65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"database/sql"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"zxq.co/x/rs"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func setYCookie(userID int, c *gin.Context) {
|
|
var token string
|
|
err := db.QueryRow("SELECT token FROM identity_tokens WHERE userid = ? LIMIT 1", userID).Scan(&token)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
c.Error(err)
|
|
return
|
|
}
|
|
if token != "" {
|
|
addY(c, token)
|
|
return
|
|
}
|
|
for {
|
|
token = fmt.Sprintf("%x", sha256.Sum256([]byte(rs.String(32))))
|
|
if db.QueryRow("SELECT 1 FROM identity_tokens WHERE token = ? LIMIT 1", token).Scan(new(int)) == sql.ErrNoRows {
|
|
break
|
|
}
|
|
}
|
|
db.Exec("INSERT INTO identity_tokens(userid, token) VALUES (?, ?)", userID, token)
|
|
addY(c, token)
|
|
}
|
|
func addY(c *gin.Context, y string) {
|
|
http.SetCookie(c.Writer, &http.Cookie{
|
|
Name: "y",
|
|
Value: y,
|
|
Expires: time.Now().Add(time.Hour * 24 * 30 * 6),
|
|
})
|
|
}
|
|
|
|
func logIP(c *gin.Context, user int) {
|
|
db.Exec(`INSERT INTO ip_user (userid, ip, occurencies) VALUES (?, ?, '1')
|
|
ON DUPLICATE KEY UPDATE occurencies = occurencies + 1`, user, clientIP(c))
|
|
}
|
|
|
|
func setCountry(c *gin.Context, user int) error {
|
|
raw, err := http.Get(config.IP_API + "/" + clientIP(c) + "/country")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
data, err := ioutil.ReadAll(raw.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
country := strings.TrimSpace(string(data))
|
|
if country == "" || len(country) != 2 {
|
|
return nil
|
|
}
|
|
db.Exec("UPDATE users_stats SET country = ? WHERE id = ?", country, user)
|
|
return nil
|
|
}
|