def dropbox_oauth_finish(auth, **kwargs): """View called when the Oauth flow is completed. Adds a new DropboxUserSettings record to the user and saves the user's access token and account info. """ if not auth.logged_in: raise HTTPError(http.FORBIDDEN) user = auth.user node = Node.load(session.data.get('dropbox_auth_nid')) result = finish_auth(node) # If result is a redirect response, follow the redirect if isinstance(result, BaseResponse): return result # Make sure user has dropbox enabled user.add_addon('dropbox') user.save() user_settings = user.get_addon('dropbox') user_settings.owner = user user_settings.access_token = result.access_token user_settings.dropbox_id = result.dropbox_id client = get_client_from_user_settings(user_settings) user_settings.dropbox_info = client.account_info() user_settings.save() if node: del session.data['dropbox_auth_nid'] # Automatically use newly-created auth if node.has_addon('dropbox'): node_addon = node.get_addon('dropbox') node_addon.set_user_auth(user_settings) node_addon.save() return redirect(node.web_url_for('node_setting')) return redirect(web_url_for('user_addons'))
def dropbox_user_config_get(user_addon, auth, **kwargs): """View for getting a JSON representation of the logged-in user's Dropbox user settings. """ urls = { 'create': api_url_for('dropbox_oauth_start_user'), 'delete': api_url_for('dropbox_oauth_delete_user') } info = user_addon.dropbox_info valid_credentials = True if user_addon.has_auth: try: client = get_client_from_user_settings(user_addon) client.account_info() except ErrorResponse as error: if error.status == 401: valid_credentials = False else: HTTPError(http.BAD_REQUEST) return { 'result': { 'userHasAuth': user_addon.has_auth, 'validCredentials': valid_credentials, 'dropboxName': info['display_name'] if info else None, 'nNodesAuthorized': len(user_addon.nodes_authorized), 'urls': urls }, }, http.OK
def dropbox_oauth_delete_user(user_addon, auth, **kwargs): """View for deauthorizing Dropbox.""" try: client = get_client_from_user_settings(user_addon) client.disable_access_token() except ErrorResponse as error: if error.status == 401: pass else: raise HTTPError(http.BAD_REQUEST) user_addon.delete() user_addon.save() return None
def serialize_settings(node_settings, current_user, client=None): """View helper that returns a dictionary representation of a DropboxNodeSettings record. Provides the return value for the dropbox config endpoints. """ user_settings = node_settings.user_settings user_is_owner = user_settings is not None and ( user_settings.owner._primary_key == current_user._primary_key) current_user_settings = current_user.get_addon('dropbox') valid_credentials = True if user_settings: try: client = client or get_client_from_user_settings(user_settings) client.account_info() except ErrorResponse as error: if error.status == 401: valid_credentials = False else: raise HTTPError(http.BAD_REQUEST) result = { 'nodeHasAuth': node_settings.has_auth, 'userIsOwner': user_is_owner, 'userHasAuth': current_user_settings is not None and current_user_settings.has_auth, 'validCredentials': valid_credentials, 'urls': serialize_urls(node_settings), } if node_settings.has_auth: # Add owner's profile URL result['urls']['owner'] = web_url_for( 'profile_view_id', uid=user_settings.owner._primary_key) result['ownerName'] = user_settings.owner.fullname # Show available folders path = node_settings.folder if path is None: result['folder'] = {'name': None, 'path': None} else: result['folder'] = { 'name': path if path != '/' else '/ (Full Dropbox)', 'path': path } return result
def serialize_settings(node_settings, current_user, client=None): """View helper that returns a dictionary representation of a DropboxNodeSettings record. Provides the return value for the dropbox config endpoints. """ user_settings = node_settings.user_settings user_is_owner = user_settings is not None and ( user_settings.owner._primary_key == current_user._primary_key ) current_user_settings = current_user.get_addon('dropbox') valid_credentials = True if user_settings: try: client = client or get_client_from_user_settings(user_settings) client.account_info() except ErrorResponse as error: if error.status == 401: valid_credentials = False else: raise HTTPError(http.BAD_REQUEST) result = { 'nodeHasAuth': node_settings.has_auth, 'userIsOwner': user_is_owner, 'userHasAuth': current_user_settings is not None and current_user_settings.has_auth, 'validCredentials': valid_credentials, 'urls': serialize_urls(node_settings), } if node_settings.has_auth: # Add owner's profile URL result['urls']['owner'] = web_url_for('profile_view_id', uid=user_settings.owner._primary_key) result['ownerName'] = user_settings.owner.fullname # Show available folders path = node_settings.folder if path is None: result['folder'] = {'name': None, 'path': None} else: result['folder'] = { 'name': 'Dropbox' + path, 'path': path } return result
def dropbox_user_config_get(auth, **kwargs): """View for getting a JSON representation of the logged-in user's Dropbox user settings. """ urls = { 'create': api_url_for('dropbox_oauth_start_user'), 'delete': api_url_for('dropbox_oauth_delete_user') } user_addon = auth.user.get_addon('dropbox') info = None user_has_auth = False n_nodes_authorized = 0 valid_credentials = True if user_addon: info = user_addon.dropbox_info user_has_auth = user_addon.has_auth n_nodes_authorized = len(user_addon.nodes_authorized) if user_addon.has_auth: try: client = get_client_from_user_settings(user_addon) client.account_info() except ErrorResponse as error: if error.status == 401: valid_credentials = False else: raise HTTPError(http.BAD_REQUEST, data=dict(message_long=error.error_msg)) return { 'result': { 'userHasAuth': user_has_auth, 'validCredentials': valid_credentials, 'dropboxName': info['display_name'] if info else None, 'nNodesAuthorized': n_nodes_authorized, 'urls': urls }, }, http.OK
def test_get_client_from_user_settings(self): client = get_client_from_user_settings(self.user_settings) assert_true(isinstance(client, DropboxClient))