View Javadoc

1   /**
2    * This file Copyright (c) 2003-2013 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.setup;
35  
36  import info.magnolia.commands.impl.MarkNodeAsDeletedCommand;
37  import info.magnolia.jcr.util.NodeTypes;
38  import info.magnolia.module.AbstractModuleVersionHandler;
39  import info.magnolia.module.InstallContext;
40  import info.magnolia.module.delta.AddURIPermissionTask;
41  import info.magnolia.module.delta.ArrayDelegateTask;
42  import info.magnolia.module.delta.BootstrapConditionally;
43  import info.magnolia.module.delta.BootstrapSingleModuleResource;
44  import info.magnolia.module.delta.BootstrapSingleResource;
45  import info.magnolia.module.delta.CheckAndModifyPropertyValueTask;
46  import info.magnolia.module.delta.Condition;
47  import info.magnolia.module.delta.CreateNodeTask;
48  import info.magnolia.module.delta.DeltaBuilder;
49  import info.magnolia.module.delta.FindAndChangeTemplateIdTask;
50  import info.magnolia.module.delta.MoveAndRenamePropertyTask;
51  import info.magnolia.module.delta.NoSameNameSiblingsCondition;
52  import info.magnolia.module.delta.NodeExistsDelegateTask;
53  import info.magnolia.module.delta.OrderFilterBeforeTask;
54  import info.magnolia.module.delta.PartialBootstrapTask;
55  import info.magnolia.module.delta.PropertyExistsDelegateTask;
56  import info.magnolia.module.delta.RemoveNodeTask;
57  import info.magnolia.module.delta.RemovePermissionTask;
58  import info.magnolia.module.delta.Task;
59  import info.magnolia.module.delta.TextFileConditionsUtil;
60  import info.magnolia.module.delta.WarnTask;
61  import info.magnolia.module.delta.WebXmlConditionsUtil;
62  import info.magnolia.module.delta.WorkspaceXmlConditionsUtil;
63  import info.magnolia.repository.RepositoryConstants;
64  import info.magnolia.setup.for5_0.CheckOrCreateLastActivatedPropertyTask;
65  import info.magnolia.setup.for5_0.ConvertMetaDataUpdateTask;
66  import info.magnolia.setup.for5_0.Register50NodeTypeTask;
67  import info.magnolia.setup.for5_0.RemoveMetaDataInNodeTypeDefinitionTask;
68  import info.magnolia.setup.initial.GenericTasks;
69  
70  import java.util.ArrayList;
71  import java.util.List;
72  
73  import javax.jcr.ImportUUIDBehavior;
74  
75  /**
76   * Special VersionHandler for the core module. As it does not extend {@link info.magnolia.module.DefaultModuleVersionHandler} it has a special getBasicInstallTasks(InstallContext) that
77   * e.g. will not automatically bootstrap xml-files placed in mgnl-bootstrap/core.
78   */
79  public class CoreModuleVersionHandler extends AbstractModuleVersionHandler {
80      public static final String BOOTSTRAP_AUTHOR_INSTANCE_PROPERTY = "magnolia.bootstrap.authorInstance";
81  
82      // TODO : why is this a BootstrapConditionally and not a BootstrapSingleResource ?
83      private final BootstrapConditionally auditTrailManagerTask = new BootstrapConditionally("New auditory log configuration", "Install new configuration for auditory log manager.", "/mgnl-bootstrap/core/config.server.auditLogging.xml");
84      private final BootstrapSingleResource bootstrapFreemarker = new BootstrapSingleResource("Freemarker configuration", "Freemarker template loaders can now be configured in Magnolia. Adds default configuration", "/mgnl-bootstrap/core/config.server.rendering.freemarker.xml");
85      private final CreateNodeTask addFreemarkerSharedVariables = new CreateNodeTask("Freemarker configuration", "Adds sharedVariables node to the Freemarker configuration",
86              RepositoryConstants.CONFIG, "/server/rendering/freemarker", "sharedVariables", NodeTypes.ContentNode.NAME);
87      private final BootstrapSingleResource bootstrapWebContainerResources = new BootstrapSingleResource("Web container resources configuration", "Global configuration which resources are not meant to be handled by Magnolia. For instance JSP files.", "/mgnl-bootstrap/core/config.server.webContainerResources.xml");
88      private final BootstrapSingleModuleResource bootstrapChannelManagement = new BootstrapSingleModuleResource("ChannelManagement configuration", "", "config.server.rendering.channelManagement.xml");
89  
90      private final BootstrapSingleModuleResource bootstrapChannelFilter = new BootstrapSingleModuleResource("ChannelFilter configuration", "", "config.server.filters.channel.xml");
91      private final Task placeChannelBeforeLogout = new OrderFilterBeforeTask("channel", new String[] { "logout" });
92      private final Task updateSecurityBaseRole = updateSecurityBaseRole();
93  
94      private Task updateSecurityBaseRole() {
95          ArrayDelegateTask permissionsTask = new ArrayDelegateTask("Update security-base role", "Disallow access to view configuration/tools pages");
96          permissionsTask.addTask(new RemovePermissionTask("", "", "security-base", "uri", "/.magnolia/pages/installedModulesList.html", AddURIPermissionTask.DENY));
97          permissionsTask.addTask(new RemovePermissionTask("", "", "security-base", "uri", "/.magnolia/pages/jcrUtils.html", AddURIPermissionTask.DENY));
98          permissionsTask.addTask(new RemovePermissionTask("", "", "security-base", "uri", "/.magnolia/pages/configuration.html", AddURIPermissionTask.DENY));
99          permissionsTask.addTask(new RemovePermissionTask("", "", "security-base", "uri", "/.magnolia/pages/logViewer.html", AddURIPermissionTask.DENY));
100         permissionsTask.addTask(new RemovePermissionTask("", "", "security-base", "uri", "/.magnolia/pages/sendMail.html", AddURIPermissionTask.DENY));
101         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/installedModulesList*", AddURIPermissionTask.DENY));
102         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/jcrUtils*", AddURIPermissionTask.DENY));
103         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/configuration*", AddURIPermissionTask.DENY));
104         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/logViewer*", AddURIPermissionTask.DENY));
105         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/sendMail*", AddURIPermissionTask.DENY));
106 
107         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/users*", AddURIPermissionTask.DENY));
108         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/import*", AddURIPermissionTask.DENY));
109         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/export*", AddURIPermissionTask.DENY));
110         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/messages*", AddURIPermissionTask.DENY));
111         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/permission*", AddURIPermissionTask.DENY));
112         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/developmentUtils*", AddURIPermissionTask.DENY));
113         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/activationTools*", AddURIPermissionTask.DENY));
114         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/migrationReport*", AddURIPermissionTask.DENY));
115         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/backup*", AddURIPermissionTask.DENY));
116         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/activationMonitor*", AddURIPermissionTask.DENY));
117         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/installedModulesList*", AddURIPermissionTask.DENY));
118         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/allModulesList*", AddURIPermissionTask.DENY));
119         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/cacheTools*", AddURIPermissionTask.DENY));
120         permissionsTask.addTask(new AddURIPermissionTask("", "", "security-base", "/.magnolia/pages/flows*", AddURIPermissionTask.DENY));
121         return permissionsTask;
122     }
123 
124     public CoreModuleVersionHandler() {
125         super();
126 
127         register(DeltaBuilder.checkPrecondition("4.5", "5.0"));
128 
129         register(DeltaBuilder.update("4.5.2", "")
130                 .addTask(new PropertyExistsDelegateTask("Fix property name", "", RepositoryConstants.CONFIG, "/server/security/userManagers/system", "realName", new MoveAndRenamePropertyTask("Fix propertyName", "/server/security/userManagers/system", "realName", "/server/security/userManagers/system", "realmName")))
131                 .addTask(new PropertyExistsDelegateTask("Fix property name", "", RepositoryConstants.CONFIG, "/server/security/userManagers/admin", "realName", new MoveAndRenamePropertyTask("Fix propertyName", "/server/security/userManagers/admin", "realName", "/server/security/userManagers/admin", "realmName"))));
132 
133         register((DeltaBuilder.update("4.5.9", ""))
134                 .addTask(new NodeExistsDelegateTask("AuditLogging configurations", "Add auditLogging configurations for delete action", "config", "/server/auditLogging/logConfigurations/delete", null, new PartialBootstrapTask("", "", "/mgnl-bootstrap/core/config.server.auditLogging.xml", "/auditLogging/logConfigurations/delete", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW)))
135                 .addTask(new CheckAndModifyPropertyValueTask("AuditLogging configurations", "Change auditLogging class", "config", "/server/auditLogging", "class", "info.magnolia.logging.AuditLoggingManager", "info.magnolia.audit.AuditLoggingManager"))
136                 .addTask(updateSecurityBaseRole));
137         register(DeltaBuilder.update("5.0", "")
138                 .addTask(new Register50NodeTypeTask("Register the new M5 node Type", "", RepositoryConstants.CONFIG))
139                 .addTask(new RemoveMetaDataInNodeTypeDefinitionTask("Un register the metaData child node", "", RepositoryConstants.CONFIG))
140                 .addTask(new ConvertMetaDataUpdateTask("Convert MetaData Task", "Remove the metaData sub node and replace them with mixIn when appropriate"))
141                 .addTask(new RemoveNodeTask("Remove PageEditorServlet", "Remove obsolete PageEditorServlet configuration.", RepositoryConstants.CONFIG, "/server/filters/servlets/PageEditorServlet"))
142                 .addTask(new RemoveNodeTask("Remove obsolete 'templating-editor' configuration", "", RepositoryConstants.CONFIG, "/modules/magnolia-templating-editor"))
143                 .addTask(new PartialBootstrapTask("Bootstrap link transformers", "Bootstrap 'server/rendering/linkManagement/transformers", "/mgnl-bootstrap/core/config.server.rendering.linkManagement.xml", "/linkManagement/transformers")));
144         register((DeltaBuilder.update("5.0.1", ""))
145                 .addTask(new CheckAndModifyPropertyValueTask("MIMEMapping", "Change xsl extension mime-type from text/xml to application/xml", RepositoryConstants.CONFIG, "/server/MIMEMapping/xsl", "mime-type", "text/xml", "application/xml"))
146                 .addTask(new CheckAndModifyPropertyValueTask("MIMEMapping", "Change xml extension mime-type from text/xml to application/xml", RepositoryConstants.CONFIG, "/server/MIMEMapping/xml", "mime-type", "text/xml", "application/xml")));
147         register((DeltaBuilder.update("5.0.3", ""))
148                 .addTask(new PartialBootstrapTask("JSON", "Add JSON mime-type", "/mgnl-bootstrap/core/config.server.MIMEMapping.xml", "/MIMEMapping/json")));
149         register((DeltaBuilder.update("5.1", ""))
150                 .addTask(new WarnTask("respectOrderDocument parameter", "As of Magnolia 5.1, the respectOrderDocument parameter has been reintroduced in repo config files and set to true by default. You will need to set it manually for each workspace in your installation. Please, refer to the release notes for more details."))
151                 .addTask(new RemoveNodeTask("Remove intercept filter", "Removes no longer used intercept filter.", RepositoryConstants.CONFIG, "/server/filters/cms/intercept")));
152         register((DeltaBuilder.update("5.1.1", ""))
153                 .addTask(new NodeExistsDelegateTask("Set mgnl:lastActivated date of the user superuser", "Set mgnl:lastActivated date of the user superuser (if not set yet)", RepositoryConstants.USERS, "/system/superuser",
154                         new CheckOrCreateLastActivatedPropertyTask("", "", RepositoryConstants.USERS, "/system/superuser")))
155                 .addTask(new NodeExistsDelegateTask("Set mgnl:lastActivated date of the user anonymous", "Set mgnl:lastActivated date of the user anonymous (if not set yet)", RepositoryConstants.USERS, "/system/anonymous",
156                         new CheckOrCreateLastActivatedPropertyTask("", "", RepositoryConstants.USERS, "/system/anonymous")))
157                 .addTask(new NodeExistsDelegateTask("Set mgnl:lastActivated date of the superuser role", "Set mgnl:lastActivated date of the superuser role (if not set yet)", RepositoryConstants.USER_ROLES, "/superuser",
158                         new CheckOrCreateLastActivatedPropertyTask("", "", RepositoryConstants.USER_ROLES, "/superuser")))
159                 .addTask(new NodeExistsDelegateTask("Set mgnl:lastActivated date of the anonymous role", "Set mgnl:lastActivated date of the anonymous role (if not set yet)", RepositoryConstants.USER_ROLES, "/anonymous",
160                         new CheckOrCreateLastActivatedPropertyTask("", "", RepositoryConstants.USER_ROLES, "/anonymous")))
161                 .addTask(new NodeExistsDelegateTask("Set mgnl:lastActivated date of the security-base role", "Set mgnl:lastActivated date of the security-base role (if not set yet)", RepositoryConstants.USER_ROLES, "/security-base",
162                         new CheckOrCreateLastActivatedPropertyTask("", "", RepositoryConstants.USER_ROLES, "/security-base")))
163                 .addTask(new FindAndChangeTemplateIdTask("Change template id mgnlDelete", "Change template id mgnlDeleted to ui-admincentral:deleted for all content marked as deleted in website repository", RepositoryConstants.WEBSITE, "mgnlDeleted", MarkNodeAsDeletedCommand.DELETED_NODE_TEMPLATE))
164                 .addTask(new FindAndChangeTemplateIdTask("Change template id adminInterface:mgnlDeleted", "Change template id adminInterface:mgnlDeleted to ui-admincentral:deleted for all content marked as deleted in website repository", RepositoryConstants.WEBSITE, "adminInterface:mgnlDeleted", MarkNodeAsDeletedCommand.DELETED_NODE_TEMPLATE)));
165         register((DeltaBuilder.update("5.1.2", ""))
166                 .addTask(new ChangeNodeTypeOfSubAppsTask("Change primary node type of subapps", "If primary node type of subapps node is set to " + NodeTypes.Content.NAME + " then change it to " + NodeTypes.ContentNode.NAME))
167                 .addTask(new PartialBootstrapTask("Anonymous user", "Change anonymous user permission. He can't have write access to himself.", "/mgnl-bootstrap/core/users.system.anonymous.xml", "/anonymous/acl_users")));
168 
169     }
170 
171     @Override
172     protected List<Task> getBasicInstallTasks(InstallContext ctx) {
173         final List<Task> tasks = new ArrayList<Task>();
174         tasks.addAll(GenericTasks.genericTasksForNewInstallation());
175         tasks.add(auditTrailManagerTask);
176         tasks.add(bootstrapFreemarker);
177         tasks.add(addFreemarkerSharedVariables);
178         tasks.add(bootstrapWebContainerResources);
179         tasks.add(new BootstrapConditionally("Security", "Bootstraps security-base role.", "/mgnl-bootstrap/core/userroles.security-base.xml"));
180         // always hash passwords. Task will not re-hash so it is safe to run this op at any time, multiple times.
181         tasks.add(new HashUsersPasswords());
182         tasks.add(bootstrapChannelManagement);
183         tasks.add(bootstrapChannelFilter);
184         tasks.add(placeChannelBeforeLogout);
185 
186         return tasks;
187     }
188 
189     @Override
190     protected List<Condition> getInstallConditions() {
191         final ArrayList<Condition> conditions = new ArrayList<Condition>();
192         final WebXmlConditionsUtil u = new WebXmlConditionsUtil(conditions);
193         u.servletIsNowWrapped("ActivationHandler");
194         u.servletIsNowWrapped("AdminTreeServlet");
195         u.servletIsNowWrapped("classpathspool");
196         u.servletIsNowWrapped("DialogServlet");
197         u.servletIsNowWrapped("PageServlet");
198         u.servletIsNowWrapped("log4j");
199         u.servletIsNowWrapped("FCKEditorSimpleUploadServlet");
200         u.servletIsDeprecated("uuidRequestDispatcher");
201         u.filterIsDeprecated("info.magnolia.cms.filters.MagnoliaManagedFilter", "info.magnolia.cms.filters.MgnlMainFilter");
202         u.filterMustBeRegisteredWithCorrectDispatchers("info.magnolia.cms.filters.MgnlMainFilter");
203         u.listenerIsDeprecated("info.magnolia.cms.servlets.PropertyInitializer", "info.magnolia.cms.servlets.MgnlServletContextListener");
204         u.listenerIsDeprecated("info.magnolia.cms.beans.config.ShutdownManager", "info.magnolia.cms.servlets.MgnlServletContextListener");
205         final WorkspaceXmlConditionsUtil u2 = new WorkspaceXmlConditionsUtil(conditions);
206         u2.textFilterClassesAreNotSet();
207 
208         conditions.add(new SystemTmpDirCondition());
209         conditions.add(new NoSameNameSiblingsCondition());
210 
211         return conditions;
212     }
213 
214     private List<Condition> get45ConfigFileConditions() {
215         List<Condition> conditions = new ArrayList<Condition>();
216 
217         final TextFileConditionsUtil u = new TextFileConditionsUtil(conditions);
218         u.addFalseConditionIfExpressionIsContained(System.getProperty("java.security.auth.login.config"), "^Jackrabbit.*");
219 
220         final WorkspaceXmlConditionsUtil u2 = new WorkspaceXmlConditionsUtil(conditions);
221         u2.textFilterClassesAreNotSet();
222         u2.paramAnalyzerIsNotSet();
223         u2.accessControlProviderIsSet();
224 
225         return conditions;
226     }
227 
228 }