func TestAddAndRetrieveApp(t *testing.T) { app := new(roll.Application) app.ApplicationName = "an app" app.ClientID = "123" app.ClientSecret = "hush" app.DeveloperEmail = "*****@*****.**" app.DeveloperID = "foo" app.LoginProvider = "auth0" app.RedirectURI = "neither here nor there" appRepo := NewMBDAppRepo() err := appRepo.CreateApplication(app) if assert.Nil(t, err) { defer appRepo.delete(app) } retapp, err := appRepo.RetrieveAppByNameAndDevEmail("an app", "*****@*****.**") assert.Nil(t, err) if assert.NotNil(t, app) { assert.Equal(t, app.ApplicationName, retapp.ApplicationName) assert.Equal(t, app.ClientID, retapp.ClientID) assert.Equal(t, app.ClientSecret, retapp.ClientSecret) assert.Equal(t, app.DeveloperEmail, retapp.DeveloperEmail) assert.Equal(t, app.DeveloperID, retapp.DeveloperID) assert.Equal(t, app.LoginProvider, retapp.LoginProvider) assert.Equal(t, app.RedirectURI, retapp.RedirectURI) } retapp, err = appRepo.RetrieveApplication(app.ClientID, app.DeveloperID, false) assert.Nil(t, err) if assert.NotNil(t, app) { assert.Equal(t, app.ApplicationName, retapp.ApplicationName) assert.Equal(t, app.ClientID, retapp.ClientID) assert.Equal(t, app.ClientSecret, retapp.ClientSecret) assert.Equal(t, app.DeveloperEmail, retapp.DeveloperEmail) assert.Equal(t, app.DeveloperID, retapp.DeveloperID) assert.Equal(t, app.LoginProvider, retapp.LoginProvider) assert.Equal(t, app.RedirectURI, retapp.RedirectURI) } retapp, err = appRepo.RetrieveApplication(app.ClientID, "huh", true) assert.Nil(t, err) if assert.NotNil(t, app) { assert.Equal(t, app.ApplicationName, retapp.ApplicationName) assert.Equal(t, app.ClientID, retapp.ClientID) assert.Equal(t, app.ClientSecret, retapp.ClientSecret) assert.Equal(t, app.DeveloperEmail, retapp.DeveloperEmail) assert.Equal(t, app.DeveloperID, retapp.DeveloperID) assert.Equal(t, app.LoginProvider, retapp.LoginProvider) assert.Equal(t, app.RedirectURI, retapp.RedirectURI) } retapp, err = appRepo.SystemRetrieveApplication(app.ClientID) assert.Nil(t, err) assert.Equal(t, app.ClientID, retapp.ClientID) retapp, err = appRepo.RetrieveApplication(app.ClientID, "huh", false) assert.NotNil(t, err) assert.Nil(t, retapp) }
func TestUpdateNoSuchApp(t *testing.T) { appRepo := NewMBDAppRepo() //Specify an app app := new(roll.Application) app.ApplicationName = "an app" app.ClientID = "123" app.DeveloperEmail = "*****@*****.**" app.DeveloperID = "foo" app.LoginProvider = "auth0" app.RedirectURI = "neither here nor there" err := appRepo.UpdateApplication(app, app.DeveloperID) assert.NotNil(t, err) }
func TestDuplicateAppCreateGeneratesError(t *testing.T) { app := new(roll.Application) app.ApplicationName = "an app" app.ClientID = "123" app.DeveloperEmail = "*****@*****.**" app.DeveloperID = "foo" app.LoginProvider = "auth0" app.RedirectURI = "neither here nor there" appRepo := NewMBDAppRepo() err := appRepo.CreateApplication(app) if assert.Nil(t, err) { defer appRepo.delete(app) } err = appRepo.CreateApplication(app) assert.NotNil(t, err) }
func TestSecretGeneratedWhenNeede(t *testing.T) { app := new(roll.Application) app.ApplicationName = "an app" app.ClientID = "123" app.DeveloperEmail = "*****@*****.**" app.DeveloperID = "foo" app.LoginProvider = "auth0" app.RedirectURI = "neither here nor there" appRepo := NewMBDAppRepo() err := appRepo.CreateApplication(app) if assert.Nil(t, err) { defer appRepo.delete(app) } retapp, err := appRepo.RetrieveAppByNameAndDevEmail("an app", "*****@*****.**") assert.Nil(t, err) assert.NotEqual(t, "", retapp.ClientSecret) }
func TestUpdateApp(t *testing.T) { appRepo := NewMBDAppRepo() //Count the apps prior to creating one apps, err := appRepo.ListApplications("foo", true) assert.Nil(t, err) adminCount := len(apps) //No apps see with a user id of not foo and not an admin apps, err = appRepo.ListApplications("not foo", false) assert.Nil(t, err) assert.Equal(t, 0, len(apps)) //Create an app app := new(roll.Application) app.ApplicationName = "an app" app.ClientID = "123" app.DeveloperEmail = "*****@*****.**" app.DeveloperID = "foo" app.LoginProvider = "auth0" app.RedirectURI = "neither here nor there" err = appRepo.CreateApplication(app) if assert.Nil(t, err) { defer appRepo.delete(app) } err = appRepo.UpdateApplication(app, "no way jose") assert.NotNil(t, err) err = appRepo.UpdateApplication(app, app.DeveloperID) assert.Nil(t, err) app.JWTFlowAudience = "aud" app.JWTFlowIssuer = "iss" app.JWTFlowPublicKey = "key to the city" appRepo.UpdateApplication(app, app.DeveloperID) retapp, err := appRepo.SystemRetrieveApplicationByJWTFlowAudience("aud") assert.Nil(t, err) if assert.NotNil(t, app) { assert.Equal(t, app.ApplicationName, retapp.ApplicationName) assert.Equal(t, app.ClientID, retapp.ClientID) assert.Equal(t, app.ClientSecret, retapp.ClientSecret) assert.Equal(t, app.DeveloperEmail, retapp.DeveloperEmail) assert.Equal(t, app.DeveloperID, retapp.DeveloperID) assert.Equal(t, app.LoginProvider, retapp.LoginProvider) assert.Equal(t, app.RedirectURI, retapp.RedirectURI) assert.Equal(t, app.JWTFlowAudience, retapp.JWTFlowAudience) assert.Equal(t, app.JWTFlowIssuer, retapp.JWTFlowIssuer) assert.Equal(t, app.JWTFlowPublicKey, retapp.JWTFlowPublicKey) } //Admin user should see an additional app in the list apps, err = appRepo.ListApplications("foo", true) assert.Nil(t, err) assert.Equal(t, adminCount+1, len(apps)) //User adding the app should see a list with 1 entry apps, err = appRepo.ListApplications("foo", false) assert.Nil(t, err) assert.Equal(t, 1, len(apps)) }
func handleApplicationPost(core *roll.Core, w http.ResponseWriter, r *http.Request) { var app roll.Application if err := parseRequest(r, &app); err != nil { respondError(w, http.StatusBadRequest, err) return } //Assign a client ID id, err := core.GenerateID() if err != nil { respondError(w, http.StatusInternalServerError, err) return } app.ClientID = id //Validate the content if err := app.Validate(); err != nil { respondError(w, http.StatusBadRequest, err) return } //Extract the subject from the request header based on security mode subject, _, err := subjectAndAdminScopeFromRequestCtx(r) if err != nil { log.Print("Error extracting subject:", err.Error()) respondError(w, http.StatusInternalServerError, nil) return } app.DeveloperID = subject //Store the application definition log.Info("storing app def: ", app) err = core.CreateApplication(&app) if err != nil { log.Info("Error storing app def: ", err.Error()) switch err.(type) { case *repos.DuplicateAppdefError: respondError(w, http.StatusConflict, err) default: respondError(w, http.StatusInternalServerError, err) } return } //Generate a private/public key pair log.Info("Generate key pair") private, public, err := secrets.GenerateKeyPair() if err != nil { respondError(w, http.StatusBadRequest, err) return } //Store keys in secrets vault log.Info("store key pair in vault") err = core.StoreKeysForApp(id, private, public) if err != nil { respondError(w, http.StatusInternalServerError, err) return } //Return the client id log.Info("return client id: ", id) clientID := ApplicationCreatedResponse{ClientID: id} respondOk(w, clientID) }