Beispiel #1
0
    def test_get_and_put_cached(self):
        storage = StorageByKeyName(CredentialsModel,
                                   'foo',
                                   'credentials',
                                   cache=memcache)

        self.assertEqual(None, storage.get())
        self.credentials.set_store(storage)

        self.credentials._refresh(_http_request)
        credmodel = CredentialsModel.get_by_key_name('foo')
        self.assertEqual('bar', credmodel.credentials.access_token)

        # Now remove the item from the cache.
        memcache.delete('foo')

        # Check that getting refreshes the cache.
        credentials = storage.get()
        self.assertEqual('bar', credentials.access_token)
        self.assertNotEqual(None, memcache.get('foo'))

        # Deleting should clear the cache.
        storage.delete()
        credentials = storage.get()
        self.assertEqual(None, credentials)
        self.assertEqual(None, memcache.get('foo'))
Beispiel #2
0
    def test_delete_ndb(self):
        # Start empty
        storage = StorageByKeyName(CredentialsNDBModel, "foo", "credentials")
        self.assertEqual(None, storage.get())

        # Add credentials to model with storage, and check equivalent w/o storage
        storage.put(self.credentials)
        credmodel = CredentialsNDBModel.get_by_id("foo")
        self.assertEqual(credmodel.credentials.to_json(), self.credentials.to_json())

        # Delete and make sure empty
        storage.delete()
        self.assertEqual(None, storage.get())
Beispiel #3
0
    def test_get_and_put_set_store_on_cache_retrieval(self):
        storage = StorageByKeyName(CredentialsModel, "foo", "credentials", cache=memcache)

        self.assertEqual(None, storage.get())
        self.credentials.set_store(storage)
        storage.put(self.credentials)
        # Pre-bug 292 old_creds wouldn't have storage, and the _refresh wouldn't
        # be able to store the updated cred back into the storage.
        old_creds = storage.get()
        self.assertEqual(old_creds.access_token, "foo")
        old_creds.invalid = True
        old_creds._refresh(_http_request)
        new_creds = storage.get()
        self.assertEqual(new_creds.access_token, "bar")
Beispiel #4
0
    def test_delete_ndb(self):
        # Start empty
        storage = StorageByKeyName(CredentialsNDBModel, 'foo', 'credentials')
        self.assertEqual(None, storage.get())

        # Add credentials to model with storage, and check equivalent w/o storage
        storage.put(self.credentials)
        credmodel = CredentialsNDBModel.get_by_id('foo')
        self.assertEqual(credmodel.credentials.to_json(),
                         self.credentials.to_json())

        # Delete and make sure empty
        storage.delete()
        self.assertEqual(None, storage.get())
Beispiel #5
0
  def test_get_and_put_set_store_on_cache_retrieval(self):
    storage = StorageByKeyName(
      CredentialsModel, 'foo', 'credentials', cache=memcache)

    self.assertEqual(None, storage.get())
    self.credentials.set_store(storage)
    storage.put(self.credentials)
    # Pre-bug 292 old_creds wouldn't have storage, and the _refresh wouldn't
    # be able to store the updated cred back into the storage.
    old_creds = storage.get()
    self.assertEqual(old_creds.access_token, 'foo')
    old_creds.invalid = True
    old_creds._refresh(_http_request)
    new_creds = storage.get()
    self.assertEqual(new_creds.access_token, 'bar')
Beispiel #6
0
def get_credentials(user_id):
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    storage = StorageByKeyName(CredentialsNDBModel, user_id, 'credentials')
    credentials = storage.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(
               CLIENT_SECRET_FILE,
               SCOPES,
               redirect_uri=ridelisterconfig['ridelister']['callbackurl'],
               # redirect_uri="https://localhost:8080/oauth2callback",
               )

        # Todo - Look this one up...
        flow.user_agent = APPLICATION_NAME
        # credentials = tools.run_flow(flow, storage)
        # print('Storing credentials')
        auth_uri = str(flow.step1_get_authorize_url())
    
    return credentials
Beispiel #7
0
def _delete_creds(userid):
    storage = StorageByKeyName(CredentialsNDBModel, userid, "credentials")
    if storage.get():
        credentials = storage.locked_delete()
        return True

    return False
