reprogl

Форк
0
/
common.go 
103 строки · 2.4 Кб
1
package handlers
2

3
import (
4
	"context"
5
	"crypto/rand"
6
	"encoding/base64"
7
	"encoding/json"
8
	"fmt"
9
	"net/http"
10
	"regexp"
11
	"strconv"
12
	"strings"
13
	"time"
14

15
	"xelbot.com/reprogl/container"
16
	"xelbot.com/reprogl/models"
17
	"xelbot.com/reprogl/models/repositories"
18
	"xelbot.com/reprogl/security"
19
	"xelbot.com/reprogl/session"
20
)
21

22
func pageOrRedirect(pageString string) (int, bool) {
23
	var page int
24

25
	if pageString == "1" {
26
		return 1, true
27
	} else if pageString == "" {
28
		page = 1
29
	} else {
30
		page, _ = strconv.Atoi(pageString)
31
	}
32

33
	return page, false
34
}
35

36
func doESI(w http.ResponseWriter) {
37
	w.Header().Set("Surrogate-Control", "content=\"ESI/1.0\"")
38
}
39

40
func cacheControl(w http.ResponseWriter, age int) {
41
	w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%d", age))
42
}
43

44
func setExpires(w http.ResponseWriter, t time.Time) {
45
	t = t.In(time.UTC)
46
	w.Header().Set("Expires", fmt.Sprintf("%s GMT", t.Format("Mon, 02 Jan 2006 15:04:05")))
47
}
48

49
func jsonResponse(w http.ResponseWriter, statusCode int, data any) {
50
	w.Header().Set("Content-Type", "application/json")
51
	if statusCode != http.StatusOK {
52
		w.WriteHeader(statusCode)
53
	}
54

55
	jsonResult, _ := json.Marshal(data)
56
	w.Write(jsonResult)
57
}
58

59
func generateRandomToken() string {
60
	nonce := make([]byte, 18)
61
	_, err := rand.Read(nonce)
62
	if err != nil {
63
		panic(err)
64
	}
65

66
	return base64.URLEncoding.EncodeToString(nonce)
67
}
68

69
func authSuccess(user *models.LoggedUser, app *container.Application, ip string, ctx context.Context) {
70
	session.SetIdentity(ctx, security.CreateIdentity(user))
71

72
	repo := repositories.UserRepository{DB: app.DB}
73
	if err := repo.SaveLoginEvent(user.ID, ip); err != nil {
74
		app.LogError(err)
75
	}
76
}
77

78
func saveLoginReferer(w http.ResponseWriter, r *http.Request) {
79
	if _, errNoCookie := r.Cookie(session.RefererCookie); errNoCookie == nil {
80
		return
81
	}
82

83
	host := strings.ReplaceAll(container.GetConfig().Host, ".", "\\.")
84
	matches := regexp.MustCompile(`^https?:\/\/` + host + `(.*)$`).FindStringSubmatch(r.Referer())
85
	if matches != nil && matches[1] != "/login" && !strings.HasPrefix(matches[1], "/oauth") {
86
		session.WriteSessionCookie(w, session.RefererCookie, matches[1], "/")
87
	}
88
}
89

90
func popLoginReferer(w http.ResponseWriter, r *http.Request) (redirectUrl string, found bool) {
91
	if cookie, errNoCookie := r.Cookie(session.RefererCookie); errNoCookie == nil {
92
		redirectUrl = cookie.Value
93
		found = true
94

95
		deleteRefererCookie(w)
96
	}
97

98
	return
99
}
100

101
func deleteRefererCookie(w http.ResponseWriter) {
102
	session.DeleteCookie(w, session.RefererCookie, "/")
103
}
104

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.