From bed74f671a4f477141b6d7fbc064182c146e575d Mon Sep 17 00:00:00 2001 From: Robin Eklund <robi-ekl@dsv.su.se> Date: Wed, 3 Aug 2011 17:50:25 +0200 Subject: [PATCH] Lots of restructuring, we'll need to dive deeper into this to make the import jobs actually work --- .../java/se/su/dsv/scipro/SciProSession.java | 44 +++------ .../scipro/data/dao/interfaces/UserDao.java | 4 - .../scipro/json/DefaultUserFullLookup.java | 82 --------------- .../su/dsv/scipro/json/DefaultUserLookup.java | 80 --------------- .../scipro/json/DefaultUserLookupBase.java | 32 ++++++ .../json/DefaultUserLookupFromIdentifier.java | 34 +++++++ .../json/DefaultUserLookupFromUsername.java | 38 +++++++ .../java/se/su/dsv/scipro/json/ILookup.java | 9 +- .../se/su/dsv/scipro/json/IUserLookup.java | 7 -- .../json/IUserLookupFromIdentifier.java | 11 +++ .../scipro/json/IUserLookupFromUsername.java | 13 +++ .../dsv/scipro/json/ImportWorkerLookup.java | 27 +---- .../dsv/scipro/json/JsonResponseHandler.java | 99 ++++--------------- .../scipro/json/JsonUserResponseHandler.java | 19 ++-- src/main/resources/applicationContext.xml | 85 +--------------- .../security/auth/TestAuthRoutines.java | 25 +++-- 16 files changed, 201 insertions(+), 408 deletions(-) delete mode 100644 src/main/java/se/su/dsv/scipro/json/DefaultUserFullLookup.java delete mode 100644 src/main/java/se/su/dsv/scipro/json/DefaultUserLookup.java create mode 100644 src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java create mode 100644 src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java create mode 100644 src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java delete mode 100644 src/main/java/se/su/dsv/scipro/json/IUserLookup.java create mode 100644 src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java create mode 100644 src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java diff --git a/src/main/java/se/su/dsv/scipro/SciProSession.java b/src/main/java/se/su/dsv/scipro/SciProSession.java index 1389f3a15e..a973e241cd 100644 --- a/src/main/java/se/su/dsv/scipro/SciProSession.java +++ b/src/main/java/se/su/dsv/scipro/SciProSession.java @@ -1,6 +1,5 @@ package se.su.dsv.scipro; -import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -8,7 +7,6 @@ import java.util.List; import javax.security.auth.login.FailedLoginException; import javax.security.auth.login.LoginException; -import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.wicket.Request; import org.apache.wicket.Session; @@ -23,7 +21,7 @@ import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao; import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; -import se.su.dsv.scipro.json.IUserLookup; +import se.su.dsv.scipro.json.IUserLookupFromUsername; import se.su.dsv.scipro.security.auth.Authenticator; import se.su.dsv.scipro.security.auth.roles.Admin; import se.su.dsv.scipro.security.auth.roles.DefaultRole; @@ -33,6 +31,7 @@ import se.su.dsv.scipro.security.auth.roles.IRole; import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.security.auth.roles.Student; import se.su.dsv.scipro.security.auth.roles.SysAdmin; +import se.su.dsv.scipro.util.KeyValuePair; public class SciProSession extends WebSession { @@ -49,8 +48,8 @@ public class SciProSession extends WebSession { @SpringBean private UserSettingsDao userSettingsDao; - @SpringBean(name="userFullLookup") - private IUserLookup userLookup; + @SpringBean + private IUserLookupFromUsername userLookupFromUsername; private List<IRole> iRoles = new ArrayList<IRole>(); private User user = null; @@ -146,14 +145,10 @@ public class SciProSession extends WebSession { //Query for the user user = userDao.getUserByUsername(username,realm); if(user == null){ - try{ - user = doUserLookup(username); - if(user == null){ - throw new NullPointerException("No user with username "+username+" found in the database or in daisy."); - } - } catch (NullPointerException e) { - throw e; - } + user = doUserLookup(username,realm); + if(user == null){ + return false; + } } //Set mail-address session attributes setLoggedInIdentity(username+"@"+realm); @@ -269,23 +264,10 @@ public class SciProSession extends WebSession { return true; return false; } - - private User doUserLookup(String username) throws NullPointerException { - try{ - User u = userLookup.lookup(username); - if(u != null){ - return u; - } - Logger.getLogger("Application").log(Level.WARN, "" + username + " authenticated successfully, but the user was not found from daisy"); - return null; - } catch (IOException ioe){ - //TODO: Log exception - //ioe.printStackTrace(); - throw new NullPointerException("Could not communicate with daisy"); - } catch (Exception e) { - //TODO: Log exception - //e.printStackTrace(); - throw new NullPointerException(e.getMessage()); - } + private User doUserLookup(final String username, final String realm) { + final User u = userLookupFromUsername.lookup(new KeyValuePair<String>(username,realm)); + if(u == null) + logger.warn(username + " authenticated successfully, but the user was not available from remote system."); + return u; } } diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java index b1bcaa0db3..8502e3dce9 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java @@ -2,12 +2,8 @@ package se.su.dsv.scipro.data.dao.interfaces; import java.util.List; -import se.su.dsv.scipro.data.dataobjects.MessageBoard; -import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.Role; import se.su.dsv.scipro.data.dataobjects.User; -import se.su.dsv.scipro.data.enums.ProjectStatus; -import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles; public interface UserDao extends LazyDeleteDao<User> { diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserFullLookup.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserFullLookup.java deleted file mode 100644 index 8f9725f62f..0000000000 --- a/src/main/java/se/su/dsv/scipro/json/DefaultUserFullLookup.java +++ /dev/null @@ -1,82 +0,0 @@ -package se.su.dsv.scipro.json; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import se.su.dsv.scipro.ApplicationSettings; -import se.su.dsv.scipro.data.dao.interfaces.UserDao; -import se.su.dsv.scipro.data.dataobjects.User; - - - -/** - * This class does a lookup on a username against the remote remoteLookupUrl specified in - * the applicationContext, under ApplicationSettings. - * - * This class does NOT handle Daisys merging of users and is not maintained. - * - * @author Dan Kjellman <dan-kjel@dsv.su.se> - */ -@Deprecated -@Component("userFullLookup") -public class DefaultUserFullLookup implements IUserLookup { - - /* - * References populated by spring - */ - @Autowired - private UserDao userDao; - @Autowired - private JsonUserFullResponseHandler userResponseHandler; - @Autowired - private ApplicationSettings settings; - - private Logger logger; - - public DefaultUserFullLookup(){ - logger = Logger.getLogger(this.getClass()); - } - - /** - * Perform lookup against remote server - * - * @param username the username to lookup - * @throws IOException if there was an error in the connection - */ - public User lookup(String username) throws IOException { - if(username == null){ - logger.log(Level.ERROR, "Trying to pass null instead of a username to the userlookup"); - throw new IllegalStateException("You cannot pass null as the lookup parameter"); - } - - logger.log(Level.INFO,"Starting lookup for username: " + username); - Map<String, String> params = new HashMap<String, String>(); - - //For now you can only log in with dsv.su.se accounts... - params.put("username", username); - RequestSender request = new RequestSender(userResponseHandler, settings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); - try{ - request.processRequest(); - } catch (IOException e) { - //Gets logged by the requestsender.... - throw e; - } - - /* - * Lookup the user and return - */ - User u = userDao.getUserByUsername(username); - if(u != null){ - logger.log(Level.INFO, "Imported user/username from remote system: " + u.getFirstName() + " " + u.getLastName() + "("+username+") id: " + u.getId()); - } - return u; - } - - -} diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookup.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookup.java deleted file mode 100644 index 8fcb09944b..0000000000 --- a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookup.java +++ /dev/null @@ -1,80 +0,0 @@ -package se.su.dsv.scipro.json; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import se.su.dsv.scipro.ApplicationSettings; -import se.su.dsv.scipro.data.dao.interfaces.UserDao; -import se.su.dsv.scipro.data.dataobjects.User; - - - -/** - * This class does a lookup on a username against the remote remoteLookupUrl specified in - * the applicationContext, under ApplicationSettings. - * - * This class does NOT handle Daisys merging of users and is not maintained. - * - * @author Dan Kjellman <dan-kjel@dsv.su.se> - */ -@Component("userLookup") -public class DefaultUserLookup implements IUserLookup { - - /* - * References populated by spring - */ - @Autowired - private UserDao userDao; - @Autowired - private JsonUserResponseHandler userResponseHandler; - @Autowired - private ApplicationSettings settings; - - private Logger logger; - - public DefaultUserLookup(){ - logger = Logger.getLogger(this.getClass()); - } - - /** - * Perform lookup against remote server - * - * @param username the username to lookup - * @throws IOException if there was an error in the connection - */ - public User lookup(String username) throws IOException { - if(username == null){ - logger.log(Level.ERROR, "Trying to pass null instead of a username to the userlookup"); - throw new IllegalStateException("You cannot pass null as the lookup parameter"); - } - - logger.log(Level.INFO,"Starting lookup for userid: " + username); - Map<String, String> params = new HashMap<String, String>(); - - //For now you can only log in with dsv.su.se accounts... - params.put("userid", username); - RequestSender request = new RequestSender(userResponseHandler, settings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); - try{ - request.processRequest(); - } catch (IOException e) { - //Gets logged by the requestsender.... - throw e; - } - - /* - * Lookup the user and return - */ - User u = userDao.getUserByUsername(username); - if(u != null){ - logger.log(Level.INFO, "Imported user/username from remote system: " + u.getFirstName() + " " + u.getLastName() + "("+username+") id: " + u.getId()); - } - return u; - } - -} diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java new file mode 100644 index 0000000000..5c8bd521a7 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java @@ -0,0 +1,32 @@ +package se.su.dsv.scipro.json; + +import java.io.IOException; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + +import se.su.dsv.scipro.ApplicationSettings; +import se.su.dsv.scipro.data.dao.interfaces.UserDao; + +/** + * Package-private Abstract base for the public UserLookups. + */ +abstract class DefaultUserLookupBase{ + @Autowired + protected UserDao userDao; + @Autowired + protected JsonUserResponseHandler userResponseHandler; + @Autowired + protected ApplicationSettings settings; + + protected boolean doRemoteRequest(final Map<String,String> params){ + userResponseHandler.setLogResult(true); + RequestSender request = new RequestSender(userResponseHandler, settings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); + try{ + request.processRequest(); + } catch (final IOException e){ + return false; + } + return true; + } +} diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java new file mode 100644 index 0000000000..d67d38495c --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java @@ -0,0 +1,34 @@ +package se.su.dsv.scipro.json; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * Default implementation of IUserLookupFromIdentifier queries remote defined by ApplicationSettings via JSon requests. + */ +@Component("userLookupFromIdentifier") +public class DefaultUserLookupFromIdentifier extends DefaultUserLookupBase implements IUserLookupFromIdentifier { + private Logger logger = Logger.getLogger(DefaultUserLookupFromIdentifier.class); + + public User lookup(final Long identifier){ + if(identifier == null){ + throw new IllegalStateException("null values for user parameter not allowed"); + } + logger.debug("Starting remote lookup for: " + identifier); + final Map<String, String> params = new HashMap<String, String>(); + params.put("userid", identifier.toString()); + if(!doRemoteRequest(params)) + return null; + final User u = userDao.getUserByIdentifier(identifier); + if(u != null) + logger.info("Successfully imported user/username from remote system: " + u.getFirstName() + " " + u.getLastName() + "("+identifier+") id: " + u.getId()); + else + logger.warn("Failed to import a valid user from remote system: "+identifier); + return u; + } +} diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java new file mode 100644 index 0000000000..4e359ef6c2 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java @@ -0,0 +1,38 @@ +package se.su.dsv.scipro.json; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.util.KeyValuePair; + +/** + * Default implementation of IUserLookupFromUsername, queries remote defined by ApplicationSettings via JSon requests. + */ +@Component("userLookupFromUsername") +public class DefaultUserLookupFromUsername extends DefaultUserLookupBase implements IUserLookupFromUsername { + private Logger logger = Logger.getLogger(DefaultUserLookupFromUsername.class); + + public User lookup(final KeyValuePair<String> userAtRealm){ + if(userAtRealm == null || userAtRealm.getKey() == null){ + throw new IllegalStateException("null values for user parameter not allowed"); + } + final String user = userAtRealm.getKey(); + final String realm = (userAtRealm.getValue()!=null?userAtRealm.getValue().toUpperCase():"DSV.SU.SE"); + logger.debug("Starting remote lookup for: " + user + "@"+realm); + final Map<String, String> params = new HashMap<String, String>(); + params.put("username", user); + params.put("realm", realm); + if(!doRemoteRequest(params)) + return null; + final User u = userDao.getUserByUsername(user,realm); + if(u != null) + logger.info("Successfully imported user/username from remote system: " + u.getFirstName() + " " + u.getLastName() + "("+user+"@"+realm+") id: " + u.getId()); + else + logger.warn("Failed to import a valid user from remote system: "+userAtRealm); + return u; + } +} diff --git a/src/main/java/se/su/dsv/scipro/json/ILookup.java b/src/main/java/se/su/dsv/scipro/json/ILookup.java index c4464ce9a5..b139ef295e 100644 --- a/src/main/java/se/su/dsv/scipro/json/ILookup.java +++ b/src/main/java/se/su/dsv/scipro/json/ILookup.java @@ -1,6 +1,13 @@ package se.su.dsv.scipro.json; +/** + * Generic interface for Remote lookups. + * The recommended way of using this interface is to create specializations + * (see IUserLookupFromIdentifier) that defines the actual parameterized types used, and implement those interfaces in concrete classes. + * @param <T> The return type specifier, implementations are urged to return a null value when a lookup fails. + * @param <E> The lookup parameter, use compound types to support querying on multiple parameters. + */ public interface ILookup<T, E> { - public T lookup(E lookupParam) throws Exception; + public T lookup(E lookupParam); } diff --git a/src/main/java/se/su/dsv/scipro/json/IUserLookup.java b/src/main/java/se/su/dsv/scipro/json/IUserLookup.java deleted file mode 100644 index f5bbdebb6b..0000000000 --- a/src/main/java/se/su/dsv/scipro/json/IUserLookup.java +++ /dev/null @@ -1,7 +0,0 @@ -package se.su.dsv.scipro.json; - -import se.su.dsv.scipro.data.dataobjects.User; - -public interface IUserLookup extends ILookup<User, String>{ - public User lookup(String username) throws Exception; -} diff --git a/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java new file mode 100644 index 0000000000..51186fe3d7 --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java @@ -0,0 +1,11 @@ +package se.su.dsv.scipro.json; + +import se.su.dsv.scipro.data.dataobjects.User; + +/** + * Lookup interface specification for remotely querying for User data. + * See ILookup for more information on the implicit contract of this interface. + */ +public interface IUserLookupFromIdentifier extends ILookup<User,Long>{ + public User lookup(final Long identifier); +} diff --git a/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java new file mode 100644 index 0000000000..4ca53ba88d --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java @@ -0,0 +1,13 @@ +package se.su.dsv.scipro.json; + +import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.util.KeyValuePair; + +/** + * Lookup interface specification for remotely querying for User data. + * The supplied parameter is a KeyValuePair<String> where the key-field is the users username and the value-field is the users realm. + * See ILookup for more information on the implicit contract of this interface. + */ +public interface IUserLookupFromUsername extends ILookup<User,KeyValuePair<String>>{ + public User lookup(final KeyValuePair<String> userAtRealm); +} diff --git a/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java b/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java index 8d9742f3a6..58bbff6c21 100644 --- a/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java +++ b/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java @@ -5,8 +5,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; import se.su.dsv.scipro.ApplicationSettings; @@ -28,13 +27,9 @@ public class ImportWorkerLookup { */ private ImportWorkerResponseHandler thesesResponseHandler; private ImportUpdateStatsResponseHandler statsResonseHandler; - private ApplicationSettings settings; - private Logger logger; - - public ImportWorkerLookup(){ - logger = Logger.getLogger(this.getClass()); - } + @Autowired + private ApplicationSettings applicationSettings; public void lookup(Date updatedAfter, String type) throws IOException{ lookup(-1,-1, updatedAfter, type); @@ -60,7 +55,7 @@ public class ImportWorkerLookup { }else{ //logger.log(Level.INFO,"Starting lookup for completeGet=true & type="+type+" & updatedAfter=" + updatedAfter); } - RequestSender request = new RequestSender(thesesResponseHandler, settings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); + RequestSender request = new RequestSender(thesesResponseHandler, applicationSettings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); try{ request.processRequest(); } catch (IOException e) { @@ -74,7 +69,7 @@ public class ImportWorkerLookup { params.put("updateStats", "true"); params.put("updatedAfter",""+updatedAfter.getTime()); - RequestSender request = new RequestSender(statsResonseHandler, settings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); + RequestSender request = new RequestSender(statsResonseHandler, applicationSettings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); try{ request.processRequest(); } catch (IOException e) { @@ -86,30 +81,18 @@ public class ImportWorkerLookup { /* * Getters and setters (for spring) */ - public ImportWorkerResponseHandler getUserResponseHandler() { return thesesResponseHandler; } - public void setUserResponseHandler(ImportWorkerResponseHandler thesesResponseHandler) { this.thesesResponseHandler = thesesResponseHandler; } - public ApplicationSettings getSettings() { - return settings; - } - - public void setSettings(ApplicationSettings settings) { - this.settings = settings; - } - public ImportUpdateStatsResponseHandler getStatsResonseHandler() { return statsResonseHandler; } - public void setStatsResonseHandler( ImportUpdateStatsResponseHandler statsResonseHandler) { this.statsResonseHandler = statsResonseHandler; } - } diff --git a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java index f2932281e0..03028ec8e7 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java @@ -5,12 +5,9 @@ import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; -import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.apache.wicket.spring.injection.annot.SpringBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.transaction.TransactionStatus; import se.su.dsv.scipro.ApplicationSettings; import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; @@ -36,10 +33,6 @@ import se.su.dsv.scipro.jsonobjects.JsonUsername; @Component public abstract class JsonResponseHandler implements IResponseHandler { - - /* - * References populated by spring - */ @Autowired protected UserDao userDao; @Autowired @@ -52,12 +45,12 @@ public abstract class JsonResponseHandler implements IResponseHandler { protected ProjectFollowerDao projectFollowerDao; @Autowired protected RoleDao roleDao; - @SpringBean(name="userLookup") - protected IUserLookup userLookup; - - protected ApplicationSettings settings; + @Autowired + protected IUserLookupFromIdentifier userLookupFromIdentifier; + @Autowired + protected ApplicationSettings applicationSettings; - protected Logger logger; + protected Logger logger = Logger.getLogger(this.getClass()); private int numUsersCreated = 0; private int numEmailChanges = 0; @@ -69,12 +62,6 @@ public abstract class JsonResponseHandler implements IResponseHandler { private int numThesesChanged = 0; - public JsonResponseHandler(){ - super(); - logger = Logger.getLogger(this.getClass()); - } - - /** * Creates a thesis user from a json user * @@ -82,8 +69,6 @@ public abstract class JsonResponseHandler implements IResponseHandler { * @return User the create thesisuser */ protected User createThesisUser(JsonUser jsonUser, boolean doFullCheck){ - - TransactionStatus status = null; User thesisUser = null; try { @@ -129,7 +114,7 @@ public abstract class JsonResponseHandler implements IResponseHandler { numUsersCreated++; } catch (Exception e){ - logger.log(Level.ERROR, "Cannot save jsonuser with jsonuserid: " + jsonUser.id + " - Rolling back...\n" + e.getMessage()); + logger.error("Cannot save jsonuser with jsonuserid: " + jsonUser.id + " - Rolling back...\n" + e.getMessage()); throw new RuntimeException(e); } return thesisUser; @@ -168,11 +153,11 @@ public abstract class JsonResponseHandler implements IResponseHandler { User u = userDao.getUserByIdentifier(jtp.id); if(u == null){ - String id = String.valueOf(jtp.id); + final Long id = Long.valueOf(jtp.id); try { - u = userLookup.lookup(id); + u = userLookupFromIdentifier.lookup(id); } catch (Exception e) { - logger.log(Level.ERROR, "Cannot save jsonuser with jsonuserid: " + jtp.id + " - Rolling back...\n" + e.getMessage()); + logger.error("Cannot save jsonuser with jsonuserid: " + jtp.id + " - Rolling back...\n" + e.getMessage()); throw new RuntimeException(e); } u = userDao.getUserByIdentifier(jtp.id); @@ -277,7 +262,7 @@ public abstract class JsonResponseHandler implements IResponseHandler { try { checkAndChangeProject(current, jThesis); } catch (Exception e) { - logger.log(Level.FATAL, "Error when checking project:" + current.getId()+ "when looking up user:" + logger.error("Error when checking project:" + current.getId()+ "when looking up user:" +jsonUser.firstName+ " "+jsonUser.lastName+" \n" + e.getMessage()); throw new RuntimeException(e); } @@ -286,7 +271,7 @@ public abstract class JsonResponseHandler implements IResponseHandler { try { checkAndCreateProject(jThesis); } catch (Exception e) { - logger.log(Level.FATAL, "Error when creating project: daisyId=" + jThesis.thesisID + "when looking up user:" + logger.error("Error when creating project: daisyId=" + jThesis.thesisID + "when looking up user:" +jsonUser.firstName+ " "+jsonUser.lastName+" \n" + e.getMessage()); throw new RuntimeException(e); } @@ -328,7 +313,7 @@ public abstract class JsonResponseHandler implements IResponseHandler { return true; } catch (Exception e){ - logger.log(Level.FATAL, "Failed to save changes for user:" + thesisUser.getIdentifier() + " - Rolling back...\n" + e.getMessage()); + logger.error("Failed to save changes for user:" + thesisUser.getIdentifier() + " - Rolling back...\n" + e.getMessage()); throw new RuntimeException(e); } } @@ -415,11 +400,11 @@ public abstract class JsonResponseHandler implements IResponseHandler { for(JsonThesisParticipant jtp : jThesis.participants){ User u = userDao.getUserByIdentifier(jtp.id); if(u == null){ - String id = String.valueOf(jtp.id); + final Long id = Long.valueOf(jtp.id); try { - u = userLookup.lookup(id); + u = userLookupFromIdentifier.lookup(id); } catch (Exception e) { - logger.log(Level.FATAL, "Failed to save changes for project:" + current.getIdentifier() + " when looking up user whith idetifier:"+jtp.id+ + logger.error("Failed to save changes for project:" + current.getIdentifier() + " when looking up user whith idetifier:"+jtp.id+ " Rolling back...\n" + e.getMessage()); throw new RuntimeException(e); } @@ -442,7 +427,7 @@ public abstract class JsonResponseHandler implements IResponseHandler { followers.add(pf); } }else{ - logger.log(Level.FATAL, "Failed to save changes for project:" + current.getIdentifier() + "u = null when looking up user whith idetifier:"+jtp.id+ + logger.error("Failed to save changes for project:" + current.getIdentifier() + "u = null when looking up user whith idetifier:"+jtp.id+ "- \n Rolling back...\n"); } } @@ -491,7 +476,7 @@ public abstract class JsonResponseHandler implements IResponseHandler { projectDao.save(current); } }catch (Exception e){ - logger.log(Level.FATAL, "Failed to save changes for project:" + current.getIdentifier() + " - Rolling back...\n" + e.getMessage()); + logger.error("Failed to save changes for project:" + current.getIdentifier() + " - Rolling back...\n" + e.getMessage()); throw new RuntimeException(e); } return changed; @@ -510,27 +495,22 @@ public abstract class JsonResponseHandler implements IResponseHandler { return numUsersCreated; } - public int getNumEmailChanges() { return numEmailChanges; } - public int getNumFirstNameChanges() { return numFirstNameChanges; } - public int getNumLastNameChanges() { return numLastNameChanges; } - - + public int getNumUsernamesAdded() { return numUsernamesAdded; } - public int getNumSupervisorsCreated() { return numSupervisorsCreated; } @@ -538,57 +518,14 @@ public abstract class JsonResponseHandler implements IResponseHandler { public int getNumThesesCreated() { return numThesesCreated; } - - public void setNumThesesCreated(int numThesesCreated) { this.numThesesCreated = numThesesCreated; } - public int getNumThesesChanged() { return numThesesChanged; } - - public void setNumThesesChanged(int numThesesChanged) { this.numThesesChanged = numThesesChanged; } - - - - /* - * Getters and setters (for spring) - */ - public UserDao getUserDao() { - return userDao; - } - - public void setUserDao(UserDao userDao) { - this.userDao = userDao; - } - - public UsernameDao getUsernameDao() { - return userNameDao; - } - - public void setUserNameDao(UsernameDao usernameDao) { - this.userNameDao = usernameDao; - } - - public ApplicationSettings getSettings() { - return settings; - } - - - public void setSettings(ApplicationSettings settings) { - this.settings = settings; - } - public IUserLookup getUserLookup() { - return userLookup; - } - - - public void setUserLookup(IUserLookup userLookup) { - this.userLookup = userLookup; - } } diff --git a/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java index d4a24ec404..c6e8b3e78d 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java @@ -2,7 +2,6 @@ package se.su.dsv.scipro.json; import java.lang.reflect.Type; -import org.apache.log4j.Level; import org.springframework.stereotype.Component; import se.su.dsv.scipro.data.dataobjects.User; @@ -23,10 +22,6 @@ public class JsonUserResponseHandler extends JsonResponseHandler { private boolean logResult = false; - public JsonUserResponseHandler(){ - super(); - } - /** * Handles a json string * @@ -37,14 +32,14 @@ public class JsonUserResponseHandler extends JsonResponseHandler { */ public void handleResponse(String response) { JsonUserContainer userContainer = null; - + logger.debug(response); try{ Gson gson = new Gson(); Type type = new TypeToken<JsonUserContainer>(){}.getType(); userContainer = gson.fromJson(response, type); } catch (Exception e) { - logger.log(Level.FATAL, "Gson error when creating objects from json \n" + e.getMessage()); + logger.error("Gson error when creating objects from json \n" + e.getMessage()); return; } int createdUsers = 0; @@ -53,18 +48,18 @@ public class JsonUserResponseHandler extends JsonResponseHandler { //Loop all users in the response and look for changes... for(JsonUser jsonUser : userContainer.users){ - //System.out.println("Checking: " + " id: " + daisyUser.id + " firstName: "+ daisyUser.firstName); - User thesisUser = userDao.getUserByIdentifier(new Long(jsonUser.id)); + logger.debug("Checking identifier: " + jsonUser.id); + User thesisUser = userDao.getUserByIdentifier(Long.valueOf(jsonUser.id)); if(thesisUser == null){ - //System.out.println("User does not exist... trying to create"); + logger.debug("User '"+jsonUser.id+ "' does not exist, trying to create"); if(null == createThesisUser(jsonUser,false)){ userCreationErrors++; } else { createdUsers++; } } else { - //System.out.println("User found, looking for changes..."); + logger.debug("User found, looking for changes..."); if(lookForChangesInUserAndSave(jsonUser)){ changedUsers++; } @@ -72,7 +67,7 @@ public class JsonUserResponseHandler extends JsonResponseHandler { } if(logResult){ - logger.log(Level.INFO, "\nResult from userimport/update:\nChecked: " + userContainer.users.size() + " users\n" + + logger.info("Result from userimport/update:\nChecked: " + userContainer.users.size() + " users\n" + "Changed users: " + changedUsers + "\n" + "Created users: " + createdUsers + "\n" + "Number of errors when creating users: " + userCreationErrors + "\n" + diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml index 14ed77e032..bebfc7b86d 100644 --- a/src/main/resources/applicationContext.xml +++ b/src/main/resources/applicationContext.xml @@ -27,107 +27,28 @@ <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> - <!-- Autowired - - "eventDao" - "projectEventDao" - "groupEventDao" - "userDao" - "roleDao" - "projectDao" - "projectClassDao" - "projectScheduleDao" - "projectFollowerDao" - "checkListDao" - "checkListQuestion" - "checkListTemplate" - "checkListAnswer" - "stringResourceDao" - "fileDescriptionDao" - "projectEventTemplateDao" - "scheduleTemplateDao" - "commmentDao" - "boardMessageDao" - "messageBoardDao" - "ratingDao" - "privateMessageDao" - "recipientDao" - "resourceDao" - "supervisorBoardMessageDao" - "supervisorMessageBoardDao" - "tagDao" - "commentThreadDao" - "fileResourceDao" - "linkResourceDao" - "embedResourceDao" - --> - - <!-- Peer-related beans, autowired--> - <!-- - "answerDao" - "peerQueueDao" - "peerRequestDao" - "peerReviewDao" - "questionDao" - "questionOptionDao" - "reviewRatingDao" - "reviewTemplateDao" - --> - <!-- End of Peer-stuff --> - - <bean class="se.su.dsv.scipro.DataInitialiser" init-method="dataInit" /> - <!-- Defines global settings for the application --> <bean id="applicationSettings" class="se.su.dsv.scipro.ApplicationSettings"> - <!-- Set this line to true if you want to do lookup against daisy if username was not found in db By default it's turned off since we don't have access to the daisy search yet --> <property name="enableRemoteUserLookup" value="true"></property> <!-- This property points to the location of the daisy json search --> - <property name="remoteLookupUrl" value="https://thesis.dsv.su.se/match/json" /> + <property name="remoteLookupUrl" value="https://thesis3.dsv.su.se/match/json" /> <!-- External auth support (via J2EE standard mechanism REMOTE_USER), if true: other authentication mechanics will be bypassed.--> <property name="acceptExternalAuthentication" value="true"/> </bean> - - <!-- Defines the class used for lookup in username against a remote server NOW AUTOWIRED AND DEPRECATED, NOT MAINTAINED--> -<!-- <bean id="userFullLookup" class="se.su.dsv.scipro.json.DefaultUserFullLookup">--> -<!-- <property name="userDao" ref="userDao" />--> -<!-- <property name="settings" ref="applicationSettings" />--> -<!-- <property name="userResponseHandler" ref="jsonUserFullResponseHandler" />--> -<!-- </bean> --> - - <!-- Defines the class used for lookup in username against a remote server --> + <!-- Defines the class used for lookup in username against a remote server --> <bean id="importWorkerLookup" class="se.su.dsv.scipro.json.ImportWorkerLookup"> - <property name="settings" ref="applicationSettings" /> <property name="userResponseHandler" ref="importWorkerResponseHandler" /> <property name="statsResonseHandler" ref="importStatsResponseHandler" /> </bean> - <!-- The abstract handler for json responses --> - <bean id="jsonResponseHandler" abstract="true" class="se.su.dsv.scipro.json.JsonResponseHandler"> - <property name="settings" ref="applicationSettings" /> - <property name="userLookup" ref="userLookup" /> - </bean> - - <!-- Defines the class used for lookup in username against a remote server NOW AUTOWIRED AND DEPRECATED, NOT MAINTAINED --> -<!-- <bean id="userLookup" class="se.su.dsv.scipro.json.DefaultUserLookup">--> -<!-- <property name="userDao" ref="userDao" />--> -<!-- <property name="settings" ref="applicationSettings" />--> -<!-- <property name="userResponseHandler" ref="jsonUserResponseHandler" />--> -<!-- </bean> --> - + <bean id="jsonResponseHandler" abstract="true" class="se.su.dsv.scipro.json.JsonResponseHandler" /> <!-- Handler for json responses regarding users --> <bean id="jsonUserResponseHandler" parent="jsonResponseHandler" class="se.su.dsv.scipro.json.JsonUserResponseHandler" /> <bean id="jsonUserFullResponseHandler" parent="jsonResponseHandler" class="se.su.dsv.scipro.json.JsonUserFullResponseHandler" /> <bean id="importWorkerResponseHandler" parent="jsonResponseHandler" class="se.su.dsv.scipro.json.ImportWorkerResponseHandler" /> <bean id="importStatsResponseHandler" parent="jsonResponseHandler" class="se.su.dsv.scipro.json.ImportUpdateStatsResponseHandler" /> - <!-- <bean class="se.su.dsv.scipro.datainitializers.EventTemplatesInitializer" init-method="dataInit" /> --> - -<!-- <bean class="se.su.dsv.scipro.datainitializers.ScheduleTemplateInitializer" init-method="dataInit" />--> - -<!-- <bean class="se.su.dsv.scipro.datainitializers.EventDataInitializer" init-method="dataInit" />--> - - </beans> diff --git a/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java b/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java index 8df1815fcb..c59375a092 100644 --- a/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java +++ b/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java @@ -32,15 +32,18 @@ import se.su.dsv.scipro.data.dataobjects.Student; import se.su.dsv.scipro.data.dataobjects.SysAdmin; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.Username; -import se.su.dsv.scipro.json.IUserLookup; +import se.su.dsv.scipro.json.IUserLookupFromIdentifier; +import se.su.dsv.scipro.json.IUserLookupFromUsername; import se.su.dsv.scipro.repository.util.RepositoryManager; +import se.su.dsv.scipro.util.KeyValuePair; public class TestAuthRoutines { private SciProSession session; private WicketTester wt; private User user; private Role sysAdm; - private IUserLookup fixedLookup; + private IUserLookupFromIdentifier fixedLookupFromIdentifier; + private IUserLookupFromUsername fixedLookupFromUsername; private ApplicationSettings appSettings; @Before public void init(){ @@ -49,10 +52,19 @@ public class TestAuthRoutines { appSettings = new ApplicationSettings(); appSettings.setAcceptExternalAuthentication(true); //Fake a lookup mechanism - fixedLookup = new IUserLookup(){ + fixedLookupFromUsername = new IUserLookupFromUsername(){ @Override - public User lookup(String username) throws Exception{ - if(username.equals("kalle-kula")) + public User lookup(final KeyValuePair<String> userAtRealm){ + if(userAtRealm.getKey().equals("kalle-kula")) + return user; + else + return null; + } + }; + fixedLookupFromIdentifier = new IUserLookupFromIdentifier(){ + @Override + public User lookup(final Long identifier){ + if(identifier.equals(666)) return user; else return null; @@ -98,7 +110,8 @@ public class TestAuthRoutines { ac.putBean("roleDao",mockedRoleDao); ac.putBean("projectDao",Mockito.mock(ProjectDao.class)); ac.putBean("userSettingsDao",Mockito.mock(UserSettingsDao.class)); - ac.putBean("userFullLookup",fixedLookup); + ac.putBean("userLookupFromUsername",fixedLookupFromIdentifier); + ac.putBean("userLookupFromIdentifier",fixedLookupFromIdentifier); //Create tester wt = new WicketTester(new SciProApplication(){ @Override