@@ -469,3 +469,80 @@ func (ts *SSOTestSuite) TestFindSSOProviderByResourceID() {
469469 require .Nil (ts .T (), got )
470470 }
471471}
472+
473+ func (ts * SSOTestSuite ) TestUpdateSCIMToken () {
474+ hashes := map [string ]string {
475+ "scim_test_token" : "dcbcd9ffd696ae1f2ee0f035fa17680d78175020a5fa1aadc758dbd681e0fe1d" ,
476+ "scim_rotated_token" : "289adb37f8946571bb4aea1e663281126c7f2d84d929ff09429fcaa1eb3f27bf" ,
477+ }
478+
479+ provider := & SSOProvider {
480+ SAMLProvider : SAMLProvider {
481+ EntityID : "https://example.com/saml/metadata/" ,
482+ MetadataXML : "<example />" ,
483+ },
484+ }
485+ require .Nil (ts .T (), provider .SCIMTokenHash )
486+
487+ for token , hash := range hashes {
488+ provider .UpdateSCIMToken (token )
489+ require .NotNil (ts .T (), provider .SCIMTokenHash )
490+ require .Equal (ts .T (), hash , * provider .SCIMTokenHash )
491+ }
492+ }
493+
494+ func (ts * SSOTestSuite ) TestFindSSOProviderBySCIMToken () {
495+ token := "scim_test_token"
496+ provider := & SSOProvider {
497+ SAMLProvider : SAMLProvider {
498+ EntityID : "https://example.com/saml/metadata/1" ,
499+ MetadataXML : "<example />" ,
500+ },
501+ }
502+
503+ provider .UpdateSCIMToken (token )
504+ require .NoError (ts .T (), ts .db .Eager ().Create (provider ))
505+
506+ withoutToken := & SSOProvider {
507+ SAMLProvider : SAMLProvider {
508+ EntityID : "https://example.com/saml/metadata/2" ,
509+ MetadataXML : "<example />" ,
510+ },
511+ }
512+ require .NoError (ts .T (), ts .db .Eager ().Create (withoutToken ))
513+
514+ ts .Run ("resolves the provider that owns the token" , func () {
515+ found , err := FindSSOProviderBySCIMToken (ts .db , token )
516+
517+ require .NoError (ts .T (), err )
518+ require .Equal (ts .T (), provider .ID , found .ID )
519+ })
520+
521+ ts .Run ("an unknown token resolves nothing" , func () {
522+ found , err := FindSSOProviderBySCIMToken (ts .db , "scim_unknown_token" )
523+
524+ require .Nil (ts .T (), found )
525+ require .True (ts .T (), IsNotFoundError (err ))
526+ })
527+
528+ ts .Run ("an empty token does not match a provider without one" , func () {
529+ found , err := FindSSOProviderBySCIMToken (ts .db , "" )
530+
531+ require .Nil (ts .T (), found )
532+ require .True (ts .T (), IsNotFoundError (err ))
533+ })
534+
535+ ts .Run ("rotation stops the previous token from resolving" , func () {
536+ newToken := "scim_rotated_token"
537+ provider .UpdateSCIMToken (newToken )
538+ require .NoError (ts .T (), ts .db .Update (provider ))
539+
540+ found , err := FindSSOProviderBySCIMToken (ts .db , newToken )
541+ require .NoError (ts .T (), err )
542+ require .Equal (ts .T (), provider .ID , found .ID )
543+
544+ found , err = FindSSOProviderBySCIMToken (ts .db , token )
545+ require .Nil (ts .T (), found )
546+ require .True (ts .T (), IsNotFoundError (err ))
547+ })
548+ }
0 commit comments