summaryrefslogtreecommitdiffstats
path: root/lib/web.go
blob: 191d2f2458bc1c56cce8ad44b7520e6260d13ce8 (plain) (blame)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright © 2020 rsiddharth <s@ricketyspace.net>
// SPDX-License-Identifier: ISC

package lib

import "crypto/rand"

type Profile map[string]string

var webSessionEncryptionKey []byte = make([]byte, 16)
var webUidCounter int64
var webUserProfiles map[string]Profile = make(map[string]Profile, 0)

func init() {
	_, err := rand.Read(webSessionEncryptionKey)
	if err != nil {
		panic(err)
	}
	webUidCounter = 10000
}

func WebGenUid() int64 {
	uid := webUidCounter
	webUidCounter += 1

	return uid
}

func WebParseKeyValue(encoded string) map[string]string {
	m := make(map[string]string, 0)

	kvs := StrSplitAt('&', encoded)
	for i := 0; i < len(kvs); i++ {
		kv := StrSplitAt('=', kvs[i])
		m[StripSpaceChars(kv[0])] = kv[1]
	}
	return m
}

func WebProfileFor(email string) string {
	e := WebSanitizeEmail(email)
	if len(e) == 0 {
		panic("email invalid")
	}

	if p, ok := webUserProfiles[e]; ok {
		// Profile already exists.
		return WebEncodeProfile(p)
	}

	// Create profile.
	p := make(Profile, 0)
	p["email"] = e
	p["uid"] = NumToStr(WebGenUid())
	p["role"] = "user"
	webUserProfiles[e] = p

	return WebEncodeProfile(p)
}

func WebEncodeProfile(p Profile) string {
	ep := "email=" + p["email"] // Encoded profile.
	ep += "&uid=" + p["uid"]
	ep += "&role=" + p["role"]
	return ep
}

func WebDecodeProfile(encoded string) Profile {
	return WebParseKeyValue(encoded)
}

func WebEncryptProfile(encoded string) []byte {
	return AESEncryptECB(StrToBytes(encoded), webSessionEncryptionKey)
}

func WebDecryptProfile(cipher []byte) string {
	return BytesToStr(AESDecryptECB(cipher, webSessionEncryptionKey))
}

func WebSanitizeEmail(email string) string {
	if len(email) < 1 {
		return ""
	}
	se := "" // sanitized email

	// Strip meta characters
	for i := 0; i < len(email); i++ {
		if email[i] == '&' || email[i] == '=' {
			continue
		}
		se += string(email[i])
	}
	return se
}