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)))
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)))
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))
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))