forked from sylabs/singularity
/
token.go
61 lines (51 loc) · 1.66 KB
/
token.go
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
/*
Copyright (c) 2018, Sylabs, Inc. All rights reserved.
This software is licensed under a 3-clause BSD license. Please
consult LICENSE.md file distributed with the sources of this project regarding
your rights to use or distribute this software.
*/
package auth
import (
"io/ioutil"
"os"
"strings"
)
const (
// WarningTokenTooShort Warning return for token shorter than 200 b
WarningTokenTooShort = "Token is too short to be valid"
// WarningTokenToolong Warning return for token longer than 4096 b
WarningTokenToolong = "Token is too large to be valid"
// WarningEmptyToken Warning return for empty token string
WarningEmptyToken = "Token file is empty"
// WarningTokenFileNotFound token file not found
WarningTokenFileNotFound = "Authentication token file not found"
// WarningCouldntReadFile Warning return for issues when reading file
WarningCouldntReadFile = "Couldn't read your Sylabs authentication token"
)
// ReadToken reads a sylabs JWT auth token from a file
func ReadToken(tokenPath string) (token, warning string) {
// check if token file exist
_, err := os.Stat(tokenPath)
if os.IsNotExist(err) {
return "", WarningTokenFileNotFound
}
buf, err := ioutil.ReadFile(tokenPath)
if err != nil {
return "", WarningCouldntReadFile
}
lines := strings.Split(string(buf), "\n")
if len(lines) < 1 {
return "", WarningEmptyToken
}
// A valid RSA signed token is at least 200 chars with no extra payload
token = lines[0]
if len(token) < 200 {
return "", WarningTokenTooShort
}
// A token should never be bigger than 4Kb - if it is we will have problems
// with header buffers
if len(token) > 4096 {
return "", WarningTokenToolong
}
return
}