Skip to content
Snippets Groups Projects
Commit 8f7c8ac4 authored by Sergey Yakubov's avatar Sergey Yakubov
Browse files

added tests

parent 1742a7f2
No related branches found
No related tags found
No related merge requests found
Showing
with 421 additions and 254 deletions
...@@ -4,6 +4,7 @@ endif () ...@@ -4,6 +4,7 @@ endif ()
set (TOKENS "ASAPO_TEST_RW_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyMXJqaXB0MzVja3MzYTEwZyIsInN1YiI6ImJ0X2FzYXBvX3Rlc3QiLCJFeHRyYUNsYWltcyI6eyJBY2Nlc3NUeXBlcyI6WyJyZWFkIiwid3JpdGUiXX19.3PFdG0f48yKrOyJwPErYcewpcbZgnd8rBmBphw_kdJ0") set (TOKENS "ASAPO_TEST_RW_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyMXJqaXB0MzVja3MzYTEwZyIsInN1YiI6ImJ0X2FzYXBvX3Rlc3QiLCJFeHRyYUNsYWltcyI6eyJBY2Nlc3NUeXBlcyI6WyJyZWFkIiwid3JpdGUiXX19.3PFdG0f48yKrOyJwPErYcewpcbZgnd8rBmBphw_kdJ0")
set (TOKENS "${TOKENS};ASAPO_CREATE_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyYzMzaXB0Mzdkb3IzYmZjZyIsInN1YiI6ImFkbWluIiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsiY3JlYXRlIl19fQ.AI41cZ7dZL0g-rrdKIQgd7ijjzuyH1Fm0xojCXwLNBo") set (TOKENS "${TOKENS};ASAPO_CREATE_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyYzMzaXB0Mzdkb3IzYmZjZyIsInN1YiI6ImFkbWluIiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsiY3JlYXRlIl19fQ.AI41cZ7dZL0g-rrdKIQgd7ijjzuyH1Fm0xojCXwLNBo")
set (TOKENS "${TOKENS};ASAPO_REVOKE_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjNWFxOHVyaXB0MzV0aG9raDFwMCIsInN1YiI6ImFkbWluIiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsicmV2b2tlIl19fQ.GNje7w6biX0-ynltRr81p5SBSWwmKdDwGfs-adb094Q")
set (TOKENS "${TOKENS};C20180508_000_COM20181_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyaDRiaXB0Mzd1cGo1aDdlMCIsInN1YiI6ImJ0X2MyMDE4MDUwOC0wMDAtQ09NMjAxODEiLCJFeHRyYUNsYWltcyI6eyJBY2Nlc3NUeXBlcyI6WyJyZWFkIiwid3JpdGUiXX19.yONpjW2ybZMc9E9Eu4Hmn1roVR-mxf2OQQyXfnel5C8") set (TOKENS "${TOKENS};C20180508_000_COM20181_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyaDRiaXB0Mzd1cGo1aDdlMCIsInN1YiI6ImJ0X2MyMDE4MDUwOC0wMDAtQ09NMjAxODEiLCJFeHRyYUNsYWltcyI6eyJBY2Nlc3NUeXBlcyI6WyJyZWFkIiwid3JpdGUiXX19.yONpjW2ybZMc9E9Eu4Hmn1roVR-mxf2OQQyXfnel5C8")
set (TOKENS "${TOKENS};BT11000015_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyajZqaXB0MzA3aHU1amwxZyIsInN1YiI6ImJ0XzExMDAwMDE1IiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsicmVhZCJdfX0.kVs669HAS4sj9VAZk8pWTLrYNQp46mOnH4id4-_qd9g") set (TOKENS "${TOKENS};BT11000015_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyajZqaXB0MzA3aHU1amwxZyIsInN1YiI6ImJ0XzExMDAwMDE1IiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsicmVhZCJdfX0.kVs669HAS4sj9VAZk8pWTLrYNQp46mOnH4id4-_qd9g")
set (TOKENS "${TOKENS};BT11000016_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyajQzaXB0MzA3OWxwc3Z2ZyIsInN1YiI6ImJ0XzExMDAwMDE2IiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsicmVhZCJdfX0.mpTVGtcdR0l4NaeHFTf16iWrfMYaLzh2pAjN5muil6Q") set (TOKENS "${TOKENS};BT11000016_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTkyajQzaXB0MzA3OWxwc3Z2ZyIsInN1YiI6ImJ0XzExMDAwMDE2IiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZXMiOlsicmVhZCJdfX0.mpTVGtcdR0l4NaeHFTf16iWrfMYaLzh2pAjN5muil6Q")
......
...@@ -14,9 +14,9 @@ import ( ...@@ -14,9 +14,9 @@ import (
type SourceCredentials struct { type SourceCredentials struct {
BeamtimeId string BeamtimeId string
Beamline string Beamline string
DataSource string DataSource string
Token string Token string
Type string Type string
} }
type authorizationRequest struct { type authorizationRequest struct {
...@@ -26,15 +26,14 @@ type authorizationRequest struct { ...@@ -26,15 +26,14 @@ type authorizationRequest struct {
func getSourceCredentials(request authorizationRequest) (SourceCredentials, error) { func getSourceCredentials(request authorizationRequest) (SourceCredentials, error) {
vals := strings.Split(request.SourceCredentials, "%") vals := strings.Split(request.SourceCredentials, "%")
nvals:=len(vals) nvals := len(vals)
if nvals < 5 { if nvals < 5 {
return SourceCredentials{}, errors.New("cannot get source credentials from " + request.SourceCredentials) return SourceCredentials{}, errors.New("cannot get source credentials from " + request.SourceCredentials)
} }
creds := SourceCredentials{Type:vals[0], BeamtimeId: vals[1], Beamline: vals[2], Token:vals[nvals-1]} creds := SourceCredentials{Type: vals[0], BeamtimeId: vals[1], Beamline: vals[2], Token: vals[nvals-1]}
creds.DataSource=strings.Join(vals[3:nvals-1],"%") creds.DataSource = strings.Join(vals[3:nvals-1], "%")
if creds.DataSource == "" { if creds.DataSource == "" {
creds.DataSource = "detector" creds.DataSource = "detector"
} }
...@@ -54,7 +53,6 @@ func getSourceCredentials(request authorizationRequest) (SourceCredentials, erro ...@@ -54,7 +53,6 @@ func getSourceCredentials(request authorizationRequest) (SourceCredentials, erro
return creds, nil return creds, nil
} }
func splitHost(hostPort string) string { func splitHost(hostPort string) string {
s := strings.Split(hostPort, ":") s := strings.Split(hostPort, ":")
return s[0] return s[0]
...@@ -95,7 +93,7 @@ func beamtimeMetaFromMatch(match string) (common.BeamtimeMeta, error) { ...@@ -95,7 +93,7 @@ func beamtimeMetaFromMatch(match string) (common.BeamtimeMeta, error) {
return common.BeamtimeMeta{}, errors.New("skipped fodler") return common.BeamtimeMeta{}, errors.New("skipped fodler")
} }
bt.OfflinePath = common.Settings.RootBeamtimesFolder+string(filepath.Separator)+match bt.OfflinePath = common.Settings.RootBeamtimesFolder + string(filepath.Separator) + match
bt.Beamline, bt.BeamtimeId = vars[2], vars[5] bt.Beamline, bt.BeamtimeId = vars[2], vars[5]
return bt, nil return bt, nil
...@@ -107,10 +105,10 @@ func findBeamtimeInfoFromId(beamtime_id string) (common.BeamtimeMeta, error) { ...@@ -107,10 +105,10 @@ func findBeamtimeInfoFromId(beamtime_id string) (common.BeamtimeMeta, error) {
matches, err := filepath.Glob(common.Settings.RootBeamtimesFolder + pattern + beamtime_id) matches, err := filepath.Glob(common.Settings.RootBeamtimesFolder + pattern + beamtime_id)
if err != nil || len(matches) == 0 { if err != nil || len(matches) == 0 {
return common.BeamtimeMeta{}, errors.New("Cannot find beamline for "+beamtime_id) return common.BeamtimeMeta{}, errors.New("Cannot find beamline for " + beamtime_id)
} }
for _, match := range (matches) { for _, match := range matches {
btInfo, err := beamtimeMetaFromMatch(match) btInfo, err := beamtimeMetaFromMatch(match)
if err != nil { if err != nil {
continue continue
...@@ -119,12 +117,12 @@ func findBeamtimeInfoFromId(beamtime_id string) (common.BeamtimeMeta, error) { ...@@ -119,12 +117,12 @@ func findBeamtimeInfoFromId(beamtime_id string) (common.BeamtimeMeta, error) {
return btInfo, nil return btInfo, nil
} }
} }
return common.BeamtimeMeta{}, errors.New("Cannot find beamline for "+beamtime_id) return common.BeamtimeMeta{}, errors.New("Cannot find beamline for " + beamtime_id)
} }
func findMetaFileInFolder(beamline string,iscommissioning bool) (string, string, error){ func findMetaFileInFolder(beamline string, iscommissioning bool) (string, string, error) {
sep := string(filepath.Separator) sep := string(filepath.Separator)
var pattern,folder string var pattern, folder string
if !iscommissioning { if !iscommissioning {
pattern = "beamtime-metadata-*.json" pattern = "beamtime-metadata-*.json"
folder = "current" folder = "current"
...@@ -135,18 +133,18 @@ func findMetaFileInFolder(beamline string,iscommissioning bool) (string, string, ...@@ -135,18 +133,18 @@ func findMetaFileInFolder(beamline string,iscommissioning bool) (string, string,
online_path := common.Settings.CurrentBeamlinesFolder + sep + beamline + sep + folder online_path := common.Settings.CurrentBeamlinesFolder + sep + beamline + sep + folder
matches, err := filepath.Glob(online_path + sep + pattern) matches, err := filepath.Glob(online_path + sep + pattern)
if err != nil { if err != nil {
return "","", err return "", "", err
} }
if len(matches) != 1 { if len(matches) != 1 {
return "","", errors.New("should be one beamtime-metadata file in folder") return "", "", errors.New("should be one beamtime-metadata file in folder")
} }
return matches[0],online_path, nil return matches[0], online_path, nil
} }
func findBeamtimeMetaFromBeamline(beamline string,iscommissioning bool) (meta common.BeamtimeMeta, err error) { func findBeamtimeMetaFromBeamline(beamline string, iscommissioning bool) (meta common.BeamtimeMeta, err error) {
fName,online_path, err := findMetaFileInFolder(beamline,iscommissioning) fName, online_path, err := findMetaFileInFolder(beamline, iscommissioning)
if (err != nil) { if err != nil {
return common.BeamtimeMeta{}, err return common.BeamtimeMeta{}, err
} }
...@@ -155,11 +153,11 @@ func findBeamtimeMetaFromBeamline(beamline string,iscommissioning bool) (meta co ...@@ -155,11 +153,11 @@ func findBeamtimeMetaFromBeamline(beamline string,iscommissioning bool) (meta co
} else { } else {
meta, err = beamtimeMetaFromJson(fName) meta, err = beamtimeMetaFromJson(fName)
} }
if (err != nil) { if err != nil {
return common.BeamtimeMeta{}, err return common.BeamtimeMeta{}, err
} }
if meta.BeamtimeId == "" || meta.OfflinePath=="" || meta.Beamline == ""{ if meta.BeamtimeId == "" || meta.OfflinePath == "" || meta.Beamline == "" {
return common.BeamtimeMeta{}, errors.New("cannot set meta fields from beamtime file") return common.BeamtimeMeta{}, errors.New("cannot set meta fields from beamtime file")
} }
...@@ -172,23 +170,23 @@ func alwaysAllowed(creds SourceCredentials) (common.BeamtimeMeta, bool) { ...@@ -172,23 +170,23 @@ func alwaysAllowed(creds SourceCredentials) (common.BeamtimeMeta, bool) {
if pair.BeamtimeId == creds.BeamtimeId { if pair.BeamtimeId == creds.BeamtimeId {
pair.DataSource = creds.DataSource pair.DataSource = creds.DataSource
pair.Type = creds.Type pair.Type = creds.Type
pair.AccessTypes = []string{"read","write"} pair.AccessTypes = []string{"read", "write"}
return pair, true return pair, true
} }
} }
return common.BeamtimeMeta{}, false return common.BeamtimeMeta{}, false
} }
func authorizeByHost(host_ip, beamline string) (error) { func authorizeByHost(host_ip, beamline string) error {
filter := strings.Replace(common.Settings.Ldap.FilterTemplate,"__BEAMLINE__",beamline,1) filter := strings.Replace(common.Settings.Ldap.FilterTemplate, "__BEAMLINE__", beamline, 1)
allowed_ips, err := ldapClient.GetAllowedIpsForBeamline(common.Settings.Ldap.Uri,common.Settings.Ldap.BaseDn, filter) allowed_ips, err := ldapClient.GetAllowedIpsForBeamline(common.Settings.Ldap.Uri, common.Settings.Ldap.BaseDn, filter)
if err != nil { if err != nil {
log.Error("cannot get list of allowed hosts from LDAP: " + err.Error()) log.Error("cannot get list of allowed hosts from LDAP: " + err.Error())
return err return err
} }
if (!utils.StringInSlice(splitHost(host_ip),allowed_ips)) { if !utils.StringInSlice(splitHost(host_ip), allowed_ips) {
err_string := "beamine " +beamline+" not allowed for host " + host_ip err_string := "beamine " + beamline + " not allowed for host " + host_ip
log.Error(err_string) log.Error(err_string)
return errors.New(err_string) return errors.New(err_string)
} }
...@@ -199,57 +197,73 @@ func canUseHostAuthorization(creds SourceCredentials) bool { ...@@ -199,57 +197,73 @@ func canUseHostAuthorization(creds SourceCredentials) bool {
return len(creds.Token) == 0 return len(creds.Token) == 0
} }
func checkTokenRevoked(tokenId string) (err error) {
revoked, err := store.IsTokenRevoked(tokenId)
if err != nil {
return &common.ServerError{utils.StatusServiceUnavailable, err.Error()}
}
if revoked {
return errors.New("token was revoked")
}
return nil
}
func checkToken(token string, subject_expect string) (accessTypes []string, err error) { func checkToken(token string, subject_expect string) (accessTypes []string, err error) {
var extra_claim structs.AccessTokenExtraClaim var extra_claim structs.AccessTokenExtraClaim
claim,err := Auth.UserAuth().CheckAndGetContent(token,&extra_claim) claim, err := Auth.UserAuth().CheckAndGetContent(token, &extra_claim)
if err!=nil { if err != nil {
return nil,err return nil, err
}
err = checkTokenRevoked(claim.Id)
if err != nil {
return nil, err
} }
if extra_claim.AccessTypes==nil || len(extra_claim.AccessTypes)==0 { if extra_claim.AccessTypes == nil || len(extra_claim.AccessTypes) == 0 {
return nil,errors.New("missing access types") return nil, errors.New("missing access types")
} }
if claim.Subject!=subject_expect { if claim.Subject != subject_expect {
return nil,errors.New("wrong token for "+subject_expect) return nil, errors.New("wrong token for " + subject_expect)
} }
return extra_claim.AccessTypes,err return extra_claim.AccessTypes, err
} }
func authorizeByToken(creds SourceCredentials) (accessTypes []string, err error) { func authorizeByToken(creds SourceCredentials) (accessTypes []string, err error) {
subject_expect:="" subject_expect := ""
if (creds.BeamtimeId != "auto") { if creds.BeamtimeId != "auto" {
subject_expect = utils.SubjectFromBeamtime(creds.BeamtimeId) subject_expect = utils.SubjectFromBeamtime(creds.BeamtimeId)
} else { } else {
subject_expect = utils.SubjectFromBeamline(creds.Beamline) subject_expect = utils.SubjectFromBeamline(creds.Beamline)
} }
return checkToken(creds.Token,subject_expect) return checkToken(creds.Token, subject_expect)
} }
func iscommissioning(beamtime string) bool { func iscommissioning(beamtime string) bool {
return len(beamtime)>0 && beamtime[0]=='c' return len(beamtime) > 0 && beamtime[0] == 'c'
} }
func findMeta(creds SourceCredentials) (common.BeamtimeMeta, error) { func findMeta(creds SourceCredentials) (common.BeamtimeMeta, error) {
var err error var err error
var meta common.BeamtimeMeta var meta common.BeamtimeMeta
if (creds.BeamtimeId != "auto") { if creds.BeamtimeId != "auto" {
meta, err = findBeamtimeInfoFromId(creds.BeamtimeId) meta, err = findBeamtimeInfoFromId(creds.BeamtimeId)
if (err == nil ) { if err == nil {
meta_onilne, err_online := findBeamtimeMetaFromBeamline(meta.Beamline,iscommissioning(creds.BeamtimeId)) meta_onilne, err_online := findBeamtimeMetaFromBeamline(meta.Beamline, iscommissioning(creds.BeamtimeId))
if err_online == nil && meta.BeamtimeId == meta_onilne.BeamtimeId { if err_online == nil && meta.BeamtimeId == meta_onilne.BeamtimeId {
meta.OnlinePath = meta_onilne.OnlinePath meta.OnlinePath = meta_onilne.OnlinePath
} }
} }
} else { } else {
meta, err = findBeamtimeMetaFromBeamline(creds.Beamline,false) meta, err = findBeamtimeMetaFromBeamline(creds.Beamline, false)
} }
if creds.Type == "processed" { if creds.Type == "processed" {
meta.OnlinePath = "" meta.OnlinePath = ""
} }
if (err != nil) { if err != nil {
log.Error(err.Error()) log.Error(err.Error())
return common.BeamtimeMeta{}, err return common.BeamtimeMeta{}, err
} }
...@@ -262,32 +276,32 @@ func findMeta(creds SourceCredentials) (common.BeamtimeMeta, error) { ...@@ -262,32 +276,32 @@ func findMeta(creds SourceCredentials) (common.BeamtimeMeta, error) {
func authorizeMeta(meta common.BeamtimeMeta, request authorizationRequest, creds SourceCredentials) (accessTypes []string, err error) { func authorizeMeta(meta common.BeamtimeMeta, request authorizationRequest, creds SourceCredentials) (accessTypes []string, err error) {
accessTypes = nil accessTypes = nil
if creds.Type=="raw" && meta.OnlinePath=="" { if creds.Type == "raw" && meta.OnlinePath == "" {
err_string := "beamtime "+meta.BeamtimeId+" is not online" err_string := "beamtime " + meta.BeamtimeId + " is not online"
log.Error(err_string) log.Error(err_string)
return nil,errors.New(err_string) return nil, errors.New(err_string)
} }
if creds.Beamline != "auto" && meta.Beamline != creds.Beamline { if creds.Beamline != "auto" && meta.Beamline != creds.Beamline {
err_string := "given beamline (" + creds.Beamline + ") does not match the found one (" + meta.Beamline + ")" err_string := "given beamline (" + creds.Beamline + ") does not match the found one (" + meta.Beamline + ")"
log.Debug(err_string) log.Debug(err_string)
return nil,errors.New(err_string) return nil, errors.New(err_string)
} }
if canUseHostAuthorization(creds) { if canUseHostAuthorization(creds) {
if err := authorizeByHost(request.OriginHost, meta.Beamline); err != nil { if err := authorizeByHost(request.OriginHost, meta.Beamline); err != nil {
return nil,err return nil, err
} }
if creds.Type == "raw" { if creds.Type == "raw" {
accessTypes = []string{"read","write","writeraw"} accessTypes = []string{"read", "write", "writeraw"}
} else { } else {
accessTypes = []string{"read","write"} accessTypes = []string{"read", "write"}
} }
} else { } else {
accessTypes,err = authorizeByToken(creds) accessTypes, err = authorizeByToken(creds)
} }
return accessTypes,err return accessTypes, err
} }
func authorize(request authorizationRequest, creds SourceCredentials) (common.BeamtimeMeta, error) { func authorize(request authorizationRequest, creds SourceCredentials) (common.BeamtimeMeta, error) {
...@@ -306,42 +320,70 @@ func authorize(request authorizationRequest, creds SourceCredentials) (common.Be ...@@ -306,42 +320,70 @@ func authorize(request authorizationRequest, creds SourceCredentials) (common.Be
} }
meta.AccessTypes = accessTypes meta.AccessTypes = accessTypes
log.Debug("authorized creds bl/bt: ", creds.Beamline+"/"+creds.BeamtimeId+", beamtime " + meta.BeamtimeId + " for " + request.OriginHost + " in " + log.Debug("authorized creds bl/bt: ", creds.Beamline+"/"+creds.BeamtimeId+", beamtime "+meta.BeamtimeId+" for "+request.OriginHost+" in "+
meta.Beamline+", type "+meta.Type, "online path "+meta.OnlinePath + ", offline path "+meta.OfflinePath) meta.Beamline+", type "+meta.Type, "online path "+meta.OnlinePath+", offline path "+meta.OfflinePath)
return meta, nil return meta, nil
} }
func writeServerError(w http.ResponseWriter, err error) {
serr, ok := err.(*common.ServerError)
if ok {
utils.WriteServerError(w, err, serr.Code)
return
}
utils.WriteServerError(w, err, http.StatusUnauthorized)
return
}
func routeAuthorize(w http.ResponseWriter, r *http.Request) { func routeAuthorize(w http.ResponseWriter, r *http.Request) {
var request authorizationRequest var request authorizationRequest
err := utils.ExtractRequest(r,&request) err := utils.ExtractRequest(r, &request)
if err != nil { if err != nil {
utils.WriteServerError(w,err,http.StatusBadRequest) utils.WriteServerError(w, err, http.StatusBadRequest)
return return
} }
creds, err := getSourceCredentials(request) creds, err := getSourceCredentials(request)
if err != nil { if err != nil {
utils.WriteServerError(w,err,http.StatusBadRequest) utils.WriteServerError(w, err, http.StatusBadRequest)
return return
} }
beamtimeInfo, err := authorize(request, creds) beamtimeInfo, err := authorize(request, creds)
if (err != nil) { if err != nil {
serr,ok:=err.(*common.ServerError) writeServerError(w, err)
if ok {
utils.WriteServerError(w,err,serr.Code)
return
}
utils.WriteServerError(w,err,http.StatusUnauthorized)
return return
} }
res, err := utils.MapToJson(&beamtimeInfo) res, err := utils.MapToJson(&beamtimeInfo)
if err != nil { if err != nil {
utils.WriteServerError(w,err,http.StatusInternalServerError) utils.WriteServerError(w, err, http.StatusInternalServerError)
return return
} }
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte(res)) w.Write([]byte(res))
} }
func checkRole(w http.ResponseWriter, r *http.Request, role string) error {
var extraClaim structs.AccessTokenExtraClaim
var claims *utils.CustomClaims
if err := utils.JobClaimFromContext(r, &claims, &extraClaim); err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return err
}
if err := checkTokenRevoked(claims.Id); err != nil {
writeServerError(w, err)
return err
}
if claims.Subject != "admin" || !utils.StringInSlice(role, extraClaim.AccessTypes) {
err_txt := "wrong token claims"
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(err_txt))
return errors.New(err_txt)
}
return nil
}
This diff is collapsed.
...@@ -3,11 +3,13 @@ package server ...@@ -3,11 +3,13 @@ package server
import ( import (
"asapo_authorizer/authorization" "asapo_authorizer/authorization"
"asapo_authorizer/common" "asapo_authorizer/common"
"asapo_authorizer/token_store"
"asapo_common/structs" "asapo_common/structs"
"asapo_common/utils" "asapo_common/utils"
"asapo_common/version" "asapo_common/version"
"fmt" "fmt"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"os" "os"
...@@ -39,6 +41,9 @@ var fodlerTokenTests = [] struct { ...@@ -39,6 +41,9 @@ var fodlerTokenTests = [] struct {
func TestFolderToken(t *testing.T) { func TestFolderToken(t *testing.T) {
allowBeamlines([]common.BeamtimeMeta{}) allowBeamlines([]common.BeamtimeMeta{})
mock_store := new(token_store.MockedStore)
store = mock_store
common.Settings.RootBeamtimesFolder ="." common.Settings.RootBeamtimesFolder ="."
common.Settings.CurrentBeamlinesFolder="." common.Settings.CurrentBeamlinesFolder="."
Auth = authorization.NewAuth(utils.NewJWTAuth("secret_user"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret_folder")) Auth = authorization.NewAuth(utils.NewJWTAuth("secret_user"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret_folder"))
...@@ -65,6 +70,8 @@ func TestFolderToken(t *testing.T) { ...@@ -65,6 +70,8 @@ func TestFolderToken(t *testing.T) {
request := makeRequest(folderTokenRequest{path_in_token,test.beamtime_id,test.token}) request := makeRequest(folderTokenRequest{path_in_token,test.beamtime_id,test.token})
if test.status == http.StatusBadRequest { if test.status == http.StatusBadRequest {
request =makeRequest(authorizationRequest{}) request =makeRequest(authorizationRequest{})
} else {
mock_store.On("IsTokenRevoked", mock.Anything).Return(false, nil)
} }
w := doPostRequest("/"+version.GetAuthorizerApiVersion()+"/folder",request,"") w := doPostRequest("/"+version.GetAuthorizerApiVersion()+"/folder",request,"")
if w.Code == http.StatusOK { if w.Code == http.StatusOK {
...@@ -78,7 +85,9 @@ func TestFolderToken(t *testing.T) { ...@@ -78,7 +85,9 @@ func TestFolderToken(t *testing.T) {
body, _ := ioutil.ReadAll(w.Body) body, _ := ioutil.ReadAll(w.Body)
fmt.Println(string(body)) fmt.Println(string(body))
} }
mock_store.AssertExpectations(t)
mock_store.ExpectedCalls = nil
mock_store.Calls = nil
assert.Equal(t, test.status, w.Code, test.message) assert.Equal(t, test.status, w.Code, test.message)
} }
} }
......
...@@ -23,6 +23,11 @@ func verifyUserToken(token string) (response structs.IntrospectTokenResponse, er ...@@ -23,6 +23,11 @@ func verifyUserToken(token string) (response structs.IntrospectTokenResponse, er
if err!=nil { if err!=nil {
return return
} }
err = checkTokenRevoked(claim.Id)
if err != nil {
return
}
response.Sub = claim.Subject response.Sub = claim.Subject
response.AccessTypes = extra_claim.AccessTypes response.AccessTypes = extra_claim.AccessTypes
return return
......
...@@ -2,6 +2,7 @@ package server ...@@ -2,6 +2,7 @@ package server
import ( import (
"asapo_authorizer/authorization" "asapo_authorizer/authorization"
"asapo_authorizer/token_store"
"asapo_common/structs" "asapo_common/structs"
"asapo_common/utils" "asapo_common/utils"
"encoding/json" "encoding/json"
...@@ -27,11 +28,16 @@ func TestIntrospect(t *testing.T) { ...@@ -27,11 +28,16 @@ func TestIntrospect(t *testing.T) {
authJWT := utils.NewJWTAuth("secret") authJWT := utils.NewJWTAuth("secret")
authAdmin := utils.NewJWTAuth("secret_admin") authAdmin := utils.NewJWTAuth("secret_admin")
authUser := utils.NewJWTAuth("secret_user") authUser := utils.NewJWTAuth("secret_user")
mock_store := new(token_store.MockedStore)
store = mock_store
Auth = authorization.NewAuth(authUser,authAdmin,authJWT) Auth = authorization.NewAuth(authUser,authAdmin,authJWT)
for _, test := range IntrospectTests { for _, test := range IntrospectTests {
token := prepareAsapoToken(test.tokenSubject,test.roles) token := prepareAsapoToken(test.tokenSubject,test.roles)
if test.status==http.StatusUnauthorized { if test.status==http.StatusUnauthorized {
token = "blabla" token = "blabla"
} else {
mock_store.On("IsTokenRevoked", expectedTokenId).Return(false, nil)
} }
request := makeRequest(structs.IntrospectTokenRequest{token}) request := makeRequest(structs.IntrospectTokenRequest{token})
w := doPostRequest("/introspect",request,"") w := doPostRequest("/introspect",request,"")
...@@ -46,6 +52,9 @@ func TestIntrospect(t *testing.T) { ...@@ -46,6 +52,9 @@ func TestIntrospect(t *testing.T) {
body, _ := ioutil.ReadAll(w.Body) body, _ := ioutil.ReadAll(w.Body)
fmt.Println(string(body)) fmt.Println(string(body))
} }
mock_store.AssertExpectations(t)
mock_store.ExpectedCalls = nil
mock_store.Calls = nil
} }
} }
...@@ -2,11 +2,13 @@ package server ...@@ -2,11 +2,13 @@ package server
import ( import (
"asapo_authorizer/authorization" "asapo_authorizer/authorization"
"asapo_authorizer/token_store"
log "asapo_common/logger" log "asapo_common/logger"
"asapo_common/structs" "asapo_common/structs"
"asapo_common/utils" "asapo_common/utils"
"errors" "errors"
"net/http" "net/http"
"time"
) )
func extractUserTokenrequest(r *http.Request) (request structs.IssueTokenRequest, err error) { func extractUserTokenrequest(r *http.Request) (request structs.IssueTokenRequest, err error) {
...@@ -37,19 +39,12 @@ func extractUserTokenrequest(r *http.Request) (request structs.IssueTokenRequest ...@@ -37,19 +39,12 @@ func extractUserTokenrequest(r *http.Request) (request structs.IssueTokenRequest
} }
func routeAuthorisedTokenIssue(w http.ResponseWriter, r *http.Request) { func routeAuthorisedTokenIssue(w http.ResponseWriter, r *http.Request) {
Auth.AdminAuth().ProcessAuth(checkAccessToken, "admin")(w, r) Auth.AdminAuth().ProcessAuth(checkAccessToken, "")(w, r)
} }
func checkAccessToken(w http.ResponseWriter, r *http.Request) { func checkAccessToken(w http.ResponseWriter, r *http.Request) {
var extraClaim structs.AccessTokenExtraClaim if checkRole(w, r, "create") != nil {
var claims *utils.CustomClaims return
if err := utils.JobClaimFromContext(r, &claims, &extraClaim); err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
}
if claims.Subject != "admin" || !utils.StringInSlice("create",extraClaim.AccessTypes) {
err_txt := "wrong token claims"
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(err_txt))
} }
issueUserToken(w, r) issueUserToken(w, r)
...@@ -62,12 +57,22 @@ func issueUserToken(w http.ResponseWriter, r *http.Request) { ...@@ -62,12 +57,22 @@ func issueUserToken(w http.ResponseWriter, r *http.Request) {
return return
} }
token, _, err := Auth.PrepareAccessToken(request, true) token, claims, err := Auth.PrepareAccessToken(request, true)
if err != nil { if err != nil {
utils.WriteServerError(w, err, http.StatusInternalServerError) utils.WriteServerError(w, err, http.StatusInternalServerError)
return return
} }
claims.StandardClaims.Issuer = "asapo-auth"
claims.StandardClaims.IssuedAt = time.Now().Unix()
record := token_store.TokenRecord{claims.Id, claims, token, false}
err = store.AddToken(record)
if err != nil {
utils.WriteServerError(w, err, http.StatusInternalServerError)
return
}
log.Debug("generated user token ") log.Debug("generated user token ")
answer := authorization.UserTokenResponce(request, token) answer := authorization.UserTokenResponce(request, token)
......
...@@ -2,11 +2,13 @@ package server ...@@ -2,11 +2,13 @@ package server
import ( import (
"asapo_authorizer/authorization" "asapo_authorizer/authorization"
"asapo_authorizer/token_store"
"asapo_common/structs" "asapo_common/structs"
"asapo_common/utils" "asapo_common/utils"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"testing" "testing"
...@@ -40,8 +42,15 @@ func TestIssueToken(t *testing.T) { ...@@ -40,8 +42,15 @@ func TestIssueToken(t *testing.T) {
authAdmin := utils.NewJWTAuth("secret_admin") authAdmin := utils.NewJWTAuth("secret_admin")
authUser := utils.NewJWTAuth("secret_user") authUser := utils.NewJWTAuth("secret_user")
Auth = authorization.NewAuth(authUser,authAdmin,authJWT) Auth = authorization.NewAuth(authUser,authAdmin,authJWT)
mock_store := new(token_store.MockedStore)
store = mock_store
for _, test := range IssueTokenTests { for _, test := range IssueTokenTests {
request := makeRequest(structs.IssueTokenRequest{test.requestSubject,test.validDays,test.roles}) request := makeRequest(structs.IssueTokenRequest{test.requestSubject,test.validDays,test.roles})
mock_store.On("IsTokenRevoked", mock.Anything).Return(false,nil)
if test.status == http.StatusOK {
mock_store.On("AddToken", mock.Anything).Return(nil)
}
w := doPostRequest("/admin/issue",request,authAdmin.Name()+" "+test.adminToken) w := doPostRequest("/admin/issue",request,authAdmin.Name()+" "+test.adminToken)
if w.Code == http.StatusOK { if w.Code == http.StatusOK {
body, _ := ioutil.ReadAll(w.Body) body, _ := ioutil.ReadAll(w.Body)
...@@ -60,6 +69,9 @@ func TestIssueToken(t *testing.T) { ...@@ -60,6 +69,9 @@ func TestIssueToken(t *testing.T) {
body, _ := ioutil.ReadAll(w.Body) body, _ := ioutil.ReadAll(w.Body)
fmt.Println(string(body)) fmt.Println(string(body))
} }
mock_store.AssertExpectations(t)
mock_store.ExpectedCalls = nil
mock_store.Calls = nil
assert.Equal(t, test.status, w.Code, test.message) assert.Equal(t, test.status, w.Code, test.message)
} }
......
...@@ -17,6 +17,12 @@ var listRoutes = utils.Routes{ ...@@ -17,6 +17,12 @@ var listRoutes = utils.Routes{
"/introspect", "/introspect",
routeIntrospect, routeIntrospect,
}, },
utils.Route{
"Authorize",
"POST",
"/admin/revoke",
routeRevoke,
},
utils.Route{ utils.Route{
"HealthCheck", "HealthCheck",
"Get", "Get",
......
package server
import (
log "asapo_common/logger"
"asapo_common/utils"
"encoding/json"
"net/http"
)
func routeRevoke(w http.ResponseWriter, r *http.Request) {
Auth.AdminAuth().ProcessAuth(processRevoke, "")(w, r)
}
func processRevoke(w http.ResponseWriter, r *http.Request) {
if checkRole(w, r, "revoke") != nil {
return
}
revokeToken(w, r)
}
func revokeToken(w http.ResponseWriter, r *http.Request) {
token, err := extractToken(r)
if err != nil {
utils.WriteServerError(w, err, http.StatusBadRequest)
return
}
rec, err := store.RevokeToken(token, "")
if err != nil {
log.Error("could not revoke token "+ token+": "+ err.Error())
utils.WriteServerError(w, err, http.StatusBadRequest)
return
}
log.Debug("revoked token " + rec.Token)
answer, _ := json.Marshal(&rec)
w.WriteHeader(http.StatusOK)
w.Write(answer)
}
...@@ -30,9 +30,9 @@ func (store *MockedStore) GetTokenList() ([]TokenRecord,error) { ...@@ -30,9 +30,9 @@ func (store *MockedStore) GetTokenList() ([]TokenRecord,error) {
return args.Get(0).([]TokenRecord), args.Error(1) return args.Get(0).([]TokenRecord), args.Error(1)
} }
func (store *MockedStore) GetRevokedTokenIds() ([]string,error) { func (store *MockedStore) IsTokenRevoked(tokenId string) (bool, error) {
args := store.Called() args := store.Called(tokenId)
return args.Get(0).([]string), args.Error(1) return args.Get(0).(bool), args.Error(1)
} }
func (store *MockedStore) Close() { func (store *MockedStore) Close() {
......
...@@ -16,7 +16,7 @@ type Store interface { ...@@ -16,7 +16,7 @@ type Store interface {
AddToken(token TokenRecord) error AddToken(token TokenRecord) error
RevokeToken(token string, id string) (TokenRecord, error) RevokeToken(token string, id string) (TokenRecord, error)
GetTokenList() ([]TokenRecord, error) GetTokenList() ([]TokenRecord, error)
GetRevokedTokenIds() ([]string, error) IsTokenRevoked(tokenId string) (bool, error)
Close() Close()
} }
...@@ -133,16 +133,6 @@ func (store *TokenStore) updateTokenStatus(token *TokenRecord) error { ...@@ -133,16 +133,6 @@ func (store *TokenStore) updateTokenStatus(token *TokenRecord) error {
Collection: KTokens, Collection: KTokens,
Op: "update_record", Op: "update_record",
}, token.Id, map[string]interface{}{"revoked": true}, false, token) }, token.Id, map[string]interface{}{"revoked": true}, false, token)
if err != nil {
return err
}
idRec := IdRecord{token.Id}
_, err = store.db.ProcessRequest(Request{
DbName: KAdminDb,
Collection: KRevokedTokens,
Op: "create_record",
}, &idRec)
return err return err
} }
...@@ -172,6 +162,9 @@ func (store *TokenStore) RevokeToken(token string, id string) (TokenRecord, erro ...@@ -172,6 +162,9 @@ func (store *TokenStore) RevokeToken(token string, id string) (TokenRecord, erro
return TokenRecord{}, store.processError(err) return TokenRecord{}, store.processError(err)
} }
store.revokedTokenList.lock.Lock()
defer store.revokedTokenList.lock.Unlock()
store.revokedTokenList.tokens = append(store.revokedTokenList.tokens, tokenRecord.Id)
return tokenRecord, nil return tokenRecord, nil
} }
...@@ -197,6 +190,7 @@ func (store *TokenStore) loopGetRevokedTokens() { ...@@ -197,6 +190,7 @@ func (store *TokenStore) loopGetRevokedTokens() {
if err != nil { if err != nil {
store.revokedTokenList.lock.Lock() store.revokedTokenList.lock.Lock()
store.revokedTokenList.lastError = err store.revokedTokenList.lastError = err
store.revokedTokenList.tokens = nil
store.processError(err) store.processError(err)
store.revokedTokenList.lock.Unlock() store.revokedTokenList.lock.Unlock()
next_update = 1 next_update = 1
...@@ -209,6 +203,7 @@ func (store *TokenStore) loopGetRevokedTokens() { ...@@ -209,6 +203,7 @@ func (store *TokenStore) loopGetRevokedTokens() {
tokens[i] = token.Id tokens[i] = token.Id
} }
store.revokedTokenList.lock.Lock() store.revokedTokenList.lock.Lock()
store.revokedTokenList.lastError = nil
store.revokedTokenList.tokens = tokens store.revokedTokenList.tokens = tokens
store.revokedTokenList.lock.Unlock() store.revokedTokenList.lock.Unlock()
} }
...@@ -221,15 +216,23 @@ func (store *TokenStore) loopGetRevokedTokens() { ...@@ -221,15 +216,23 @@ func (store *TokenStore) loopGetRevokedTokens() {
} }
} }
func (store *TokenStore) GetRevokedTokenIds() ([]string, error) { func (store *TokenStore) IsTokenRevoked(tokenId string) (bool, error) {
tokens, err := store.getRevokedTokenIds()
if err != nil {
return true, err
}
return utils.StringInSlice(tokenId, tokens), nil
}
func (store *TokenStore) getRevokedTokenIds() ([]string, error) {
store.revokedTokenList.lock.RLock() store.revokedTokenList.lock.RLock()
defer store.revokedTokenList.lock.RUnlock() defer store.revokedTokenList.lock.RUnlock()
if store.revokedTokenList.lastError != nil { if store.revokedTokenList.lastError != nil {
return []string{}, store.revokedTokenList.lastError return []string{}, store.revokedTokenList.lastError
} }
// res := make([]string, len(store.revokedTokenList.tokens)) // res := make([]string, len(store.revokedTokenList.tokens))
// copy(res, store.revokedTokenList.tokens) // copy(res, store.revokedTokenList.tokens)
// return res,nil // return res,nil
return store.revokedTokenList.tokens, nil return store.revokedTokenList.tokens, nil
} }
......
...@@ -127,7 +127,7 @@ func (suite *TokenStoreTestSuite) TestProcessRequestRevokeToken() { ...@@ -127,7 +127,7 @@ func (suite *TokenStoreTestSuite) TestProcessRequestRevokeToken() {
suite.Equal(token, expectedRevokedToken, "ok") suite.Equal(token, expectedRevokedToken, "ok")
} }
func (suite *TokenStoreTestSuite) TestProcessRequestGetRevokedTokens() { func (suite *TokenStoreTestSuite) TestProcessRequestCheckRevokedToken() {
suite.mock_db.On("Close") suite.mock_db.On("Close")
suite.store.Close() suite.store.Close()
common.Settings.UpdateRevokedTokensIntervalSec = 5 common.Settings.UpdateRevokedTokensIntervalSec = 5
...@@ -141,6 +141,7 @@ func (suite *TokenStoreTestSuite) TestProcessRequestGetRevokedTokens() { ...@@ -141,6 +141,7 @@ func (suite *TokenStoreTestSuite) TestProcessRequestGetRevokedTokens() {
logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("list"))) logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("list")))
time.Sleep(time.Second*1) time.Sleep(time.Second*1)
_,err := suite.store.GetRevokedTokenIds() res,err := suite.store.IsTokenRevoked("123")
suite.Equal(err, nil, "ok") suite.Equal(err, nil, "ok")
suite.Equal(false, res, "ok")
} }
\ No newline at end of file
...@@ -14,5 +14,6 @@ ...@@ -14,5 +14,6 @@
"Uri" : "ldap://localhost:389", "Uri" : "ldap://localhost:389",
"BaseDn" : "ou=rgy,o=desy,c=de", "BaseDn" : "ou=rgy,o=desy,c=de",
"FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)" "FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)"
} },
"UpdateRevokedTokensIntervalSec": 60
} }
...@@ -16,5 +16,6 @@ ...@@ -16,5 +16,6 @@
"FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)" "FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)"
}, },
"DatabaseServer":"auto", "DatabaseServer":"auto",
"DiscoveryServer": "localhost:8400/asapo-discovery" "DiscoveryServer": "localhost:8400/asapo-discovery",
"UpdateRevokedTokensIntervalSec": 60
} }
...@@ -6,6 +6,7 @@ trap Cleanup EXIT ...@@ -6,6 +6,7 @@ trap Cleanup EXIT
Cleanup() { Cleanup() {
echo cleanup echo cleanup
echo "db.dropDatabase()" | mongo asapo_admin
} }
mkdir -p /tmp/asapo/asap3/petra3/gpfs/p00/2019/comissioning/c20180508-000-COM20181 mkdir -p /tmp/asapo/asap3/petra3/gpfs/p00/2019/comissioning/c20180508-000-COM20181
...@@ -20,8 +21,10 @@ cp beamtime-metadata-11111112.json /tmp/asapo/beamline/p08/current/ ...@@ -20,8 +21,10 @@ cp beamtime-metadata-11111112.json /tmp/asapo/beamline/p08/current/
AdminToken=$ASAPO_CREATE_TOKEN AdminToken=$ASAPO_CREATE_TOKEN
echo admin $AdminToken echo admin $AdminToken
curl -v --silent -H "Authorization: Bearer $AdminToken" --data '{"Subject": {"beamtimeId":"12345678"},"DaysValid":123,"AccessType":["read"]}' 127.0.0.1:8400/asapo-authorizer/admin/issue --stderr - | tee /dev/stderr | grep "bt_12345678" RevokeToken=$ASAPO_REVOKE_TOKEN
curl -v --silent -H "Authorization: Bearer blabla" --data '{"Subject": {"beamtimeId":"12345678"},"DaysValid":123,"AccessType":["read"]}' 127.0.0.1:8400/asapo-authorizer/admin/issue --stderr - | tee /dev/stderr | grep "token does not match"
curl -v --silent -H "Authorization: Bearer $AdminToken" --data '{"Subject": {"beamtimeId":"12345678"},"DaysValid":123,"AccessTypes":["read"]}' 127.0.0.1:8400/asapo-authorizer/admin/issue --stderr - | tee /dev/stderr | grep "bt_12345678"
curl -v --silent -H "Authorization: Bearer blabla" --data '{"Subject": {"beamtimeId":"12345678"},"DaysValid":123,"AccessTypes":["read"]}' 127.0.0.1:8400/asapo-authorizer/admin/issue --stderr - | tee /dev/stderr | grep "token does not match"
curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep c20180508-000-COM20181 curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep c20180508-000-COM20181
curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep p00 curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep p00
...@@ -59,4 +62,18 @@ curl -v --silent --data "{\"SourceCredentials\":\"processed%auto%p07%detector%$t ...@@ -59,4 +62,18 @@ curl -v --silent --data "{\"SourceCredentials\":\"processed%auto%p07%detector%$t
token=$BLP07_W_TOKEN token=$BLP07_W_TOKEN
curl -v --silent --data "{\"SourceCredentials\":\"processed%auto%p07%detector%$token\",\"OriginHost\":\"bla\"}" 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep write curl -v --silent --data "{\"SourceCredentials\":\"processed%auto%p07%detector%$token\",\"OriginHost\":\"bla\"}" 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep write
#revocation
token=`curl --silent -H "Authorization: Bearer $AdminToken" --data '{"Subject": {"beamtimeId":"11000015"},"DaysValid":123,"AccessTypes":["read"]}' 127.0.0.1:8400/asapo-authorizer/admin/issue | jq -r .Token`
echo $token
curl -v --silent --data "{\"SourceCredentials\":\"processed%11000015%auto%detector%$token\",\"OriginHost\":\"bla\"}" 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep p00
#revoke token
curl -v --silent -H "Authorization: Bearer $RevokeToken" --data '{"Token": "'"$token"'"}' 127.0.0.1:8400/asapo-authorizer/admin/revoke | grep '"Revoked":true'
sleep 1
curl -v --silent --data "{\"SourceCredentials\":\"processed%11000015%auto%detector%$token\",\"OriginHost\":\"bla\"}" 127.0.0.1:8400/asapo-authorizer/authorize --stderr - | tee /dev/stderr | grep 401
rm -rf /tmp/asapo/asap3 /tmp/asapo/beamline rm -rf /tmp/asapo/asap3 /tmp/asapo/beamline
\ No newline at end of file
...@@ -17,5 +17,6 @@ ...@@ -17,5 +17,6 @@
"FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)" "FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)"
}, },
"DatabaseServer":"auto", "DatabaseServer":"auto",
"DiscoveryServer": "localhost:8400/asapo-discovery" "DiscoveryServer": "localhost:8400/asapo-discovery",
"UpdateRevokedTokensIntervalSec": 60
} }
...@@ -17,5 +17,6 @@ ...@@ -17,5 +17,6 @@
"FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)" "FilterTemplate" : "(cn=a3__BEAMLINE__-hosts)"
}, },
"DatabaseServer":"auto", "DatabaseServer":"auto",
"DiscoveryServer": "localhost:8400/asapo-discovery" "DiscoveryServer": "localhost:8400/asapo-discovery",
"UpdateRevokedTokensIntervalSec": 60
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment