[Suiviobsmer-commits] r474 - in trunk/wao-ui: . src/main/java/fr/ifremer/wao/ui/base src/main/java/fr/ifremer/wao/ui/components src/main/java/fr/ifremer/wao/ui/data src/main/java/fr/ifremer/wao/ui/pages src/main/java/fr/ifremer/wao/ui/services src/main/resources/fr/ifremer/wao/ui/components src/main/webapp src/test/java/test/fr/ifremer/wao/ui src/test/java/test/fr/ifremer/wao/ui/pages
Author: fdesbois Date: 2010-05-03 16:48:00 +0000 (Mon, 03 May 2010) New Revision: 474 Log: - Improve user connection managment using a filter on ComponentRequestHandler service. - Layout doesn't manage authentication anymore, use RequiresAuthentication annotation + ServiceAuthentication service + two new pages Unavailable and Connexion. No need canDisplay method anymore in WaoPage. - Tests is working fine using Testify :) Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/RequiresAuthentication.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Connexion.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Unavailable.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/RequiresAuthenticationFilter.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthentication.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthenticationImpl.java trunk/wao-ui/src/main/webapp/Connexion.tml trunk/wao-ui/src/main/webapp/Unavailable.tml trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/AdministrationTest.java Modified: trunk/wao-ui/pom.xml trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/WaoPage.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/Layout.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/BoatActivityCalendar.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Index.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowForm.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowHistoric.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SamplingPlan.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Synthesis.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/UserProfile.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/AppModule.java trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/Layout.tml trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/AbstractApplicationTest.java trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/ConnectionTest.java Modified: trunk/wao-ui/pom.xml =================================================================== --- trunk/wao-ui/pom.xml 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/pom.xml 2010-05-03 16:48:00 UTC (rev 474) @@ -203,9 +203,10 @@ </build> </profile> </profiles> -<!-- <repositories> + + <repositories> - Repository for fckeditor component needed for News page + <!-- Repository for fckeditor component needed for News page --> <repository> <id>m2-release-repository.orientimport.kenai.com</id> <name>Orient Import Oy Maven Release Repository</name> @@ -219,7 +220,7 @@ <url>http://tapestry.formos.com/maven-repository</url> </repository> - </repositories>--> + </repositories> <scm> <url>http://labs.libre-entreprise.org/scm/viewvc.php/trunk/wao-ui/?root=suiviobsmer</url> Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/WaoPage.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/WaoPage.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/WaoPage.java 2010-05-03 16:48:00 UTC (rev 474) @@ -38,7 +38,9 @@ * Used to determine if the page has to be displayed (depends on user right) * * @return true if the page has to be displayed + * @deprecated since 1.2.1 */ + @Deprecated boolean canDisplay(); /** Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/Layout.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/Layout.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/components/Layout.java 2010-05-03 16:48:00 UTC (rev 474) @@ -25,25 +25,20 @@ package fr.ifremer.wao.ui.components; -import fr.ifremer.wao.WaoBusinessException; -import fr.ifremer.wao.WaoBusinessException.Type; -import fr.ifremer.wao.WaoException; import fr.ifremer.wao.WaoProperty; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.service.ServiceUser; import fr.ifremer.wao.ui.base.WaoPage; import fr.ifremer.wao.ui.pages.Index; +import fr.ifremer.wao.ui.services.ServiceAuthentication; import fr.ifremer.wao.ui.services.WaoManager; import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.BindingConstants; -import org.apache.tapestry5.PersistenceConstants; import org.apache.tapestry5.annotations.InjectComponent; import org.apache.tapestry5.annotations.InjectContainer; import org.apache.tapestry5.annotations.Log; import org.apache.tapestry5.annotations.Parameter; -import org.apache.tapestry5.annotations.Persist; import org.apache.tapestry5.annotations.Property; -import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.Request; @@ -62,37 +57,20 @@ private WaoManager manager; @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL) + @Property private String pageTitle; @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL) + @Property private String contentId; - /** - * Objet de session représentant l'utilisateur identifié - */ - @SessionState - private WaoUser currentUser; - - /** - * vrai si l'utilisateur s'est identifié, faux sinon - */ - //@SuppressWarnings("unused") - //@Property - //private boolean currentUserExists; - @InjectComponent - private FeedBack connexionFeedback; - - @InjectComponent private FeedBack contentFeedback; @InjectContainer private WaoPage page; @Inject - private ServiceUser serviceUser; - - @Inject private Request request; @Inject @@ -101,13 +79,12 @@ @Inject private Messages messages; + @Inject + private ServiceAuthentication serviceAuthentication; + private boolean fatal = false; void setupRender() { - if(isCurrentUserExists() && !canShowPage()) { - contentFeedback.addError("Vous n'êtes pas autorisé à accéder" + - " à cette page !"); - } if (logger.isDebugEnabled()) { logger.debug("Initialize page from Layout"); logger.debug("currentUserExists : " + isCurrentUserExists()); @@ -147,7 +124,7 @@ * contributeApplicationStateManager(MappedConfiguration) */ public boolean isCurrentUserExists() { - return StringUtils.isNotEmpty(currentUser.getTopiaId()); + return serviceAuthentication.isUserConnected(); } public String getContextPath() { @@ -157,34 +134,9 @@ public String getVersion() { return WaoProperty.APP_VERSION.getValue(); } - - /** - * User for connexion form data - */ - @Property - private String login; - - @Property - private String password; - - @Persist(PersistenceConstants.FLASH) - @Property - private String email; - - public String getPageTitle() { - return this.pageTitle; - } - - public String getContentId() { - return this.contentId; - } - public void setCurrentUser(WaoUser user) { - this.currentUser = user; - } - public WaoUser getCurrentUser() { - return this.currentUser; + return serviceAuthentication.getUserConnected(); } public FeedBack getFeedBack() { @@ -192,7 +144,7 @@ } public String getAdminClass() { - return this.currentUser.isAdmin() ? " admin" : ""; + return getCurrentUser().isAdmin() ? " admin" : ""; } public String getSamplingSelected() { @@ -215,27 +167,16 @@ return this.contentId.equals("so-admin") ? "selected" : ""; } - public boolean canShowPage() { - return page.canDisplay(); - } - public String getAccessText() { - String text = currentUser.getUserRole().getLibelle(); - if (currentUser.getReadOnly()) { + String text = getCurrentUser().getUserRole().getLibelle(); + if (getCurrentUser().getReadOnly()) { text += " lecture seule"; } return text; } - -// @InjectPage -// private Administration administration; -// -// public boolean canAccessAdministration() { -// return administration.canDisplay(); -// } public boolean displayBody() { - return canShowPage() && !fatal; + return !fatal; } /** @@ -266,50 +207,12 @@ fatal = true; } - @Log - Object onSuccessFromConnexionForm() throws WaoException { - try { - if (logger.isDebugEnabled()) { - logger.debug("Login : " + login); - } - if (login != null && password != null) { - currentUser = serviceUser.connect(login, password); - if (logger.isDebugEnabled()) { - logger.debug("User connected : " + - currentUser.getFullName()); - } - } - } catch (WaoBusinessException eee) { - if (eee.getType().equals(Type.BAD_CONNECTION)) { - connexionFeedback.addError(eee.getMessage()); - email = login; - } else if (eee.getType().equals(Type.ILLEGAL_CONNECTION)) { - connexionFeedback.addInfo(eee.getMessage()); - } - if (logger.isDebugEnabled()) { - logger.error("WaoBusinessException : " + eee.getMessage(), eee); - } - } - return null; - } - public boolean hasConnexionErrors() { - return connexionFeedback.hasErrors(); - } - void onSuccessFromForgetPassword() throws WaoException { - try { - serviceUser.forgetPassword(email); - connexionFeedback.addInfo("Un email avec votre nouveau mot de passe vous a été envoyé."); - } catch (WaoBusinessException eee) { - connexionFeedback.addError(eee.getMessage()); - } - } - @Log Object onActionFromExit() { - setCurrentUser(null); - request.getSession(false).invalidate(); - return Index.class; + serviceAuthentication.setUserConnected(null); + request.getSession(false).invalidate(); + return Index.class; } } Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/RequiresAuthentication.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/RequiresAuthentication.java (rev 0) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/RequiresAuthentication.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,30 @@ + +package fr.ifremer.wao.ui.data; + +import fr.ifremer.wao.bean.UserRole; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation is used on pages and components that need authentication + * to be rendered. + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ + at Target( { ElementType.TYPE }) + at Retention(RetentionPolicy.RUNTIME) + at Documented +public @interface RequiresAuthentication { + + // By default everybody can access + UserRole[] value() default + {UserRole.OBSERVER, UserRole.ADMIN, UserRole.COORDINATOR}; + + boolean readOnlyAllowed() default true; +} Property changes on: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/RequiresAuthentication.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java 2010-05-03 16:48:00 UTC (rev 474) @@ -28,6 +28,7 @@ import fr.ifremer.wao.WaoBusinessException; import fr.ifremer.wao.WaoBusinessException.Type; import fr.ifremer.wao.WaoException; +import fr.ifremer.wao.bean.UserRole; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.entity.CompanyImpl; import fr.ifremer.wao.entity.WaoUser; @@ -36,6 +37,7 @@ import fr.ifremer.wao.ui.base.GenericSelectModel; import fr.ifremer.wao.ui.base.WaoPage; import fr.ifremer.wao.ui.components.Layout; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.services.WaoManager; import java.util.List; import org.apache.commons.lang.StringUtils; @@ -60,6 +62,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication(value = UserRole.ADMIN, readOnlyAllowed = true) @IncludeStylesheet("context:css/administration.css") public class Administration implements WaoPage { @@ -74,8 +77,7 @@ } @Override - public void initialize() { - + public void initialize() { } @Inject Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/BoatActivityCalendar.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/BoatActivityCalendar.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/BoatActivityCalendar.java 2010-05-03 16:48:00 UTC (rev 474) @@ -34,11 +34,11 @@ import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.service.ServiceBoat; import fr.ifremer.wao.ui.base.WaoPage; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import java.util.Collections; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.annotations.IncludeStylesheet; -import org.apache.tapestry5.annotations.InjectPage; import org.apache.tapestry5.annotations.Persist; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.annotations.SessionState; @@ -53,6 +53,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/boats.css") public class BoatActivityCalendar implements WaoPage { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java 2010-05-03 16:48:00 UTC (rev 474) @@ -50,6 +50,7 @@ import fr.ifremer.wao.ui.components.Layout; import fr.ifremer.wao.ui.data.BoatDataSource; import fr.ifremer.wao.ui.data.ExportStreamResponse; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.services.WaoManager; import java.io.FileNotFoundException; import java.io.IOException; @@ -89,6 +90,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/boats.css") public class Boats extends AbstractFilteredPage { Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Connexion.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Connexion.java (rev 0) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Connexion.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,118 @@ + +package fr.ifremer.wao.ui.pages; + +import fr.ifremer.wao.WaoBusinessException; +import fr.ifremer.wao.WaoBusinessException.Type; +import fr.ifremer.wao.WaoException; +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.service.ServiceUser; +import fr.ifremer.wao.ui.components.FeedBack; +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.annotations.InjectComponent; +import org.apache.tapestry5.annotations.Log; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SessionState; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.services.PageRenderLinkSource; +import org.slf4j.Logger; + +/** + * Login + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ +public class Connexion { + + @Inject + private Logger logger; + + @Inject + private ServiceUser serviceUser; + + @Inject + private PageRenderLinkSource pageRender; + + /** + * Objet de session représentant l'utilisateur identifié + */ + @SessionState + private WaoUser currentUser; + + @InjectComponent + private FeedBack connexionFeedback; + + private String redirectPage; + + /** + * User for connexion form data + */ + @Property + private String login; + + @Property + private String password; + + @Persist(PersistenceConstants.FLASH) + @Property + private String email; + + void onActivate(String page) { + this.redirectPage = page; + } + + String onPassivate() { + return redirectPage; + } + + void onValidateFormFromConnexionForm() { + try { + if (logger.isDebugEnabled()) { + logger.debug("Login : " + login); + } + if (login != null && password != null) { + currentUser = serviceUser.connect(login, password); + if (logger.isDebugEnabled()) { + logger.debug("User connected : " + + currentUser.getFullName()); + } + } + } catch (WaoBusinessException eee) { + if (eee.getType().equals(Type.BAD_CONNECTION)) { + connexionFeedback.addError(eee.getMessage()); + email = login; + } else if (eee.getType().equals(Type.ILLEGAL_CONNECTION)) { + connexionFeedback.addInfo(eee.getMessage()); + } + if (logger.isDebugEnabled()) { + logger.error("WaoBusinessException : " + eee.getMessage(), eee); + } + } + } + + @Log + Object onSuccessFromConnexionForm() throws WaoException { + if (hasConnexionErrors()) { + return this; + } + // If redirectPage is defined, return a new Link to this page + return pageRender.createPageRenderLink(redirectPage); + } + + public boolean hasConnexionErrors() { + return connexionFeedback.hasErrors(); + } + + void onSuccessFromForgetPassword() throws WaoException { + try { + serviceUser.forgetPassword(email); + connexionFeedback.addInfo("Un email avec votre nouveau mot de " + + "passe vous a été envoyé."); + } catch (WaoBusinessException eee) { + connexionFeedback.addError(eee.getMessage()); + } + } +} Property changes on: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Connexion.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java 2010-05-03 16:48:00 UTC (rev 474) @@ -47,6 +47,7 @@ import fr.ifremer.wao.ui.base.GenericSelectModel; import fr.ifremer.wao.ui.components.Layout; import fr.ifremer.wao.ui.data.ExportStreamResponse; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.services.ContactModelFactory; import fr.ifremer.wao.ui.services.WaoManager; import java.io.IOException; @@ -85,6 +86,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/contacts.css") public class Contacts extends AbstractFilteredPage { @@ -111,12 +113,6 @@ @Inject private ServiceContact serviceContact; - @Inject - private ServiceSampling serviceSampling; - - @Inject - private ServiceBoat serviceBoat; - @Log void setupRender() throws WaoException { if (log.isDebugEnabled()) { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Index.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Index.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Index.java 2010-05-03 16:48:00 UTC (rev 474) @@ -26,11 +26,13 @@ package fr.ifremer.wao.ui.pages; import fr.ifremer.wao.WaoException; +import fr.ifremer.wao.bean.UserRole; import fr.ifremer.wao.entity.News; import fr.ifremer.wao.entity.NewsImpl; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.service.ServiceNews; import fr.ifremer.wao.ui.base.WaoPage; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -53,6 +55,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/news.css") public class Index implements WaoPage { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowForm.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowForm.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowForm.java 2010-05-03 16:48:00 UTC (rev 474) @@ -27,6 +27,7 @@ import fr.ifremer.wao.WaoBusinessException; import fr.ifremer.wao.WaoException; +import fr.ifremer.wao.bean.UserRole; import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.entity.FishingZone; @@ -42,6 +43,7 @@ import fr.ifremer.wao.service.ServiceUser; import fr.ifremer.wao.ui.base.GenericSelectModel; import fr.ifremer.wao.ui.base.WaoPage; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.data.WaoPropertyChangeListener; import fr.ifremer.wao.ui.services.WaoManager; import java.text.DateFormat; @@ -78,6 +80,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication(value = UserRole.ADMIN, readOnlyAllowed = false) @IncludeStylesheet("context:css/sampling.css") public class SampleRowForm implements WaoPage { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowHistoric.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowHistoric.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SampleRowHistoric.java 2010-05-03 16:48:00 UTC (rev 474) @@ -35,6 +35,7 @@ import fr.ifremer.wao.ui.base.WaoPage; import fr.ifremer.wao.ui.components.FeedBack; import fr.ifremer.wao.ui.components.Layout; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Locale; @@ -54,6 +55,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/sampling.css") public class SampleRowHistoric implements WaoPage { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SamplingPlan.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SamplingPlan.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/SamplingPlan.java 2010-05-03 16:48:00 UTC (rev 474) @@ -41,6 +41,7 @@ import fr.ifremer.wao.ui.base.AbstractFilteredPage; import fr.ifremer.wao.ui.components.Layout; import fr.ifremer.wao.ui.data.ExportStreamResponse; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; @@ -71,6 +72,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/sampling.css") public class SamplingPlan extends AbstractFilteredPage { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Synthesis.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Synthesis.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Synthesis.java 2010-05-03 16:48:00 UTC (rev 474) @@ -39,6 +39,7 @@ import fr.ifremer.wao.ui.data.BusinessUtils; import fr.ifremer.wao.ui.data.ChartUtils; import fr.ifremer.wao.ui.data.ChartUtils.ChartType; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.data.SynthesisId; import java.text.DateFormat; import java.text.NumberFormat; @@ -72,6 +73,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/synthesis.css") public class Synthesis extends AbstractFilteredPage { Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Unavailable.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Unavailable.java (rev 0) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Unavailable.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,40 @@ + +package fr.ifremer.wao.ui.pages; + +import fr.ifremer.wao.ui.base.WaoPage; +import fr.ifremer.wao.ui.components.Layout; +import org.apache.tapestry5.annotations.InjectComponent; + +/** + * Unavailable + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ +public class Unavailable implements WaoPage { + + @InjectComponent + private Layout layout; + + private String pageName; + + @Override + public boolean canDisplay() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void initialize() { + } + + void setupRender() { + layout.addError("Vous n'êtes pas autorisé à accéder à la page " + + pageName + " !"); + } + + void onActivate(String pageName) { + this.pageName = pageName; + } +} Property changes on: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Unavailable.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/UserProfile.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/UserProfile.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/UserProfile.java 2010-05-03 16:48:00 UTC (rev 474) @@ -32,6 +32,7 @@ import fr.ifremer.wao.service.ServiceUser; import fr.ifremer.wao.ui.base.WaoPage; import fr.ifremer.wao.ui.components.Layout; +import fr.ifremer.wao.ui.data.RequiresAuthentication; import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.annotations.IncludeStylesheet; import org.apache.tapestry5.annotations.InjectComponent; @@ -39,7 +40,6 @@ import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.corelib.components.BeanEditForm; import org.apache.tapestry5.ioc.annotations.Inject; -import org.slf4j.Logger; /** * UserProfile @@ -48,6 +48,7 @@ * * @author fdesbois <fdesbois at codelutin.com> */ + at RequiresAuthentication @IncludeStylesheet("context:css/userProfile.css") public class UserProfile implements WaoPage { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/AppModule.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/AppModule.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/AppModule.java 2010-05-03 16:48:00 UTC (rev 474) @@ -26,6 +26,7 @@ package fr.ifremer.wao.ui.services; import fr.ifremer.wao.WaoContextImpl; +import fr.ifremer.wao.entity.CompanyImpl; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.entity.WaoUserImpl; import fr.ifremer.wao.service.*; @@ -39,11 +40,14 @@ import org.apache.tapestry5.ioc.services.RegistryShutdownHub; import org.apache.tapestry5.services.ApplicationStateContribution; import org.apache.tapestry5.services.ApplicationStateCreator; +import org.apache.tapestry5.services.ApplicationStateManager; +import org.apache.tapestry5.services.ComponentRequestFilter; import org.apache.tapestry5.services.Request; import org.apache.tapestry5.services.RequestFilter; import org.apache.tapestry5.services.RequestHandler; import org.apache.tapestry5.services.Response; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * This module is automatically included as part of the Tapestry IoC Registry, @@ -54,6 +58,9 @@ */ public class AppModule { + private static final Logger logger = + LoggerFactory.getLogger(AppModule.class); + public static void bind(ServiceBinder binder) { binder.bind(ContactModelFactory.class); } @@ -131,6 +138,13 @@ return instance; } + public ServiceAuthentication buildServiceAuthentication( + ApplicationStateManager stateManager) { + ServiceAuthentication instance = + new ServiceAuthenticationImpl(stateManager); + return instance; + } + public static void contributeApplicationDefaults( MappedConfiguration<String, String> configuration) { // Contributions to ApplicationDefaults will override any contributions to @@ -210,14 +224,16 @@ * Used to instanciate SessionState WaoUser when session expires. * * @param configuration to add the ApplicationStateCreator. + * @param serviceAuthentication used to instantiate the new user */ public void contributeApplicationStateManager(MappedConfiguration<Class<?>, - ApplicationStateContribution> configuration) { + ApplicationStateContribution> configuration, + final ServiceAuthentication serviceAuthentication) { ApplicationStateCreator<WaoUser> creator = new ApplicationStateCreator<WaoUser>() { @Override public WaoUser create() { - return new WaoUserImpl(); + return serviceAuthentication.getNewUserInstance(); } }; @@ -225,6 +241,24 @@ new ApplicationStateContribution("session", creator)); } + /** + * Contribution to ComponentRequestHandler service. The + * {@link RequiresAuthenticationFilter} is added to the configuration of + * the service to provide authentication managment on user connected. + * + * @param configuration + * @see ServiceAuthentication + * @see RequiresAuthenticationFilter + * @see ComponentRequestFilter + */ + public static void contributeComponentRequestHandler( + OrderedConfiguration<ComponentRequestFilter> configuration) { + configuration.addInstance("RequiresAuthentication", + RequiresAuthenticationFilter.class); + } + + + // public void contributeValidationMessagesSource(OrderedConfiguration<String> configuration) { // configuration.add("myValidationMessages", "jumpstart/web/validators/ValidationMessages"); // configuration.add("myTranslationMessages", "jumpstart/web/translators/TranslationMessages"); Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/RequiresAuthenticationFilter.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/RequiresAuthenticationFilter.java (rev 0) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/RequiresAuthenticationFilter.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,135 @@ +package fr.ifremer.wao.ui.services; + +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.ui.data.RequiresAuthentication; +import fr.ifremer.wao.ui.pages.Connexion; +import fr.ifremer.wao.ui.pages.Unavailable; +import java.io.IOException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.tapestry5.Link; +import org.apache.tapestry5.runtime.Component; +import org.apache.tapestry5.services.ComponentEventRequestParameters; +import org.apache.tapestry5.services.ComponentRequestFilter; +import org.apache.tapestry5.services.ComponentRequestHandler; +import org.apache.tapestry5.services.ComponentSource; +import org.apache.tapestry5.services.PageRenderLinkSource; +import org.apache.tapestry5.services.PageRenderRequestParameters; +import org.apache.tapestry5.services.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * RequiresLoginFilter + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ +public class RequiresAuthenticationFilter implements ComponentRequestFilter { + + private static final Logger logger = + LoggerFactory.getLogger(RequiresAuthenticationFilter.class); + + private final PageRenderLinkSource pageRender; + + private final ComponentSource componentSource; + + private final Response response; + + private final ServiceAuthentication serviceAuthentication; + + public RequiresAuthenticationFilter(PageRenderLinkSource renderLinkSource, + ComponentSource componentSource, Response response, + ServiceAuthentication serviceAuthentication) { + this.pageRender = renderLinkSource; + this.componentSource = componentSource; + this.response = response; + this.serviceAuthentication = serviceAuthentication; + + if (logger.isDebugEnabled()) { + logger.debug("Construct"); + } + } + + @Override + public void handleComponentEvent( + ComponentEventRequestParameters parameters, + ComponentRequestHandler handler) throws IOException { + + if (logger.isDebugEnabled()) { + logger.debug("handleComponentEvent"); + } + + if (dispatchedToLoginPage(parameters.getActivePageName())) { + return; + } + + handler.handleComponentEvent(parameters); + + } + + @Override + public void handlePageRender(PageRenderRequestParameters parameters, + ComponentRequestHandler handler) throws IOException { + + if (logger.isDebugEnabled()) { + logger.debug("handlePageRender"); + } + + if (dispatchedToLoginPage(parameters.getLogicalPageName())) { + return; + } + + handler.handlePageRender(parameters); + } + + private boolean dispatchedToLoginPage(String pageName) throws IOException { + + Component page = componentSource.getPage(pageName); + + if (logger.isDebugEnabled()) { + logger.debug("Page name : " + pageName); + logger.debug("Page class : " + page.getClass()); + logger.debug("RequiresLogin annotation : " + + page.getClass().isAnnotationPresent(RequiresAuthentication.class)); + logger.debug("User in session : " + + serviceAuthentication.isUserConnected()); + } + + if (!page.getClass().isAnnotationPresent(RequiresAuthentication.class)) { + return false; + } + + Class<?> redirectPage = Connexion.class; + + if (serviceAuthentication.isUserConnected()) { + WaoUser user = serviceAuthentication.getUserConnected(); + if (logger.isDebugEnabled()) { + logger.debug("User connected : " + user); + logger.debug("User role : " + user.getUserRole().name()); + logger.debug("User allowed : " + + serviceAuthentication.isAllowed(page.getClass())); + } + + if (serviceAuthentication.isAllowed(page.getClass())) { + return false; + } + + redirectPage = Unavailable.class; + } + + Link link = pageRender.createPageRenderLinkWithContext(redirectPage, + pageName); + + if (logger.isDebugEnabled()) { + logger.debug("Redirection to " + redirectPage.getSimpleName() + + " page..."); + } + + response.sendRedirect(link); + + return true; + } +} + Property changes on: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/RequiresAuthenticationFilter.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthentication.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthentication.java (rev 0) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthentication.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,27 @@ + +package fr.ifremer.wao.ui.services; + +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.ui.base.WaoPage; + +/** + * ServiceAuthentication + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ +public interface ServiceAuthentication { + + boolean isUserConnected(); + + WaoUser getUserConnected(); + + void setUserConnected(WaoUser user); + + boolean isAllowed(Class<?> page); + + WaoUser getNewUserInstance(); + +} Property changes on: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthentication.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthenticationImpl.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthenticationImpl.java (rev 0) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthenticationImpl.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,73 @@ + +package fr.ifremer.wao.ui.services; + +import fr.ifremer.wao.bean.UserRole; +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.entity.WaoUserImpl; +import fr.ifremer.wao.ui.data.RequiresAuthentication; +import org.apache.tapestry5.services.ApplicationStateManager; + +/** + * ServiceAuthenticationImpl + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ +public class ServiceAuthenticationImpl implements ServiceAuthentication { + + private final ApplicationStateManager stateManager; + + public ServiceAuthenticationImpl(ApplicationStateManager stateManager) { + this.stateManager = stateManager; + } + + @Override + public boolean isUserConnected() { + return stateManager.exists(WaoUser.class); + } + + @Override + public WaoUser getUserConnected() { + return stateManager.getIfExists(WaoUser.class); + } + + @Override + public void setUserConnected(WaoUser user) { + stateManager.set(WaoUser.class, user); + } + + @Override + public boolean isAllowed(Class<?> page) { + if (page.isAnnotationPresent(RequiresAuthentication.class) && + isUserConnected()) { + + RequiresAuthentication check = + page.getAnnotation(RequiresAuthentication.class); + + WaoUser user = getUserConnected(); + + // Check if user readOnly is allowed + if (user.getReadOnly() && !check.readOnlyAllowed()) { + return false; + } + + // Check if user role is allowed + for (UserRole role : check.value()) { + if (role.equals(user.getUserRole())) { + return true; + } + } + return false; + } + // No restriction if annotation is not present + return true; + } + + @Override + public WaoUser getNewUserInstance() { + return new WaoUserImpl(); + } + +} Property changes on: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ServiceAuthenticationImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/Layout.tml =================================================================== --- trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/Layout.tml 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/Layout.tml 2010-05-03 16:48:00 UTC (rev 474) @@ -2,7 +2,7 @@ <!-- #%L Wao :: Web Interface - + $Author$ $LastChangedDate$ $LastChangedRevision$ @@ -15,17 +15,17 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/gpl-3.0.html>. #L% - --> +--> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> @@ -35,149 +35,110 @@ <link rel="stylesheet" type="text/css" href="${asset:context:css/common.css}" /> <link rel="stylesheet" type="text/css" href="${asset:context:css/main.css}" /> <script type="text/javascript" src="${asset:context:js/wao.js}"/> - </head> - <t:if t:test="currentUserExists"> - <body> - <t:unless t:test="devEnvironment"> - <!-- Script for Google Analytics --> - <script type="text/javascript"> - var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); - document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); - </script> - <script type="text/javascript"> - try { + </head> + <body> + <t:unless t:test="devEnvironment"> + <!-- Script for Google Analytics --> + <script type="text/javascript"> + var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); + document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); + </script> + <script type="text/javascript"> + try { var pageTracker = _gat._getTracker("UA-12982015-1"); pageTracker._trackPageview(); - } catch(err) {} - </script> - </t:unless> - <div id="so-session" class="clearfix"> - <div class="fleft"> - <a t:type="pagelink" t:page="index" title="Page d'accueil"> - <img src="${asset:context:img/logo-wao-48px.png}" alt="WAO logo" title="Retourner sur la page d'accueil"/> - </a> - </div> - <div class="fleft"> - <a href="mailto:obsmer at ifremer.fr" title="Contacter un responsable Obsmer"> - <img src="${asset:context:img/MiniLogo.jpg}" alt="Obsmer logo"/> - </a> - </div> - <div id="user-infos" class="fleft"> - Vous êtes <strong>${currentUser.fullName}</strong> de la société <strong>${currentUser.company.name}</strong> - (${accessText}) - </div> - <div id="user-actions" class="fright"> - <a t:type="pagelink" t:page="index" title="Page d'accueil"> - <img src="${asset:context:img/home.png}" alt="Accueil" title="Page d'accueil" /> - </a> - <a t:type="pagelink" t:page="userProfile" title="Gestion profil"> - <img src="${asset:context:img/user.png}" alt="Preferences" title="Gestion profil"/> - </a> - <a t:type="actionlink" t:id="exit" title="Déconnexion"> - <img src="${asset:context:img/exit.png}" alt="Exit" title="Déconnexion"/> - </a> - </div> + } catch(err) {} + </script> + </t:unless> + <div id="so-session" class="clearfix"> + <div class="fleft"> + <a t:type="pagelink" t:page="index" title="Page d'accueil"> + <img src="${asset:context:img/logo-wao-48px.png}" alt="WAO logo" title="Retourner sur la page d'accueil"/> + </a> </div> - <ul class="clearfix" id="so-menu"> - <li class="link${adminClass} ${samplingSelected}" onclick="location.href='${contextPath}/samplingPlan'" - title="Plan d'échantillonnage"> - Plan d'Echantillonnage - </li> + <div class="fleft"> + <a href="mailto:obsmer at ifremer.fr" title="Contacter un responsable Obsmer"> + <img src="${asset:context:img/MiniLogo.jpg}" alt="Obsmer logo"/> + </a> + </div> + <div id="user-infos" class="fleft"> + Vous êtes <strong>${currentUser.fullName}</strong> de la société <strong>${currentUser.company.name}</strong> + (${accessText}) + </div> + <div id="user-actions" class="fright"> + <a t:type="pagelink" t:page="index" title="Page d'accueil"> + <img src="${asset:context:img/home.png}" alt="Accueil" title="Page d'accueil" /> + </a> + <a t:type="pagelink" t:page="userProfile" title="Gestion profil"> + <img src="${asset:context:img/user.png}" alt="Preferences" title="Gestion profil"/> + </a> + <a t:type="actionlink" t:id="exit" title="Déconnexion"> + <img src="${asset:context:img/exit.png}" alt="Exit" title="Déconnexion"/> + </a> + </div> + </div> + <ul class="clearfix" id="so-menu"> + <li class="link${adminClass} ${samplingSelected}" onclick="location.href='${contextPath}/samplingPlan'" + title="Plan d'échantillonnage"> + Plan d'Echantillonnage + </li> + <li class="sep"> </li> + <li class="link${adminClass} ${boatsSelected}" onclick="location.href='${contextPath}/boats'" title="Liste des navires"> + Navires + </li> + <li class="sep"> </li> + <li class="link${adminClass} ${contactsSelected}" onclick="location.href='${contextPath}/contacts'" title="Liste des contacts"> + Contacts + </li> + <li class="sep"> </li> + <li class="link${adminClass} ${synthesisSelected}" onclick="location.href='${contextPath}/synthesis'" title="Synthèses et indicateurs"> + Synthèse + </li> + <t:if t:test="currentUser.admin"> <li class="sep"> </li> - <li class="link${adminClass} ${boatsSelected}" onclick="location.href='${contextPath}/boats'" title="Liste des navires"> - Navires + <li class="link${adminClass} ${adminSelected}" onclick="location.href='${contextPath}/administration'" title="Administration"> + Administration </li> - <li class="sep"> </li> - <li class="link${adminClass} ${contactsSelected}" onclick="location.href='${contextPath}/contacts'" title="Liste des contacts"> - Contacts - </li> - <li class="sep"> </li> - <li class="link${adminClass} ${synthesisSelected}" onclick="location.href='${contextPath}/synthesis'" title="Synthèses et indicateurs"> - Synthèse - </li> - <t:if t:test="currentUser.admin"> - <li class="sep"> </li> - <li class="link${adminClass} ${adminSelected}" onclick="location.href='${contextPath}/administration'" title="Administration"> - Administration - </li> - </t:if> - </ul> + </t:if> + </ul> - <div id="${contentId}"> - <t:feedback t:id="contentFeedback" t:autoClear="false"/> - <t:if t:test="displayBody()"> - <t:body /> - </t:if> - </div> - <div id="so-footer"> - <p> - <a href="http://suiviobsmer.labs.libre-entreprise.org/wao/" title="Documentation de l'application" target="blank"> - WAO - </a> - <a href="http://suiviobsmer.labs.libre-entreprise.org/wao/release-note.html" title="Modifications faites pour cette version" target="blank"> - ${version} - </a> - - <a href="mailto:obsmer at ifremer.fr" title="Contacter un responsable Obsmer" target="blank"> - Obsmer - </a> - - <a href="http://www.ifremer.fr/sih" title="Page d'accueil du SIH" target="blank"> - Ifremer SIH - </a> - - <a href="http://www.gnu.org/licenses/gpl.html" title="License GPL v3" target="blank"> - GPLv3 - </a> - Copyright 2009-2010 - <a href="http://www.ifremer.fr" title="Ifremer" target="blank"> - Ifremer</a>, - <a href="http://www.codelutin.com" title="Code Lutin" target="blank"> - Code Lutin - </a> - <!-- - - <a href="https://labs.libre-entreprise.org/tracker/?atid=692&group_id=154&func=browse" title="Bug Tracker"> - Bugs - </a>--> - </p> - <p class="cnil"> - Le site de "SUIVI DU REALISE DU PLAN D'ECHANTILLONNAGE DES OBSERVATIONS A LA MER" a fait l'objet d'une déclaration à - la CNIL sous le numéro suivant : 1414476 - </p> - </div> - </body> - - <!-- Connexion --> - <p:else> - <body class="so-connexion"> - <div id="so-connexion-feedback"> - <t:feedback t:id="connexionFeedback" /> - <t:if t:test="hasConnexionErrors()"> - <form t:type="form" t:id="forgetPassword"> - <strong>Mot de passe oublié ?</strong> - <t:label t:for="email" /> : - <input t:type="textfield" t:id="email" value="email" /> - <input class="ico accept" t:type="submit" value="Go" title="Envoyez moi un nouveau mot de passe" /> - </form> - </t:if> - </div> - <div class="clearfix" id="so-connexion-box"> - <form t:id="connexionForm" t:type="form"> - <div class="fleft clearfix" id="so-connexion-form"> - <p><t:label for="login" /> : </p> - <p><input t:type="textfield" t:id="login" t:value="login" /></p> - <p><t:label for="password" /> : </p> - <p><input t:type="passwordfield" t:id="password" t:value="password" /></p> - <div class="fright" id="so-connexion-form-buttons"> - <input class="ico accept" t:type="submit" value="Connexion" title="Connexion à l'application Wao" /> - </div> - </div> - <div class="fright" id="so-connexion-logo"> - <img src="${asset:context:img/logo-wao-48px.png}" alt="Logo Obsmer"/> - </div> - </form> - </div> - - </body> - <!--<div class="acenter"> - <img src="${asset:context:}/img/logo_WAO.png" alt="Logo WAO" title="WAO - Web Applicatif Obsmer"/> - </div>--> - </p:else> - </t:if> + <div id="${contentId}"> + <t:feedback t:id="contentFeedback" t:autoClear="false"/> + <t:if t:test="displayBody()"> + <t:body /> + </t:if> + </div> + <div id="so-footer"> + <p> + <a href="http://suiviobsmer.labs.libre-entreprise.org/wao/" title="Documentation de l'application" target="blank"> + WAO + </a> + <a href="http://suiviobsmer.labs.libre-entreprise.org/wao/release-note.html" title="Modifications faites pour cette version" target="blank"> + ${version} + </a> - + <a href="mailto:obsmer at ifremer.fr" title="Contacter un responsable Obsmer" target="blank"> + Obsmer + </a> - + <a href="http://www.ifremer.fr/sih" title="Page d'accueil du SIH" target="blank"> + Ifremer SIH + </a> - + <a href="http://www.gnu.org/licenses/gpl.html" title="License GPL v3" target="blank"> + GPLv3 + </a> - Copyright 2009-2010 + <a href="http://www.ifremer.fr" title="Ifremer" target="blank"> + Ifremer</a>, + <a href="http://www.codelutin.com" title="Code Lutin" target="blank"> + Code Lutin + </a> + <!-- - + <a href="https://labs.libre-entreprise.org/tracker/?atid=692&group_id=154&func=browse" title="Bug Tracker"> + Bugs + </a>--> + </p> + <p class="cnil"> + Le site de "SUIVI DU REALISE DU PLAN D'ECHANTILLONNAGE DES OBSERVATIONS A LA MER" a fait l'objet d'une déclaration à + la CNIL sous le numéro suivant : 1414476 + </p> + </div> + </body> </html> Added: trunk/wao-ui/src/main/webapp/Connexion.tml =================================================================== --- trunk/wao-ui/src/main/webapp/Connexion.tml (rev 0) +++ trunk/wao-ui/src/main/webapp/Connexion.tml 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + Wao :: Web Interface + + $Author$ + $LastChangedDate$ + $LastChangedRevision$ + $Id$ + $HeadURL$ + %% + Copyright (C) 2009 - 2010 Ifremer + %% + 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 3 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, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + <title>WAO - Web Applicatif Obsmer : Connexion</title> + <link rel="stylesheet" type="text/css" href="${asset:context:css/common.css}" /> + <link rel="stylesheet" type="text/css" href="${asset:context:css/main.css}" /> + </head> + <body class="so-connexion"> + + <!-- Connexion --> + <div id="so-connexion-feedback"> + <t:feedback t:id="connexionFeedback" /> + <t:if t:test="hasConnexionErrors()"> + <form t:type="form" t:id="forgetPassword" action="tapestry"> + <div> + <strong>Mot de passe oublié ?</strong> + <t:label t:for="email" /> : + <input t:type="textfield" t:id="email" value="email" /> + <input class="ico accept" t:type="submit" value="Go" title="Envoyez moi un nouveau mot de passe" /> + </div> + </form> + </t:if> + </div> + <div class="clearfix" id="so-connexion-box"> + <form t:id="connexionForm" t:type="form" action="tapestry"> + <div class="fleft clearfix" id="so-connexion-form"> + <p><t:label for="login" /> : </p> + <p><input t:type="textfield" t:id="login" t:value="login" /></p> + <p><t:label for="password" /> : </p> + <p><input t:type="passwordfield" t:id="password" t:value="password" /></p> + <div class="fright" id="so-connexion-form-buttons"> + <input class="ico accept" t:type="submit" value="Connexion" title="Connexion à l'application Wao" /> + </div> + </div> + <div class="fright" id="so-connexion-logo"> + <img src="${asset:context:img/logo-wao-48px.png}" alt="Logo Obsmer"/> + </div> + </form> + </div> + + </body> + <!--<div class="acenter"> + <img src="${asset:context:}/img/logo_WAO.png" alt="Logo WAO" title="WAO - Web Applicatif Obsmer"/> + </div>--> +</html> Property changes on: trunk/wao-ui/src/main/webapp/Connexion.tml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/wao-ui/src/main/webapp/Unavailable.tml =================================================================== --- trunk/wao-ui/src/main/webapp/Unavailable.tml (rev 0) +++ trunk/wao-ui/src/main/webapp/Unavailable.tml 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + Wao :: Web Interface + + $Author$ + $LastChangedDate$ + $LastChangedRevision$ + $Id$ + $HeadURL$ + %% + Copyright (C) 2009 - 2010 Ifremer + %% + 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 3 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, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<t:layout t:pageTitle="Accès réservé" t:contentId="so-unavailable" + xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter" /> \ No newline at end of file Property changes on: trunk/wao-ui/src/main/webapp/Unavailable.tml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/AbstractApplicationTest.java =================================================================== --- trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/AbstractApplicationTest.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/AbstractApplicationTest.java 2010-05-03 16:48:00 UTC (rev 474) @@ -81,4 +81,14 @@ stateManager.set(WaoUser.class, user); } } + + protected void prepareAdminUser() { + Company company = mock(Company.class); + when(company.getName()).thenReturn("ADMIN"); + + when(user.getFullName()).thenReturn("Super Admin"); + when(user.isAdmin()).thenReturn(true); + when(user.getUserRole()).thenReturn(UserRole.ADMIN); + when(user.getCompany()).thenReturn(company); + } } Added: trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/AdministrationTest.java =================================================================== --- trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/AdministrationTest.java (rev 0) +++ trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/AdministrationTest.java 2010-05-03 16:48:00 UTC (rev 474) @@ -0,0 +1,40 @@ + +package test.fr.ifremer.wao.ui.pages; + +import org.apache.tapestry5.dom.Document; +import org.apache.tapestry5.dom.Element; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import test.fr.ifremer.wao.ui.AbstractApplicationTest; + +/** + * AdministrationTest + * + * Created: 3 mai 2010 + * + * @author fdesbois + * $Id$ + */ +public class AdministrationTest extends AbstractApplicationTest { + + private static final Logger logger = + LoggerFactory.getLogger(ConnectionTest.class); + + @Test + public void testAuthenticationFailed() { + logger.info("## testAuthenticationFailed"); + + prepareObserverUser(true); + + Document page = tester.renderPage("administration"); + // User not allowed will be redirect on Unavailable page + Element main = page.getElementById("so-unavailable"); + Assert.assertNotNull(main); + + if (logger.isDebugEnabled()) { + logger.debug("Page content : " + main); + } + } +} Property changes on: trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/AdministrationTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/ConnectionTest.java =================================================================== --- trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/ConnectionTest.java 2010-04-29 21:50:44 UTC (rev 473) +++ trunk/wao-ui/src/test/java/test/fr/ifremer/wao/ui/pages/ConnectionTest.java 2010-05-03 16:48:00 UTC (rev 474) @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.Map; import org.apache.tapestry5.dom.Document; +import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.ApplicationStateManager; import org.junit.*; @@ -68,31 +69,54 @@ @Test public void testObserverSession() throws WaoException, WaoBusinessException { - if (logger.isInfoEnabled()) { - logger.info("testObserverSession"); - } + logger.info("## testObserverSession"); + prepareObserverUser(true); WaoUser sso = stateManager.getIfExists(WaoUser.class); Assert.assertNotNull(sso); Assert.assertFalse(sso.isAdmin()); + + Document page = tester.renderPage("index"); + Element main = page.getElementById("so-news"); + if (logger.isInfoEnabled()) { + logger.info("Content page News : " + main); + } + Assert.assertNotNull(main); } @Test - public void testConnection() throws WaoException, WaoBusinessException { + public void testObserverConnection() + throws WaoException, WaoBusinessException { + logger.info("## testObserverConnection"); + + when(serviceNews.getNews()).thenReturn(new ArrayList<News>()); + Document page = tester.renderPage("index"); + // Will be redirect to Connexion page if (logger.isInfoEnabled()) { - logger.info("testConnection"); + logger.info("Content : " + page.getRootElement()); } + + prepareObserverUser(false); + // Connect the user with connection page + connectUser(page); + } + + @Test + public void testAdminConnection() + throws WaoException, WaoBusinessException { + logger.info("## testAdminConnection"); + when(serviceNews.getNews()).thenReturn(new ArrayList<News>()); - Document page = tester.renderPage("Index"); + Document page = tester.renderPage("index"); if (logger.isInfoEnabled()) { logger.info("Content : " + page.getRootElement()); } - prepareObserverUser(false); + prepareAdminUser(); connectUser(page); } - private void connectUser(Document page) + private Element connectUser(Document page) throws WaoException, WaoBusinessException { when(serviceUser.connect("jmichmuche", "password")).thenReturn(user); @@ -101,9 +125,13 @@ fieldValues.put("password", "password"); Document result = tester.submitForm( page.getElementById("connexionForm"), fieldValues); + + Element main = result.getElementById("so-news"); if (logger.isInfoEnabled()) { - logger.info("Content : " + result.getRootElement()); + logger.info("Content page News : " + main); } + Assert.assertNotNull(main); + return main; } }
participants (1)
-
fdesbois@users.labs.libre-entreprise.org