예제 #1
0
 def _format_user_data(self, raw_data):
     """
     Velruse return data in a Portable Contact format but different plugins can return or not
     informations
     """
     user_data = {}
     userid_data = raw_data.get('profile', {}).get('accounts', [None])[0]
     userid = ("%s.%s" % (userid_data.get(
         'domain', ''), userid_data.get('userid', None))).encode('utf-8')
     user_data['userid'] = userid
     username = userid_data.get('username', None)
     if not username:
         username = userid
     else:
         username = (
             "%s.%s" %
             (userid_data.get('domain', ''), username)).encode('utf-8')
     user_data['username'] = username
     for provider, given_properties in config.PROPERTY_PROVIDERS_INFO.items(
     ):
         if username.startswith("%s." % provider):
             for property_id in [p for p in given_properties]:
                 if property_id == 'email' and raw_data.get(
                         'profile', {}).get('emails', []):
                     # BBB: seems that commonly email (up) is stored as string
                     user_data['email'] = raw_data.get('profile', {}).get(
                         'emails', [])[0]['value'].encode('utf-8')
                 if property_id == 'fullname':
                     user_data['fullname'] = raw_data.get('profile', {}).get('name', {}).get('formatted', '') or \
                             raw_data.get('profile', {}).get('displayName', {})
                 if property_id == "addresses" and raw_data.get(
                         'profile', {}).get('addresses', []):
                     user_data['location'] = raw_data.get(
                         'profile', {}).get('addresses',
                                            [])[0].get('formatted', '')
                 if property_id == "home_page" and raw_data.get(
                         'profile', {}).get('urls', []):
                     user_data['home_page'] = raw_data.get(
                         'profile', {}).get('urls', [])[0].get('value', '')
     # profile's photo
     if raw_data.get('profile', {}).get('photos', []):
         photo_url = raw_data.get('profile',
                                  {}).get('photos', [])[0].get('value', '')
         r = requests.get(photo_url)
         #path = urlparse.urlsplit(photo_url).path # only with Python 2.5+
         path = urlparse.urlsplit(photo_url)[2]
         filename = posixpath.basename(path)
         portrait = TempPortrait(filename, r.content)
         # getToolByName(self, 'portal_membership').changeMemberPortrait(portrait, username)
         try:
             self._changePortraitFor(portrait, userid)
         except ConflictError:
             raise
         except Exception, inst:
             logger.error("Can't change portrait for %s: %s" %
                          (username, str(inst)))
예제 #2
0
 def _format_user_data(self, raw_data):
     """
     Velruse return data in a Portable Contact format but different plugins can return or not
     informations
     """
     user_data = {}
     userid_data = raw_data.get('profile', {}).get('accounts', [None])[0]
     userid = ("%s.%s" % (userid_data.get('domain', ''),
                          userid_data.get('userid', None))).encode('utf-8')
     user_data['userid'] = userid
     username = userid_data.get('username', None)
     if not username:
         username = userid
     else:
         username = ("%s.%s" % (userid_data.get('domain', ''),
                                username)).encode('utf-8')
     user_data['username'] = username
     for provider, given_properties in config.PROPERTY_PROVIDERS_INFO.items():
         if username.startswith("%s." % provider):
             for property_id in [p for p in given_properties]:
                 if property_id == 'email' and raw_data.get('profile', {}).get('emails', []):
                     # BBB: seems that commonly email (up) is stored as string
                     user_data['email'] = raw_data.get('profile', {}).get('emails', [])[0]['value'].encode('utf-8')
                 if property_id == 'fullname':
                     user_data['fullname'] = raw_data.get('profile', {}).get('name', {}).get('formatted', '') or \
                             raw_data.get('profile', {}).get('displayName', {})
                 if property_id == "addresses" and raw_data.get('profile', {}).get('addresses', []):
                     user_data['location'] = raw_data.get('profile', {}).get('addresses', [])[0].get('formatted', '')
                 if property_id == "home_page" and raw_data.get('profile', {}).get('urls', []):
                     user_data['home_page'] = raw_data.get('profile', {}).get('urls', [])[0].get('value', '')
     # profile's photo
     if raw_data.get('profile', {}).get('photos', []):
         photo_url = raw_data.get('profile', {}).get('photos', [])[0].get('value', '')
         r = requests.get(photo_url)
         #path = urlparse.urlsplit(photo_url).path # only with Python 2.5+
         path = urlparse.urlsplit(photo_url)[2]
         filename = posixpath.basename(path)
         portrait = TempPortrait(filename, r.content)
         # getToolByName(self, 'portal_membership').changeMemberPortrait(portrait, username)
         try:
             self._changePortraitFor(portrait, userid)
         except ConflictError:
             raise
         except Exception, inst:
             logger.error("Can't change portrait for %s: %s" % (username, str(inst)))
