* remove ReplaceLeft * remove GetRepositoryByOwnerAndName chainload to models.GetRepositoryByOwnerAndName * remove CheckUnitUser chainload to models.CheckUnitUser * remove MakeAssigneeList * remove DownloadDiff & DownloadPatch -> DownloadDiffOrPatch * remove GetRandomBytesAsBase64 * remove PushUpdateDeleteTags * remove GetUserByKeyID (you still can resolve user by "k, err := GetPublicKeyByID; userID := k.OwnerID") * remove BasicAuthEncode from struct package -> same function in modules/base/tools ! * remove UserID from api.utils * remove unused func from structs packagetags/v1.10.5
return e.Get(&IssueAssignees{IssueID: issue.ID, AssigneeID: user.ID}) | return e.Get(&IssueAssignees{IssueID: issue.ID, AssigneeID: user.ID}) | ||||
} | } | ||||
// MakeAssigneeList concats a string with all names of the assignees. Useful for logs. | |||||
func MakeAssigneeList(issue *Issue) (assigneeList string, err error) { | |||||
err = issue.loadAssignees(x) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
for in, assignee := range issue.Assignees { | |||||
assigneeList += assignee.Name | |||||
if len(issue.Assignees) > (in + 1) { | |||||
assigneeList += ", " | |||||
} | |||||
} | |||||
return | |||||
} | |||||
// ClearAssigneeByUserID deletes all assignments of an user | // ClearAssigneeByUserID deletes all assignments of an user | ||||
func clearAssigneeByUserID(sess *xorm.Session, userID int64) (err error) { | func clearAssigneeByUserID(sess *xorm.Session, userID int64) (err error) { | ||||
_, err = sess.Delete(&IssueAssignees{AssigneeID: userID}) | _, err = sess.Delete(&IssueAssignees{AssigneeID: userID}) |
"strings" | "strings" | ||||
) | ) | ||||
// PushUpdateDeleteTags updates a number of delete tags | |||||
func PushUpdateDeleteTags(repo *Repository, tags []string) error { | |||||
sess := x.NewSession() | |||||
defer sess.Close() | |||||
if err := sess.Begin(); err != nil { | |||||
return fmt.Errorf("Unable to begin sess in PushUpdateDeleteTags: %v", err) | |||||
} | |||||
if err := pushUpdateDeleteTags(sess, repo, tags); err != nil { | |||||
return err | |||||
} | |||||
return sess.Commit() | |||||
} | |||||
// PushUpdateDeleteTagsContext updates a number of delete tags with context | // PushUpdateDeleteTagsContext updates a number of delete tags with context | ||||
func PushUpdateDeleteTagsContext(ctx DBContext, repo *Repository, tags []string) error { | func PushUpdateDeleteTagsContext(ctx DBContext, repo *Repository, tags []string) error { | ||||
return pushUpdateDeleteTags(ctx.e, repo, tags) | return pushUpdateDeleteTags(ctx.e, repo, tags) |
return filepath.Join(setting.RepoRootPath, strings.ToLower(userName)) | return filepath.Join(setting.RepoRootPath, strings.ToLower(userName)) | ||||
} | } | ||||
// GetUserByKeyID get user information by user's public key id | |||||
func GetUserByKeyID(keyID int64) (*User, error) { | |||||
var user User | |||||
has, err := x.Join("INNER", "public_key", "`public_key`.owner_id = `user`.id"). | |||||
Where("`public_key`.id=?", keyID). | |||||
Get(&user) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if !has { | |||||
return nil, ErrUserNotExist{0, "", keyID} | |||||
} | |||||
return &user, nil | |||||
} | |||||
func getUserByID(e Engine, id int64) (*User, error) { | func getUserByID(e Engine, id int64) (*User, error) { | ||||
u := new(User) | u := new(User) | ||||
has, err := e.ID(id).Get(u) | has, err := e.ID(id).Get(u) |
import ( | import ( | ||||
"crypto/md5" | "crypto/md5" | ||||
"crypto/rand" | |||||
"crypto/sha1" | "crypto/sha1" | ||||
"crypto/sha256" | "crypto/sha256" | ||||
"encoding/base64" | "encoding/base64" | ||||
"encoding/hex" | "encoding/hex" | ||||
"fmt" | "fmt" | ||||
"io" | |||||
"net/http" | "net/http" | ||||
"net/url" | "net/url" | ||||
"os" | "os" | ||||
return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) | return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) | ||||
} | } | ||||
// GetRandomBytesAsBase64 generates a random base64 string from n bytes | |||||
func GetRandomBytesAsBase64(n int) string { | |||||
bytes := make([]byte, 32) | |||||
_, err := io.ReadFull(rand.Reader, bytes) | |||||
if err != nil { | |||||
log.Fatal("Error reading random bytes: %v", err) | |||||
} | |||||
return base64.RawURLEncoding.EncodeToString(bytes) | |||||
} | |||||
// VerifyTimeLimitCode verify time limit code | // VerifyTimeLimitCode verify time limit code | ||||
func VerifyTimeLimitCode(data string, minutes int, code string) bool { | func VerifyTimeLimitCode(data string, minutes int, code string) bool { | ||||
if len(code) <= 18 { | if len(code) <= 18 { |
package structs | package structs | ||||
import ( | import ( | ||||
"encoding/base64" | |||||
"time" | "time" | ||||
) | ) | ||||
// BasicAuthEncode generate base64 of basic auth head | |||||
func BasicAuthEncode(user, pass string) string { | |||||
return base64.StdEncoding.EncodeToString([]byte(user + ":" + pass)) | |||||
} | |||||
// AccessToken represents an API access token. | // AccessToken represents an API access token. | ||||
// swagger:response AccessToken | // swagger:response AccessToken | ||||
type AccessToken struct { | type AccessToken struct { |
// Copyright 2015 The Gogs Authors. All rights reserved. | |||||
// Use of this source code is governed by a MIT-style | |||||
// license that can be found in the LICENSE file. | |||||
package structs | |||||
// Bool return address of bool value | |||||
func Bool(v bool) *bool { | |||||
return &v | |||||
} | |||||
// String return address of string value | |||||
func String(v string) *string { | |||||
return &v | |||||
} | |||||
// Int64 return address of int64 value | |||||
func Int64(v int64) *int64 { | |||||
return &v | |||||
} |
return base.EncodeSha1(str) | return base.EncodeSha1(str) | ||||
} | } | ||||
// ReplaceLeft replaces all prefixes 'oldS' in 's' with 'newS'. | |||||
func ReplaceLeft(s, oldS, newS string) string { | |||||
oldLen, newLen, i, n := len(oldS), len(newS), 0, 0 | |||||
for ; i < len(s) && strings.HasPrefix(s[i:], oldS); n++ { | |||||
i += oldLen | |||||
} | |||||
// simple optimization | |||||
if n == 0 { | |||||
return s | |||||
} | |||||
// allocating space for the new string | |||||
curLen := n*newLen + len(s[i:]) | |||||
replacement := make([]byte, curLen) | |||||
j := 0 | |||||
for ; j < n*newLen; j += newLen { | |||||
copy(replacement[j:j+newLen], newS) | |||||
} | |||||
copy(replacement[j:], s[i:]) | |||||
return string(replacement) | |||||
} | |||||
// RenderCommitMessage renders commit message with XSS-safe and special links. | // RenderCommitMessage renders commit message with XSS-safe and special links. | ||||
func RenderCommitMessage(msg, urlPrefix string, metas map[string]string) template.HTML { | func RenderCommitMessage(msg, urlPrefix string, metas map[string]string) template.HTML { | ||||
return RenderCommitMessageLink(msg, urlPrefix, "", metas) | return RenderCommitMessageLink(msg, urlPrefix, "", metas) |
"code.gitea.io/gitea/modules/convert" | "code.gitea.io/gitea/modules/convert" | ||||
) | ) | ||||
// UserID user ID of authenticated user, or 0 if not authenticated | |||||
func UserID(ctx *context.APIContext) int64 { | |||||
if ctx.User == nil { | |||||
return 0 | |||||
} | |||||
return ctx.User.ID | |||||
} | |||||
// GetQueryBeforeSince return parsed time (unix format) from URL query's before and since | // GetQueryBeforeSince return parsed time (unix format) from URL query's before and since | ||||
func GetQueryBeforeSince(ctx *context.APIContext) (before, since int64, err error) { | func GetQueryBeforeSince(ctx *context.APIContext) (before, since int64, err error) { | ||||
qCreatedBefore := strings.Trim(ctx.Query("before"), " ") | qCreatedBefore := strings.Trim(ctx.Query("before"), " ") |
import ( | import ( | ||||
"strings" | "strings" | ||||
"code.gitea.io/gitea/models" | |||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
"code.gitea.io/gitea/modules/private" | "code.gitea.io/gitea/modules/private" | ||||
"code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
} | } | ||||
} | } | ||||
//GetRepositoryByOwnerAndName chainload to models.GetRepositoryByOwnerAndName | |||||
func GetRepositoryByOwnerAndName(ctx *macaron.Context) { | |||||
//TODO use repo.Get(ctx *context.APIContext) ? | |||||
ownerName := ctx.Params(":owner") | |||||
repoName := ctx.Params(":repo") | |||||
repo, err := models.GetRepositoryByOwnerAndName(ownerName, repoName) | |||||
if err != nil { | |||||
ctx.JSON(500, map[string]interface{}{ | |||||
"err": err.Error(), | |||||
}) | |||||
return | |||||
} | |||||
ctx.JSON(200, repo) | |||||
} | |||||
//CheckUnitUser chainload to models.CheckUnitUser | |||||
func CheckUnitUser(ctx *macaron.Context) { | |||||
repoID := ctx.ParamsInt64(":repoid") | |||||
userID := ctx.ParamsInt64(":userid") | |||||
repo, err := models.GetRepositoryByID(repoID) | |||||
if err != nil { | |||||
ctx.JSON(500, map[string]interface{}{ | |||||
"err": err.Error(), | |||||
}) | |||||
return | |||||
} | |||||
var user *models.User | |||||
if userID > 0 { | |||||
user, err = models.GetUserByID(userID) | |||||
if err != nil { | |||||
ctx.JSON(500, map[string]interface{}{ | |||||
"err": err.Error(), | |||||
}) | |||||
return | |||||
} | |||||
} | |||||
perm, err := models.GetUserRepoPermission(repo, user) | |||||
if err != nil { | |||||
ctx.JSON(500, map[string]interface{}{ | |||||
"err": err.Error(), | |||||
}) | |||||
return | |||||
} | |||||
ctx.JSON(200, perm.UnitAccessMode(models.UnitType(ctx.QueryInt("unitType")))) | |||||
} | |||||
// RegisterRoutes registers all internal APIs routes to web application. | // RegisterRoutes registers all internal APIs routes to web application. | ||||
// These APIs will be invoked by internal commands for example `gitea serv` and etc. | // These APIs will be invoked by internal commands for example `gitea serv` and etc. | ||||
func RegisterRoutes(m *macaron.Macaron) { | func RegisterRoutes(m *macaron.Macaron) { |
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
) | ) | ||||
// DownloadDiff will write the patch for the pr to the writer | |||||
func DownloadDiff(pr *models.PullRequest, w io.Writer, patch bool) error { | |||||
return DownloadDiffOrPatch(pr, w, false) | |||||
} | |||||
// DownloadPatch will write the patch for the pr to the writer | |||||
func DownloadPatch(pr *models.PullRequest, w io.Writer, patch bool) error { | |||||
return DownloadDiffOrPatch(pr, w, true) | |||||
} | |||||
// DownloadDiffOrPatch will write the patch for the pr to the writer | // DownloadDiffOrPatch will write the patch for the pr to the writer | ||||
func DownloadDiffOrPatch(pr *models.PullRequest, w io.Writer, patch bool) error { | func DownloadDiffOrPatch(pr *models.PullRequest, w io.Writer, patch bool) error { | ||||
// Clone base repo. | // Clone base repo. |