-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauth.go
67 lines (51 loc) · 1.11 KB
/
auth.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main
import (
"database/sql"
"fmt"
"net/http"
"os"
"github.com/gin-gonic/gin"
)
type AudyAuth struct {
SesCache map[string]*DBUser
}
const UserKey string = "__user_session__"
func (aa *AudyAuth) Middleware() gin.HandlerFunc {
aa.SesCache = make(map[string]*DBUser, 0)
return func(c *gin.Context) {
cookie, err := c.Cookie("session_hash")
if err == http.ErrNoCookie {
c.Set(UserKey, nil)
return
}
if _, ok := aa.SesCache[cookie]; ok {
c.Set(UserKey, aa.SesCache[cookie])
} else {
u, dberr := db.GetUserByHash(cookie)
if u != nil {
u.HasAvatar = true
u.IsRoot = config.RootUser == u.login
avatarFilePath := fmt.Sprintf("db/avatars/%v.jpg", u.ID)
if _, err = os.Stat(avatarFilePath); os.IsNotExist(err) {
u.HasAvatar = false
}
}
if dberr != nil {
if dberr.underlying != sql.ErrNoRows {
dberr.Print()
}
} else {
aa.SesCache[u.sessionHash] = u
}
c.Set(UserKey, u)
}
c.Next()
}
}
func (aa *AudyAuth) GetUser(c *gin.Context) *DBUser {
v, ok := c.Get(UserKey)
if !ok || v == nil {
return nil
}
return v.(*DBUser)
}