Beispiel #1
0
 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)
Beispiel #2
0
    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()