forked from TrueCloudLab/certificates
parent
54d0186d1f
commit
a54bf925eb
2 changed files with 31 additions and 0 deletions
|
@ -70,6 +70,7 @@ type GCP struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
ServiceAccounts []string `json:"serviceAccounts"`
|
ServiceAccounts []string `json:"serviceAccounts"`
|
||||||
|
ProjectIDs []string `json:"projectIDs"`
|
||||||
DisableCustomSANs bool `json:"disableCustomSANs"`
|
DisableCustomSANs bool `json:"disableCustomSANs"`
|
||||||
DisableTrustOnFirstUse bool `json:"disableTrustOnFirstUse"`
|
DisableTrustOnFirstUse bool `json:"disableTrustOnFirstUse"`
|
||||||
Claims *Claims `json:"claims,omitempty"`
|
Claims *Claims `json:"claims,omitempty"`
|
||||||
|
@ -284,6 +285,20 @@ func (p *GCP) authorizeToken(token string) (*gcpPayload, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validate projects
|
||||||
|
if len(p.ProjectIDs) > 0 {
|
||||||
|
var found bool
|
||||||
|
for _, pi := range p.ProjectIDs {
|
||||||
|
if pi == claims.Google.ComputeEngine.ProjectID {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
return nil, errors.New("invalid token: invalid project id")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case claims.Google.ComputeEngine.InstanceID == "":
|
case claims.Google.ComputeEngine.InstanceID == "":
|
||||||
return nil, errors.New("token google.compute_engine.instance_id cannot be empty")
|
return nil, errors.New("token google.compute_engine.instance_id cannot be empty")
|
||||||
|
|
|
@ -203,6 +203,10 @@ func TestGCP_AuthorizeSign(t *testing.T) {
|
||||||
assert.FatalError(t, err)
|
assert.FatalError(t, err)
|
||||||
p2.DisableCustomSANs = true
|
p2.DisableCustomSANs = true
|
||||||
|
|
||||||
|
p3, err := generateGCP()
|
||||||
|
assert.FatalError(t, err)
|
||||||
|
p3.ProjectIDs = []string{"other-project-id"}
|
||||||
|
|
||||||
aKey, err := generateJSONWebKey()
|
aKey, err := generateJSONWebKey()
|
||||||
assert.FatalError(t, err)
|
assert.FatalError(t, err)
|
||||||
|
|
||||||
|
@ -216,6 +220,11 @@ func TestGCP_AuthorizeSign(t *testing.T) {
|
||||||
"instance-id", "instance-name", "project-id", "zone",
|
"instance-id", "instance-name", "project-id", "zone",
|
||||||
time.Now(), &p2.keyStore.keySet.Keys[0])
|
time.Now(), &p2.keyStore.keySet.Keys[0])
|
||||||
assert.FatalError(t, err)
|
assert.FatalError(t, err)
|
||||||
|
t3, err := generateGCPToken(p3.ServiceAccounts[0],
|
||||||
|
"https://accounts.google.com", p3.GetID(),
|
||||||
|
"instance-id", "instance-name", "other-project-id", "zone",
|
||||||
|
time.Now(), &p3.keyStore.keySet.Keys[0])
|
||||||
|
assert.FatalError(t, err)
|
||||||
|
|
||||||
failKey, err := generateGCPToken(p1.ServiceAccounts[0],
|
failKey, err := generateGCPToken(p1.ServiceAccounts[0],
|
||||||
"https://accounts.google.com", p1.GetID(),
|
"https://accounts.google.com", p1.GetID(),
|
||||||
|
@ -247,6 +256,11 @@ func TestGCP_AuthorizeSign(t *testing.T) {
|
||||||
"instance-id", "instance-name", "project-id", "zone",
|
"instance-id", "instance-name", "project-id", "zone",
|
||||||
time.Now(), &p1.keyStore.keySet.Keys[0])
|
time.Now(), &p1.keyStore.keySet.Keys[0])
|
||||||
assert.FatalError(t, err)
|
assert.FatalError(t, err)
|
||||||
|
failInvalidProjectID, err := generateGCPToken(p3.ServiceAccounts[0],
|
||||||
|
"https://accounts.google.com", p3.GetID(),
|
||||||
|
"instance-id", "instance-name", "project-id", "zone",
|
||||||
|
time.Now(), &p3.keyStore.keySet.Keys[0])
|
||||||
|
assert.FatalError(t, err)
|
||||||
failInstanceID, err := generateGCPToken(p1.ServiceAccounts[0],
|
failInstanceID, err := generateGCPToken(p1.ServiceAccounts[0],
|
||||||
"https://accounts.google.com", p1.GetID(),
|
"https://accounts.google.com", p1.GetID(),
|
||||||
"", "instance-name", "project-id", "zone",
|
"", "instance-name", "project-id", "zone",
|
||||||
|
@ -280,6 +294,7 @@ func TestGCP_AuthorizeSign(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{"ok", p1, args{t1}, 4, false},
|
{"ok", p1, args{t1}, 4, false},
|
||||||
{"ok", p2, args{t2}, 5, false},
|
{"ok", p2, args{t2}, 5, false},
|
||||||
|
{"ok", p3, args{t3}, 4, false},
|
||||||
{"fail token", p1, args{"token"}, 0, true},
|
{"fail token", p1, args{"token"}, 0, true},
|
||||||
{"fail key", p1, args{failKey}, 0, true},
|
{"fail key", p1, args{failKey}, 0, true},
|
||||||
{"fail iss", p1, args{failIss}, 0, true},
|
{"fail iss", p1, args{failIss}, 0, true},
|
||||||
|
@ -287,6 +302,7 @@ func TestGCP_AuthorizeSign(t *testing.T) {
|
||||||
{"fail exp", p1, args{failExp}, 0, true},
|
{"fail exp", p1, args{failExp}, 0, true},
|
||||||
{"fail nbf", p1, args{failNbf}, 0, true},
|
{"fail nbf", p1, args{failNbf}, 0, true},
|
||||||
{"fail service account", p1, args{failServiceAccount}, 0, true},
|
{"fail service account", p1, args{failServiceAccount}, 0, true},
|
||||||
|
{"fail invalid project id", p3, args{failInvalidProjectID}, 0, true},
|
||||||
{"fail instance id", p1, args{failInstanceID}, 0, true},
|
{"fail instance id", p1, args{failInstanceID}, 0, true},
|
||||||
{"fail instance name", p1, args{failInstanceName}, 0, true},
|
{"fail instance name", p1, args{failInstanceName}, 0, true},
|
||||||
{"fail project id", p1, args{failProjectID}, 0, true},
|
{"fail project id", p1, args{failProjectID}, 0, true},
|
||||||
|
|
Loading…
Reference in a new issue