def before_page_load(self, node, user): """ :param Node node: :param User user: :return str: Alert message """ messages = [] # Quit if not contributor if not node.is_contributor(user): return messages # Quit if not configured if self.user is None or self.repo is None: return messages # Quit if no user authorization if self.user_settings is None: return messages connect = GitHubClient(external_account=self.external_account) try: repo = connect.repo(self.user, self.repo) except (ApiError, GitHubError): return node_permissions = 'public' if node.is_public else 'private' repo_permissions = 'private' if repo.private else 'public' if repo_permissions != node_permissions: message = ( 'Warning: This OSF {category} is {node_perm}, but the GitHub ' 'repo {user} / {repo} is {repo_perm}.'.format( category=markupsafe.escape(node.project_or_component), node_perm=markupsafe.escape(node_permissions), repo_perm=markupsafe.escape(repo_permissions), user=markupsafe.escape(self.user), repo=markupsafe.escape(self.repo), ) ) if repo_permissions == 'private': message += ( ' Users can view the contents of this private GitHub ' 'repository through this public project.' ) else: message += ( ' The files in this GitHub repo can be viewed on GitHub ' '<u><a href="https://github.com/{user}/{repo}/">here</a></u>.' ).format( user=self.user, repo=self.repo, ) messages.append(message) return messages
def github_hgrid_data(node_settings, auth, **kwargs): # Quit if no repo linked if not node_settings.complete: return connection = GitHubClient(external_account=node_settings.external_account) # Initialize repo here in the event that it is set in the privacy check # below. This potentially saves an API call in _check_permissions, below. repo = None # Quit if privacy mismatch and not contributor node = node_settings.owner if node.is_public and not node.is_contributor(auth.user): try: repo = connection.repo(node_settings.user, node_settings.repo) except NotFoundError: logger.error('Could not access GitHub repo') return None except GitHubError: return if repo.private: return None try: branch, sha, branches = get_refs( node_settings, branch=kwargs.get('branch'), sha=kwargs.get('sha'), connection=connection, ) except (NotFoundError, GitHubError): # TODO: Show an alert or change GitHub configuration? logger.error('GitHub repo not found') return if branch is not None: ref = ref_to_params(branch, sha) can_edit = check_permissions( node_settings, auth, connection, branch, sha, repo=repo, ) else: ref = None can_edit = False name_tpl = '{user}/{repo}'.format( user=node_settings.user, repo=node_settings.repo ) permissions = { 'edit': can_edit, 'view': True, 'private': node_settings.is_private } urls = { 'upload': node_settings.owner.api_url + 'github/file/' + (ref or ''), 'fetch': node_settings.owner.api_url + 'github/hgrid/' + (ref or ''), 'branch': node_settings.owner.api_url + 'github/hgrid/root/', 'zip': node_settings.owner.api_url + 'github/zipball/' + (ref or ''), 'repo': 'https://github.com/{0}/{1}/tree/{2}'.format(node_settings.user, node_settings.repo, branch) } branch_names = [each.name for each in branches] if not branch_names: branch_names = [branch] # if repo un-init-ed then still add default branch to list of branches return [rubeus.build_addon_root( node_settings, name_tpl, urls=urls, permissions=permissions, branches=branch_names, defaultBranch=branch, private_key=kwargs.get('view_only', None), )]
def is_private(self): connection = GitHubClient(external_account=self.external_account) try: return connection.repo(user=self.user, repo=self.repo).private except GitHubError: return
def github_set_config(auth, **kwargs): node_settings = kwargs.get('node_addon', None) node = kwargs.get('node', None) user_settings = kwargs.get('user_addon', None) try: if not node: node = node_settings.owner if not user_settings: user_settings = node_settings.user_settings except AttributeError: raise HTTPError(http.BAD_REQUEST) # Parse request github_user_name = request.json.get('github_user', '') github_repo_name = request.json.get('github_repo', '') if not github_user_name or not github_repo_name: raise HTTPError(http.BAD_REQUEST) # Verify that repo exists and that user can access connection = GitHubClient(external_account=node_settings.external_account) repo = connection.repo(github_user_name, github_repo_name) if repo is None: if user_settings: message = ( 'Cannot access repo. Either the repo does not exist ' 'or your account does not have permission to view it.' ) else: message = ( 'Cannot access repo.' ) return {'message': message}, http.BAD_REQUEST changed = ( github_user_name != node_settings.user or github_repo_name != node_settings.repo ) # Update hooks if changed: # Delete existing hook, if any node_settings.delete_hook() # Update node settings node_settings.user = github_user_name node_settings.repo = github_repo_name # Log repo select node.add_log( action='github_repo_linked', params={ 'project': node.parent_id, 'node': node._id, 'github': { 'user': github_user_name, 'repo': github_repo_name, } }, auth=auth, ) # Add new hook if node_settings.user and node_settings.repo: node_settings.add_hook(save=False) node_settings.save() return {}
def github_set_config(auth, **kwargs): node_settings = kwargs.get('node_addon', None) node = kwargs.get('node', None) user_settings = kwargs.get('user_addon', None) try: if not node: node = node_settings.owner if not user_settings: user_settings = node_settings.user_settings except AttributeError: raise HTTPError(http_status.HTTP_400_BAD_REQUEST) # Parse request github_user_name = request.json.get('github_user', '') github_repo_name = request.json.get('github_repo', '') if not github_user_name or not github_repo_name: raise HTTPError(http_status.HTTP_400_BAD_REQUEST) # Verify that repo exists and that user can access connection = GitHubClient(external_account=node_settings.external_account) repo = connection.repo(github_user_name, github_repo_name) if repo is None: if user_settings: message = ('Cannot access repo. Either the repo does not exist ' 'or your account does not have permission to view it.') else: message = ('Cannot access repo.') return {'message': message}, http_status.HTTP_400_BAD_REQUEST changed = (github_user_name != node_settings.user or github_repo_name != node_settings.repo) # Update hooks if changed: # Delete existing hook, if any node_settings.delete_hook() # Update node settings node_settings.user = github_user_name node_settings.repo = github_repo_name # Log repo select node.add_log( action='github_repo_linked', params={ 'project': node.parent_id, 'node': node._id, 'github': { 'user': github_user_name, 'repo': github_repo_name, } }, auth=auth, ) # Add new hook if node_settings.user and node_settings.repo: node_settings.add_hook(save=False) node_settings.save() return {}
def is_private(self): connection = GitHubClient(external_account=self.external_account) try: return connection.repo(user=self.user, repo=self.repo).private except GitHubError: return