Beispiel #8
0
def _get_creds(userid):
    """
    We store the credentials by google userid from the users api.
    """
    storage = StorageByKeyName(CredentialsNDBModel, userid, "credentials")
    credentials = storage.get()
    return credentials
Beispiel #9
0
  def get(self):
    devices = None
    updated = 'Never'
    linkkey = self.request.get('id')
    fetcherror = 'Key not found'
    domainname = None

    if linkkey is not None:
      customerlink = CustomerLink.get_by_id(int(linkkey))
      if customerlink is not None:
        domainname = customerlink.domainname
        try:
          authstorage = StorageByKeyName(CredentialsModel, customerlink.linkeduserid, 'credentials')
          credentials = authstorage.get()
          http = httplib2.Http()
          http = credentials.authorize(http)
          authstorage.put(credentials)
          active_users = get_active_users(customerlink.customerid, http)
          devices = get_devices(active_users, http)
          updated = datetime.now().strftime('%a, %d %b %Y, %H:%M UTC')
          fetcherror = None
        except:
          fetcherror = traceback.format_exc()
    
    variables = {
        'linkkey': linkkey,
        'domainname': domainname,
        'devices': devices,
        'updated': updated,
        'fetcherror': fetcherror
        }
    
    self.response.headers['Content-Type'] = 'application/json'
    self.response.write(json.dumps(variables))
    def _deliver_test(self):
        """Print to the admins printer."""

        gcp_cred_storage = StorageByKeyName(GcpCredentials, self.user.user_id(), 'credentials')
        gcp_creds = gcp_cred_storage.get()
        
        if not gcp_creds:
            return self.redirect("/printers/add")
        
        account = Account.get_or_insert(self.user_bundle.user.user_id())
        printers = Printer.query(Printer.owner == account.key).fetch(1000)

        PrintJobEnqueuer.enqueue_to_printers(
            printers,
            self.request.get("deliver_title"),
            self.request.get("deliver_url")
        )

        self.template_values.update({
            "deliver_title": self.request.get("deliver_title"),
            "deliver_url": self.request.get("deliver_url"),
            "printer_names": [printer.display_name for printer in printers]
        })

        path = os.path.join(os.path.dirname(__file__), '../templates/admin_deliver.html')
        self.response.write(template.render(path, self.template_values)) 
    def get(self):
        gcp_cred_storage = StorageByKeyName(GcpCredentials, self.user_bundle.user.user_id(), 'credentials')
        gcp_creds = gcp_cred_storage.get()
        if gcp_creds is None:
            if ann_config.oauth_decorator.has_credentials():
                gcp_creds = ann_config.oauth_decorator.credentials
                gcp_cred_storage.put(gcp_creds)
            else:
                self.template_values.update({
                    "auth_url": ann_config.oauth_decorator.authorize_url(),
                })
                path = os.path.join(os.path.dirname(__file__), '../templates/gcp_authorization_request.html')
                self.response.write(template.render(path, self.template_values))
                return None

        http = gcp_creds.authorize(httplib2.Http())
        resp, content = http.request('http://www.google.com/cloudprint/search')
        
        response_json = json.loads(content)
        printers = response_json["printers"]

        self.template_values.update({
            "printers": printers,
        })
    
        path = os.path.join(os.path.dirname(__file__), '../templates/printer_add.html')
        self.response.write(template.render(path, self.template_values))
    def get(self):
        gcp_cred_storage = StorageByKeyName(GcpCredentials,
                                            self.user_bundle.user.user_id(),
                                            'credentials')
        gcp_creds = gcp_cred_storage.get()
        if gcp_creds is None:
            if ann_config.oauth_decorator.has_credentials():
                gcp_creds = ann_config.oauth_decorator.credentials
                gcp_cred_storage.put(gcp_creds)
            else:
                self.template_values.update({
                    "auth_url":
                    ann_config.oauth_decorator.authorize_url(),
                })
                path = os.path.join(
                    os.path.dirname(__file__),
                    '../templates/gcp_authorization_request.html')
                self.response.write(template.render(path,
                                                    self.template_values))
                return None

        http = gcp_creds.authorize(httplib2.Http())
        resp, content = http.request('http://www.google.com/cloudprint/search')

        response_json = json.loads(content)
        printers = response_json["printers"]

        self.template_values.update({
            "printers": printers,
        })

        path = os.path.join(os.path.dirname(__file__),
                            '../templates/printer_add.html')
        self.response.write(template.render(path, self.template_values))
