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

9 years ago
9 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
9 years ago
9 years ago
9 years ago
9 years ago
9 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
9 years ago
9 years ago
9 years ago
9 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
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 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. }