gitea源码

openid.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "context"
  6. "fmt"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/modules/util"
  9. )
  10. // UserOpenID is the list of all OpenID identities of a user.
  11. // Since this is a middle table, name it OpenID is not suitable, so we ignore the lint here
  12. type UserOpenID struct { //revive:disable-line:exported
  13. ID int64 `xorm:"pk autoincr"`
  14. UID int64 `xorm:"INDEX NOT NULL"`
  15. URI string `xorm:"UNIQUE NOT NULL"`
  16. Show bool `xorm:"DEFAULT false"`
  17. }
  18. func init() {
  19. db.RegisterModel(new(UserOpenID))
  20. }
  21. // GetUserOpenIDs returns all openid addresses that belongs to given user.
  22. func GetUserOpenIDs(ctx context.Context, uid int64) ([]*UserOpenID, error) {
  23. openids := make([]*UserOpenID, 0, 5)
  24. if err := db.GetEngine(ctx).
  25. Where("uid=?", uid).
  26. Asc("id").
  27. Find(&openids); err != nil {
  28. return nil, err
  29. }
  30. return openids, nil
  31. }
  32. // isOpenIDUsed returns true if the openid has been used.
  33. func isOpenIDUsed(ctx context.Context, uri string) (bool, error) {
  34. if len(uri) == 0 {
  35. return true, nil
  36. }
  37. return db.GetEngine(ctx).Get(&UserOpenID{URI: uri})
  38. }
  39. // ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
  40. type ErrOpenIDAlreadyUsed struct {
  41. OpenID string
  42. }
  43. // IsErrOpenIDAlreadyUsed checks if an error is a ErrOpenIDAlreadyUsed.
  44. func IsErrOpenIDAlreadyUsed(err error) bool {
  45. _, ok := err.(ErrOpenIDAlreadyUsed)
  46. return ok
  47. }
  48. func (err ErrOpenIDAlreadyUsed) Error() string {
  49. return fmt.Sprintf("OpenID already in use [oid: %s]", err.OpenID)
  50. }
  51. func (err ErrOpenIDAlreadyUsed) Unwrap() error {
  52. return util.ErrAlreadyExist
  53. }
  54. // AddUserOpenID adds an pre-verified/normalized OpenID URI to given user.
  55. // NOTE: make sure openid.URI is normalized already
  56. func AddUserOpenID(ctx context.Context, openid *UserOpenID) error {
  57. used, err := isOpenIDUsed(ctx, openid.URI)
  58. if err != nil {
  59. return err
  60. } else if used {
  61. return ErrOpenIDAlreadyUsed{openid.URI}
  62. }
  63. return db.Insert(ctx, openid)
  64. }
  65. // DeleteUserOpenID deletes an openid address of given user.
  66. func DeleteUserOpenID(ctx context.Context, openid *UserOpenID) (err error) {
  67. var deleted int64
  68. // ask to check UID
  69. address := UserOpenID{
  70. UID: openid.UID,
  71. }
  72. if openid.ID > 0 {
  73. deleted, err = db.GetEngine(ctx).ID(openid.ID).Delete(&address)
  74. } else {
  75. deleted, err = db.GetEngine(ctx).
  76. Where("openid=?", openid.URI).
  77. Delete(&address)
  78. }
  79. if err != nil {
  80. return err
  81. } else if deleted != 1 {
  82. return util.NewNotExistErrorf("OpenID is unknown")
  83. }
  84. return nil
  85. }
  86. // ToggleUserOpenIDVisibility toggles visibility of an openid address of given user.
  87. func ToggleUserOpenIDVisibility(ctx context.Context, id int64) (err error) {
  88. _, err = db.GetEngine(ctx).Exec("update `user_open_id` set `show` = not `show` where `id` = ?", id)
  89. return err
  90. }