r552 - in trunk: simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service simexplorer-is-storage/src/resources/properties simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools simexpl
Author: glandais Date: 2008-01-28 13:00:46 +0000 (Mon, 28 Jan 2008) New Revision: 552 Added: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java Modified: trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurity.java trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/MockAuthenticationServiceImpl.java trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/SecurityTestCase.java trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java trunk/simexplorer-is-storage/src/resources/properties/config.properties trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDelete.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPage.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementRights.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/Login.java trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.java trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml trunk/simexplorer-is-web/src/main/webapp/ExceptionReport.tml trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml Log: Security updates Modified: trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java =================================================================== --- trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/contenttype/RawType.java 2008-01-28 13:00:46 UTC (rev 552) @@ -20,6 +20,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.io.Serializable; /** * Raw content type @@ -27,8 +28,10 @@ * @author landais * */ -public class RawType extends ContentType { +public class RawType extends ContentType implements Serializable { + private static final long serialVersionUID = -8010160085848440286L; + /** * Set inner properties */ Modified: trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurity.java =================================================================== --- trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurity.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurity.java 2008-01-28 13:00:46 UTC (rev 552) @@ -52,7 +52,15 @@ public void saveToken(LoginAction loginAction); - public void deleteToken(String token); + /** + * Delete old tokens associated to user + * + * @param login + * Login of user + * @param before + * ms before now + */ + public void deleteTokens(String login, long before); public List<Group> getGroups(); Modified: trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java =================================================================== --- trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-security/src/java/fr/cemagref/simexplorer/is/security/dao/DaoSecurityImpl.java 2008-01-28 13:00:46 UTC (rev 552) @@ -130,13 +130,14 @@ em.persist(loginAction); } - public void deleteToken(String token) { - LoginAction loginAction = (LoginAction) getSingleResult(em.createQuery( - "select la from LoginAction la where la.token=:token") - .setParameter("token", token)); - if (loginAction != null) { - em.remove(loginAction); - } + public void deleteTokens(String login, long before) { + Date now = new Date(); + Date date = new Date(now.getTime() - before); + em + .createQuery( + "delete from LoginAction la where la.loggedUser.login = :login and la.time < :time") + .setParameter("time", date) + .setParameter("login", login).executeUpdate(); } public User getUser(String login) { Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationService.java 2008-01-28 13:00:46 UTC (rev 552) @@ -29,19 +29,16 @@ public String loginUser(String login, String password) throws SimExplorerServiceException; - public void closeSessionTimer(String token) + public void requestAccount(String login, String mail) throws SimExplorerServiceException; - public User requestAccount(String login, String mail) - throws SimExplorerServiceException; - public User saveUser(String token, String login, String mail) throws SimExplorerServiceException; public void resetPassword(String token, String login) throws SimExplorerServiceException; - public void changePassword(String token, String login, String password) + public void changePassword(String token, String password) throws SimExplorerServiceException; public User getUser(String token, Integer id) @@ -76,7 +73,7 @@ public void setGroupsOfUser(String token, User user, Integer[] groupsIds) throws SimExplorerServiceException; - public Group saveGroup(String token, String name, User owner) + public Group saveGroup(String token, String name) throws SimExplorerServiceException; public Group getGroup(String token, Integer id) Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/AuthenticationServiceImpl.java 2008-01-28 13:00:46 UTC (rev 552) @@ -20,19 +20,16 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.UUID; -import java.util.Arrays; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.Remote; import javax.ejb.SessionContext; import javax.ejb.Stateless; -import javax.ejb.Timeout; -import javax.ejb.Timer; -import javax.ejb.TimerService; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; @@ -62,13 +59,9 @@ /* javax.mail.Session mailSession = (javax.mail.Session) new InitialContext().lookup("java:/Mail"); javax.mail.Message msg = new MimeMessage(mailSession); - msg.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse("AQui at aQui.be,siplusieuradresse at hotmail.com", false)); - msg.setSubject("This is a test"); - msg.setContent("<html><body><h2>Helle le monde mondial des terriens " + - " Petit test de jboss Mail-Service" + - " Ne m'en voulez pas si vous recevez ce mail alors que vous nedevrez pas " + - " Braim " + - "</h2></body></html>", "text/html"); + msg.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(mail, false)); + msg.setSubject(""); + msg.setContent("", "text/text"); msg.setHeader("X-Mailer", "JavaMailer"); msg.setSentDate(new java.util.Date()); Transport.send(msg); @@ -95,6 +88,53 @@ return "password"; } + private boolean canAdminGroup(String token, Integer id) + throws SimExplorerServiceException { + User loggedUser = getLoggedUser(token); + if (loggedUser != null) { + if (loggedUser.isSuperAdmin()) { + return true; + } + if (loggedUser.isAdmin()) { + return userOwnerOfGroup(loggedUser, dao.getGroup(id)); + } + } + return false; + } + + private boolean userOwnerOfGroup(User loggedUser, Group group) { + if (group.getOwner().getId() == loggedUser.getId()) { + return true; + } + List<Group> groups = group.getGroups(); + for (Group parent : groups) { + if (userOwnerOfGroup(loggedUser, parent)) { + return true; + } + } + return false; + } + + private boolean canAdminUser(String token, Integer id) + throws SimExplorerServiceException { + User loggedUser = getLoggedUser(token); + if (loggedUser != null) { + if (loggedUser.isSuperAdmin()) { + return true; + } + if (loggedUser.isAdmin()) { + User user = dao.getUser(id); + List<Group> groups = user.getGroups(); + for (Group group : groups) { + if (canAdminGroup(token, group.getId())) { + return true; + } + } + } + } + return false; + } + private void removeUserFromGroup(User user, Group group) { List<Group> toRemove = new ArrayList<Group>(); for (Group testGroup : user.getGroups()) { @@ -107,67 +147,116 @@ } } - public void deleteGroup(String token, Integer id) { - dao.deleteGroup(id); + public void deleteGroup(String token, Integer id) + throws SimExplorerServiceException { + if (canAdminGroup(token, id)) { + dao.deleteGroup(id); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public void deleteUser(String token, Integer id) { - dao.deleteUser(id); + public void deleteUser(String token, Integer id) + throws SimExplorerServiceException { + if (canAdminUser(token, id)) { + dao.deleteUser(id); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public Group getGroup(String token, Integer id) { - return dao.getGroup(id); + public Group getGroup(String token, Integer id) + throws SimExplorerServiceException { + if (canAdminGroup(token, id)) { + return dao.getGroup(id); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public Group getGroup(String token, String name) { - return dao.getGroup(name); + public Group getGroup(String token, String name) + throws SimExplorerServiceException { + Group group = dao.getGroup(name); + if (canAdminGroup(token, group.getId())) { + return group; + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public User getUser(String token, Integer id) { - return dao.getUser(id); + public User getUser(String token, Integer id) + throws SimExplorerServiceException { + if (canAdminUser(token, id)) { + return dao.getUser(id); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public User getUser(String token, String login) { - return dao.getUser(login); + public User getUser(String token, String login) + throws SimExplorerServiceException { + User user = dao.getUser(login); + if (canAdminUser(token, user.getId())) { + return user; + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public Group saveGroup(String token, String name, User owner) { - Group group = new Group(); - group.setName(name); - group.setOwner(owner); - dao.saveGroup(group); - group = getGroup(token, group.getId()); - return group; + public Group saveGroup(String token, String name) + throws SimExplorerServiceException { + User loggedUser = getLoggedUser(token); + if (loggedUser.isAdmin() || loggedUser.isSuperAdmin()) { + Group group = new Group(); + group.setName(name); + group.setOwner(loggedUser); + dao.saveGroup(group); + group = getGroup(token, group.getId()); + return group; + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } public User saveUser(String token, String login, String mail) throws SimExplorerServiceException { - User user = new User(); - user.setLogin(login); - user.setMail(mail); - String password = generatePassword(); - sendMail(login, mail, password); - String passwordHash = computeHash(password); - user.setPasswordHash(passwordHash); - user.setAdmin(false); - user.setSuperAdmin(false); - dao.saveUser(user); - user = getUser(token, user.getId()); - return user; + User loggedUser = getLoggedUser(token); + if (loggedUser.isAdmin() || loggedUser.isSuperAdmin()) { + User user = new User(); + user.setLogin(login); + user.setMail(mail); + String password = generatePassword(); + sendMail(login, mail, password); + String passwordHash = computeHash(password); + user.setPasswordHash(passwordHash); + user.setAdmin(false); + user.setSuperAdmin(false); + dao.saveUser(user); + user = getUser(token, user.getId()); + return user; + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public Group updateGroup(String token, Group group) { - return dao.updateGroup(group); + public Group updateGroup(String token, Group group) + throws SimExplorerServiceException { + if (canAdminGroup(token, group.getId())) { + return dao.updateGroup(group); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public User updateUser(String token, User user) { - return dao.updateUser(user); + public User updateUser(String token, User user) + throws SimExplorerServiceException { + if (canAdminUser(token, user.getId())) { + return dao.updateUser(user); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } - public User getLoggedUser(String token) { + public User getLoggedUser(String token) throws SimExplorerServiceException { + if (token == null || token.equals("")) { + return null; + } User loggedUser; loggedUser = dao.getLoggedUser(token); - return loggedUser; + if (loggedUser != null) { + return loggedUser; + } + throw new SimExplorerServiceException("simexplorer.security.loggedoff"); } private void checkSuperAdmin() throws SimExplorerServiceException { @@ -193,6 +282,8 @@ String token = null; User loggedUser = dao.loginUser(login, computeHash(password)); if (loggedUser != null) { + // dao.deleteTokens(login, 10 * 60 * 1000); + LoginAction loginAction = new LoginAction(); loginAction.setLoggedUser(loggedUser); loginAction.setTime(new Date()); @@ -203,20 +294,10 @@ return token; } - public void closeSessionTimer(String token) { - // FIXME session length - TimerService timerService = sessionContext.getTimerService(); - timerService.createTimer(10 * 60 * 1000, token); - } - - @Timeout - public void timeoutHandler(Timer timer) { - String token = (String) timer.getInfo(); - dao.deleteToken(token); - } - - public User requestAccount(String login, String mail) + public void requestAccount(String login, String mail) throws SimExplorerServiceException { + // FIXME send mail to superadmin + /* User user = new User(); user.setLogin(login); user.setMail(mail); @@ -226,24 +307,28 @@ user.setPasswordHash(passwordHash); dao.saveUser(user); return user; + */ } - public void changePassword(String token, String login, String password) + public void changePassword(String token, String password) throws SimExplorerServiceException { - User user = getUser(token, login); + User user = getLoggedUser(token); String passwordHash = computeHash(password); user.setPasswordHash(passwordHash); - dao.saveUser(user); + dao.updateUser(user); } public void resetPassword(String token, String login) throws SimExplorerServiceException { User user = getUser(token, login); - String password = generatePassword(); - sendMail(login, user.getMail(), password); - String passwordHash = computeHash(password); - user.setPasswordHash(passwordHash); - dao.saveUser(user); + if (canAdminUser(token, user.getId())) { + String password = generatePassword(); + sendMail(login, user.getMail(), password); + String passwordHash = computeHash(password); + user.setPasswordHash(passwordHash); + dao.updateUser(user); + } + throw new SimExplorerServiceException("simexplorer.security.norights"); } public Group[] getGroups(String token) { @@ -259,7 +344,8 @@ } public User[] getUsers(String token) { - return dao.getUsers().toArray(new User[dao.getUsers().size()]); + List<User> users = dao.getUsers(); + return users.toArray(new User[users.size()]); } public User[] getUsersOfGroup(String token, Group group) { Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/MockAuthenticationServiceImpl.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/MockAuthenticationServiceImpl.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/MockAuthenticationServiceImpl.java 2008-01-28 13:00:46 UTC (rev 552) @@ -21,10 +21,8 @@ import fr.cemagref.simexplorer.is.security.entities.Permission; import fr.cemagref.simexplorer.is.security.entities.User; - public class MockAuthenticationServiceImpl implements AuthenticationService { - public String loginUser(String login, String password) { return (String) checkImplemented(); } @@ -33,8 +31,8 @@ checkImplemented(); } - public User requestAccount(String login, String mail) { - return (User) checkImplemented(); + public void requestAccount(String login, String mail) { + checkImplemented(); } public User saveUser(String token, String login, String mail) { @@ -45,7 +43,7 @@ checkImplemented(); } - public void changePassword(String token, String login, String password) { + public void changePassword(String token, String password) { checkImplemented(); } @@ -73,7 +71,8 @@ return (User[]) checkImplemented(); } - public void setUsersOfGroup(String token, Group group, Integer[] usersInGroup) { + public void setUsersOfGroup(String token, Group group, + Integer[] usersInGroup) { checkImplemented(); } @@ -93,7 +92,7 @@ checkImplemented(); } - public Group saveGroup(String token, String name, User owner) { + public Group saveGroup(String token, String name) { return (Group) checkImplemented(); } @@ -136,6 +135,6 @@ public void setPermissions(String uuid, Permission[] permissions) { // TODO Auto-generated method stub - + } } \ No newline at end of file Modified: trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/SecurityTestCase.java =================================================================== --- trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/SecurityTestCase.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/SecurityTestCase.java 2008-01-28 13:00:46 UTC (rev 552) @@ -56,8 +56,7 @@ String token = authenticationService .loginUser("superadmin", "password"); - Group everybody = authenticationService.saveGroup(token, "everybody", - authenticationService.getLoggedUser(token)); + Group everybody = authenticationService.saveGroup(token, "everybody"); User me = authenticationService.getLoggedUser(token); me.getGroups().add(everybody); @@ -83,8 +82,11 @@ adminUsers[i].getGroups().add(everybody); authenticationService.updateUser(token, adminUsers[i]); - groups[i] = authenticationService.saveGroup(token, "group" + i, - adminUsers[i]); + String tokenAdmin = authenticationService.loginUser("admin" + i, + "password"); + + groups[i] = authenticationService + .saveGroup(tokenAdmin, "group" + i); for (int j = i * 4; j < (i * 4 + 5); j++) { simpleUsers[j].getGroups().add(groups[i]); authenticationService.updateUser(token, simpleUsers[j]); Modified: trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java =================================================================== --- trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-service/src/test/fr/cemagref/simexplorer/is/service/StorageServiceMassInsert.java 2008-01-28 13:00:46 UTC (rev 552) @@ -21,6 +21,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.Random; import junit.framework.TestCase; import fr.cemagref.simexplorer.is.contenttype.ContentType; @@ -36,6 +37,8 @@ private StorageServiceCommon storageService; private ElementGenerator elementGenerator; + private Random r = new Random(); + @Override protected void setUp() throws Exception { super.setUp(); @@ -82,20 +85,28 @@ ExplorationApplication ea = null; for (int i = 0; i < c; i++) { ea = elementGenerator.generateRandomEA(); - InputStream xmlStream = BaseEntityFactory.getFactory( - ExplorationApplication.class).saveElement( - XmlConstants.VALUE_METADATA_TYPE_EA, ea); - Map<String, InputStream> attachments = new HashMap<String, InputStream>(); - Map<String, ContentType> attachmentsKeys = ea.getMetaData() - .getAttachments(); - for (Map.Entry<String, ContentType> kv : attachmentsKeys.entrySet()) { - InputStream stream = elementGenerator.generateTextStream(); - attachments.put(kv.getKey(), stream); + int v = 2 + r.nextInt(5); + + for (int j = 0; j < v; j++) { + ea.getMetaData().getVersion().incVersion(r.nextInt(3)); + + InputStream xmlStream = BaseEntityFactory.getFactory( + ExplorationApplication.class).saveElement( + XmlConstants.VALUE_METADATA_TYPE_EA, ea); + + Map<String, InputStream> attachments = new HashMap<String, InputStream>(); + Map<String, ContentType> attachmentsKeys = ea.getMetaData() + .getAttachments(); + for (Map.Entry<String, ContentType> kv : attachmentsKeys + .entrySet()) { + InputStream stream = elementGenerator.generateTextStream(); + attachments.put(kv.getKey(), stream); + } + + storageService.saveElement(null, xmlStream, attachments); } - storageService.saveElement(null, xmlStream, attachments); - if (i > 0 && i % 100 == 0) { Date end = new Date(); long time = end.getTime() - begin.getTime(); Modified: trunk/simexplorer-is-storage/src/resources/properties/config.properties =================================================================== --- trunk/simexplorer-is-storage/src/resources/properties/config.properties 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-storage/src/resources/properties/config.properties 2008-01-28 13:00:46 UTC (rev 552) @@ -1,3 +1,3 @@ -simexplorer.db=/var/local/simexplorer/db3 -simexplorer.data=/var/local/simexplorer/data3/ +simexplorer.db=/var/local/simexplorer/db4 +simexplorer.data=/var/local/simexplorer/data4/ simexplorer.optimizeperiod=3600 Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDelete.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDelete.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDelete.java 2008-01-28 13:00:46 UTC (rev 552) @@ -36,8 +36,8 @@ public Object onActionFromConfirm() { try { RemoteStorageService.getStorageService().deleteElement(getToken(), - getElement().getMetaData().getUuid(), - getElement().getMetaData().getVersion().toString()); + getMetadata().getUuid(), + getMetadata().getVersion().toString()); } catch (SimExplorerServiceException e) { throw new SimExplorerWebException(e); } @@ -47,7 +47,7 @@ public Object onActionFromConfirmAll() { try { RemoteStorageService.getStorageService().deleteElement(getToken(), - getElement().getMetaData().getUuid()); + getMetadata().getUuid()); } catch (SimExplorerServiceException e) { throw new SimExplorerWebException(e); } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementDetail.java 2008-01-28 13:00:46 UTC (rev 552) @@ -128,7 +128,7 @@ node.setType(TreeNode.TYPE_FOLDER); node.setColumns(generateStringArray("Application exploration", - getElement().getMetaData().getName(), getElement() + getMetadata().getName(), getElement() .getMetaData().getVersion().toString(), getElement() .getMetaData(), "export", "history", "delete")); Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementExport.java 2008-01-28 13:00:46 UTC (rev 552) @@ -19,29 +19,38 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import java.util.Set; +import org.apache.tapestry.StreamResponse; + +import com.healthmarketscience.rmiio.RemoteInputStream; +import com.healthmarketscience.rmiio.RemoteInputStreamClient; import com.healthmarketscience.rmiio.RemoteOutputStreamServer; import com.healthmarketscience.rmiio.SimpleRemoteOutputStream; import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.ui.web.SimExplorerWebException; import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; +import fr.cemagref.simexplorer.is.ui.web.tools.AttachmentStreamResponse; +import fr.cemagref.simexplorer.is.ui.web.tools.DownloadableFile; import fr.cemagref.simexplorer.is.ui.web.tools.XMLAttachment; public class ElementExport extends ElementPage { - private String attachment; + private DownloadableFile attachment; public String getWindowTitle() { return ""; } - + public Object onActionFromDownloadXML() { Object response; - MetaDataEntity mde = getElement().getMetaData(); + MetaDataEntity mde = getMetadata(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); RemoteOutputStreamServer xmlRemoteOutputStream = new SimpleRemoteOutputStream( @@ -61,17 +70,40 @@ return response; } - public Set<String> getAttachments() { - Set<String> result = getElement().getMetaData().getAttachments() - .keySet(); + public Object onActionFromDownloadFile(String fileName) { + StreamResponse response; + + try { + MetaDataEntity mde = getMetadata(); + RemoteInputStream ris = RemoteStorageService.getStorageService() + .retrieveData(getToken(), mde.getUuid(), + mde.getVersion().toString(), fileName); + InputStream stream = RemoteInputStreamClient.wrap(ris); + + response = new AttachmentStreamResponse(stream, fileName); + } catch (Exception e) { + throw new SimExplorerWebException(e); + } + + return response; + } + + public List<DownloadableFile> getAttachments() { + Set<String> attachments = getMetadata().getAttachments().keySet(); + List<DownloadableFile> result = new ArrayList<DownloadableFile>(); + for (String attachment : attachments) { + DownloadableFile file = new DownloadableFile(); + file.setFilename(attachment); + result.add(file); + } return result; } - public String getAttachment() { + public DownloadableFile getAttachment() { return attachment; } - public void setAttachment(String attachment) { + public void setAttachment(DownloadableFile attachment) { this.attachment = attachment; } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPage.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPage.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementPage.java 2008-01-28 13:00:46 UTC (rev 552) @@ -22,6 +22,7 @@ import org.apache.tapestry.ioc.annotations.Inject; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; import fr.cemagref.simexplorer.is.ui.web.SimExplorerWebException; import fr.cemagref.simexplorer.is.ui.web.pages.security.UserPage; import fr.cemagref.simexplorer.is.ui.web.services.RemoteStorageService; @@ -52,4 +53,8 @@ return element; } + public MetaDataEntity getMetadata() { + return element.getMetaData(); + } + } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementRights.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementRights.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ElementRights.java 2008-01-28 13:00:46 UTC (rev 552) @@ -70,7 +70,7 @@ public String getWindowTitle() { return ""; } - + @Override public void setup(String uuid, String version) { super.setup(uuid, version); @@ -91,7 +91,7 @@ Permission[] permissions = RemoteSecurityService .getAuthentificationService().getPermissions( - getElement().getMetaData().getUuid()); + getMetadata().getUuid()); for (Permission permission : permissions) { if (permission.isOwner() && permission.getActor() instanceof User) { ownerUsers.add((User) permission.getActor()); @@ -133,7 +133,7 @@ if (permission == null) { permission = new Permission(); permission.setActor(actor); - permission.setBusinessId(getElement().getMetaData().getUuid()); + permission.setBusinessId(getMetadata().getUuid()); permission.setOwner(false); permission.setCanRead(false); permission.setCanWrite(false); @@ -176,7 +176,7 @@ new Permission[permissions.values().size()]); RemoteSecurityService.getAuthentificationService().setPermissions( - getElement().getMetaData().getUuid(), permissionsArray); + getMetadata().getUuid(), permissionsArray); return elementDetail; } Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/ExceptionReport.java 2008-01-28 13:00:46 UTC (rev 552) @@ -62,7 +62,7 @@ } public String getErrorMessage() { - return "Error"; + return "Custom message describing error."; } public boolean getShowPropertyList() { Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/GroupEdit.java 2008-01-28 13:00:46 UTC (rev 552) @@ -57,7 +57,7 @@ public String getWindowTitle() { return ""; } - + void setup(int groupId) { this.usersInGroup = new ArrayList<User>(); this.groupsInGroup = new ArrayList<Group>(); @@ -90,9 +90,8 @@ public Object onSuccess() { try { if (group.getId() == null) { - group = RemoteSecurityService - .getAuthentificationService() - .saveGroup(getToken(), group.getName(), getUserLogged()); + group = RemoteSecurityService.getAuthentificationService() + .saveGroup(getToken(), group.getName()); } else { group = RemoteSecurityService.getAuthentificationService() .updateGroup(getToken(), group); Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/Login.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/Login.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/Login.java 2008-01-28 13:00:46 UTC (rev 552) @@ -43,8 +43,6 @@ token = RemoteSecurityService.getAuthentificationService() .loginUser(user, password); if (token != null) { - RemoteSecurityService.getAuthentificationService() - .closeSessionTimer(token); result = elementList; } } catch (SimExplorerServiceException e) { Modified: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.java 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/pages/UserEdit.java 2008-01-28 13:00:46 UTC (rev 552) @@ -66,7 +66,7 @@ public String getWindowTitle() { return ""; } - + void pageLoaded() { groupModel = beanModelSource.create(Group.class, true, resources); List<String> wantedProperties = new ArrayList<String>(); @@ -79,14 +79,14 @@ } } - void setup(int groupId) { + void setup(int userId) { this.groupsOfUser = new ArrayList<Group>(); - if (groupId == -1) { + if (userId == -1) { this.user = new User(); } else { try { this.user = RemoteSecurityService.getAuthentificationService() - .getUser(getToken(), groupId); + .getUser(getToken(), userId); Group[] groups = RemoteSecurityService .getAuthentificationService().getGroupsOfUser( getToken(), this.user); @@ -139,8 +139,12 @@ public Group[] getOwnedGroups() { try { - return RemoteSecurityService.getAuthentificationService() - .getGroupsOwnedBy(getToken(), user); + if (user.getId() == null) { + return new Group[0]; + } else { + return RemoteSecurityService.getAuthentificationService() + .getGroupsOwnedBy(getToken(), user); + } } catch (SimExplorerServiceException e) { throw new SimExplorerWebException(e); } Added: trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java =================================================================== --- trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java (rev 0) +++ trunk/simexplorer-is-web/src/java/fr/cemagref/simexplorer/is/ui/web/tools/DownloadableFile.java 2008-01-28 13:00:46 UTC (rev 552) @@ -0,0 +1,32 @@ +/* +* ##% Copyright (C) 2008 Code Lutin, Gabriel Landais +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* ##% */ +package fr.cemagref.simexplorer.is.ui.web.tools; + +public class DownloadableFile { + + private String filename; + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + +} Modified: trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml =================================================================== --- trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/main/webapp/ElementExport.tml 2008-01-28 13:00:46 UTC (rev 552) @@ -6,14 +6,19 @@ <p> <h2>${message:attachments}</h2> - <br /> + </p> + <p>${message:download}</p> + <p> <table t:type="Grid" source="attachments" row="attachment"> <t:parameter name="empty"> - ${message:noAttachment} + noAttachment ${message:noAttachment} </t:parameter> + <t:parameter name="filenameCell"> + <t:actionlink t:id="downloadFile" context="${attachment.filename}">${attachment.filename}</t:actionlink> + </t:parameter> </table> </p> - + <p><t:back label="${message:back}" /></p> </t:layout> Modified: trunk/simexplorer-is-web/src/main/webapp/ExceptionReport.tml =================================================================== --- trunk/simexplorer-is-web/src/main/webapp/ExceptionReport.tml 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/main/webapp/ExceptionReport.tml 2008-01-28 13:00:46 UTC (rev 552) @@ -4,8 +4,10 @@ ${errormessage} <t:if test="unknown"> - - <div class="t-exception-report"> + + <h1>Unknown Exception</h1> + + <div class="t-exception-report" id="errordetail"> <ul> <t:loop source="stack" value="info"> <li><span class="t-exception-class-name">${info.className}</span> Modified: trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml =================================================================== --- trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml 2008-01-27 15:19:44 UTC (rev 551) +++ trunk/simexplorer-is-web/src/resources/fr/cemagref/simexplorer/is/ui/web/components/Layout.tml 2008-01-28 13:00:46 UTC (rev 552) @@ -1,80 +1,62 @@ <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> - <head> - <title>${title}</title> - </head> - - <body> - - <!-- titre --> - <h1 id="Title">${message:layout-pagetitle}</h1> - - <!-- barre --> - <div id="Header"> - <div class="Left"> - [<a t:type="actionlink" t:id="switchLocaleEn">${message:layout-localeen}</a>] - - - [<a t:type="actionlink" t:id="switchLocaleFr">${message:layout-localefr}</a>] - </div> - <t:if test="logged"> - <div class="Right"> - ${loginName} [<a t:type="actionlink" t:id="logout">${message:layout-logout}</a>] - </div> - </t:if> - </div> - - <t:if test="logged"> +<head> +<title>${title}</title> +</head> - <div id="Menu" class=""> +<body> - <!-- menu --> - <h1 class="tab">${message:layout-menutitle}</h1> - <div id="tabMenu"> - - <h2 class="Title">${message:layout-applications}</h2> - <menu class="menu"> - <li> - <t:actionlink t:id="applicationList">${message:layout-list}</t:actionlink> - </li> - <li><t:pagelink page="ApplicationImport">${message:layout-import}</t:pagelink></li> - </menu> - - <t:if test="administrator"> - - <h2 class="Title">${message:layout-administration}</h2> - <menu class="menu"> - <t:if test="superadministrator"> - <li><t:pagelink page="UserList">${message:layout-userlist}</t:pagelink></li> - </t:if> - <li><t:pagelink page="GroupList">${message:layout-grouplist}</t:pagelink></li> - </menu> - - </t:if> - - </div> - - <!-- menu --> - <h1 class="tab">${message:search}</h1> - <div id="tabMenu"> - - <t:form> - <t:errors/> - <h2 class="Title"><t:label for="searchField"/>:</h2> - <input t:type="TextField" t:id="searchField" t:value="searchText" t:validate="required,minlength=3" size="30"/> - <input type="submit" value="${message:search}"/> - </t:form> - - </div> - - </div> - - </t:if> - - <div id="Content"> - <!-- main template here --> - <t:body/> - </div> - - <div id="FooterAdd">${message:layout-copyright} - </div> - </body> +<!-- titre --> +<h1 id="Title">${message:layout-pagetitle}</h1> + +<!-- barre --> +<div id="Header"> +<div class="Left">[<a t:type="actionlink" t:id="switchLocaleEn">${message:layout-localeen}</a>] +- [<a t:type="actionlink" t:id="switchLocaleFr">${message:layout-localefr}</a>] +</div> +<t:if test="logged"> + <div class="Right">${loginName} [<a t:type="actionlink" + t:id="logout">${message:layout-logout}</a>]</div> +</t:if></div> + +<t:if test="logged"> + + <div id="Menu" class=""><!-- menu --> + <h1 class="tab">${message:layout-menutitle}</h1> + <div id="tabMenu"> + + <h2 class="Title">${message:layout-applications}</h2> + <menu class="menu"> + <li><t:actionlink t:id="applicationList">${message:layout-list}</t:actionlink> + </li> + <li><t:pagelink page="ApplicationImport">${message:layout-import}</t:pagelink></li> + </menu> + + <t:if test="administrator"> + + <h2 class="Title">${message:layout-administration}</h2> + <menu class="menu"> + <li><t:pagelink page="UserList">${message:layout-userlist}</t:pagelink></li> + <li><t:pagelink page="GroupList">${message:layout-grouplist}</t:pagelink></li> + </menu> + + </t:if></div> + + <!-- menu --> + <h1 class="tab">${message:search}</h1> + <div id="tabMenu"><t:form> + <t:errors /> + <h2 class="Title"><t:label for="searchField" />:</h2> + <input t:type="TextField" t:id="searchField" t:value="searchText" + t:validate="required,minlength=3" size="30" /> + <input type="submit" value="${message:search}" /> + </t:form></div> + + </div> + +</t:if> + +<div id="Content"><!-- main template here --> <t:body /></div> + +<div id="FooterAdd">${message:layout-copyright}</div> +</body> </html> \ No newline at end of file
participants (1)
-
glandais@users.labs.libre-entreprise.org