From 6a92e0e78e5eedfb6cfffeed56dbd3e0e72ddefc Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 9 Sep 2010 18:35:54 +0200 Subject: [PATCH] improve authentication --- .../java/sonia/scm/BasicContextProvider.java | 19 +++++++++++++++++++ .../java/sonia/scm/SCMContextProvider.java | 10 ++++++++++ .../scm/api/rest/JsonJaxbContextResolver.java | 5 +++-- .../resources/AuthenticationResource.java | 16 +++++----------- .../src/main/webapp/resources/js/global.js | 17 +++++++++++++---- .../src/main/webapp/resources/js/layout.js | 13 +++++++------ .../main/webapp/resources/js/sonia.login.js | 4 ++-- 7 files changed, 59 insertions(+), 25 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/BasicContextProvider.java b/scm-core/src/main/java/sonia/scm/BasicContextProvider.java index 9684e1b8e6..e8ea36ca0e 100644 --- a/scm-core/src/main/java/sonia/scm/BasicContextProvider.java +++ b/scm-core/src/main/java/sonia/scm/BasicContextProvider.java @@ -11,6 +11,7 @@ package sonia.scm; import sonia.scm.group.GroupManager; import sonia.scm.repository.RepositoryManager; +import sonia.scm.repository.RepositoryType; import sonia.scm.util.ServiceUtil; import sonia.scm.util.Util; @@ -19,6 +20,7 @@ import sonia.scm.util.Util; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -125,6 +127,18 @@ public class BasicContextProvider implements SCMContextProvider return repositoryManagerMap.get(type); } + /** + * Method description + * + * + * @return + */ + @Override + public List getRepositoryTypes() + { + return repositoryTypes; + } + //~--- methods -------------------------------------------------------------- /** @@ -183,6 +197,7 @@ public class BasicContextProvider implements SCMContextProvider private void loadRepositoryManagers() { repositoryManagerMap = new HashMap(); + repositoryTypes = new ArrayList(); List repositoryManagers = ServiceUtil.getServices(RepositoryManager.class); @@ -191,6 +206,7 @@ public class BasicContextProvider implements SCMContextProvider { manager.init(this); repositoryManagerMap.put(manager.getType().getName(), manager); + repositoryTypes.add(manager.getType()); } } @@ -204,4 +220,7 @@ public class BasicContextProvider implements SCMContextProvider /** Field description */ private Map repositoryManagerMap; + + /** Field description */ + private List repositoryTypes; } diff --git a/scm-core/src/main/java/sonia/scm/SCMContextProvider.java b/scm-core/src/main/java/sonia/scm/SCMContextProvider.java index d1aab960dd..22576a310c 100644 --- a/scm-core/src/main/java/sonia/scm/SCMContextProvider.java +++ b/scm-core/src/main/java/sonia/scm/SCMContextProvider.java @@ -11,11 +11,13 @@ package sonia.scm; import sonia.scm.group.GroupManager; import sonia.scm.repository.RepositoryManager; +import sonia.scm.repository.RepositoryType; //~--- JDK imports ------------------------------------------------------------ import java.io.Closeable; import java.io.File; +import java.util.Collection; /** * @@ -59,4 +61,12 @@ public interface SCMContextProvider extends Closeable * @return */ public RepositoryManager getRepositoryManager(String type); + + /** + * Method description + * + * + * @return + */ + public Collection getRepositoryTypes(); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/JsonJaxbContextResolver.java b/scm-webapp/src/main/java/sonia/scm/api/rest/JsonJaxbContextResolver.java index 2531617670..17875685ff 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/JsonJaxbContextResolver.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/JsonJaxbContextResolver.java @@ -9,6 +9,7 @@ package sonia.scm.api.rest; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.ScmState; import sonia.scm.group.Group; import sonia.scm.repository.Repository; @@ -43,7 +44,7 @@ public class JsonJaxbContextResolver implements ContextResolver { this.context = new JSONJAXBContext( JSONConfiguration.mapped().rootUnwrapping(true).arrays( - "member", "groups", "permissions").nonStrings( + "member", "groups", "permissions", "repositoryTypes").nonStrings( "readable", "writeable", "groupPermission").build(), types.toArray( new Class[0])); } @@ -73,5 +74,5 @@ public class JsonJaxbContextResolver implements ContextResolver /** Field description */ private List types = Arrays.asList(new Class[] { Group.class, - Repository.class }); + Repository.class, ScmState.class }); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java index e599ceb943..8854b964a8 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java @@ -9,9 +9,10 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.repository.RepositoryType; +import sonia.scm.SCMContext; import sonia.scm.ScmState; import sonia.scm.User; +import sonia.scm.repository.RepositoryType; import sonia.scm.security.Authenticator; //~--- JDK imports ------------------------------------------------------------ @@ -41,15 +42,6 @@ import javax.ws.rs.core.Response; public class AuthenticationResource { - /** Field description */ - private static final RepositoryType[] types = new RepositoryType[] { - new RepositoryType("hg", - "Mercurial"), - new RepositoryType("svn", "Subversion"), - new RepositoryType("git", "Git") }; - - //~--- get methods ---------------------------------------------------------- - /** * Method description * @@ -120,7 +112,9 @@ public class AuthenticationResource ScmState state = new ScmState(); state.setUser(user); - state.setRepositoryTypes(types); + state.setRepositoryTypes( + SCMContext.getContext().getRepositoryTypes().toArray( + new RepositoryType[0])); return state; } diff --git a/scm-webapp/src/main/webapp/resources/js/global.js b/scm-webapp/src/main/webapp/resources/js/global.js index e8e9411c88..eef0107439 100644 --- a/scm-webapp/src/main/webapp/resources/js/global.js +++ b/scm-webapp/src/main/webapp/resources/js/global.js @@ -4,14 +4,23 @@ */ var debug = true; - var state = null; - -/*var repositoryTypes = [ ['Mercurial', 'hg'], ['Subversion','svn'], ['Git','git'] ];*/ +var authCallbacks = []; var repositoryTypeStore = new Ext.data.JsonStore({ id: 1, fields: [ 'displayName', 'name' ] }); -var restUrl = "api/rest/"; \ No newline at end of file +var restUrl = "api/rest/"; + +function loadState(s){ + state = s; + console.debug( s ); + repositoryTypeStore.loadData(state.repositoryTypes); + Ext.each(authCallbacks, function(callback){ + if ( Ext.isFunction(callback) ){ + callback(state); + } + }); +} \ No newline at end of file diff --git a/scm-webapp/src/main/webapp/resources/js/layout.js b/scm-webapp/src/main/webapp/resources/js/layout.js index 7276b48656..549397b469 100644 --- a/scm-webapp/src/main/webapp/resources/js/layout.js +++ b/scm-webapp/src/main/webapp/resources/js/layout.js @@ -113,20 +113,21 @@ Ext.onReady(function(){ repositoryLink.on('click', addRepositoryPanel); } + // create menu after login + authCallbacks.push( createMainMenu ); + Ext.Ajax.request({ url: restUrl + 'authentication.json', method: 'GET', success: function(response){ - state = Ext.decode(response.responseText); - console.debug( state ); - repositoryTypeStore.loadData(state.repositoryTypes); - createMainMenu(); + var s = Ext.decode(response.responseText); + loadState(s); }, failure: function(){ var loginWin = new Sonia.login.Window(); - loginWin.on('success', function(){ + /*loginWin.on('success', function(){ createMainMenu(); - }); + });*/ loginWin.show(); } }); diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.login.js b/scm-webapp/src/main/webapp/resources/js/sonia.login.js index 7807bac971..05598d8d43 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.login.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.login.js @@ -63,8 +63,8 @@ Sonia.login.Form = Ext.extend(Ext.FormPanel,{ waitTitle:'Connecting', waitMsg:'Sending data...', - success: function(){ - Ext.Msg.alert('Login Success!'); + success: function(form, action){ + loadState( action.result ); }, failure: function(form, action){