// Get handles GET request, it checks the http header for user credentials // and parse service and scope based on docker registry v2 standard, // checkes the permission agains local DB and generates jwt token. func (h *Handler) Get() { var username, password string request := h.Ctx.Request service := h.GetString("service") scopes := h.GetStrings("scope") access := GetResourceActions(scopes) log.Infof("request url: %v", request.URL.String()) if svc_utils.VerifySecret(request) { log.Debugf("Will grant all access as this request is from job service with legal secret.") username = "******" } else { username, password, _ = request.BasicAuth() authenticated := authenticate(username, password) if len(scopes) == 0 && !authenticated { log.Info("login request with invalid credentials") h.CustomAbort(http.StatusUnauthorized, "") } for _, a := range access { FilterAccess(username, authenticated, a) } } h.serveToken(username, service, access) }
// Get ... func (ra *RepositoryAPI) Get() { projectID, err := ra.GetInt64("project_id") if err != nil { log.Errorf("Failed to get project id, error: %v", err) ra.RenderError(http.StatusBadRequest, "Invalid project id") return } p, err := dao.GetProjectByID(projectID) if err != nil { log.Errorf("Error occurred in GetProjectById, error: %v", err) ra.CustomAbort(http.StatusInternalServerError, "Internal error.") } if p == nil { log.Warningf("Project with Id: %d does not exist", projectID) ra.RenderError(http.StatusNotFound, "") return } if p.Public == 0 { var userID int if svc_utils.VerifySecret(ra.Ctx.Request) { userID = 1 } else { userID = ra.ValidateUser() } if !checkProjectPermission(userID, projectID) { ra.RenderError(http.StatusForbidden, "") return } } repoList, err := cache.GetRepoFromCache() if err != nil { log.Errorf("Failed to get repo from cache, error: %v", err) ra.RenderError(http.StatusInternalServerError, "internal sever error") } projectName := p.Name q := ra.GetString("q") var resp []string if len(q) > 0 { for _, r := range repoList { if strings.Contains(r, "/") && strings.Contains(r[strings.LastIndex(r, "/")+1:], q) && r[0:strings.LastIndex(r, "/")] == projectName { resp = append(resp, r) } } ra.Data["json"] = resp } else if len(projectName) > 0 { for _, r := range repoList { if strings.Contains(r, "/") && r[0:strings.LastIndex(r, "/")] == projectName { resp = append(resp, r) } } ra.Data["json"] = resp } else { ra.Data["json"] = repoList } ra.ServeJSON() }