From c56252fc05f426b3b1af2c2487a78581f1b003b3 Mon Sep 17 00:00:00 2001 From: Sylvain Jermini Date: Sun, 30 Aug 2015 19:29:34 +0200 Subject: [PATCH] #8 WORK-263 expose oauth handler configurability status up to the front end --- .../lavagna/web/api/LoginInfoController.java | 31 ++++++++++++++----- .../web/security/login/OAuthLogin.java | 6 +++- .../login/oauth/BitbucketHandler.java | 5 +++ .../security/login/oauth/GithubHandler.java | 5 +++ .../security/login/oauth/GitlabHandler.java | 5 +++ .../security/login/oauth/GoogleHandler.java | 5 +++ .../oauth/OAuthResultHandlerFactory.java | 3 ++ .../security/login/oauth/TwitterHandler.java | 5 +++ src/main/webapp/app/app.js | 2 +- .../admin/admin-configure-login.js | 4 +-- src/main/webapp/app/services/admin.js | 2 +- .../partials/admin/configure-login.html | 12 +++---- .../io/lavagna/web/config/ServiceConf.java | 6 ++++ 13 files changed, 73 insertions(+), 18 deletions(-) diff --git a/src/main/java/io/lavagna/web/api/LoginInfoController.java b/src/main/java/io/lavagna/web/api/LoginInfoController.java index a2891b7af..32a9c6ef7 100644 --- a/src/main/java/io/lavagna/web/api/LoginInfoController.java +++ b/src/main/java/io/lavagna/web/api/LoginInfoController.java @@ -23,6 +23,7 @@ import io.lavagna.web.helper.ExpectPermission; import io.lavagna.web.security.LoginHandler; import io.lavagna.web.security.login.OAuthLogin; +import io.lavagna.web.security.login.oauth.OAuthResultHandlerFactory; import java.util.ArrayList; import java.util.Collection; @@ -31,10 +32,13 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.regex.Pattern; +import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import lombok.Getter; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -49,10 +53,12 @@ public class LoginInfoController { private final ConfigurationRepository configurationRepository; + private final OAuthLogin oauthLogin; @Autowired - public LoginInfoController(ConfigurationRepository configurationRepository) { + public LoginInfoController(ConfigurationRepository configurationRepository, OAuthLogin oauthLogin) { this.configurationRepository = configurationRepository; + this.oauthLogin = oauthLogin; } @RequestMapping(value = "/api/login/all", method = RequestMethod.GET) @@ -66,12 +72,23 @@ public Collection getAllLoginProviders(HttpServletRequest request) { return res; } + @Getter + @AllArgsConstructor + public static class OAuthProviderInfo implements Comparable { + private final String name; + private final boolean hasConfigurableBaseUrl; + + @Override + public int compareTo(OAuthProviderInfo o) { + return name.compareTo(o.name); + } + } + @RequestMapping(value = "/api/login/oauth/all", method = RequestMethod.GET) - public Collection getAllUnprefixedOauthProviders(HttpServletRequest request) { - WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()); - List res = new ArrayList<>(); - for(String s : ctx.getBean(OAuthLogin.class).getAllHandlerNames()) { - res.add(s.split(Pattern.quote("."), 2)[1]); + public Collection getAllUnprefixedOauthProviders() { + List res = new ArrayList<>(); + for(Entry e : oauthLogin.getAllHandlers().entrySet()) { + res.add(new OAuthProviderInfo(e.getKey(), e.getValue().hasConfigurableBaseUrl())); } Collections.sort(res); return res; diff --git a/src/main/java/io/lavagna/web/security/login/OAuthLogin.java b/src/main/java/io/lavagna/web/security/login/OAuthLogin.java index 152c764fb..22d4c3a70 100644 --- a/src/main/java/io/lavagna/web/security/login/OAuthLogin.java +++ b/src/main/java/io/lavagna/web/security/login/OAuthLogin.java @@ -45,7 +45,7 @@ public class OAuthLogin extends AbstractLoginHandler { static final Map SUPPORTED_OAUTH_HANDLER; - static final String USER_PROVIDER = "oauth"; + private static final String USER_PROVIDER = "oauth"; static { Map r = new LinkedHashMap<>(); @@ -175,6 +175,10 @@ public OAuthResultHandler from(OAuthProvider oauthProvider, String confBaseUrl, } } } + + public Map getAllHandlers() { + return SUPPORTED_OAUTH_HANDLER; + } @Override public List getAllHandlerNames() { diff --git a/src/main/java/io/lavagna/web/security/login/oauth/BitbucketHandler.java b/src/main/java/io/lavagna/web/security/login/oauth/BitbucketHandler.java index d00c910e9..2e8a18e38 100644 --- a/src/main/java/io/lavagna/web/security/login/oauth/BitbucketHandler.java +++ b/src/main/java/io/lavagna/web/security/login/oauth/BitbucketHandler.java @@ -60,5 +60,10 @@ public OAuthResultHandler build(ServiceBuilder serviceBuilder, String errorPage) { return new BitbucketHandler(serviceBuilder, reqBuilder, provider.getApiKey(), provider.getApiSecret(), callback, users, sessionHandler, errorPage); } + + @Override + public boolean hasConfigurableBaseUrl() { + return false; + } }; } diff --git a/src/main/java/io/lavagna/web/security/login/oauth/GithubHandler.java b/src/main/java/io/lavagna/web/security/login/oauth/GithubHandler.java index c7aada7f1..b6c54b82d 100644 --- a/src/main/java/io/lavagna/web/security/login/oauth/GithubHandler.java +++ b/src/main/java/io/lavagna/web/security/login/oauth/GithubHandler.java @@ -59,6 +59,11 @@ public OAuthResultHandler build(ServiceBuilder serviceBuilder, String errorPage) { return new GithubHandler(serviceBuilder, reqBuilder, provider.getApiKey(), provider.getApiSecret(), callback, users, sessionHandler, errorPage); } + + @Override + public boolean hasConfigurableBaseUrl() { + return false; + } }; } diff --git a/src/main/java/io/lavagna/web/security/login/oauth/GitlabHandler.java b/src/main/java/io/lavagna/web/security/login/oauth/GitlabHandler.java index 5c9e0ca0e..daa42c69e 100644 --- a/src/main/java/io/lavagna/web/security/login/oauth/GitlabHandler.java +++ b/src/main/java/io/lavagna/web/security/login/oauth/GitlabHandler.java @@ -67,5 +67,10 @@ public OAuthResultHandler build(ServiceBuilder serviceBuilder, String errorPage) { return new GitlabHandler(serviceBuilder, reqBuilder, provider, callback, users, sessionHandler, errorPage); } + + @Override + public boolean hasConfigurableBaseUrl() { + return true; + } }; } diff --git a/src/main/java/io/lavagna/web/security/login/oauth/GoogleHandler.java b/src/main/java/io/lavagna/web/security/login/oauth/GoogleHandler.java index 59ab94838..d30891efe 100644 --- a/src/main/java/io/lavagna/web/security/login/oauth/GoogleHandler.java +++ b/src/main/java/io/lavagna/web/security/login/oauth/GoogleHandler.java @@ -81,5 +81,10 @@ public OAuthResultHandler build(ServiceBuilder serviceBuilder, String errorPage) { return new GoogleHandler(serviceBuilder, reqBuilder, provider.getApiKey(), provider.getApiSecret(), callback, users, sessionHandler, errorPage); } + + @Override + public boolean hasConfigurableBaseUrl() { + return false; + } }; } diff --git a/src/main/java/io/lavagna/web/security/login/oauth/OAuthResultHandlerFactory.java b/src/main/java/io/lavagna/web/security/login/oauth/OAuthResultHandlerFactory.java index 3ff8e4799..ea3a32bea 100644 --- a/src/main/java/io/lavagna/web/security/login/oauth/OAuthResultHandlerFactory.java +++ b/src/main/java/io/lavagna/web/security/login/oauth/OAuthResultHandlerFactory.java @@ -31,4 +31,7 @@ OAuthResultHandler build(ServiceBuilder serviceBuilder, Users users, SessionHandler sessionHandler, String errorPage); + + + boolean hasConfigurableBaseUrl(); } diff --git a/src/main/java/io/lavagna/web/security/login/oauth/TwitterHandler.java b/src/main/java/io/lavagna/web/security/login/oauth/TwitterHandler.java index 87dc21f5c..509d0ae5e 100644 --- a/src/main/java/io/lavagna/web/security/login/oauth/TwitterHandler.java +++ b/src/main/java/io/lavagna/web/security/login/oauth/TwitterHandler.java @@ -59,5 +59,10 @@ public OAuthResultHandler build(ServiceBuilder serviceBuilder, String errorPage) { return new TwitterHandler(serviceBuilder, reqBuilder, provider.getApiKey(), provider.getApiSecret(), callback, users, sessionHandler, errorPage); } + + @Override + public boolean hasConfigurableBaseUrl() { + return false; + } }; } diff --git a/src/main/webapp/app/app.js b/src/main/webapp/app/app.js index b16ec5fb9..51d893615 100644 --- a/src/main/webapp/app/app.js +++ b/src/main/webapp/app/app.js @@ -204,7 +204,7 @@ url: 'configure-login/', templateUrl: 'partials/admin/configure-login.html', controller: 'AdminConfigureLoginCtrl', - resolve: {'oauthProviders' : function(Admin) {return Admin.findAllUnprefixedOauthProviders();}} + resolve: {'oauthProviders' : function(Admin) {return Admin.findAllOauthProvidersInfo();}} }).state('admin.adminManageSmtpConfiguration', { url : 'manage-smtp-configuration/', templateUrl : 'partials/admin/manage-smtp-configuration.html', diff --git a/src/main/webapp/app/controllers/admin/admin-configure-login.js b/src/main/webapp/app/controllers/admin/admin-configure-login.js index 80577efdc..a18912c65 100644 --- a/src/main/webapp/app/controllers/admin/admin-configure-login.js +++ b/src/main/webapp/app/controllers/admin/admin-configure-login.js @@ -35,7 +35,7 @@ $scope.oauth = {}; angular.forEach($scope.oauthProviders, function(p) { - $scope.oauth[p] = {}; + $scope.oauth[p.name] = {}; }); $scope.oauth.baseUrl = oauth.baseUrl || CONTEXT_PATH; @@ -121,7 +121,7 @@ var newOauthConf = {baseUrl: $scope.oauth.baseUrl, providers : []}; angular.forEach($scope.oauthProviders, function(provider) { - addProviderIfPresent(newOauthConf.providers, $scope.oauth[provider], provider); + addProviderIfPresent(newOauthConf.providers, $scope.oauth[provider.name], provider.name); }); toUpdate.push({first : 'OAUTH_CONFIGURATION', second : JSON.stringify(newOauthConf)}); diff --git a/src/main/webapp/app/services/admin.js b/src/main/webapp/app/services/admin.js index 4a6c6e984..12dbb5b9b 100644 --- a/src/main/webapp/app/services/admin.js +++ b/src/main/webapp/app/services/admin.js @@ -65,7 +65,7 @@ findAllLoginHandlers : function() { return $http.get('api/login/all').then(extractData); }, - findAllUnprefixedOauthProviders : function() { + findAllOauthProvidersInfo : function() { return $http.get('api/login/oauth/all').then(extractData); }, findAllBaseLoginWithActivationStatus : function() { diff --git a/src/main/webapp/partials/admin/configure-login.html b/src/main/webapp/partials/admin/configure-login.html index 2963172fb..eb56a84d7 100644 --- a/src/main/webapp/partials/admin/configure-login.html +++ b/src/main/webapp/partials/admin/configure-login.html @@ -130,21 +130,21 @@
- -
+ +
-
+
partials.admin.configure-login.oauth.apiKey
- +
partials.admin.configure-login.oauth.secret
- +
partials.admin.configure-login.oauth.callback
- +
diff --git a/src/test/java/io/lavagna/web/config/ServiceConf.java b/src/test/java/io/lavagna/web/config/ServiceConf.java index 3654792f7..3a533b371 100644 --- a/src/test/java/io/lavagna/web/config/ServiceConf.java +++ b/src/test/java/io/lavagna/web/config/ServiceConf.java @@ -46,6 +46,7 @@ import io.lavagna.service.SetupService; import io.lavagna.service.UserRepository; import io.lavagna.service.UserService; +import io.lavagna.web.security.login.OAuthLogin; import java.util.Collections; import java.util.Date; @@ -197,4 +198,9 @@ public BulkOperationService getBulkOperationService() { public CalendarService getCalendarService() { return mock(CalendarService.class); } + + @Bean + public OAuthLogin getOAuthLogin() { + return mock(OAuthLogin.class); + } } \ No newline at end of file