You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

key.go 7.6 kB

10 years ago
10 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
10 years ago
10 years ago
10 years ago
10 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package user
  5. import (
  6. "net/http"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/convert"
  10. "code.gitea.io/gitea/modules/setting"
  11. api "code.gitea.io/gitea/modules/structs"
  12. "code.gitea.io/gitea/routers/api/v1/repo"
  13. "code.gitea.io/gitea/routers/api/v1/utils"
  14. )
  15. // appendPrivateInformation appends the owner and key type information to api.PublicKey
  16. func appendPrivateInformation(apiKey *api.PublicKey, key *models.PublicKey, defaultUser *models.User) (*api.PublicKey, error) {
  17. if key.Type == models.KeyTypeDeploy {
  18. apiKey.KeyType = "deploy"
  19. } else if key.Type == models.KeyTypeUser {
  20. apiKey.KeyType = "user"
  21. if defaultUser.ID == key.OwnerID {
  22. apiKey.Owner = convert.ToUser(defaultUser, true, true)
  23. } else {
  24. user, err := models.GetUserByID(key.OwnerID)
  25. if err != nil {
  26. return apiKey, err
  27. }
  28. apiKey.Owner = convert.ToUser(user, true, true)
  29. }
  30. } else {
  31. apiKey.KeyType = "unknown"
  32. }
  33. apiKey.ReadOnly = key.Mode == models.AccessModeRead
  34. return apiKey, nil
  35. }
  36. // GetUserByParamsName get user by name
  37. func GetUserByParamsName(ctx *context.APIContext, name string) *models.User {
  38. user, err := models.GetUserByName(ctx.Params(name))
  39. if err != nil {
  40. if models.IsErrUserNotExist(err) {
  41. ctx.NotFound()
  42. } else {
  43. ctx.Error(http.StatusInternalServerError, "GetUserByName", err)
  44. }
  45. return nil
  46. }
  47. return user
  48. }
  49. // GetUserByParams returns user whose name is presented in URL paramenter.
  50. func GetUserByParams(ctx *context.APIContext) *models.User {
  51. return GetUserByParamsName(ctx, ":username")
  52. }
  53. func composePublicKeysAPILink() string {
  54. return setting.AppURL + "api/v1/user/keys/"
  55. }
  56. func listPublicKeys(ctx *context.APIContext, user *models.User) {
  57. var keys []*models.PublicKey
  58. var err error
  59. fingerprint := ctx.Query("fingerprint")
  60. username := ctx.Params("username")
  61. if fingerprint != "" {
  62. // Querying not just listing
  63. if username != "" {
  64. // Restrict to provided uid
  65. keys, err = models.SearchPublicKey(user.ID, fingerprint)
  66. } else {
  67. // Unrestricted
  68. keys, err = models.SearchPublicKey(0, fingerprint)
  69. }
  70. } else {
  71. // Use ListPublicKeys
  72. keys, err = models.ListPublicKeys(user.ID, utils.GetListOptions(ctx))
  73. }
  74. if err != nil {
  75. ctx.Error(http.StatusInternalServerError, "ListPublicKeys", err)
  76. return
  77. }
  78. apiLink := composePublicKeysAPILink()
  79. apiKeys := make([]*api.PublicKey, len(keys))
  80. for i := range keys {
  81. apiKeys[i] = convert.ToPublicKey(apiLink, keys[i])
  82. if ctx.User.IsAdmin || ctx.User.ID == keys[i].OwnerID {
  83. apiKeys[i], _ = appendPrivateInformation(apiKeys[i], keys[i], user)
  84. }
  85. }
  86. ctx.JSON(http.StatusOK, &apiKeys)
  87. }
  88. // ListMyPublicKeys list all of the authenticated user's public keys
  89. func ListMyPublicKeys(ctx *context.APIContext) {
  90. // swagger:operation GET /user/keys user userCurrentListKeys
  91. // ---
  92. // summary: List the authenticated user's public keys
  93. // parameters:
  94. // - name: fingerprint
  95. // in: query
  96. // description: fingerprint of the key
  97. // type: string
  98. // - name: page
  99. // in: query
  100. // description: page number of results to return (1-based)
  101. // type: integer
  102. // - name: limit
  103. // in: query
  104. // description: page size of results, maximum page size is 50
  105. // type: integer
  106. // produces:
  107. // - application/json
  108. // responses:
  109. // "200":
  110. // "$ref": "#/responses/PublicKeyList"
  111. listPublicKeys(ctx, ctx.User)
  112. }
  113. // ListPublicKeys list the given user's public keys
  114. func ListPublicKeys(ctx *context.APIContext) {
  115. // swagger:operation GET /users/{username}/keys user userListKeys
  116. // ---
  117. // summary: List the given user's public keys
  118. // produces:
  119. // - application/json
  120. // parameters:
  121. // - name: username
  122. // in: path
  123. // description: username of user
  124. // type: string
  125. // required: true
  126. // - name: fingerprint
  127. // in: query
  128. // description: fingerprint of the key
  129. // type: string
  130. // - name: page
  131. // in: query
  132. // description: page number of results to return (1-based)
  133. // type: integer
  134. // - name: limit
  135. // in: query
  136. // description: page size of results, maximum page size is 50
  137. // type: integer
  138. // responses:
  139. // "200":
  140. // "$ref": "#/responses/PublicKeyList"
  141. user := GetUserByParams(ctx)
  142. if ctx.Written() {
  143. return
  144. }
  145. listPublicKeys(ctx, user)
  146. }
  147. // GetPublicKey get a public key
  148. func GetPublicKey(ctx *context.APIContext) {
  149. // swagger:operation GET /user/keys/{id} user userCurrentGetKey
  150. // ---
  151. // summary: Get a public key
  152. // produces:
  153. // - application/json
  154. // parameters:
  155. // - name: id
  156. // in: path
  157. // description: id of key to get
  158. // type: integer
  159. // format: int64
  160. // required: true
  161. // responses:
  162. // "200":
  163. // "$ref": "#/responses/PublicKey"
  164. // "404":
  165. // "$ref": "#/responses/notFound"
  166. key, err := models.GetPublicKeyByID(ctx.ParamsInt64(":id"))
  167. if err != nil {
  168. if models.IsErrKeyNotExist(err) {
  169. ctx.NotFound()
  170. } else {
  171. ctx.Error(http.StatusInternalServerError, "GetPublicKeyByID", err)
  172. }
  173. return
  174. }
  175. apiLink := composePublicKeysAPILink()
  176. apiKey := convert.ToPublicKey(apiLink, key)
  177. if ctx.User.IsAdmin || ctx.User.ID == key.OwnerID {
  178. apiKey, _ = appendPrivateInformation(apiKey, key, ctx.User)
  179. }
  180. ctx.JSON(http.StatusOK, apiKey)
  181. }
  182. // CreateUserPublicKey creates new public key to given user by ID.
  183. func CreateUserPublicKey(ctx *context.APIContext, form api.CreateKeyOption, uid int64) {
  184. content, err := models.CheckPublicKeyString(form.Key)
  185. if err != nil {
  186. repo.HandleCheckKeyStringError(ctx, err)
  187. return
  188. }
  189. key, err := models.AddPublicKey(uid, form.Title, content, 0)
  190. if err != nil {
  191. repo.HandleAddKeyError(ctx, err)
  192. return
  193. }
  194. apiLink := composePublicKeysAPILink()
  195. apiKey := convert.ToPublicKey(apiLink, key)
  196. if ctx.User.IsAdmin || ctx.User.ID == key.OwnerID {
  197. apiKey, _ = appendPrivateInformation(apiKey, key, ctx.User)
  198. }
  199. ctx.JSON(http.StatusCreated, apiKey)
  200. }
  201. // CreatePublicKey create one public key for me
  202. func CreatePublicKey(ctx *context.APIContext, form api.CreateKeyOption) {
  203. // swagger:operation POST /user/keys user userCurrentPostKey
  204. // ---
  205. // summary: Create a public key
  206. // consumes:
  207. // - application/json
  208. // produces:
  209. // - application/json
  210. // parameters:
  211. // - name: body
  212. // in: body
  213. // schema:
  214. // "$ref": "#/definitions/CreateKeyOption"
  215. // responses:
  216. // "201":
  217. // "$ref": "#/responses/PublicKey"
  218. // "422":
  219. // "$ref": "#/responses/validationError"
  220. CreateUserPublicKey(ctx, form, ctx.User.ID)
  221. }
  222. // DeletePublicKey delete one public key
  223. func DeletePublicKey(ctx *context.APIContext) {
  224. // swagger:operation DELETE /user/keys/{id} user userCurrentDeleteKey
  225. // ---
  226. // summary: Delete a public key
  227. // produces:
  228. // - application/json
  229. // parameters:
  230. // - name: id
  231. // in: path
  232. // description: id of key to delete
  233. // type: integer
  234. // format: int64
  235. // required: true
  236. // responses:
  237. // "204":
  238. // "$ref": "#/responses/empty"
  239. // "403":
  240. // "$ref": "#/responses/forbidden"
  241. // "404":
  242. // "$ref": "#/responses/notFound"
  243. if err := models.DeletePublicKey(ctx.User, ctx.ParamsInt64(":id")); err != nil {
  244. if models.IsErrKeyNotExist(err) {
  245. ctx.NotFound()
  246. } else if models.IsErrKeyAccessDenied(err) {
  247. ctx.Error(http.StatusForbidden, "", "You do not have access to this key")
  248. } else {
  249. ctx.Error(http.StatusInternalServerError, "DeletePublicKey", err)
  250. }
  251. return
  252. }
  253. ctx.Status(http.StatusNoContent)
  254. }