2015-02-11 02:34:04 +01:00
|
|
|
package token
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/base64"
|
|
|
|
"errors"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// joseBase64UrlEncode encodes the given data using the standard base64 url
|
2015-04-17 14:39:52 +02:00
|
|
|
// encoding format but with all trailing '=' characters omitted in accordance
|
2015-02-11 02:34:04 +01:00
|
|
|
// with the jose specification.
|
|
|
|
// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2
|
|
|
|
func joseBase64UrlEncode(b []byte) string {
|
|
|
|
return strings.TrimRight(base64.URLEncoding.EncodeToString(b), "=")
|
|
|
|
}
|
|
|
|
|
|
|
|
// joseBase64UrlDecode decodes the given string using the standard base64 url
|
|
|
|
// decoder but first adds the appropriate number of trailing '=' characters in
|
|
|
|
// accordance with the jose specification.
|
|
|
|
// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2
|
|
|
|
func joseBase64UrlDecode(s string) ([]byte, error) {
|
|
|
|
switch len(s) % 4 {
|
|
|
|
case 0:
|
|
|
|
case 2:
|
|
|
|
s += "=="
|
|
|
|
case 3:
|
|
|
|
s += "="
|
|
|
|
default:
|
|
|
|
return nil, errors.New("illegal base64url string")
|
|
|
|
}
|
|
|
|
return base64.URLEncoding.DecodeString(s)
|
|
|
|
}
|
|
|
|
|
|
|
|
// actionSet is a special type of stringSet.
|
|
|
|
type actionSet struct {
|
|
|
|
stringSet
|
|
|
|
}
|
|
|
|
|
|
|
|
func newActionSet(actions ...string) actionSet {
|
|
|
|
return actionSet{newStringSet(actions...)}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Contains calls StringSet.Contains() for
|
|
|
|
// either "*" or the given action string.
|
|
|
|
func (s actionSet) contains(action string) bool {
|
|
|
|
return s.stringSet.contains("*") || s.stringSet.contains(action)
|
|
|
|
}
|
|
|
|
|
|
|
|
// contains returns true if q is found in ss.
|
|
|
|
func contains(ss []string, q string) bool {
|
|
|
|
for _, s := range ss {
|
|
|
|
if s == q {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|