@@ -12,21 +12,19 @@ import (
12
12
router "github.com/mutablelogic/go-server/pkg/handler/router"
13
13
httprequest "github.com/mutablelogic/go-server/pkg/httprequest"
14
14
httpresponse "github.com/mutablelogic/go-server/pkg/httpresponse"
15
+ types "github.com/mutablelogic/go-server/pkg/types"
15
16
)
16
17
17
18
///////////////////////////////////////////////////////////////////////////////
18
19
// GLOBALS
19
20
20
21
const (
21
22
jsonIndent = 2
22
-
23
- // Token should be at least eight bytes (16 chars)
24
- reTokenString = `[a-zA-Z0-9]{16}[a-zA-Z0-9]*`
25
23
)
26
24
27
25
var (
28
26
reRoot = regexp .MustCompile (`^/?$` )
29
- reToken = regexp .MustCompile (`^/(` + reTokenString + `)/?$` )
27
+ reToken = regexp .MustCompile (`^/(` + types . ReIdentifier + `)/?$` )
30
28
)
31
29
32
30
///////////////////////////////////////////////////////////////////////////////
@@ -46,13 +44,13 @@ func (service *auth) AddEndpoints(ctx context.Context, router server.Router) {
46
44
// Description: Create a new token
47
45
router .AddHandlerFuncRe (ctx , reRoot , service .CreateToken , http .MethodPost )
48
46
49
- // Path: /<token>
47
+ // Path: /<token-name >
50
48
// Methods: GET
51
49
// Scopes: read // TODO: Add scopes
52
50
// Description: Get a token
53
51
router .AddHandlerFuncRe (ctx , reToken , service .GetToken , http .MethodGet )
54
52
55
- // Path: /<token>
53
+ // Path: /<token-name >
56
54
// Methods: DELETE, PATCH
57
55
// Scopes: write // TODO: Add scopes
58
56
// Description: Delete or update a token
@@ -67,6 +65,7 @@ func (service *auth) ListTokens(w http.ResponseWriter, r *http.Request) {
67
65
tokens := service .jar .Tokens ()
68
66
result := make ([]* Token , 0 , len (tokens ))
69
67
for _ , token := range tokens {
68
+ // Remove the token value
70
69
token .Value = ""
71
70
result = append (result , & token )
72
71
}
@@ -76,7 +75,7 @@ func (service *auth) ListTokens(w http.ResponseWriter, r *http.Request) {
76
75
// Get a token
77
76
func (service * auth ) GetToken (w http.ResponseWriter , r * http.Request ) {
78
77
urlParameters := router .Params (r .Context ())
79
- token := service .jar .GetWithValue (strings .ToLower (urlParameters [0 ]))
78
+ token := service .jar .GetWithName (strings .ToLower (urlParameters [0 ]))
80
79
if token .IsZero () {
81
80
httpresponse .Error (w , http .StatusNotFound )
82
81
return
@@ -103,8 +102,18 @@ func (service *auth) CreateToken(w http.ResponseWriter, r *http.Request) {
103
102
req .Name = strings .TrimSpace (req .Name )
104
103
if req .Name == "" {
105
104
httpresponse .Error (w , http .StatusBadRequest , "missing 'name'" )
106
- } else if token := service .jar .GetWithName (req .Name ); token .IsValid () {
105
+ return
106
+ } else if token := service .jar .GetWithName (req .Name ); ! token .IsZero () {
107
107
httpresponse .Error (w , http .StatusConflict , "duplicate 'name'" )
108
+ return
109
+ } else if duration := req .Duration .Duration ; duration > 0 {
110
+ // Truncate duration to minute, check
111
+ duration = duration .Truncate (time .Minute )
112
+ if duration < time .Minute {
113
+ httpresponse .Error (w , http .StatusBadRequest , "invalid 'duration'" )
114
+ } else {
115
+ req .Duration .Duration = duration
116
+ }
108
117
}
109
118
110
119
// Create the token
@@ -128,10 +137,10 @@ func (service *auth) CreateToken(w http.ResponseWriter, r *http.Request) {
128
137
httpresponse .JSON (w , token , http .StatusCreated , jsonIndent )
129
138
}
130
139
131
- // Update an existing token
140
+ // Update (patch, delete) an existing token
132
141
func (service * auth ) UpdateToken (w http.ResponseWriter , r * http.Request ) {
133
142
urlParameters := router .Params (r .Context ())
134
- token := service .jar .GetWithValue (strings .ToLower (urlParameters [0 ]))
143
+ token := service .jar .GetWithName (strings .ToLower (urlParameters [0 ]))
135
144
if token .IsZero () {
136
145
httpresponse .Error (w , http .StatusNotFound )
137
146
return
0 commit comments