File: token.go

package info (click to toggle)
singularity-container 4.0.3%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 21,672 kB
  • sloc: asm: 3,857; sh: 2,125; ansic: 1,677; awk: 414; makefile: 110; python: 99
file content (58 lines) | stat: -rw-r--r-- 1,716 bytes parent folder | download | duplicates (2)
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
// Copyright (c) 2018-2022, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.

package auth

import (
	"errors"
	"os"
	"strings"
)

var (
	// ErrTokenTooShort is returned for token shorter than 200 b
	ErrTokenTooShort = errors.New("token is too short to be valid")
	// ErrTokenToolong is returned for token longer than 4096 b
	ErrTokenToolong = errors.New("token is too large to be valid")
	// ErrEmptyToken is returned for empty token string
	ErrEmptyToken = errors.New("token file is empty")
	// ErrTokenFileNotFound is returned when token file not found
	ErrTokenFileNotFound = errors.New("authentication token file not found")
	// ErrCouldntReadFile is returned for issues when reading file
	ErrCouldntReadFile = errors.New("couldn't read your Sylabs authentication token")
)

// ReadToken reads a sylabs JWT auth token from a file
func ReadToken(tokenPath string) (token string, err error) {
	// check if token file exist
	_, err = os.Stat(tokenPath)
	if os.IsNotExist(err) {
		return "", ErrTokenFileNotFound
	}

	buf, err := os.ReadFile(tokenPath)
	if err != nil {
		return "", ErrCouldntReadFile
	}

	lines := strings.Split(string(buf), "\n")
	if len(lines) < 1 {
		return "", ErrEmptyToken
	}

	// A valid RSA signed token is at least 200 chars with no extra payload
	token = lines[0]
	if len(token) < 200 {
		return "", ErrTokenTooShort
	}

	// A token should never be bigger than 4Kb - if it is we will have problems
	// with header buffers
	if len(token) > 4096 {
		return "", ErrTokenToolong
	}

	return token, nil
}