Goit

Simple and lightweight Git web server
git clone https://git.omkov.net/Goit
git clone [email protected]:Goit
Log | Tree | Refs | README | Download

Goit/src/user/keys.go (138 lines, 3.2 KiB) -rw-r--r-- file download

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