aboutsummaryrefslogtreecommitdiffhomepage
path: root/storage/user.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2017-11-22 22:22:33 -0800
committerGravatar Frédéric Guillot <fred@miniflux.net>2017-11-22 22:22:33 -0800
commitcc6d272eb7719bcca02c7f36a1badbeecb153759 (patch)
tree2fd6e92dcaa19faccfc25ff67499abcc6dabbaaf /storage/user.go
parent9877051f12621aa71daad520caa2847c47c746f8 (diff)
Add OAuth2 authentication
Diffstat (limited to 'storage/user.go')
-rw-r--r--storage/user.go44
1 files changed, 36 insertions, 8 deletions
diff --git a/storage/user.go b/storage/user.go
index 736f7ac..caffc3b 100644
--- a/storage/user.go
+++ b/storage/user.go
@@ -8,11 +8,14 @@ import (
"database/sql"
"errors"
"fmt"
- "github.com/miniflux/miniflux2/helper"
- "github.com/miniflux/miniflux2/model"
"strings"
"time"
+ "github.com/lib/pq/hstore"
+
+ "github.com/miniflux/miniflux2/helper"
+ "github.com/miniflux/miniflux2/model"
+
"golang.org/x/crypto/bcrypt"
)
@@ -43,16 +46,26 @@ func (s *Storage) AnotherUserExists(userID int64, username string) bool {
return result >= 1
}
-func (s *Storage) CreateUser(user *model.User) error {
+func (s *Storage) CreateUser(user *model.User) (err error) {
defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:CreateUser] username=%s", user.Username))
+ password := ""
+ extra := hstore.Hstore{Map: make(map[string]sql.NullString)}
- password, err := hashPassword(user.Password)
- if err != nil {
- return err
+ if user.Password != "" {
+ password, err = hashPassword(user.Password)
+ if err != nil {
+ return err
+ }
}
- query := "INSERT INTO users (username, password, is_admin) VALUES ($1, $2, $3) RETURNING id"
- err = s.db.QueryRow(query, strings.ToLower(user.Username), password, user.IsAdmin).Scan(&user.ID)
+ if len(user.Extra) > 0 {
+ for key, value := range user.Extra {
+ extra.Map[key] = sql.NullString{String: value, Valid: true}
+ }
+ }
+
+ query := "INSERT INTO users (username, password, is_admin, extra) VALUES ($1, $2, $3, $4) RETURNING id"
+ err = s.db.QueryRow(query, strings.ToLower(user.Username), password, user.IsAdmin, extra).Scan(&user.ID)
if err != nil {
return fmt.Errorf("unable to create user: %v", err)
}
@@ -117,6 +130,21 @@ func (s *Storage) GetUserByUsername(username string) (*model.User, error) {
return &user, nil
}
+func (s *Storage) GetUserByExtraField(field, value string) (*model.User, error) {
+ defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:GetUserByExtraField] field=%s", field))
+ var user model.User
+ query := `SELECT id, username, is_admin, theme, language, timezone FROM users WHERE extra->$1=$2`
+ row := s.db.QueryRow(query, field, value)
+ err := row.Scan(&user.ID, &user.Username, &user.IsAdmin, &user.Theme, &user.Language, &user.Timezone)
+ if err == sql.ErrNoRows {
+ return nil, nil
+ } else if err != nil {
+ return nil, fmt.Errorf("unable to fetch user: %v", err)
+ }
+
+ return &user, nil
+}
+
func (s *Storage) RemoveUser(userID int64) error {
defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:RemoveUser] userID=%d", userID))