diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2021-11-17 17:58:31 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-17 17:58:31 +0800 |
commit | 95d3266bee797cbeb7228d361fe32531737906d2 (patch) | |
tree | 68d90e7ef3e890c1ac311cf79f08cbe12a0dafca /models/user/openid.go | |
parent | adda27668b9764f97822e56e0591a6eb22165a83 (diff) | |
download | gitea-95d3266bee797cbeb7228d361fe32531737906d2.tar.gz gitea-95d3266bee797cbeb7228d361fe32531737906d2.zip |
Move user follow and openid into models/user/ (#17613)
* Move UserRedirect into models/user/
* Fix lint & test
* Fix lint
* Fix lint
* remove nolint comment
* Fix lint
* Move user follow and openid into models/user
* Ignore the lint
* Ignore the lint
* Fix test
* ignore stutters lint on UserOpenID
Diffstat (limited to 'models/user/openid.go')
-rw-r--r-- | models/user/openid.go | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/models/user/openid.go b/models/user/openid.go new file mode 100644 index 0000000000..8ca3c7f2c8 --- /dev/null +++ b/models/user/openid.go @@ -0,0 +1,112 @@ +// Copyright 2017 The Gitea 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 user + +import ( + "errors" + "fmt" + + "code.gitea.io/gitea/models/db" +) + +// ErrOpenIDNotExist openid is not known +var ErrOpenIDNotExist = errors.New("OpenID is unknown") + +// UserOpenID is the list of all OpenID identities of a user. +// Since this is a middle table, name it OpenID is not suitable, so we ignore the lint here +type UserOpenID struct { //revive:disable-line:exported + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX NOT NULL"` + URI string `xorm:"UNIQUE NOT NULL"` + Show bool `xorm:"DEFAULT false"` +} + +func init() { + db.RegisterModel(new(UserOpenID)) +} + +// GetUserOpenIDs returns all openid addresses that belongs to given user. +func GetUserOpenIDs(uid int64) ([]*UserOpenID, error) { + openids := make([]*UserOpenID, 0, 5) + if err := db.GetEngine(db.DefaultContext). + Where("uid=?", uid). + Asc("id"). + Find(&openids); err != nil { + return nil, err + } + + return openids, nil +} + +// isOpenIDUsed returns true if the openid has been used. +func isOpenIDUsed(e db.Engine, uri string) (bool, error) { + if len(uri) == 0 { + return true, nil + } + + return e.Get(&UserOpenID{URI: uri}) +} + +// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error. +type ErrOpenIDAlreadyUsed struct { + OpenID string +} + +// IsErrOpenIDAlreadyUsed checks if an error is a ErrOpenIDAlreadyUsed. +func IsErrOpenIDAlreadyUsed(err error) bool { + _, ok := err.(ErrOpenIDAlreadyUsed) + return ok +} + +func (err ErrOpenIDAlreadyUsed) Error() string { + return fmt.Sprintf("OpenID already in use [oid: %s]", err.OpenID) +} + +// NOTE: make sure openid.URI is normalized already +func addUserOpenID(e db.Engine, openid *UserOpenID) error { + used, err := isOpenIDUsed(e, openid.URI) + if err != nil { + return err + } else if used { + return ErrOpenIDAlreadyUsed{openid.URI} + } + + _, err = e.Insert(openid) + return err +} + +// AddUserOpenID adds an pre-verified/normalized OpenID URI to given user. +func AddUserOpenID(openid *UserOpenID) error { + return addUserOpenID(db.GetEngine(db.DefaultContext), openid) +} + +// DeleteUserOpenID deletes an openid address of given user. +func DeleteUserOpenID(openid *UserOpenID) (err error) { + var deleted int64 + // ask to check UID + address := UserOpenID{ + UID: openid.UID, + } + if openid.ID > 0 { + deleted, err = db.GetEngine(db.DefaultContext).ID(openid.ID).Delete(&address) + } else { + deleted, err = db.GetEngine(db.DefaultContext). + Where("openid=?", openid.URI). + Delete(&address) + } + + if err != nil { + return err + } else if deleted != 1 { + return ErrOpenIDNotExist + } + return nil +} + +// ToggleUserOpenIDVisibility toggles visibility of an openid address of given user. +func ToggleUserOpenIDVisibility(id int64) (err error) { + _, err = db.GetEngine(db.DefaultContext).Exec("update `user_open_id` set `show` = not `show` where `id` = ?", id) + return err +} |