44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
0
|
// Copyright (C) 2025, Jakob Wakeling |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
1
|
// All rights reserved. |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
2
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
3
|
package user |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
4
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
5
|
import ( |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
6
|
"fmt" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
7
|
"html/template" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
8
|
"net/http" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
9
|
"strconv" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
10
|
"strings" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
11
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
12
|
"github.com/Jamozed/Goit/src/goit" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
13
|
"github.com/Jamozed/Goit/src/util" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
14
|
"github.com/gorilla/csrf" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
15
|
"golang.org/x/crypto/ssh" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
16
|
) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
17
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
18
|
func HandleKeys(w http.ResponseWriter, r *http.Request) { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
19
|
auth, user, err := goit.Auth(w, r, true) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
20
|
if err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
21
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
22
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
23
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
24
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
25
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
26
|
if !auth { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
27
|
goit.HttpError(w, http.StatusUnauthorized) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
28
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
29
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
30
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
31
|
data := struct { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
32
|
Title string |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
33
|
Keys []goit.Key |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
34
|
KeyLines []string |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
35
|
CSRFField template.HTML |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
36
|
}{ |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
37
|
Title: "User - Keys", |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
38
|
CSRFField: csrf.TemplateField(r), |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
39
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
40
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
41
|
if r.Method == http.MethodPost { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
42
|
fmt.Println(r.FormValue("submit")) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
43
|
if r.FormValue("submit") == "Delete" { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
44
|
kid, err := strconv.ParseInt(r.FormValue("kid"), 10, 64) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
45
|
if err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
46
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
47
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
48
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
49
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
50
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
51
|
if err := goit.DelKey(kid); err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
52
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
53
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
54
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
55
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
56
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
57
|
/* Redirect to user keys page on success. */ |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
58
|
http.Redirect(w, r, "/user/keys", http.StatusFound) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
59
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
60
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
61
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
62
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
63
|
if keys, err := goit.GetKeys(user.Id); err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
64
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
65
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
66
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
67
|
} else { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
68
|
data.Keys = keys |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
69
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
70
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
71
|
for _, key := range data.Keys { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
72
|
k, err := ssh.ParsePublicKey(key.Key) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
73
|
if err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
74
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
75
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
76
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
77
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
78
|
data.KeyLines = append(data.KeyLines, strings.TrimSuffix(string(ssh.MarshalAuthorizedKey(k)), "\n")) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
79
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
80
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
81
|
if err := goit.Tmpl.ExecuteTemplate(w, "user/keys", data); err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
82
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
83
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
84
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
85
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
86
|
func HandleKeysAdd(w http.ResponseWriter, r *http.Request) { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
87
|
auth, user, err := goit.Auth(w, r, true) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
88
|
if err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
89
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
90
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
91
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
92
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
93
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
94
|
if !auth { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
95
|
goit.HttpError(w, http.StatusUnauthorized) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
96
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
97
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
98
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
99
|
data := struct { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
100
|
Title, Message string |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
101
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
102
|
Form struct{ Key string } |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
103
|
CSRFField template.HTML |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
104
|
}{ |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
105
|
Title: "User - Add Key", |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
106
|
CSRFField: csrf.TemplateField(r), |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
107
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
108
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
109
|
if r.Method == http.MethodPost { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
110
|
data.Form.Key = r.FormValue("key") |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
111
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
112
|
if data.Form.Key == "" { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
113
|
data.Message = "Key cannot be empty" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
114
|
} else if key, comment, options, _, err := ssh.ParseAuthorizedKey([]byte(data.Form.Key)); err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
115
|
data.Message = "Invalid SSH public key" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
116
|
} else if len(options) != 0 { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
117
|
data.Message = "Key options are not permitted" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
118
|
} else if comment == "" { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
119
|
data.Message = "Key comment is required" |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
120
|
} else if err := goit.AddKey(goit.Key{ |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
121
|
OwnerID: user.Id, Description: comment, Key: key.Marshal(), Type: goit.SSH_Auth, |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
122
|
}); err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
123
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
124
|
goit.HttpError(w, http.StatusInternalServerError) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
125
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
126
|
} else { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
127
|
/* Redirect to user keys page on success. */ |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
128
|
http.Redirect(w, r, "/user/keys", http.StatusFound) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
129
|
return |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
130
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
131
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
132
|
|
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
133
|
if err := goit.Tmpl.ExecuteTemplate(w, "user/keys/add", data); err != nil { |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
134
|
util.PrintFuncError(err) |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
135
|
} |
44175af |
Jakob Wakeling |
2025-01-03 15:33:07 |
136
|
} |
|
|
|
137
|
|