def redirect_home_or_user_page(self, state): redirect_to = '/' split = state.split('-', 1) if len(split) >= 2: source = ndb.Key(urlsafe=split[1]).get() if source: redirect_to = source.bridgy_url(self) self.redirect(redirect_to)
def maybe_add_or_delete_source(self, source_cls, auth_entity, state, **kwargs): """Adds or deletes a source if auth_entity is not None. Used in each source's oauth-dropins CallbackHandler finish() and get() methods, respectively. Args: source_cls: source class, e.g. Instagram auth_entity: ouath-dropins auth entity state: string, OAuth callback state parameter. a JSON serialized dict with operation, feature, and an optional callback URL. For deletes, it will also include the source key kwargs: passed through to the source_cls constructor Returns: source entity if it was created or updated, otherwise None """ state_obj = self.decode_state_parameter(state) operation = state_obj.get('operation', 'add') feature = state_obj.get('feature') callback = state_obj.get('callback') user_url = state_obj.get('user_url') logging.debug( 'maybe_add_or_delete_source with operation=%s, feature=%s, callback=%s', operation, feature, callback) if operation == 'add': # this is an add/update if not auth_entity: if not self.messages: self.messages.add("OK, you're not signed up. Hope you reconsider!") if callback: callback = util.add_query_params(callback, {'result': 'declined'}) logging.debug( 'user declined adding source, redirect to external callback %s', callback) # call super.redirect so the callback url is unmodified super(Handler, self).redirect(callback.encode('utf-8')) else: self.redirect('/') return CachedPage.invalidate('/users') logging.info('%s.create_new with %s', source_cls.__class__.__name__, (auth_entity.key, state, kwargs)) source = source_cls.create_new(self, auth_entity=auth_entity, features=[feature] if feature else [], user_url=user_url, **kwargs) if callback: callback = util.add_query_params(callback, { 'result': 'success', 'user': source.bridgy_url(self), 'key': source.key.urlsafe(), } if source else {'result': 'failure'}) logging.debug( 'finished adding source, redirect to external callback %s', callback) # call super.redirect so the callback url is unmodified super(Handler, self).redirect(callback.encode('utf-8')) else: self.redirect(source.bridgy_url(self) if source else '/') return source else: # this is a delete if auth_entity: self.redirect('/delete/finish?auth_entity=%s&state=%s' % (auth_entity.key.urlsafe(), state)) else: self.messages.add('If you want to disable, please approve the %s prompt.' % source_cls.GR_CLASS.NAME) self.redirect_home_or_user_page(state)