Beispiel #13
0
def get_credentials(gplus_id, test):
    """Retrieves credentials for the provided Google+ User ID from the Datastore"""
    if test is not None:
        storage = StorageByKeyName(TestUser, gplus_id, "credentials")
    else:
        storage = StorageByKeyName(User, gplus_id, "credentials")
    credentials = storage.get()
    return credentials
Beispiel #14
0
def get_credentials(gplus_id, test):
    """Retrieves credentials for the provided Google+ User ID from the Datastore"""
    if test is not None:
        storage = StorageByKeyName(utils.TestUser, gplus_id, "credentials")
    else:
        storage = StorageByKeyName(utils.User, gplus_id, "credentials")
    credentials = storage.get()
    return credentials
Beispiel #15
0
def oauth2redirect(request):
  user = users.get_current_user()
  storage = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials')
  credentials = storage.get()

  # if not credentials or not credentials.refresh_token:
    # return __initial_oauth_flow(request, approval_prompt='force')
  # Use approval_prompt='force' to ensure the refresh token is good.
  return __initial_oauth_flow(request, approval_prompt='force')
Beispiel #16
0
    def test_get_and_put_simple(self):
        storage = StorageByKeyName(CredentialsModel, "foo", "credentials")

        self.assertEqual(None, storage.get())
        self.credentials.set_store(storage)

        self.credentials._refresh(_http_request)
        credmodel = CredentialsModel.get_by_key_name("foo")
        self.assertEqual("bar", credmodel.credentials.access_token)
Beispiel #17
0
    def test_get_and_put_simple(self):
        storage = StorageByKeyName(CredentialsModel, 'foo', 'credentials')

        self.assertEqual(None, storage.get())
        self.credentials.set_store(storage)

        self.credentials._refresh(_http_request)
        credmodel = CredentialsModel.get_by_key_name('foo')
        self.assertEqual('bar', credmodel.credentials.access_token)
Beispiel #18
0
def build_gmail_service_for_user(userId):
    if not Constants.TEST_CONTEXT:
        storage = StorageByKeyName(CredentialsModel, userId, "credentials")
        credentials = storage.get()
        return GmailService(credentials)
    else:
        with open("gmailytics/test/credentials.json") as f:
            data = f.read()
            credentials = OAuth2Credentials.from_json(data)
        return GmailService(credentials)
def acquireLatestCredentials(user_id):
  """Returns credentials, and refreshes them if necessary."""
  storage = StorageByKeyName(CredentialsModel, user_id, 'credentials')
  credentials = storage.get()
  if credentials.access_token_expired:
    logging.info('Credentials expired. Attempting to refresh...')
    credentials.refresh(httplib2.Http())
    storage.put(credentials)
    logging.info('Successfully refreshed access token!')
  return credentials
Beispiel #20
0
    def test_get_and_put_ndb(self):
        # Start empty
        storage = StorageByKeyName(CredentialsNDBModel, "foo", "credentials")
        self.assertEqual(None, storage.get())

        # Refresh storage and retrieve without using storage
        self.credentials.set_store(storage)
        self.credentials._refresh(_http_request)
        credmodel = CredentialsNDBModel.get_by_id("foo")
        self.assertEqual("bar", credmodel.credentials.access_token)
        self.assertEqual(credmodel.credentials.to_json(), self.credentials.to_json())
Beispiel #21
0
def EndpointsGetAuthorizedHttp():
  """Sign an Http with user credentials.

  Returns:
    Http: An authorized Http connection.
  """
  user = users.get_current_user()
  storage = StorageByKeyName(
    CredentialsModel, user.user_id(), 'credentials')
  credentials = storage.get()
  http = Http()
  return credentials.authorize(http)
Beispiel #22
0
def get_access_token():
    """Used to check app activation and append token to urls"""

    # Check if access token is in storage
    storage = StorageByKeyName(CredentialsModel, 'token', 'credentials')

    credentials = storage.get()

    if not credentials:
        return False

    return credentials.access_token