예제 #3
0
    def authenticateCredentials(self, credentials):
        """ credentials -> (userid, login)

        o 'credentials' will be a mapping, as returned by IExtractionPlugin.

        o Return a  tuple consisting of user ID (which may be different
          from the login name) and login

        o If the credentials cannot be authenticated, return None.
        """
        if not credentials.get('velruse-token'):
            return
        velruse_host = self.getProperty('velruse_server_host')
        velruse_auth_info = self.getProperty('velruse_auth_info_path')
        try:
            r = requests.get('http://%s%s' % (velruse_host, velruse_auth_info),
                             params={
                                 'format': 'json',
                                 'token': credentials.get('velruse-token')
                             },
                             timeout=self.getConnectionTimeout())
        except Timeout:
            logger.error("Can't connect to Velruse backend. Timeout.")
            return None
        if r.status_code >= 300:
            logger.error("Can't connect to Velruse backend. Code %s" %
                         r.status_code)
            return None
        raw_user_data = r.json()
        user_data = self._format_user_data(raw_user_data)
        if user_data.get('userid'):
            acl_users = getToolByName(self, 'acl_users')
            userid = user_data.get('userid').encode('utf-8')
            username = user_data.get('username').encode('utf-8')
            if self._blacklist.get(userid):
                logger.warning("User %s is blacklisted" % (userid))
                return None
            if not self._storage.get(userid):
                # userdata not existing: this is the first time we enter here
                if PLONE4:
                    acl_users.session._setupSession(userid,
                                                    self.REQUEST.RESPONSE)
                else:
                    acl_users.session.setupSession(userid,
                                                   self.REQUEST.RESPONSE)
                self._storage.insert(userid, user_data)
                new_user = self.acl_users.getUserById(userid)
                if new_user:
                    self.REQUEST.set('first_user_login', userid)
                    notify(VelruseFirstLoginEvent(new_user))
            else:
                if PLONE4:
                    acl_users.session._setupSession(userid,
                                                    self.REQUEST.RESPONSE)
                else:
                    acl_users.session.setupSession(userid,
                                                   self.REQUEST.RESPONSE)
                # we store the user info EVERY TIME because data from social network can be changed meanwhile
                # but we need to take care of not overriding other Plone-only user's information
                existing_user_data = self._storage[userid]
                existing_user_data.update(user_data)
                self._storage[userid] = existing_user_data
                new_user = self.acl_users.getUserById(userid)
            if not new_user:
                logger.error("Can't authenticate with userid %s (%s)" %
                             (userid, username))
                return None
            return (userid, username)
        else:
            logger.error("Invalid token %s > %r" %
                         (credentials.get('velruse-token'), raw_user_data))
예제 #4
0
    def authenticateCredentials(self, credentials):
        """ credentials -> (userid, login)

        o 'credentials' will be a mapping, as returned by IExtractionPlugin.

        o Return a  tuple consisting of user ID (which may be different
          from the login name) and login

        o If the credentials cannot be authenticated, return None.
        """
        if not credentials.get('velruse-token'):
            return
        velruse_host = self.getProperty('velruse_server_host')
        velruse_auth_info = self.getProperty('velruse_auth_info_path')
        try:
            r = requests.get('http://%s%s' % (velruse_host, velruse_auth_info),
                         params={'format': 'json',
                                 'token': credentials.get('velruse-token')},
                         timeout=self.getConnectionTimeout())
        except Timeout:
            logger.error("Can't connect to Velruse backend. Timeout.")
            return None
        if r.status_code >= 300:
            logger.error("Can't connect to Velruse backend. Code %s" % r.status_code)
            return None
        raw_user_data = r.json()
        user_data = self._format_user_data(raw_user_data)
        if user_data.get('userid'):
            acl_users = getToolByName(self, 'acl_users')
            userid = user_data.get('userid').encode('utf-8')
            username = user_data.get('username').encode('utf-8')
            if self._blacklist.get(userid):
                logger.warning("User %s is blacklisted" % (userid))
                return None
            if not self._storage.get(userid):
                # userdata not existing: this is the first time we enter here
                if PLONE4:
                    acl_users.session._setupSession(userid, self.REQUEST.RESPONSE)
                else:
                    acl_users.session.setupSession(userid, self.REQUEST.RESPONSE)
                self._storage.insert(userid, user_data)
                new_user = self.acl_users.getUserById(userid)
                if new_user:
                    self.REQUEST.set('first_user_login', userid)
                    notify(VelruseFirstLoginEvent(new_user))
            else:
                if PLONE4:
                    acl_users.session._setupSession(userid, self.REQUEST.RESPONSE)
                else:
                    acl_users.session.setupSession(userid, self.REQUEST.RESPONSE)
                # we store the user info EVERY TIME because data from social network can be changed meanwhile
                # but we need to take care of not overriding other Plone-only user's information
                existing_user_data = self._storage[userid]
                existing_user_data.update(user_data)
                self._storage[userid] = existing_user_data
                new_user = self.acl_users.getUserById(userid)
            if not new_user:
                logger.error("Can't authenticate with userid %s (%s)" % (userid, username))
                return None
            return (userid, username)
        else:
            logger.error("Invalid token %s > %r" % (credentials.get('velruse-token'), raw_user_data))