def _process(self): quiet = request.form.get('quiet') == '1' force = request.form.get('force') == '1' persistent = request.form.get( 'persistent') == '1' and api_settings.get('allow_persistent') old_key = self.user.api_key if old_key: if not force: raise BadRequest('There is already an API key for this user') if old_key.is_blocked and not session.user.is_admin: raise Forbidden old_key.is_active = False db.session.flush() key = APIKey(user=self.user) db.session.add(key) if persistent: key.is_persistent_allowed = persistent elif old_key: key.is_persistent_allowed = old_key.is_persistent_allowed if not quiet: if old_key: flash(_('Your API key has been successfully replaced.'), 'success') if old_key.use_count: flash( _('Please update any applications which use old key.'), 'warning') else: flash(_('Your API key has been successfully created.'), 'success') db.session.flush() return redirect_or_jsonify( url_for('api.user_profile'), flash=not quiet, is_persistent_allowed=key.is_persistent_allowed)
def migrate_keys(self): print cformat('%{white!}migrating api keys') for idx_key, ak in committing_iterator( self.zodb_root['apikeys'].iteritems()): if idx_key != ak._key: print cformat( '%{red!}!!!%{reset} ' '%{yellow!}Skipping {} - index key {} does not match' ).format(ak._key, idx_key) continue elif str(ak._user.id) not in self.zodb_root['avatars']: print cformat( '%{red!}!!!%{reset} ' '%{yellow!}Skipping {} - user {} does not exist').format( ak._key, ak._user.id) continue elif ak._user.apiKey != ak: print cformat( '%{red!}!!!%{reset} ' '%{yellow!}Skipping {} - user {} has a different api key set' ).format(ak._key, ak._user.id) continue last_used_uri = None if ak._lastPath and ak._lastQuery: last_used_uri = '{}?{}'.format( convert_to_unicode(ak._lastPath), convert_to_unicode(ak._lastQuery)) elif ak._lastPath: last_used_uri = convert_to_unicode(ak._lastPath) api_key = APIKey(token=ak._key, secret=ak._signKey, user_id=ak._user.id, is_blocked=ak._isBlocked, is_persistent_allowed=getattr( ak, '_persistentAllowed', False), created_dt=self._to_utc(ak._createdDT), last_used_dt=self._to_utc(ak._lastUsedDT), last_used_ip=ak._lastUsedIP, last_used_uri=last_used_uri, last_used_auth=ak._lastUseAuthenticated, use_count=ak._useCount) db.session.add(api_key) print cformat( '%{green}+++%{reset} %{cyan}{}%{reset} [%{blue!}{}%{reset}]' ).format(ak._key, ak._user.email) for old_key in ak._oldKeys: # We have no creation time so we use *something* older.. fake_created_dt = self._to_utc( ak._createdDT) - timedelta(hours=1) # We don't have anything besides the api key for old keys, so we use a random secret old_api_key = APIKey(token=old_key, secret=unicode(uuid4()), user_id=ak._user.id, created_dt=fake_created_dt, is_active=False) db.session.add(old_api_key) print cformat( '%{blue!}***%{reset} %{cyan}{}%{reset} [%{yellow}old%{reset}]' ).format(old_key) db.session.flush()