Beispiel #23
0
    def test_get_and_put_ndb(self):
        # Start empty
        storage = StorageByKeyName(CredentialsNDBModel, 'foo', 'credentials')
        self.assertEqual(None, storage.get())

        # Refresh storage and retrieve without using storage
        self.credentials.set_store(storage)
        self.credentials._refresh(_http_request)
        credmodel = CredentialsNDBModel.get_by_id('foo')
        self.assertEqual('bar', credmodel.credentials.access_token)
        self.assertEqual(credmodel.credentials.to_json(),
                         self.credentials.to_json())
  def test_delete_db_ndb_mixed(self):
    # Start empty
    storage_ndb = StorageByKeyName(
      CredentialsNDBModel, 'foo', 'credentials')
    storage = StorageByKeyName(
      CredentialsModel, 'foo', 'credentials')

    # First DB, then NDB
    self.assertEqual(None, storage.get())
    storage.put(self.credentials)
    self.assertNotEqual(None, storage.get())

    storage_ndb.delete()
    self.assertEqual(None, storage.get())

    # First NDB, then DB
    self.assertEqual(None, storage_ndb.get())
    storage_ndb.put(self.credentials)

    storage.delete()
    self.assertNotEqual(None, storage_ndb.get())
    # NDB uses memcache and an instance cache (Context)
    ndb.get_context().clear_cache()
    memcache.flush_all()
    self.assertEqual(None, storage_ndb.get())
Beispiel #25
0
  def test_delete_db_ndb_mixed(self):
    # Start empty
    storage_ndb = StorageByKeyName(
      CredentialsNDBModel, 'foo', 'credentials')
    storage = StorageByKeyName(
      CredentialsModel, 'foo', 'credentials')

    # First DB, then NDB
    self.assertEqual(None, storage.get())
    storage.put(self.credentials)
    self.assertNotEqual(None, storage.get())

    storage_ndb.delete()
    self.assertEqual(None, storage.get())

    # First NDB, then DB
    self.assertEqual(None, storage_ndb.get())
    storage_ndb.put(self.credentials)

    storage.delete()
    self.assertNotEqual(None, storage_ndb.get())
    # NDB uses memcache and an instance cache (Context)
    ndb.get_context().clear_cache()
    memcache.flush_all()
    self.assertEqual(None, storage_ndb.get())
Beispiel #26
0
    def test_get_and_put_mixed_db_storage_ndb_get(self):
        # Start empty
        storage = StorageByKeyName(CredentialsModel, "foo", "credentials")
        self.assertEqual(None, storage.get())

        # Set DB store and refresh to add to storage
        self.credentials.set_store(storage)
        self.credentials._refresh(_http_request)

        # Retrieve same key from NDB model to confirm mixing works
        credmodel = CredentialsNDBModel.get_by_id("foo")
        self.assertEqual("bar", credmodel.credentials.access_token)
        self.assertEqual(self.credentials.to_json(), credmodel.credentials.to_json())
Beispiel #27
0
    def test_get_and_put_cached(self):
        storage = StorageByKeyName(CredentialsModel, "foo", "credentials", cache=memcache)

        self.assertEqual(None, storage.get())
        self.credentials.set_store(storage)

        self.credentials._refresh(_http_request)
        credmodel = CredentialsModel.get_by_key_name("foo")
        self.assertEqual("bar", credmodel.credentials.access_token)

        # Now remove the item from the cache.
        memcache.delete("foo")

        # Check that getting refreshes the cache.
        credentials = storage.get()
        self.assertEqual("bar", credentials.access_token)
        self.assertNotEqual(None, memcache.get("foo"))

        # Deleting should clear the cache.
        storage.delete()
        credentials = storage.get()
        self.assertEqual(None, credentials)
        self.assertEqual(None, memcache.get("foo"))
Beispiel #28
0
    def test_get_and_put_mixed_db_storage_ndb_get(self):
        # Start empty
        storage = StorageByKeyName(CredentialsModel, 'foo', 'credentials')
        self.assertEqual(None, storage.get())

        # Set DB store and refresh to add to storage
        self.credentials.set_store(storage)
        self.credentials._refresh(_http_request)

        # Retrieve same key from NDB model to confirm mixing works
        credmodel = CredentialsNDBModel.get_by_id('foo')
        self.assertEqual('bar', credmodel.credentials.access_token)
        self.assertEqual(self.credentials.to_json(),
                         credmodel.credentials.to_json())
