func isProjectAdmin(userID int, pid int64) bool { isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { log.Errorf("Error occurred in IsAdminRole, returning false, error: %v", err) return false } if isSysAdmin { return true } rolelist, err := dao.GetUserProjectRoles(userID, pid) if err != nil { log.Errorf("Error occurred in GetUserProjectRoles, returning false, error: %v", err) return false } hasProjectAdminRole := false for _, role := range rolelist { if role.RoleID == models.PROJECTADMIN { hasProjectAdminRole = true break } } return hasProjectAdminRole }
//sysadmin has all privileges to all projects func listRoles(userID int, projectID int64) ([]models.Role, error) { roles := make([]models.Role, 0, 1) isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { log.Errorf("failed to determine whether the user %d is system admin: %v", userID, err) return roles, err } if isSysAdmin { role, err := dao.GetRoleByID(models.PROJECTADMIN) if err != nil { log.Errorf("failed to get role %d: %v", models.PROJECTADMIN, err) return roles, err } roles = append(roles, *role) return roles, nil } rs, err := dao.GetUserProjectRoles(userID, projectID) if err != nil { log.Errorf("failed to get user %d 's roles for project %d: %v", userID, projectID, err) return roles, err } roles = append(roles, rs...) return roles, nil }
// Get ... func (s *SearchAPI) Get() { userID, ok := s.GetSession("userId").(int) if !ok { userID = dao.NonExistUserID } keyword := s.GetString("q") isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { log.Errorf("failed to check whether the user %d is system admin: %v", userID, err) s.CustomAbort(http.StatusInternalServerError, "internal error") } var projects []models.Project if isSysAdmin { projects, err = dao.GetAllProjects("") if err != nil { log.Errorf("failed to get all projects: %v", err) s.CustomAbort(http.StatusInternalServerError, "internal error") } } else { projects, err = dao.SearchProjects(userID) if err != nil { log.Errorf("failed to get user %d 's relevant projects: %v", userID, err) s.CustomAbort(http.StatusInternalServerError, "internal error") } } projectSorter := &models.ProjectSorter{Projects: projects} sort.Sort(projectSorter) projectResult := []map[string]interface{}{} for _, p := range projects { match := true if len(keyword) > 0 && !strings.Contains(p.Name, keyword) { match = false } if match { entry := make(map[string]interface{}) entry["id"] = p.ProjectID entry["name"] = p.Name entry["public"] = p.Public projectResult = append(projectResult, entry) } } repositories, err2 := cache.GetRepoFromCache() if err2 != nil { log.Errorf("Failed to get repos from cache, error: %v", err2) s.CustomAbort(http.StatusInternalServerError, "Failed to get repositories search result") } sort.Strings(repositories) repositoryResult := filterRepositories(repositories, projects, keyword) result := &searchResult{Project: projectResult, Repository: repositoryResult} s.Data["json"] = result s.ServeJSON() }
// Prepare validates whether the user has system admin role func (pa *RepPolicyAPI) Prepare() { uid := pa.ValidateUser() var err error isAdmin, err := dao.IsAdminRole(uid) if err != nil { log.Errorf("Failed to Check if the user is admin, error: %v, uid: %d", err, uid) } if !isAdmin { pa.CustomAbort(http.StatusForbidden, "") } }
// Prepare validates the user func (t *TargetAPI) Prepare() { userID := t.ValidateUser() isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { log.Errorf("error occurred in IsAdminRole: %v", err) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } if !isSysAdmin { t.CustomAbort(http.StatusForbidden, http.StatusText(http.StatusForbidden)) } }
// Prepare validates the URL and parms func (ua *UserAPI) Prepare() { authMode := strings.ToLower(os.Getenv("AUTH_MODE")) if authMode == "" { authMode = "db_auth" } ua.AuthMode = authMode selfRegistration := strings.ToLower(os.Getenv("SELF_REGISTRATION")) if selfRegistration == "on" { ua.SelfRegistration = true } if ua.Ctx.Input.IsPost() { sessionUserID := ua.GetSession("userId") _, _, ok := ua.Ctx.Request.BasicAuth() if sessionUserID == nil && !ok { return } } ua.currentUserID = ua.ValidateUser() id := ua.Ctx.Input.Param(":id") if id == "current" { ua.userID = ua.currentUserID } else if len(id) > 0 { var err error ua.userID, err = strconv.Atoi(id) if err != nil { log.Errorf("Invalid user id, error: %v", err) ua.CustomAbort(http.StatusBadRequest, "Invalid user Id") } userQuery := models.User{UserID: ua.userID} u, err := dao.GetUser(userQuery) if err != nil { log.Errorf("Error occurred in GetUser, error: %v", err) ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } if u == nil { log.Errorf("User with Id: %d does not exist", ua.userID) ua.CustomAbort(http.StatusNotFound, "") } } var err error ua.IsAdmin, err = dao.IsAdminRole(ua.currentUserID) if err != nil { log.Errorf("Error occurred in IsAdminRole:%v", err) ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } }
// List ... func (p *ProjectAPI) List() { var projectList []models.Project projectName := p.GetString("project_name") if len(projectName) > 0 { projectName = "%" + projectName + "%" } var public int var err error isPublic := p.GetString("is_public") if len(isPublic) > 0 { public, err = strconv.Atoi(isPublic) if err != nil { log.Errorf("Error parsing public property: %v, error: %v", isPublic, err) p.CustomAbort(http.StatusBadRequest, "invalid project Id") } } isAdmin := false if public == 1 { projectList, err = dao.GetPublicProjects(projectName) } else { //if the request is not for public projects, user must login or provide credential p.userID = p.ValidateUser() isAdmin, err = dao.IsAdminRole(p.userID) if err != nil { log.Errorf("Error occured in check admin, error: %v", err) p.CustomAbort(http.StatusInternalServerError, "Internal error.") } if isAdmin { projectList, err = dao.GetAllProjects(projectName) } else { projectList, err = dao.GetUserRelevantProjects(p.userID, projectName) } } if err != nil { log.Errorf("Error occured in get projects info, error: %v", err) p.CustomAbort(http.StatusInternalServerError, "Internal error.") } for i := 0; i < len(projectList); i++ { if public != 1 { if isAdmin { projectList[i].Role = models.PROJECTADMIN } if projectList[i].Role == models.PROJECTADMIN { projectList[i].Togglable = true } } projectList[i].RepoCount = getRepoCountByProject(projectList[i].Name) } p.Data["json"] = projectList p.ServeJSON() }
// FilterAccess modify the action list in access based on permission // determine if the request needs to be authenticated. func FilterAccess(username string, authenticated bool, a *token.ResourceActions) { if a.Type == "registry" && a.Name == "catalog" { log.Infof("current access, type: %s, name:%s, actions:%v \n", a.Type, a.Name, a.Actions) return } //clear action list to assign to new acess element after perm check. a.Actions = []string{} if a.Type == "repository" { if strings.Contains(a.Name, "/") { //Only check the permission when the requested image has a namespace, i.e. project projectName := a.Name[0:strings.LastIndex(a.Name, "/")] var permission string if authenticated { isAdmin, err := dao.IsAdminRole(username) if err != nil { log.Errorf("Error occurred in IsAdminRole: %v", err) } if isAdmin { exist, err := dao.ProjectExists(projectName) if err != nil { log.Errorf("Error occurred in CheckExistProject: %v", err) return } if exist { permission = "RWM" } else { permission = "" log.Infof("project %s does not exist, set empty permission for admin\n", projectName) } } else { permission, err = dao.GetPermission(username, projectName) if err != nil { log.Errorf("Error occurred in GetPermission: %v", err) return } } } if strings.Contains(permission, "W") { a.Actions = append(a.Actions, "push") } if strings.Contains(permission, "M") { a.Actions = append(a.Actions, "*") } if strings.Contains(permission, "R") || dao.IsProjectPublic(projectName) { a.Actions = append(a.Actions, "pull") } } } log.Infof("current access, type: %s, name:%s, actions:%v \n", a.Type, a.Name, a.Actions) }
// Get total projects and repos of the user func (s *StatisticAPI) Get() { isAdmin, err := dao.IsAdminRole(s.userID) if err != nil { log.Errorf("Error occured in check admin, error: %v", err) s.CustomAbort(http.StatusInternalServerError, "Internal error.") } var projectList []models.Project if isAdmin { projectList, err = dao.GetAllProjects("") } else { projectList, err = dao.GetUserRelevantProjects(s.userID, "") } if err != nil { log.Errorf("Error occured in QueryProject, error: %v", err) s.CustomAbort(http.StatusInternalServerError, "Internal error.") } proMap := map[string]int{} proMap["my_project_count"] = 0 proMap["my_repo_count"] = 0 proMap["public_project_count"] = 0 proMap["public_repo_count"] = 0 var publicProjects []models.Project publicProjects, err = dao.GetPublicProjects("") if err != nil { log.Errorf("Error occured in QueryPublicProject, error: %v", err) s.CustomAbort(http.StatusInternalServerError, "Internal error.") } proMap["public_project_count"] = len(publicProjects) for i := 0; i < len(publicProjects); i++ { proMap["public_repo_count"] += getRepoCountByProject(publicProjects[i].Name) } if isAdmin { proMap["total_project_count"] = len(projectList) proMap["total_repo_count"] = getTotalRepoCount() } for i := 0; i < len(projectList); i++ { if isAdmin { projectList[i].Role = models.PROJECTADMIN } if projectList[i].Role == models.PROJECTADMIN || projectList[i].Role == models.DEVELOPER || projectList[i].Role == models.GUEST { proMap["my_project_count"]++ proMap["my_repo_count"] += getRepoCountByProject(projectList[i].Name) } } s.Data["json"] = proMap s.ServeJSON() }
// Get renders the add new page func (anc *AddNewController) Get() { sessionUserID := anc.GetSession("userId") anc.Data["AddNew"] = false if sessionUserID != nil { isAdmin, err := dao.IsAdminRole(sessionUserID.(int)) if err != nil { log.Errorf("Error occurred in IsAdminRole: %v", err) anc.CustomAbort(http.StatusInternalServerError, "") } if isAdmin && anc.AuthMode == "db_auth" { anc.Data["AddNew"] = true anc.Forward("page_title_add_new", "sign-up.htm") return } } anc.CustomAbort(http.StatusUnauthorized, "Status Unauthorized.") }
// Prepare validates that whether user has system admin role func (ra *RepJobAPI) Prepare() { uid := ra.ValidateUser() isAdmin, err := dao.IsAdminRole(uid) if err != nil { log.Errorf("Failed to Check if the user is admin, error: %v, uid: %d", err, uid) } if !isAdmin { ra.CustomAbort(http.StatusForbidden, "") } idStr := ra.Ctx.Input.Param(":id") if len(idStr) != 0 { id, err := strconv.ParseInt(idStr, 10, 64) if err != nil { ra.CustomAbort(http.StatusBadRequest, "ID is invalid") } ra.jobID = id } }
//sysadmin has all privileges to all projects func listRoles(userID int, projectID int64) ([]models.Role, error) { roles := make([]models.Role, 0, 1) isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { return roles, err } if isSysAdmin { role, err := dao.GetRoleByID(models.PROJECTADMIN) if err != nil { return roles, err } roles = append(roles, *role) return roles, nil } rs, err := dao.GetUserProjectRoles(userID, projectID) if err != nil { return roles, err } roles = append(roles, rs...) return roles, nil }
// Get renders optional menu, Admin user has "Add User" menu func (omc *OptionalMenuController) Get() { sessionUserID := omc.GetSession("userId") var hasLoggedIn bool var allowAddNew bool if sessionUserID != nil { hasLoggedIn = true userID := sessionUserID.(int) u, err := dao.GetUser(models.User{UserID: userID}) if err != nil { log.Errorf("Error occurred in GetUser, error: %v", err) omc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if u == nil { log.Warningf("User was deleted already, user id: %d, canceling request.", userID) omc.CustomAbort(http.StatusUnauthorized, "") } omc.Data["Username"] = u.Username isAdmin, err := dao.IsAdminRole(sessionUserID.(int)) if err != nil { log.Errorf("Error occurred in IsAdminRole: %v", err) omc.CustomAbort(http.StatusInternalServerError, "") } if isAdmin && omc.AuthMode == "db_auth" { allowAddNew = true } } omc.Data["AddNew"] = allowAddNew omc.Data["HasLoggedIn"] = hasLoggedIn omc.TplName = "optional-menu.htm" omc.Render() }