81 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/rand"
 | 
						|
	"crypto/rsa"
 | 
						|
	"encoding/base64"
 | 
						|
	"errors"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/distribution/distribution/v3/registry/auth"
 | 
						|
	"github.com/docker/libtrust"
 | 
						|
)
 | 
						|
 | 
						|
func TestCreateJWTSuccessWithEmptyACL(t *testing.T) {
 | 
						|
	key, err := rsa.GenerateKey(rand.Reader, 1024)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	pk, err := libtrust.FromCryptoPrivateKey(key)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	tokenIssuer := TokenIssuer{
 | 
						|
		Expiration: time.Duration(100),
 | 
						|
		Issuer:     "localhost",
 | 
						|
		SigningKey: pk,
 | 
						|
	}
 | 
						|
 | 
						|
	grantedAccessList := make([]auth.Access, 0)
 | 
						|
	token, err := tokenIssuer.CreateJWT("test", "test", grantedAccessList)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	tokens := strings.Split(token, ".")
 | 
						|
 | 
						|
	if len(token) == 0 {
 | 
						|
		t.Fatal("token not generated.")
 | 
						|
	}
 | 
						|
 | 
						|
	json, err := decodeJWT(tokens[1])
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	if !strings.Contains(json, "test") {
 | 
						|
		t.Fatal("Valid token was not generated.")
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func decodeJWT(rawToken string) (string, error) {
 | 
						|
	data, err := joseBase64Decode(rawToken)
 | 
						|
	if err != nil {
 | 
						|
		return "", errors.New("Error in Decoding base64 String")
 | 
						|
	}
 | 
						|
	return data, nil
 | 
						|
}
 | 
						|
 | 
						|
func joseBase64Decode(s string) (string, error) {
 | 
						|
	switch len(s) % 4 {
 | 
						|
	case 0:
 | 
						|
	case 2:
 | 
						|
		s += "=="
 | 
						|
	case 3:
 | 
						|
		s += "="
 | 
						|
	default:
 | 
						|
		{
 | 
						|
			return "", errors.New("Invalid base64 String")
 | 
						|
		}
 | 
						|
	}
 | 
						|
	data, err := base64.StdEncoding.DecodeString(s)
 | 
						|
	if err != nil {
 | 
						|
		return "", err //errors.New("Error in Decoding base64 String")
 | 
						|
	}
 | 
						|
	return string(data), nil
 | 
						|
}
 |