// 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 uid, password, username 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 { uid, password, _ = request.BasicAuth() log.Debugf("uid for logging: %s", uid) user := authenticate(uid, password) if user == nil { log.Warningf("login request with invalid credentials in token service, uid: %s", uid) if len(scopes) == 0 { h.CustomAbort(http.StatusUnauthorized, "") } } else { username = user.Username } log.Debugf("username for filtering access: %s.", username) for _, a := range access { FilterAccess(username, a) } } h.serveToken(username, service, access) }
// Get ... func (ra *RepositoryAPI) Get() { projectID, err := ra.GetInt64("project_id") if err != nil || projectID <= 0 { ra.CustomAbort(http.StatusBadRequest, "invalid project_id") } page, pageSize := ra.GetPaginationParams() project, err := dao.GetProjectByID(projectID) if err != nil { log.Errorf("failed to get project %d: %v", projectID, err) ra.CustomAbort(http.StatusInternalServerError, "") } if project == nil { ra.CustomAbort(http.StatusNotFound, fmt.Sprintf("project %d not found", projectID)) } if project.Public == 0 { var userID int if svc_utils.VerifySecret(ra.Ctx.Request) { userID = 1 } else { userID = ra.ValidateUser() } if !checkProjectPermission(userID, projectID) { ra.CustomAbort(http.StatusForbidden, "") } } repositories, err := getReposByProject(project.Name, ra.GetString("q")) if err != nil { log.Errorf("failed to get repository: %v", err) ra.CustomAbort(http.StatusInternalServerError, "") } total := int64(len(repositories)) if (page-1)*pageSize > total { repositories = []string{} } else { repositories = repositories[(page-1)*pageSize:] } if page*pageSize <= total { repositories = repositories[:pageSize] } ra.SetPaginationHeader(total, page, pageSize) ra.Data["json"] = repositories ra.ServeJSON() }