diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index 945baa5a3c..d124032ec4 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -1744,6 +1744,7 @@ assignee=Assignee comment=Comment invalid_task=The task being viewed is no longer valid, it has probably been completed by another user. error_webprj_does_not_exist=Web project {0} does not exist (it may have been deleted) +inviteOutcome=Review Outcome # Workflow Definitions wf_review_options=Review Options diff --git a/config/alfresco/messages/webclient_de.properties b/config/alfresco/messages/webclient_de.properties index b28d58f958..370467a5a5 100644 --- a/config/alfresco/messages/webclient_de.properties +++ b/config/alfresco/messages/webclient_de.properties @@ -353,6 +353,7 @@ Collaborator=Mitarbeiter Contributor=Beitragender Editor=Editor All=Alle +FullControl=Vollzugriff ContentManager=Content Manager ContentPublisher=Content Publisher ContentContributor=Content Contributor @@ -1743,6 +1744,7 @@ assignee=Bevollm\u00e4chtigter comment=Kommentar invalid_task=Die angezeigte Aufgabe ist nicht mehr g\u00fcltig, sie wurde vermutlich von einem anderen Benutzer abgeschlossen. error_webprj_does_not_exist=Web-Projekt {0} existiert nicht (wurde m\u00f6glicherweise gel\u00f6scht) +inviteOutcome=\u00dcberpr\u00fcfungsergebnis # Workflow Definitions wf_review_options=Optionen \u00fcberpr\u00fcfen diff --git a/config/alfresco/messages/webclient_es.properties b/config/alfresco/messages/webclient_es.properties index 3faafd3180..a8e4a8fbac 100755 --- a/config/alfresco/messages/webclient_es.properties +++ b/config/alfresco/messages/webclient_es.properties @@ -353,6 +353,7 @@ Collaborator=Colaborador Contributor=Contribuidor Editor=Editor All=Todos +FullControl=Control completo ContentManager=Administrador de contenidos ContentPublisher=Editor de contenidos ContentContributor=Contribuidor de contenidos @@ -1743,6 +1744,7 @@ assignee=Asignado a comment=Comentario invalid_task=La tarea que se est\u00e1 viendo ya no es v\u00e1lida, probablemente ha sido completada por otro usuario. error_webprj_does_not_exist=El proyecto Web {0} no existe (puede haber sido eliminado) +inviteOutcome=Revisar resultado # Workflow Definitions wf_review_options=Revisar opciones diff --git a/config/alfresco/messages/webclient_fr.properties b/config/alfresco/messages/webclient_fr.properties index eb7f0e1588..e7ae8da4db 100755 --- a/config/alfresco/messages/webclient_fr.properties +++ b/config/alfresco/messages/webclient_fr.properties @@ -353,6 +353,7 @@ Collaborator=Collaborateur Contributor=Contributeur Editor=Editeur All=Toutes +FullControl=Contr\u00f4le complet ContentManager=Gestionnaire de contenu ContentPublisher=Responsable de publication ContentContributor=Contributeur de contenu @@ -1743,6 +1744,7 @@ assignee=Personne assign\u00e9e comment=Commentaire invalid_task=La t\u00e2che visualis\u00e9e n'est plus valide, elle a probablement \u00e9t\u00e9 finalis\u00e9e par un autre utilisateur. error_webprj_does_not_exist=Le projet Web {0} n''existe pas (il a peut-\u00eatre \u00e9t\u00e9 supprim\u00e9) +inviteOutcome=R\u00e9sultat de la r\u00e9vision # Workflow Definitions wf_review_options=Options de relecture diff --git a/config/alfresco/messages/webclient_it.properties b/config/alfresco/messages/webclient_it.properties index 90bbf32b31..e8e88b4c9a 100755 --- a/config/alfresco/messages/webclient_it.properties +++ b/config/alfresco/messages/webclient_it.properties @@ -353,6 +353,7 @@ Collaborator=Collaboratore Contributor=Contributore Editor=Redattore All=Tutti +FullControl=Controllo completo ContentManager=Manager contenuto ContentPublisher=Editore contenuto ContentContributor=Contributore contenuto @@ -1743,6 +1744,7 @@ assignee=Assegnatario comment=Commento invalid_task=Il compito visualizzato non \u00e8 pi\u00f9 valido. \u00c8 probabile che sia stato completato da un altro utente. error_webprj_does_not_exist=Il progetto web {0} non esiste (\u00e8 possibile che sia stato eliminato) +inviteOutcome=Esamina risultato # Workflow Definitions wf_review_options=Opzioni esame diff --git a/config/alfresco/messages/webclient_ja.properties b/config/alfresco/messages/webclient_ja.properties index a3e58b4c52..f5408b70d8 100755 --- a/config/alfresco/messages/webclient_ja.properties +++ b/config/alfresco/messages/webclient_ja.properties @@ -353,6 +353,7 @@ Collaborator=\u5171\u540c\u4f5c\u696d\u8005 Contributor=\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf Editor=\u7de8\u96c6\u8005 All=\u3059\u3079\u3066 +FullControl=\u30d5\u30eb\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb ContentManager=\u30b3\u30f3\u30c6\u30f3\u30c4\u30de\u30cd\u30fc\u30b8\u30e3 ContentPublisher=\u30b3\u30f3\u30c6\u30f3\u30c4\u767a\u884c\u8005 ContentContributor=\u30b3\u30f3\u30c6\u30f3\u30c4\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf @@ -1743,6 +1744,7 @@ assignee=\u62c5\u5f53\u8005 comment=\u30b3\u30e1\u30f3\u30c8 invalid_task=\u8868\u793a\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u308b\u30bf\u30b9\u30af\u306f\u7121\u52b9\u3067\u3059\u3002\u3059\u3067\u306b\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u5b8c\u4e86\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 error_webprj_does_not_exist=Web\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\uff08\u524a\u9664\u3055\u308c\u305f\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\uff09\u3002 +inviteOutcome=\u30ec\u30d3\u30e5\u30fc\u7d50\u679c # Workflow Definitions wf_review_options=\u30ec\u30d3\u30e5\u30fc\u306e\u30aa\u30d7\u30b7\u30e7\u30f3 diff --git a/config/alfresco/messages/webclient_nb_NO.properties b/config/alfresco/messages/webclient_nb_NO.properties index 6015477990..b05d3644ca 100755 --- a/config/alfresco/messages/webclient_nb_NO.properties +++ b/config/alfresco/messages/webclient_nb_NO.properties @@ -353,6 +353,7 @@ Collaborator=Medarbeider Contributor=Bidragsyter Editor=Redakt\u00f8r All=Alle +FullControl=Full kontroll ContentManager=Innholdsadministrator ContentPublisher=Innholdsutgiver ContentContributor=Innholdsbidragsyter @@ -1743,6 +1744,7 @@ assignee=Den som tilordnes comment=Kommentar invalid_task=Oppgaven som vises, er ikke lenger gyldig. Den har sannsynligvis blitt fullf\u00f8rt av en annen bruker. error_webprj_does_not_exist=Webprosjektet {0} finnes ikke (det kan v\u00e6re slettet) +inviteOutcome=Gjennomgangsresultat # Workflow Definitions wf_review_options=Alternativer for gjennomgang diff --git a/config/alfresco/messages/webclient_nl.properties b/config/alfresco/messages/webclient_nl.properties index 80aeb84867..c5f472641b 100755 --- a/config/alfresco/messages/webclient_nl.properties +++ b/config/alfresco/messages/webclient_nl.properties @@ -353,6 +353,7 @@ Collaborator=Medewerker Contributor=Bijdrager Editor=Editor All=Alle +FullControl=Volledig beheer ContentManager=Contentmanager ContentPublisher=Contentuitgever ContentContributor=Contentbijdrager @@ -1743,6 +1744,7 @@ assignee=Uitvoerder comment=Opmerking invalid_task=De taak die wordt bekeken is niet langer geldig en is mogelijk voltooid door een andere gebruiker. error_webprj_does_not_exist=Webproject {0} bestaat niet (het project is mogelijk verwijderd) +inviteOutcome=Resultaat van revisie # Workflow Definitions wf_review_options=Revisieopties diff --git a/config/alfresco/messages/webclient_ru.properties b/config/alfresco/messages/webclient_ru.properties index 7658ebcb9b..ecaf827038 100755 --- a/config/alfresco/messages/webclient_ru.properties +++ b/config/alfresco/messages/webclient_ru.properties @@ -353,6 +353,7 @@ Collaborator=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 Contributor=\u0410\u0432\u0442\u043E\u0440 Editor=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 All=\u0412\u0441\u0435 +FullControl=\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c ContentManager=\u041C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 ContentPublisher=\u0418\u0437\u0434\u0430\u0442\u0435\u043B\u044C \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 ContentContributor=\u0410\u0432\u0442\u043E\u0440 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 @@ -1743,6 +1744,7 @@ assignee=\u0418\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C comment=\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C invalid_task=\u041F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043C\u0430\u044F \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043B\u0430 \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439, \u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E, \u043E\u043D\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \u0434\u0440\u0443\u0433\u0438\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C. error_webprj_does_not_exist=\u0412\u0435\u0431-\u043F\u0440\u043E\u0435\u043A\u0442 {0} \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 (\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E, \u043E\u043D \u0443\u0434\u0430\u043B\u0435\u043D) +inviteOutcome=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 # Workflow Definitions wf_review_options=\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B diff --git a/config/alfresco/messages/webclient_zh_CN.properties b/config/alfresco/messages/webclient_zh_CN.properties index 6cd5adf4a9..7bf6b13569 100755 --- a/config/alfresco/messages/webclient_zh_CN.properties +++ b/config/alfresco/messages/webclient_zh_CN.properties @@ -353,6 +353,7 @@ Collaborator=\u5408\u4f5c\u8005 Contributor=\u8d21\u732e\u8005 Editor=\u7f16\u8f91\u8005 All=\u5168\u90e8 +FullControl=\u5b8c\u5168\u63a7\u5236 ContentManager=\u5185\u5bb9\u7ba1\u7406\u5458 ContentPublisher=\u5185\u5bb9\u53d1\u5e03\u8005 ContentContributor=\u5185\u5bb9\u8d21\u732e\u8005 @@ -1743,6 +1744,7 @@ assignee=\u88ab\u6307\u6d3e\u8005 comment=\u8bc4\u8bba invalid_task=\u6b63\u5728\u67e5\u770b\u7684\u4efb\u52a1\u4e0d\u518d\u6709\u6548\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u5df2\u88ab\u53e6\u4e00\u4f4d\u7528\u6237\u5b8c\u6210\u3002 error_webprj_does_not_exist=Web \u9879\u76ee {0} \u4e0d\u5b58\u5728\uff08\u53ef\u80fd\u5df2\u5220\u9664\uff09 +inviteOutcome=\u590d\u67e5\u7ed3\u679c # Workflow Definitions wf_review_options=\u590d\u67e5\u9009\u9879 diff --git a/config/alfresco/subsystems/Authentication/alfrescoNtlm/ntlm-filter-context.xml b/config/alfresco/subsystems/Authentication/alfrescoNtlm/ntlm-filter-context.xml index eedaab66fe..ce92eb2665 100644 --- a/config/alfresco/subsystems/Authentication/alfrescoNtlm/ntlm-filter-context.xml +++ b/config/alfresco/subsystems/Authentication/alfrescoNtlm/ntlm-filter-context.xml @@ -39,6 +39,9 @@ + + + diff --git a/config/alfresco/subsystems/Authentication/kerberos/kerberos-filter-context.xml b/config/alfresco/subsystems/Authentication/kerberos/kerberos-filter-context.xml index dc4f85e0f0..ed659b2456 100644 --- a/config/alfresco/subsystems/Authentication/kerberos/kerberos-filter-context.xml +++ b/config/alfresco/subsystems/Authentication/kerberos/kerberos-filter-context.xml @@ -48,6 +48,9 @@ ${kerberos.authentication.stripUsernameSuffix} + + + diff --git a/config/alfresco/subsystems/Authentication/passthru/ntlm-filter-context.xml b/config/alfresco/subsystems/Authentication/passthru/ntlm-filter-context.xml index eedaab66fe..ce92eb2665 100644 --- a/config/alfresco/subsystems/Authentication/passthru/ntlm-filter-context.xml +++ b/config/alfresco/subsystems/Authentication/passthru/ntlm-filter-context.xml @@ -39,6 +39,9 @@ + + + diff --git a/config/alfresco/web-client-application-context.xml b/config/alfresco/web-client-application-context.xml index 627722aa64..5946fec994 100644 --- a/config/alfresco/web-client-application-context.xml +++ b/config/alfresco/web-client-application-context.xml @@ -212,7 +212,44 @@ - + + + + + + + + org.alfresco.repo.web.filter.beans.DependencyInjectedFilter + + + + cookieBasedAuthenticationFilter + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/alfresco/web-client-config-properties.xml b/config/alfresco/web-client-config-properties.xml index 04011ce8fd..1ee3d11e8d 100644 --- a/config/alfresco/web-client-config-properties.xml +++ b/config/alfresco/web-client-config-properties.xml @@ -841,5 +841,15 @@ - + + + + + + + + + + + diff --git a/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java index f82c9e417a..f0ab35eada 100644 --- a/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java @@ -26,27 +26,22 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.alfresco.repo.SessionUser; import org.alfresco.repo.management.subsystems.ActivateableBean; import org.alfresco.repo.web.filter.beans.DependencyInjectedFilter; import org.alfresco.repo.webdav.auth.BaseAuthenticationFilter; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.web.bean.repository.User; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.surf.util.URLDecoder; +import org.springframework.extensions.webscripts.Description.RequiredAuthentication; import org.springframework.extensions.webscripts.Match; import org.springframework.extensions.webscripts.RuntimeContainer; -import org.springframework.extensions.webscripts.Description.RequiredAuthentication; /** * WebScript aware Authentication Filter Class. Takes into account the authentication setting in the descriptor for the * webscript before chaining to the downstream authentication filters. If authentication is not required then chains * with the NO_AUTH_REQUIRED request attribute set, which should cause any downstream authentication filter to bypass - * authentication checks. Also directly handles login script calls, allowing Surf to establish a cookie for a manual log - * in, rather than the usual stateless ticket based logins used in non-SSO mode. + * authentication checks. * * @author Kevin Roast * @author dward @@ -54,16 +49,9 @@ import org.springframework.extensions.webscripts.Description.RequiredAuthenticat public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter implements DependencyInjectedFilter, ActivateableBean { - private static final String API_LOGIN = "/api/login"; private static final Log logger = LogFactory.getLog(WebScriptSSOAuthenticationFilter.class); private RuntimeContainer container; private boolean isActive = true; - - - public WebScriptSSOAuthenticationFilter() - { - setUserAttributeName(AuthenticationHelper.AUTHENTICATION_USER); - } /** * @param container the container to set @@ -72,8 +60,7 @@ public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter i { this.container = container; } - - + /** * Activates or deactivates the bean * @@ -102,7 +89,6 @@ public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter i { // Get the HTTP request/response HttpServletRequest req = (HttpServletRequest)sreq; - HttpServletResponse res = (HttpServletResponse)sresp; // find a webscript match for the requested URI String requestURI = req.getRequestURI(); @@ -125,32 +111,9 @@ public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter i } } - // Allow propagation of manual logins to the session user - String script = req.getPathInfo(); - if (script != null && script.equals(API_LOGIN) && req.getMethod().equalsIgnoreCase("POST")) - { - if (handleLoginForm(req, res)); - { - // Establish the session locale using request headers rather than web client preferences - AuthenticationHelper.setupThread(context, req, res, false); - } - } - else - { - chain.doFilter(sreq, sresp); - } + chain.doFilter(sreq, sresp); } - - @Override - protected SessionUser createUserObject(String userName, String ticket, NodeRef personNode, NodeRef homeSpaceRef) - { - // Create a web client user object - User user = new User( userName, ticket, personNode); - user.setHomeSpaceId( homeSpaceRef.getId()); - - return user; - } - + /* (non-Javadoc) * @see org.alfresco.repo.webdav.auth.BaseAuthenticationFilter#getLogger() */ diff --git a/source/java/org/alfresco/web/app/servlet/WebscriptCookieAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/WebscriptCookieAuthenticationFilter.java new file mode 100644 index 0000000000..257c0f8a45 --- /dev/null +++ b/source/java/org/alfresco/web/app/servlet/WebscriptCookieAuthenticationFilter.java @@ -0,0 +1,81 @@ +package org.alfresco.web.app.servlet; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.alfresco.repo.SessionUser; +import org.alfresco.repo.web.filter.beans.DependencyInjectedFilter; +import org.alfresco.repo.webdav.auth.BaseAuthenticationFilter; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.web.bean.repository.User; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +/** + * WebScript aware Authentication Filter. Directly handles login script calls, allowing Surf to establish a cookie + * for a manual login, rather than the usual stateless ticket based logins. + * + * This functionality has been extracted from the WebScriptSSOAuthenticationFilter so that they can work independently. + * + * @author Gethin James + */ +public class WebscriptCookieAuthenticationFilter extends BaseAuthenticationFilter implements DependencyInjectedFilter +{ + + private static final Log logger = LogFactory.getLog(WebscriptCookieAuthenticationFilter.class); + private static final String API_LOGIN = "/api/login"; + + public WebscriptCookieAuthenticationFilter() + { + setUserAttributeName(AuthenticationHelper.AUTHENTICATION_USER); + } + + + @Override + public void doFilter(ServletContext context, ServletRequest sreq, ServletResponse sresp, FilterChain chain) throws IOException, ServletException + { + + // Get the HTTP request/response + HttpServletRequest req = (HttpServletRequest)sreq; + HttpServletResponse res = (HttpServletResponse)sresp; + + // Allow propagation of manual logins to the session user + if (API_LOGIN.equals(req.getPathInfo()) && req.getMethod().equalsIgnoreCase("POST")) + { + if (handleLoginForm(req, res)); + { + // Establish the session locale using request headers rather than web client preferences + AuthenticationHelper.setupThread(context, req, res, false); + } + } + else + { + chain.doFilter(sreq, sresp); + } + } + + @Override + protected SessionUser createUserObject(String userName, String ticket, NodeRef personNode, NodeRef homeSpaceRef) + { + // Create a web client user object + User user = new User( userName, ticket, personNode); + user.setHomeSpaceId( homeSpaceRef.getId()); + + return user; + } + + @Override + protected Log getLogger() + { + return logger; + } + +} diff --git a/source/java/org/alfresco/web/bean/wcm/EditWebContentWizard.java b/source/java/org/alfresco/web/bean/wcm/EditWebContentWizard.java index fbeef1a2ff..b105c9ed13 100644 --- a/source/java/org/alfresco/web/bean/wcm/EditWebContentWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/EditWebContentWizard.java @@ -48,6 +48,7 @@ public class EditWebContentWizard extends CreateWebContentWizard private AVMNode avmNode; private Form form; + private String storeNameBeforeEditing; protected Set existingLocks = null; @@ -87,6 +88,7 @@ public class EditWebContentWizard extends CreateWebContentWizard // calculate which locks are present at init time this.existingLocks = new HashSet(4); + this.storeNameBeforeEditing = null; String lock = this.getAvmLockingService().getLockOwner(AVMUtil.getStoreId(this.createdPath), AVMUtil.getStoreRelativePath(this.createdPath)); if (lock != null) @@ -148,6 +150,24 @@ public class EditWebContentWizard extends CreateWebContentWizard } } } + + if (this.storeNameBeforeEditing != null) + { + String storeId = AVMUtil.getStoreId(this.createdPath); + String storePath = AVMUtil.getStoreRelativePath(this.createdPath); + String lockOwner = this.getAvmLockingService().getLockOwner(storeId, storePath); + Map lockData = this.getAvmLockingService().getLockData(storeId, storePath); + + if (lockOwner != null) + { + if (logger.isDebugEnabled()) + logger.debug("transferring lock from " + lockData.get(WCMUtil.LOCK_KEY_STORE_NAME) + " to " + + storeNameBeforeEditing + " on cancel editing"); + + lockData.put(WCMUtil.LOCK_KEY_STORE_NAME, this.storeNameBeforeEditing); + this.getAvmLockingService().modifyLock(storeId, storePath, lockOwner, storeId, storePath, lockData); + } + } return super.cancel(); } @@ -182,6 +202,7 @@ public class EditWebContentWizard extends CreateWebContentWizard if (logger.isDebugEnabled()) logger.debug("transferring lock from " + lockData.get(WCMUtil.LOCK_KEY_STORE_NAME) + " to " + storeName); + this.storeNameBeforeEditing = lockData.get(WCMUtil.LOCK_KEY_STORE_NAME); lockData.put(WCMUtil.LOCK_KEY_STORE_NAME, AVMUtil.getStoreName(this.createdPath)); this.getAvmLockingService().modifyLock(storeId, storePath, lockOwner, storeId, storePath, lockData); } diff --git a/source/java/org/alfresco/web/bean/workflow/WorkflowBean.java b/source/java/org/alfresco/web/bean/workflow/WorkflowBean.java index 75fbfa6e92..abccdb4de3 100644 --- a/source/java/org/alfresco/web/bean/workflow/WorkflowBean.java +++ b/source/java/org/alfresco/web/bean/workflow/WorkflowBean.java @@ -150,7 +150,7 @@ public class WorkflowBean implements Serializable tx.begin(); // get the current pooled tasks for the current user - List tasks = this.getWorkflowService().getPooledTasks(userName); + List tasks = this.getWorkflowService().getPooledTasks(userName, true); // create a list of transient nodes to represent this.pooledTasks = new ArrayList(tasks.size()); @@ -200,7 +200,7 @@ public class WorkflowBean implements Serializable // get the current in progress tasks for the current user List tasks = this.getWorkflowService().getAssignedTasks( - userName, WorkflowTaskState.IN_PROGRESS); + userName, WorkflowTaskState.IN_PROGRESS, true); // create a list of transient nodes to represent this.tasks = new ArrayList(tasks.size()); @@ -376,54 +376,6 @@ public class WorkflowBean implements Serializable */ protected TransientMapNode createTask(WorkflowTask task) { - // get the type of the task - WorkflowTaskDefinition taskDef = task.definition; - - // create the basic transient node - TransientMapNode node = new TransientMapNode(taskDef.metadata.getName(), - task.title, task.properties); - - // add properties for the other useful metadata - node.getProperties().put(ContentModel.PROP_NAME.toString(), task.title); - node.getProperties().put("type", node.getType().toString()); - node.getProperties().put("id", task.id); - - // add extra properties for completed tasks - if (task.state.equals(WorkflowTaskState.COMPLETED)) - { - // add the outcome label for any completed task - String outcome = null; - String transition = (String)task.properties.get(WorkflowModel.PROP_OUTCOME); - if (transition != null) - { - WorkflowTransition[] transitions = task.definition.node.transitions; - for (WorkflowTransition trans : transitions) - { - if (trans.id.equals(transition)) - { - outcome = trans.title; - break; - } - } - - if(outcome == null) - { - // TODO: is this okay -> no real transitions exist for activiti - outcome = transition; - } - if (outcome != null) - { - node.getProperties().put("outcome", outcome); - } - } - - // add the workflow instance id and name this taks belongs to - node.getProperties().put("workflowInstanceId", task.path.instance.id); - - // add the task itself as a property - node.getProperties().put("workflowTask", task); - } - - return node; + return new WorkflowTaskNode(task); } } diff --git a/source/java/org/alfresco/web/bean/workflow/WorkflowTaskNode.java b/source/java/org/alfresco/web/bean/workflow/WorkflowTaskNode.java new file mode 100644 index 0000000000..19c4d5862e --- /dev/null +++ b/source/java/org/alfresco/web/bean/workflow/WorkflowTaskNode.java @@ -0,0 +1,115 @@ +package org.alfresco.web.bean.workflow; + +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.workflow.WorkflowModel; +import org.alfresco.service.cmr.workflow.WorkflowTask; +import org.alfresco.service.cmr.workflow.WorkflowTaskState; +import org.alfresco.service.cmr.workflow.WorkflowTransition; +import org.alfresco.service.namespace.QName; +import org.alfresco.web.bean.repository.Node; +import org.alfresco.web.bean.repository.TransientMapNode; + +/** + * Wrapper around a {@link WorkflowTask} to allow it to be approached as a {@link Node}. + * Can hold additional properties, on top of the properties in the actual {@link WorkflowTask}. + * + * @author Frederik Heremans + */ +public class WorkflowTaskNode extends TransientMapNode { + + private static final long serialVersionUID = 1L; + private Map propertyWrapper; + + private WorkflowTask workflowTask; + + public WorkflowTaskNode(WorkflowTask workflowTask) { + super(workflowTask.getDefinition().getMetadata().getName(), workflowTask.getTitle(), null); + this.workflowTask = workflowTask; + + propertyWrapper = new WorkflowTaskPropertyBackedMap(); + + propertyWrapper.put(ContentModel.PROP_NAME.toString(), workflowTask.getTitle()); + propertyWrapper.put("type", type.toString()); + propertyWrapper.put("id", workflowTask.getId()); + + // add extra properties for completed tasks + if (workflowTask.getState().equals(WorkflowTaskState.COMPLETED)) + { + // add the outcome label for any completed task + String outcome = null; + String transition = (String)workflowTask.getProperties().get(WorkflowModel.PROP_OUTCOME); + if (transition != null) + { + for (WorkflowTransition trans : workflowTask.getDefinition().getNode().getTransitions()) + { + if (trans.getId().equals(transition)) + { + outcome = trans.getTitle(); + break; + } + } + + if(outcome == null) + { + outcome = transition; + } + if (outcome != null) + { + propertyWrapper.put("outcome", outcome); + } + } + + // add the workflow instance id and name this taks belongs to + propertyWrapper.put("workflowInstanceId", workflowTask.getPath().getInstance().getId()); + + // add the task itself as a property + propertyWrapper.put("workflowTask", workflowTask); + } + } + + @Override + public Map getProperties() { + return propertyWrapper; + } + + /** + * Map which can contain local values (added by put and putAll). Get-operation reverts + * to {@link WorkflowTask} properties when not found in the local values. + * + * @author Frederik Heremans + */ + private class WorkflowTaskPropertyBackedMap extends HashMap + { + private static final long serialVersionUID = 1L; + + @Override + public Object get(Object key) { + String fullKey = QName.resolveToQNameString(WorkflowTaskNode.this.getNamespacePrefixResolver(), key.toString()); + Object value = super.get(fullKey); + if(value == null) + { + value = workflowTask.getProperties().get(QName.resolveToQName(WorkflowTaskNode.this.getNamespacePrefixResolver(), fullKey)); + } + return value; + } + + @Override + public boolean containsKey(Object key) { + String fullKey = QName.resolveToQNameString(WorkflowTaskNode.this.getNamespacePrefixResolver(), key.toString()); + boolean contains = super.containsKey(fullKey); + if(!contains) + { + contains = workflowTask.getProperties().containsKey(QName.resolveToQName(WorkflowTaskNode.this.getNamespacePrefixResolver(), fullKey)); + } + return contains; + } + + @Override + public Object put(String key, Object value) { + return super.put(QName.resolveToQNameString(WorkflowTaskNode.this.getNamespacePrefixResolver(), key.toString()), value); + } + } +} diff --git a/source/java/org/alfresco/web/ui/repo/component/UIContentSelector.java b/source/java/org/alfresco/web/ui/repo/component/UIContentSelector.java index 34ec2c61ef..e46a20e9e8 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UIContentSelector.java +++ b/source/java/org/alfresco/web/ui/repo/component/UIContentSelector.java @@ -355,7 +355,7 @@ public class UIContentSelector extends UIInput NamespaceService.CONTENT_MODEL_1_0_URI, "name")); query.append(nameAttr); - query.append(":\"*" + safeContains + "\"*"); + query.append(":\"*" + safeContains + "*\""); } int maxResults = Application.getClientConfig(context).getSelectorsSearchMaxResults(); diff --git a/source/web/WEB-INF/web.xml b/source/web/WEB-INF/web.xml index 9803d79651..a42514cecd 100644 --- a/source/web/WEB-INF/web.xml +++ b/source/web/WEB-INF/web.xml @@ -137,7 +137,17 @@ WebscriptAuthenticationFilter - + + + WebScript Cookie Authentication Filter + Directly handles login script calls, allowing Surf to establish a cookie for a manual login + org.alfresco.repo.web.filter.beans.BeanProxyFilter + + beanName + WebscriptCookieAuthenticationFilter + + + WebDAV Authentication Filter org.alfresco.repo.web.filter.beans.BeanProxyFilter @@ -218,6 +228,17 @@ Global Authentication Filter /d/* + + + + WebScript Cookie Authentication Filter + /wcservice/* + + + + WebScript Cookie Authentication Filter + /wcs/* + @@ -294,7 +315,17 @@ JSF Session Synchronized Filter /faces/* - + + + Global Authentication Filter + /cmisatom/* + + + + Authentication Filter + /cmisatom/* + + CacheExpiresFilter *.jpg diff --git a/source/web/scripts/ajax/dojo/src/widget/DatePicker.js b/source/web/scripts/ajax/dojo/src/widget/DatePicker.js index 3fbd497774..01d8b15c39 100644 --- a/source/web/scripts/ajax/dojo/src/widget/DatePicker.js +++ b/source/web/scripts/ajax/dojo/src/widget/DatePicker.js @@ -6,6 +6,10 @@ modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml + + 2013 - Alfresco Software, Ltd. + Alfresco Software has modified source of this file + The details of changes can be found in svn at location root\projects\web-client\source\web\scripts\ajax\dojo */ dojo.provide("dojo.widget.DatePicker"); @@ -406,7 +410,7 @@ dojo.widget.defineWidget( if(null != event){ event.stopPropagation(); - if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + if(((null != event.keyCode) && ((13 == event.keyCode) || (32 == event.keyCode))) || ((null != event.charCode) && ((13 == event.charCode) || (32 == event.charCode)))) { this.onIncrementWeek(event); } } @@ -425,7 +429,7 @@ dojo.widget.defineWidget( if(null != event){ event.stopPropagation(); - if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + if(((null != event.keyCode) && ((13 == event.keyCode) || (32 == event.keyCode))) || ((null != event.charCode) && ((13 == event.charCode) || (32 == event.charCode)))) { this.onIncrementMonth(event); } } @@ -444,7 +448,7 @@ dojo.widget.defineWidget( if(null != event){ event.stopPropagation(); - if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + if(((null != event.keyCode) && ((13 == event.keyCode) || (32 == event.keyCode))) || ((null != event.charCode) && ((13 == event.charCode) || (32 == event.charCode)))) { this.onIncrementYear(event); } } @@ -523,7 +527,7 @@ dojo.widget.defineWidget( if(null != event){ event.stopPropagation(); - if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + if(((null != event.keyCode) && ((13 == event.keyCode) || (32 == event.keyCode))) || ((null != event.charCode) && ((13 == event.charCode) || (32 == event.charCode)))) { this._handleUiClick(event); } } diff --git a/source/web/scripts/ajax/dojo/src/widget/TimePicker.js b/source/web/scripts/ajax/dojo/src/widget/TimePicker.js index 2aa82a563e..b5a3066da9 100644 --- a/source/web/scripts/ajax/dojo/src/widget/TimePicker.js +++ b/source/web/scripts/ajax/dojo/src/widget/TimePicker.js @@ -6,6 +6,10 @@ modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml + + 2013 - Alfresco Software, Ltd. + Alfresco Software has modified source of this file + The details of changes can be found in svn at location root\projects\web-client\source\web\scripts\ajax\dojo */ dojo.provide("dojo.widget.TimePicker"); @@ -248,6 +252,22 @@ dojo.widget.defineWidget( this.onSetTime(); }, + handleNewHourSelectedKey: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if((null != event) && (((null != event.keyCode) && ((13 == event.keyCode) || (32 == event.keyCode))) || ((null != event.charCode) && ((13 == event.charCode) || (32 == event.charCode))))) { + event.stopPropagation(); + this.onSetSelectedHour(event); + } + }, + + handleNewMinuteSelectedKey: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if((null != event) && (((null != event.keyCode) && ((13 == event.keyCode) || (32 == event.keyCode))) || ((null != event.charCode) && ((13 == event.charCode) || (32 == event.charCode))))) { + event.stopPropagation(); + this.onSetSelectedMinute(event); + } + }, + setSelectedMinute: function(evt) { if(evt && evt.target) { if(evt.target.nodeType == dojo.dom.ELEMENT_NODE) { diff --git a/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html b/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html index 91b1e26b46..6fd80a62ec 100644 --- a/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html +++ b/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html @@ -13,7 +13,7 @@ + dojoAttachEvent="onClick: onSetSelectedHour; onKey: handleNewHourSelectedKey;"> @@ -44,7 +44,7 @@
12 6 + dojoAttachEvent="onClick: onSetSelectedMinute; onKey: handleNewMinuteSelectedKey;"> diff --git a/source/web/scripts/ajax/xforms.js b/source/web/scripts/ajax/xforms.js index 4cd0f2fdbf..766d8713bc 100644 --- a/source/web/scripts/ajax/xforms.js +++ b/source/web/scripts/ajax/xforms.js @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -5418,7 +5418,7 @@ alfresco.xforms.FocusResolver = new Class({ // Ignores the event if focus actually is the same as at previous time or if nothing is focused if ((null == focusedElement) || ((null != resolver._currentElement) && !resolver._forced && ((resolver._currentElement.id == focusedElement.id) || (0 == focusedElement.id.indexOf("undefined"))))) { - if (0 != focusedElement.id.indexOf("undefined")) + if ((null != focusedElement) && (0 != focusedElement.id.indexOf("undefined"))) { resolver._navigationDirection = 0; } @@ -5589,7 +5589,7 @@ alfresco.xforms.FocusResolver = new Class({ findControl: function(element, ignoreTabIndex, dontCareAboutValidity) { - if ((null == element) || (("DIV" == element.tagName) && element.hasClass("xformsItemLabelContainer"))) + if ((null == element) || (("DIV" == element.tagName) && this._hasClass(element, "xformsItemLabelContainer"))) { return null; } @@ -5613,6 +5613,11 @@ alfresco.xforms.FocusResolver = new Class({ return result; }, + _hasClass: function(element, className) + { + return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1; + }, + _isElementInTheScope: function(element) { if (null != element)
00 30