Skip to content

Commit

Permalink
#8 WORK-263 expose oauth handler configurability status up to the fro…
Browse files Browse the repository at this point in the history
…nt end
syjer committed Aug 30, 2015
1 parent 8444e91 commit c56252f
Showing 13 changed files with 73 additions and 18 deletions.
31 changes: 24 additions & 7 deletions src/main/java/io/lavagna/web/api/LoginInfoController.java
Original file line number Diff line number Diff line change
@@ -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<String> getAllLoginProviders(HttpServletRequest request) {
return res;
}

@Getter
@AllArgsConstructor
public static class OAuthProviderInfo implements Comparable<OAuthProviderInfo> {
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<String> getAllUnprefixedOauthProviders(HttpServletRequest request) {
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
List<String> res = new ArrayList<>();
for(String s : ctx.getBean(OAuthLogin.class).getAllHandlerNames()) {
res.add(s.split(Pattern.quote("."), 2)[1]);
public Collection<OAuthProviderInfo> getAllUnprefixedOauthProviders() {
List<OAuthProviderInfo> res = new ArrayList<>();
for(Entry<String, OAuthResultHandlerFactory> e : oauthLogin.getAllHandlers().entrySet()) {
res.add(new OAuthProviderInfo(e.getKey(), e.getValue().hasConfigurableBaseUrl()));
}
Collections.sort(res);
return res;
6 changes: 5 additions & 1 deletion src/main/java/io/lavagna/web/security/login/OAuthLogin.java
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@
public class OAuthLogin extends AbstractLoginHandler {

static final Map<String, OAuthResultHandlerFactory> SUPPORTED_OAUTH_HANDLER;
static final String USER_PROVIDER = "oauth";
private static final String USER_PROVIDER = "oauth";

static {
Map<String, OAuthResultHandlerFactory> r = new LinkedHashMap<>();
@@ -175,6 +175,10 @@ public OAuthResultHandler from(OAuthProvider oauthProvider, String confBaseUrl,
}
}
}

public Map<String, OAuthResultHandlerFactory> getAllHandlers() {
return SUPPORTED_OAUTH_HANDLER;
}

@Override
public List<String> getAllHandlerNames() {
Original file line number Diff line number Diff line change
@@ -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;
}
};
}
Original file line number Diff line number Diff line change
@@ -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;
}
};

}
Original file line number Diff line number Diff line change
@@ -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;
}
};
}
Original file line number Diff line number Diff line change
@@ -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;
}
};
}
Original file line number Diff line number Diff line change
@@ -31,4 +31,7 @@ OAuthResultHandler build(ServiceBuilder serviceBuilder,
Users users,
SessionHandler sessionHandler,
String errorPage);


boolean hasConfigurableBaseUrl();
}
Original file line number Diff line number Diff line change
@@ -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;
}
};
}
2 changes: 1 addition & 1 deletion src/main/webapp/app/app.js
Original file line number Diff line number Diff line change
@@ -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',
Original file line number Diff line number Diff line change
@@ -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)});

2 changes: 1 addition & 1 deletion src/main/webapp/app/services/admin.js
Original file line number Diff line number Diff line change
@@ -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() {
12 changes: 6 additions & 6 deletions src/main/webapp/partials/admin/configure-login.html
Original file line number Diff line number Diff line change
@@ -130,21 +130,21 @@

<div class="form-group" data-ng-repeat="provider in oauthProviders">
<div>
<lvg-switch switch-class="lvg-switch-sm" control="oauth[provider].present"></lvg-switch>
<div class="lvg-switch-label lvg-oauth-provider"><span data-ng-bind="provider"></span></div>
<lvg-switch switch-class="lvg-switch-sm" control="oauth[provider.name].present"></lvg-switch>
<div class="lvg-switch-label lvg-oauth-provider"><span data-ng-bind="provider.name"></span></div>
</div>
<div data-ng-show="oauth[provider].present" class="lvg-oauth-provider-panel">
<div data-ng-show="oauth[provider.name].present" class="lvg-oauth-provider-panel">
<div class="form-group">
<div class="lvg-form-label" data-translate>partials.admin.configure-login.oauth.apiKey</div>
<input class="form-control" type="text" data-ng-model="oauth[provider].apiKey">
<input class="form-control" type="text" data-ng-model="oauth[provider.name].apiKey">
</div>
<div class="form-group">
<div class="lvg-form-label" data-translate>partials.admin.configure-login.oauth.secret</div>
<input class="form-control" type="text" data-ng-model="oauth[provider].apiSecret">
<input class="form-control" type="text" data-ng-model="oauth[provider.name].apiSecret">
</div>
<div class="form-group">
<div class="lvg-form-label" data-translate>partials.admin.configure-login.oauth.callback</div>
<input class="form-control form-selectable" type="text" disabled value="{{oauth.baseUrl}}login/oauth/{{provider}}/callback">
<input class="form-control form-selectable" type="text" disabled value="{{oauth.baseUrl}}login/oauth/{{provider.name}}/callback">
</div>
</div>
</div>
6 changes: 6 additions & 0 deletions src/test/java/io/lavagna/web/config/ServiceConf.java
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit c56252f

Please sign in to comment.