Beispiel #29
0
def getService():
    flow = flow_from_clientsecrets(
        'client_secrets.json',
        scope='https://www.googleapis.com/auth/youtube',
        redirect_uri='http://localhost:8080/oauth2callback')

    user = users.get_current_user()
    storage = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials')
    credentials = storage.get()

    http = httplib2.Http()
    http = credentials.authorize(http)

    authenticated_service = build('youtube', 'v3', http=http)
    return authenticated_service
    def post(self):
        gcp_cred_storage = StorageByKeyName(GcpCredentials, self.user_bundle.user.user_id(), 'credentials')
        gcp_creds = gcp_cred_storage.get()

        if not gcp_creds:
            return self.redirect("/printers/add")

        printer = Printer.get_by_id(int(self.request.get("printer_key_id")))

        PrintJobEnqueuer.enqueue_to_printer(
            printer,
            "Distributed Press Test Print",
            "http://distributedpress.appspot.com"
        )

        self.redirect("/dashboard")
Beispiel #31
0
def SendMessages(post_data):
  storage = StorageByKeyName(AdminCredentialsModel,
                             'theadminaccount',
                             'credentials')
  credentials = storage.get()
  if credentials:
    try:
      api_http = credentials.authorize(httplib2.Http())
      for data in post_data:
        api_http.request(
            'https://www.googleapis.com/gcm_for_chrome/v1/messages',
            'POST',
            body=json.dumps(data),
            headers={'Content-Type': 'application/json'})
    except AccessTokenRefreshError:
      logger.warning('Unable to refresh the Push Messaging access token!')
Beispiel #32
0
def SendMessages(post_data):
    storage = StorageByKeyName(AdminCredentialsModel, 'theadminaccount',
                               'credentials')
    credentials = storage.get()
    if credentials:
        try:
            api_http = credentials.authorize(httplib2.Http())
            for data in post_data:
                api_http.request(
                    'https://www.googleapis.com/gcm_for_chrome/v1/messages',
                    'POST',
                    body=json.dumps(data),
                    headers={'Content-Type': 'application/json'})
        except AccessTokenRefreshError:
            logger.warning(
                'Unable to refresh the Push Messaging access token!')
Beispiel #33
0
def getService():
    flow = flow_from_clientsecrets(
        "client_secrets.json",
        scope="https://www.googleapis.com/auth/youtube",
        redirect_uri="http://localhost:8080/oauth2callback",
    )

    user = users.get_current_user()
    storage = StorageByKeyName(CredentialsModel, user.user_id(), "credentials")
    credentials = storage.get()

    http = httplib2.Http()
    http = credentials.authorize(http)

    authenticated_service = build("youtube", "v3", http=http)
    return authenticated_service
    def post(self):
        gcp_cred_storage = StorageByKeyName(GcpCredentials,
                                            self.user_bundle.user.user_id(),
                                            'credentials')
        gcp_creds = gcp_cred_storage.get()

        if not gcp_creds:
            return self.redirect("/printers/add")

        printer = Printer.get_by_id(int(self.request.get("printer_key_id")))

        PrintJobEnqueuer.enqueue_to_printer(
            printer, "Distributed Press Test Print",
            "http://distributedpress.appspot.com")

        self.redirect("/dashboard")
Beispiel #35
0
	def get(self):
		user = users.get_current_user()
		
		if user:
			storage = StorageByKeyName(Credentials, user.user_id(), 'credentials')
			credentials = storage.get()
			
			auth = GAPDecoratorAuthMethod(credentials)
			reader = GoogleReader(auth)
			reader.buildSubscriptionList()
			
			feeds = reader.getFeeds()
			template_values = {
				'feeds': feeds
			}
			path = os.path.join(os.path.dirname(__file__), 'templates/template_slist.html')
			self.response.out.write(template.render(path, template_values))
		else:
			self.redirect(users.create_login_url(self.request.uri))
    def post(self):
        printer = Printer.get_by_id(int(self.request.get("printer_key_id")))
        account = printer.owner
        gcp_cred_storage = StorageByKeyName(GcpCredentials, account.id(), 'credentials')
        gcp_creds = gcp_cred_storage.get()

        if not gcp_creds:
            return logging.warning("Missing credentials for %s" % printer)

        data = {
            'printerid': printer.cloudprint_id,
            'title': self.request.get("title"),
            'content': self.request.get("url"),
            'contentType': 'url',
        }
        body = urllib.urlencode(data)
        http = gcp_creds.authorize(httplib2.Http())
        resp, content = http.request('https://www.google.com/cloudprint/submit', method="POST", body=body)
        self.response.write(content)
