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(a)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));
}