modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 88 ++++++---- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 54 +++--- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 21 ++ 7 files changed, 114 insertions(+), 65 deletions(-)
New commits: commit 7e38fa92bec032c5556e88a316db7cadf31c7cb6 Author: Simeon Pinder spinder@redhat.com Date: Thu Oct 14 11:26:36 2010 -0400
i)fixed new registration session issues ii)lowered some logging to trace.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java index 97a97d9..ff9f246 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java @@ -99,6 +99,7 @@ public class LoginView extends Canvas { private static final String PHONE = "phone"; private static final String DEPARTMENT = "department"; private static final String SESSIONID = "sessionid"; + private static final String PASSWORD = "password";
public void showLoginDialog() { if (!loginShowing) { @@ -181,7 +182,8 @@ public class LoginView extends Canvas { * @param sessionId pass in valid session id for LDAP registration steps. * @param callback pass in callback reference to indicate success and launch of coreGUI */ - public void showRegistrationDialog(String user, final String sessionId, final AsyncCallback<Void> callback) { + public void showRegistrationDialog(String user, final String sessionId, final String password, + final AsyncCallback<Subject> callback) { if (!loginShowing) { loginShowing = true;
@@ -242,7 +244,7 @@ public class LoginView extends Canvas { public void onClick(ClickEvent event) { //validation if (validateForms(forms)) { - Log.trace("Successfully validated all forms"); + Log.trace("Successfully validated all data for user registration."); //populate form form.setValue(FIRST, String.valueOf(first.getValue())); form.setValue(LAST, String.valueOf(last.getValue())); @@ -251,10 +253,16 @@ public class LoginView extends Canvas { form.setValue(PHONE, String.valueOf(phone.getValue())); form.setValue(DEPARTMENT, String.valueOf(department.getValue())); form.setValue(SESSIONID, sessionId); + form.setValue(PASSWORD, password); registerLdapUser(form, callback); } }
+ /** Iterates through the dynamic forms populated then calls validate(). + * + * @param forms + * @return + */ private boolean validateForms(ArrayList<DynamicForm> forms) { boolean allValid = true; for (DynamicForm form : forms) { @@ -314,8 +322,13 @@ public class LoginView extends Canvas { } }
- protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Void> callback) { - Subject newSubject = new Subject(); + /**Uses the information from the populated form to create the Subject for the new LDAP user. + * + * @param populatedForm - validated data + * @param callback + */ + protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Subject> callback) { + final Subject newSubject = new Subject();
//insert some required data checking boolean proceed = true; @@ -327,8 +340,14 @@ public class LoginView extends Canvas { if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) { proceed = false; } + retrieved = populatedForm.getValueAsString(PASSWORD); + if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) { + proceed = false; + } + newSubject.setName(populatedForm.getValueAsString(USERNAME)); newSubject.setSessionId(Integer.valueOf(populatedForm.getValueAsString(SESSIONID))); + String password = populatedForm.getValueAsString(PASSWORD);
//don't load null values not set or returned from ldap server retrieved = populatedForm.getValueAsString(FIRST); @@ -355,34 +374,39 @@ public class LoginView extends Canvas { newSubject.setFsystem(false);
if (proceed) { - GWTServiceLookup.getSubjectService().createSubjectUsingOverlord(newSubject, new AsyncCallback<Subject>() { - public void onSuccess(Subject result) { - CoreGUI.getMessageCenter().notify( - new Message("Succesfully created new ldap Subject.", Message.Severity.Info)); - //now do group role assignment for initial login - GWTServiceLookup.getLdapService().updateLdapGroupAssignmentsForSubject(result, - new AsyncCallback<Void>() { - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError("Failed to assign roles for ldap Subject.", - caught); - } - - public void onSuccess(Void result) { - CoreGUI.getMessageCenter().notify( - new Message("Succesfully assigned roles for ldap Subject.", Message.Severity.Info)); - window.destroy(); - loginShowing = false; - callback.onSuccess(result); - } - }); - } + GWTServiceLookup.getSubjectService().createSubjectUsingOverlord(newSubject, password, + new AsyncCallback<Subject>() { + public void onSuccess(final Subject newLoggedInSubject) { + CoreGUI.getMessageCenter().notify( + new Message("Succesfully created new ldap Subject.", Message.Severity.Info)); + Log.trace("New subject created for ldap user."); + //now do group role assignment for initial login + GWTServiceLookup.getLdapService().updateLdapGroupAssignmentsForSubject(newLoggedInSubject, + new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to assign roles for ldap Subject.", + caught); + Log.debug("Failed to assign roles to ldap subject."); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify( + new Message("Succesfully assigned roles for ldap Subject.", + Message.Severity.Info)); + Log.trace("Role assignment update for ldap subject complete."); + window.destroy(); + loginShowing = false; + callback.onSuccess(newLoggedInSubject); + } + }); + }
- public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught); - } - }); + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught); + } + }); } else {//log them out then reload LoginView - com.allen_sauer.gwt.log.client.Log.warn("Failed to locate username required to create LDAP subject."); + Log.warn("Failed to locate username required to create LDAP subject."); UserSessionManager.logout(); new LoginView().showLoginDialog(); } @@ -411,7 +435,7 @@ public class LoginView extends Canvas { return form; }
- /**Build and loads the custom validators for each of the formItems + /**Build and loads the validators for each of the formItems * * @param form */ @@ -478,7 +502,7 @@ public class LoginView extends Canvas { ResourceTypeRepository.Cache.getInstance().getResourceTypes((Integer[]) null, EnumSet.allOf(ResourceTypeRepository.MetadataType.class), new ResourceTypeRepository.TypesLoadedCallback() { public void onTypesLoaded(Map<Integer, ResourceType> types) { - com.allen_sauer.gwt.log.client.Log.info("Preloaded [" + types.size() + "] resource types"); + Log.info("Preloaded [" + types.size() + "] resource types"); } }); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java index e3dc5df..0932e6f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java @@ -22,6 +22,7 @@ import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.util.SC;
+import org.rhq.core.domain.auth.Subject; import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
/** @@ -45,14 +46,14 @@ public class SearchGUI implements EntryPoint { return; }
- UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Void>() { + UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Subject>() { @Override public void onFailure(Throwable caught) { SC.say("Unable to determine login status, check server status"); }
@Override - public void onSuccess(Void result) { + public void onSuccess(Subject result) { singleton.buildSearchGUI(); } }); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java index 2722ea4..0dc4482 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java @@ -82,8 +82,7 @@ public class UserSessionManager {
private static Boolean needsRegistration = false;
- public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Void> callback) { - // public static void checkLoginStatus(final String password, final AsyncCallback<Boolean> callback) { + public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Subject> callback) { BrowserUtility.forceIe6Hacks();
RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess"); @@ -151,7 +150,7 @@ public class UserSessionManager { GWTServiceLookup.getLdapService().checkSubjectForLdapAuth(subject, user, password, new AsyncCallback<Subject>() { public void onFailure(Throwable caught) { - Log.info("Unable to check subject for LDAP authorization - check Server status." + Log.warn("Unable to check subject for LDAP authorization - check Server status." + caught.getMessage()); //TODO: how/what to display in LoginView when unexpected communication with server occurs? // LoginView @@ -163,20 +162,20 @@ public class UserSessionManager { public void onSuccess(Subject checked) { //now pull the flags/information back out of this subject if (checked == null) {//no new subject was returned. - Log.debug("No alternative case insensitive LDAP accounts located."); - locateSubjectOrLogin(subjectId, sessionId, user, callback); + Log.trace("No alternative case insensitive LDAP accounts located."); + locateSubjectOrLogin(subjectId, sessionId, user, password, callback); } else {//alternative Subject returned meaning we located - Log.debug("Case insensitive matching LDAP account located."); + Log.trace("Case insensitive matching LDAP account located."); needsRegistration = false; //change the subject.sessionId sessionSubject = checked; locateSubjectOrLogin(checked.getId(), String.valueOf(checked.getSessionId()), - checked.getName(), callback); + checked.getName(), password, callback); } - Log.debug("Subject registration required:" + needsRegistration); + Log.trace("Subject registration required:" + needsRegistration); } }); - } else { + } else {//invalid session. Back to login new LoginView().showLoginDialog(); } } @@ -200,10 +199,10 @@ public class UserSessionManager { * @param user * @param callback */ - private static void locateSubjectOrLogin(int subjectId, final String sessionId, final String user, - final AsyncCallback<Void> callback) { + private static void locateSubjectOrLogin(int subjectId, final String sessionId, final String user, String password, + final AsyncCallback<Subject> callback) { if (subjectId > 0) {//registration not needed - Log.debug("SubjectCriteria search with subjectId:" + subjectId); + Log.trace("SubjectCriteria search with subjectId:" + subjectId); SubjectCriteria criteria = new SubjectCriteria(); criteria.fetchConfiguration(true); criteria.addFilterId(subjectId); @@ -216,14 +215,14 @@ public class UserSessionManager { // LoginView // .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization " // + "- check Server status."); - com.allen_sauer.gwt.log.client.Log.info("Failed to load user's subject"); + Log.debug("Failed to load user's subject"); //show login dialog new LoginView().showLoginDialog(); }
public void onSuccess(PageList<Subject> result) { Subject subject = result.get(0); - Log.debug("Found subject [" + subject + "]."); + Log.trace("Found subject [" + subject + "]."); subject.setSessionId(Integer.valueOf(sessionId));
// reset the session subject to the latest, for wrapping in user preferences @@ -232,13 +231,12 @@ public class UserSessionManager { userPreferences = new UserPreferences(sessionSubject); refresh();
- callback.onSuccess((Void) null); + callback.onSuccess(subject); } }); } else { - Log.info("Proceeding with registration for ldap user '" + user + "'."); - loggedIn = true; - new LoginView().showRegistrationDialog(user, sessionId, callback); + Log.trace("Proceeding with registration for ldap user '" + user + "'."); + new LoginView().showRegistrationDialog(user, sessionId, password, callback); } }
@@ -246,18 +244,30 @@ public class UserSessionManager { login(null, null); }
+ /**Same as login, but passes in credentials optionally needed during new LDAP user registration. + * + * @param user + * @param password + */ public static void login(String user, String password) { - checkLoginStatus(user, password, new AsyncCallback<Void>() { - @Override - public void onSuccess(Void result) { + checkLoginStatus(user, password, new AsyncCallback<Subject>() { + public void onSuccess(Subject result) { // will build UI if necessary, then fires history event + loggedIn = true; + if (result != null) {// subject and session has been updated during this login request + Log.trace("A new subject and session has been returned. Updating sessionSubject."); + sessionSubject = result; + } CoreGUI.get().buildCoreUI(); }
- @Override public void onFailure(Throwable caught) { Log.error("Unable to determine login status - check Server status."); } + + public String toString() {//attempt to identify call back + return super.toString() + " UserSessionManager.checkLoginStatus()"; + } }); }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java index b50900a..a277f90 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java @@ -64,7 +64,7 @@ public interface SubjectGWTService extends RemoteService { * @param subjectToCreate The subject to be created. * @return the newly persisted {@link Subject} */ - Subject createSubjectUsingOverlord(Subject subjectToCreate); + Subject createSubjectUsingOverlord(Subject subjectToCreate, String password);
/** * Deletes the given set of users, including both the {@link Subject} and {@link org.rhq.core.domain.auth.Principal} objects associated with diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java index 46f37b9..f0c2135 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java @@ -313,12 +313,10 @@ public abstract class RPCDataSource<T> extends DataSource { }
/** Quick method to determine if current user is still logged in. - * Builds a - * + * * @return boolean indication of logged in status. */ protected boolean userStillLoggedIn() { return UserSessionManager.isLoggedIn(); } - } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java index 6d06e3c..a1de14c 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java @@ -25,6 +25,7 @@ import com.google.gwt.user.client.History; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.util.SC;
+import org.rhq.core.domain.auth.Subject; import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
/** @@ -63,9 +64,9 @@ public class MonitoringRequestCallback implements RequestCallback { + response.getStatusText());
// if we have a rich and coordinated client-side loggedIn state, do we need to check upon failure here? - UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Void>() { + UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Subject>() { @Override - public void onSuccess(Void result) { + public void onSuccess(Subject result) { History.fireCurrentHistoryState(); }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java index fa515bd..8c5e9ea 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java @@ -18,6 +18,8 @@ */ package org.rhq.enterprise.gui.coregui.server.gwt;
+import com.allen_sauer.gwt.log.client.Log; + import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.criteria.SubjectCriteria; import org.rhq.core.domain.util.PageList; @@ -62,10 +64,23 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub } }
- public Subject createSubjectUsingOverlord(Subject subjectToCreate) { + /**Same as create subject, but uses Overlord and returns new/non-temporary session. + * + * @param subjectToCreate + * @param password + * @return + */ + public Subject createSubjectUsingOverlord(Subject subjectToCreate, String password) { try { - return SerialUtility.prepare(subjectManager.createSubject(subjectManager.getOverlord(), subjectToCreate), - "SubjectManager.createSubjectUsingOverlord"); + //Officially create the new subject + subjectToCreate = subjectManager.createSubject(subjectManager.getOverlord(), subjectToCreate); + // nuke the temporary session and establish a new + // one for this subject.. must be done before pulling the + // new subject in order to do it with his own credentials + subjectManager.logout(getSessionSubject().getSessionId()); + subjectToCreate = subjectManager.login(subjectToCreate.getName(), password); + Log.trace("Created new user with overlord and logged back in with that user."); + return SerialUtility.prepare(subjectToCreate, "SubjectManager.createSubjectUsingOverlord"); } catch (Exception e) { throw new RuntimeException(ThrowableUtil.getAllMessages(e)); }