Beispiel #37
0
    def get_credentials(self, api_type, **params):
        storage_ndb = StorageByKeyName(
            CredentialsNDBModel, api_type, 'credentials')

        credentials = storage_ndb.get()
        if credentials is None:
            # self.read_settings()
            with open(join(dirname(abspath(__file__)), self.ApiSettings["private_key_file"])) as f:
                private_key = f.read()

            credentials = SignedJwtAssertionCredentials(
                self.ApiSettings["service_account_name"],
                private_key,
                # sub=self.ApiSettings["google_account_owner_email"],  # before commenting this line,
                # I got "AccessTokenRefreshError: unauthorized_client" error
                **params
            )

            storage_ndb.put(credentials)
        return credentials
Beispiel #38
0
def GetCurrentCredentials():
  """Fetch current user's credentials, refreshing if possible."""
  user = users.get_current_user()
  if not user:
    return None

  storage = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials')
  credentials = storage.get()
  if not credentials or not credentials.access_token:
    return None

  if credentials.access_token_expired:
    http = httplib2.Http()
    try:
      logging.info('Refreshing OAuth2 Access Token.')
      credentials.refresh(http)
    except AccessTokenRefreshError:
      return None
    storage.put(credentials)

  return credentials
Beispiel #39
0
def GetCurrentCredentials():
    """Fetch current user's credentials, refreshing if possible."""
    user = users.get_current_user()
    if not user:
        return None

    storage = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials')
    credentials = storage.get()
    if not credentials or not credentials.access_token:
        return None

    if credentials.access_token_expired:
        http = httplib2.Http()
        try:
            logging.info('Refreshing OAuth2 Access Token.')
            credentials.refresh(http)
        except AccessTokenRefreshError:
            return None
        storage.put(credentials)

    return credentials
    def post(self):
        printer = Printer.get_by_id(int(self.request.get("printer_key_id")))
        account = printer.owner
        gcp_cred_storage = StorageByKeyName(GcpCredentials, account.id(),
                                            'credentials')
        gcp_creds = gcp_cred_storage.get()

        if not gcp_creds:
            return logging.warning("Missing credentials for %s" % printer)

        data = {
            'printerid': printer.cloudprint_id,
            'title': self.request.get("title"),
            'content': self.request.get("url"),
            'contentType': 'url',
        }
        body = urllib.urlencode(data)
        http = gcp_creds.authorize(httplib2.Http())
        resp, content = http.request(
            'https://www.google.com/cloudprint/submit',
            method="POST",
            body=body)
        self.response.write(content)
Beispiel #41
0
def get_credentials(gplus_id):
    storage = StorageByKeyName(utils.User, gplus_id, "credentials")
    credentials = storage.get()
    return credentials
Beispiel #42
0
def get_credentials(gplus_id):
    storage = StorageByKeyName(utils.User, gplus_id, "credentials")
    credentials = storage.get()
    return credentials
Beispiel #43
0
 def __storeCredentials(self, userid, propName):
   storage = StorageByKeyName(CredentialsModel, userid, propName)
   credentials = storage.get()
   storage.put(credentials)
Beispiel #44
0
 def store_sfdc_credentials_for_user_id(cls, user_id, credentials):
     storage = StorageByKeyName(CredentialsModel, user_id+"sfdc", "credentials")
     cached_credentials = storage.get()
     if credentials.refresh_token or not cached_credentials or cached_credentials and not cached_credentials.refresh_token:
         storage.put(credentials)                
Beispiel #45
0
 def get_sfdc_credentials_from_user_id(cls, user_id):
     storage = StorageByKeyName(CredentialsModel, user_id+"sfdc", "credentials")
     return storage.get()