You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2013/04/02 14:40:45 UTC

svn commit: r1463506 - in /syncope/trunk/core: ./ src/main/java/org/apache/syncope/core/init/ src/main/java/org/apache/syncope/core/persistence/beans/ src/main/java/org/apache/syncope/core/persistence/dao/impl/ src/main/java/org/apache/syncope/core/res...

Author: ilgrosso
Date: Tue Apr  2 12:40:45 2013
New Revision: 1463506

URL: http://svn.apache.org/r1463506
Log:
[SYNCOPE-276] Implemented feature for upgrading existing content of internal storage + authenticator with MD5 fallback

Added:
    syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java   (with props)
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java   (with props)
    syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java   (with props)
Modified:
    syncope/trunk/core/pom.xml
    syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/init/SpringContextInitializer.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/Policy.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ReportletConfInstance.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/ContentLoader.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeAuthenticationProvider.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/util/PasswordEncoder.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/ActivitiDetector.java

Modified: syncope/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/syncope/trunk/core/pom.xml?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/pom.xml (original)
+++ syncope/trunk/core/pom.xml Tue Apr  2 12:40:45 2013
@@ -1066,7 +1066,7 @@ under the License.
         <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
-          <version>5.1.23</version>
+          <version>5.1.24</version>
           <scope>test</scope>
         </dependency>
       </dependencies>

Added: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java?rev=1463506&view=auto
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java (added)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java Tue Apr  2 12:40:45 2013
@@ -0,0 +1,304 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.init;
+
+import java.lang.reflect.Field;
+import java.net.URI;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import javax.sql.DataSource;
+import org.apache.commons.lang.StringUtils;
+import org.apache.syncope.common.search.NodeCond;
+import org.apache.syncope.common.to.UserTO;
+import org.apache.syncope.common.types.AbstractPolicySpec;
+import org.apache.syncope.common.types.CipherAlgorithm;
+import org.apache.syncope.common.types.ConnConfProperty;
+import org.apache.syncope.core.persistence.beans.ConnInstance;
+import org.apache.syncope.core.persistence.beans.ExternalResource;
+import org.apache.syncope.core.persistence.beans.Notification;
+import org.apache.syncope.core.persistence.beans.Policy;
+import org.apache.syncope.core.persistence.beans.SyncTask;
+import org.apache.syncope.core.persistence.beans.SyncopeConf;
+import org.apache.syncope.core.persistence.beans.UserRequest;
+import org.apache.syncope.core.persistence.dao.ConfDAO;
+import org.apache.syncope.core.persistence.dao.ConnInstanceDAO;
+import org.apache.syncope.core.persistence.dao.NotificationDAO;
+import org.apache.syncope.core.persistence.dao.PolicyDAO;
+import org.apache.syncope.core.persistence.dao.ResourceDAO;
+import org.apache.syncope.core.persistence.dao.TaskDAO;
+import org.apache.syncope.core.persistence.dao.UserRequestDAO;
+import org.apache.syncope.core.persistence.dao.impl.AbstractContentDealer;
+import org.apache.syncope.core.util.ConnIdBundleManager;
+import org.apache.syncope.core.util.XMLSerializer;
+import org.apache.syncope.core.workflow.ActivitiDetector;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ReflectionUtils;
+
+/**
+ * Upgrade internal storage content according to format expected by this Syncope release.
+ */
+@Component
+public class ContentUpgrader extends AbstractContentDealer {
+
+    @Autowired
+    private DataSource dataSource;
+
+    @Autowired
+    private ConfDAO confDAO;
+
+    @Autowired
+    private ConnInstanceDAO connInstanceDAO;
+
+    @Autowired
+    private ResourceDAO resourceDAO;
+
+    @Autowired
+    private PolicyDAO policyDAO;
+
+    @Autowired
+    private NotificationDAO notificationDAO;
+
+    @Autowired
+    private TaskDAO taskDAO;
+
+    @Autowired
+    private UserRequestDAO userRequestDAO;
+
+    private void upgradeActiviti() {
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
+
+        List<Map<String, Object>> byteArrays =
+                jdbcTemplate.queryForList("SELECT ID_, BYTES_ FROM ACT_GE_BYTEARRAY");
+        for (Map<String, Object> row : byteArrays) {
+            byte[] updated = new String((byte[]) row.get("BYTES_")).replaceAll(
+                    "org\\.apache.syncope\\.core\\.workflow\\.activiti\\.",
+                    "org.apache.syncope.core.workflow.user.activiti.task.").
+                    replaceAll("org\\.apache\\.syncope\\.client\\.to\\.",
+                    "org.apache.syncope.common.to").
+                    replaceAll("org\\.apache\\.syncope\\.types\\.",
+                    "org.apache.syncope.common.types").
+                    replaceAll("org/apache/syncope/types/",
+                    "org/apache/syncope/common/types/").
+                    getBytes();
+            jdbcTemplate.update("UPDATE ACT_GE_BYTEARRAY SET BYTES_=? WHERE ID_=?",
+                    new Object[] {updated, row.get("ID_")});
+        }
+    }
+
+    private String upgradeSyncopeConf() {
+        confDAO.delete("connid.bundles.directory");
+
+        URI localConnIdLocation = null;
+        for (URI location : ConnIdBundleManager.getConnManagers().keySet()) {
+            if ("file".equals(location.getScheme())) {
+                localConnIdLocation = location;
+            }
+        }
+        if (localConnIdLocation == null) {
+            throw new IllegalArgumentException("No local ConnId location was found, aborting");
+        }
+
+        SyncopeConf cipher = confDAO.find("password.cipher.algorithm");
+        if ("MD5".equals(cipher.getValue())) {
+            cipher.setValue(CipherAlgorithm.SMD5.name());
+        }
+
+        return localConnIdLocation.toString();
+    }
+
+    private void upgradeConnInstance(final String localConnIdLocation) {
+        Field xmlConfiguration = ReflectionUtils.findField(ConnInstance.class, "xmlConfiguration");
+        xmlConfiguration.setAccessible(true);
+        for (ConnInstance connInstance : connInstanceDAO.findAll()) {
+            connInstance.setLocation(localConnIdLocation);
+
+            try {
+                String oldConf = (String) xmlConfiguration.get(connInstance);
+                connInstance.setConfiguration(
+                        XMLSerializer.<HashSet<ConnConfProperty>>deserialize(
+                        oldConf.replaceAll("org\\.apache\\.syncope\\.types\\.ConnConfProperty",
+                        ConnConfProperty.class.getName())));
+            } catch (Exception e) {
+                LOG.error("While upgrading {}", connInstance, e);
+            }
+        }
+    }
+
+    private void upgradeExternalResource() {
+        Field xmlConfiguration = ReflectionUtils.findField(ExternalResource.class, "xmlConfiguration");
+        xmlConfiguration.setAccessible(true);
+        for (ExternalResource resource : resourceDAO.findAll()) {
+            try {
+                String oldConf = (String) xmlConfiguration.get(resource);
+                if (StringUtils.isNotBlank(oldConf)) {
+                    resource.setConnInstanceConfiguration(
+                            XMLSerializer.<HashSet<ConnConfProperty>>deserialize(
+                            oldConf.replaceAll("org\\.apache\\.syncope\\.types\\.ConnConfProperty",
+                            ConnConfProperty.class.getName())));
+                }
+            } catch (Exception e) {
+                LOG.error("While upgrading {}", resource, e);
+            }
+        }
+    }
+
+    private void upgradePolicy() {
+        Field specification = ReflectionUtils.findField(Policy.class, "specification");
+        specification.setAccessible(true);
+        for (Policy policy : policyDAO.findAll()) {
+            try {
+                String oldConf = (String) specification.get(policy);
+                policy.setSpecification(
+                        XMLSerializer.<AbstractPolicySpec>deserialize(
+                        oldConf.replaceAll("org\\.apache\\.syncope\\.types\\.",
+                        "org.apache.syncope.common.types.").
+                        replaceAll("alternativeSearchAttrs", "uAltSearchSchemas")));
+            } catch (Exception e) {
+                LOG.error("While upgrading {}", policy, e);
+            }
+        }
+    }
+
+    private void upgradeNotification() {
+        Field xmlAbout = ReflectionUtils.findField(Notification.class, "xmlAbout");
+        xmlAbout.setAccessible(true);
+        Field xmlRecipients = ReflectionUtils.findField(Notification.class, "xmlRecipients");
+        xmlRecipients.setAccessible(true);
+        for (Notification notification : notificationDAO.findAll()) {
+            try {
+                String oldAbout = (String) xmlAbout.get(notification);
+                if (oldAbout != null) {
+                    notification.setAbout(
+                            XMLSerializer.<NodeCond>deserialize(
+                            oldAbout.replaceAll("org\\.apache\\.syncope\\.client\\.search\\.",
+                            "org.apache.syncope.common.search.")));
+                }
+                String oldRecipients = (String) xmlRecipients.get(notification);
+                if (oldRecipients != null) {
+                    notification.setRecipients(
+                            XMLSerializer.<NodeCond>deserialize(
+                            oldRecipients.replaceAll("org\\.apache\\.syncope\\.client\\.search\\.",
+                            "org.apache.syncope.common.search.")));
+                }
+            } catch (Exception e) {
+                LOG.error("While upgrading {}", notification, e);
+            }
+        }
+    }
+
+    private void upgradeSyncTask() {
+        Field userTemplate = ReflectionUtils.findField(SyncTask.class, "userTemplate");
+        userTemplate.setAccessible(true);
+        for (SyncTask task : taskDAO.findAll(SyncTask.class)) {
+            try {
+                String oldUserTemplate = (String) userTemplate.get(task);
+                if (oldUserTemplate != null) {
+                    task.setUserTemplate(
+                            XMLSerializer.<UserTO>deserialize(
+                            oldUserTemplate.replaceAll("org\\.apache\\.syncope\\.client\\.to\\.",
+                            "org.apache.syncope.common.to.").
+                            replaceAll("propagationTOs",
+                            "propagationStatusTOs")));
+                }
+            } catch (Exception e) {
+                LOG.error("While upgrading {}", task, e);
+            }
+        }
+    }
+
+    private void upgradeReportletConf() {
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
+
+        List<Map<String, Object>> rcInstances =
+                jdbcTemplate.queryForList("SELECT id, serializedInstance FROM ReportletConfInstance");
+        for (Map<String, Object> row : rcInstances) {
+            String updated = ((String) row.get("serializedInstance")).
+                    replaceAll("org\\.apache\\.syncope\\.client\\.report\\.",
+                    "org.apache.syncope.common.report.");
+            jdbcTemplate.update("UPDATE ReportletConfInstance SET serializedInstance=? WHERE id=?",
+                    new Object[] {updated, row.get("id")});
+        }
+    }
+
+    private void upgradeUserRequest() {
+        Field payload = ReflectionUtils.findField(UserRequest.class, "payload");
+        payload.setAccessible(true);
+        for (UserRequest request : userRequestDAO.findAll()) {
+            try {
+                String oldPayload = (String) payload.get(request);
+                if (oldPayload != null) {
+                    payload.set(request,
+                            oldPayload.replaceAll("org\\.apache\\.syncope\\.client\\.to\\.",
+                            "org.apache.syncope.common.to.").
+                            replaceAll("org\\.apache\\.syncope\\.client\\.mod\\.",
+                            "org.apache.syncope.common.mod."));
+                }
+            } catch (Exception e) {
+                LOG.error("While upgrading {}", request, e);
+            }
+        }
+    }
+
+    @Transactional
+    public void upgrade() {
+        if (ActivitiDetector.isActivitiEnabledForUsers()) {
+            upgradeActiviti();
+        }
+
+        final String localConnIdLocation = upgradeSyncopeConf();
+
+        upgradeConnInstance(localConnIdLocation);
+
+        upgradeExternalResource();
+
+        upgradePolicy();
+
+        upgradeNotification();
+
+        upgradeSyncTask();
+
+        upgradeReportletConf();
+
+        upgradeUserRequest();
+
+        Connection conn = DataSourceUtils.getConnection(dataSource);
+        try {
+            createIndexes(conn);
+            createViews(conn);
+        } finally {
+            DataSourceUtils.releaseConnection(conn, dataSource);
+            if (conn != null) {
+                try {
+                    if (!conn.isClosed()) {
+                        conn.close();
+                    }
+                } catch (SQLException e) {
+                    LOG.error("While releasing connection", e);
+                }
+            }
+        }
+    }
+}

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ContentUpgrader.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java Tue Apr  2 12:40:45 2013
@@ -212,11 +212,10 @@ public class JobInstanceLoader {
         unregisterJob(getJobName(report));
     }
 
-    @SuppressWarnings("unchecked")
     @Transactional
     public void load() {
         // 1. jobs for SchedTasks
-        Set<SchedTask> tasks = new HashSet(taskDAO.findAll(SchedTask.class));
+        Set<SchedTask> tasks = new HashSet<SchedTask>(taskDAO.findAll(SchedTask.class));
         tasks.addAll(taskDAO.findAll(SyncTask.class));
         for (SchedTask task : tasks) {
             try {

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/SpringContextInitializer.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/SpringContextInitializer.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/SpringContextInitializer.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/SpringContextInitializer.java Tue Apr  2 12:40:45 2013
@@ -22,15 +22,20 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.propagation.ConnectorFactory;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Configurable;
 import org.springframework.stereotype.Component;
 
 /**
  * Take care of all initializations needed by Syncope to run up and safe.
  */
 @Component
+@Configurable
 public class SpringContextInitializer implements InitializingBean {
 
     @Autowired
+    private ContentUpgrader contentUpgrader;
+
+    @Autowired
     private ConnectorFactory connFactory;
 
     @Autowired
@@ -48,8 +53,18 @@ public class SpringContextInitializer im
     @Autowired
     private WorkflowAdapterLoader workflowAdapterLoader;
 
+    private boolean upgrade = false;
+
+    public void setUpgrade(final boolean upgrade) {
+        this.upgrade = upgrade;
+    }
+
     @Override
     public void afterPropertiesSet() throws Exception {
+        if (upgrade) {
+            contentUpgrader.upgrade();
+        }
+
         workflowAdapterLoader.load();
         contentLoader.load();
         connFactory.load();

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java Tue Apr  2 12:40:45 2013
@@ -312,25 +312,22 @@ public class ExternalResource extends Ab
         this.syncPolicy = syncPolicy;
     }
 
-    public void setConnectorConfigurationProperties(final Set<ConnConfProperty> properties) {
-        // create new set to make sure it's a serializable set implementation.
-        xmlConfiguration = XMLSerializer.serialize(new HashSet<ConnConfProperty>(properties));
-    }
-
-    public Set<ConnConfProperty> getConfiguration() {
-        Set<ConnConfProperty> result = Collections.emptySet();
-
-        Set<ConnConfProperty> deserializedSet;
+    public Set<ConnConfProperty> getConnInstanceConfiguration() {
+        Set<ConnConfProperty> result = null;
         if (StringUtils.isNotBlank(xmlConfiguration)) {
-            deserializedSet = XMLSerializer.<HashSet<ConnConfProperty>>deserialize(xmlConfiguration);
-            if (deserializedSet != null) {
-                result = deserializedSet;
-            }
+            result = XMLSerializer.<HashSet<ConnConfProperty>>deserialize(xmlConfiguration);
+        }
+        if (result == null) {
+            result = Collections.emptySet();
         }
 
         return result;
     }
 
+    public void setConnInstanceConfiguration(final Set<ConnConfProperty> properties) {
+        xmlConfiguration = XMLSerializer.serialize(new HashSet<ConnConfProperty>(properties));
+    }
+
     public String getUserializedSyncToken() {
         return userializedSyncToken;
     }
@@ -346,7 +343,7 @@ public class ExternalResource extends Ab
     }
 
     public void setUsyncToken(final SyncToken syncToken) {
-        userializedSyncToken = XMLSerializer.serialize(syncToken);
+        this.userializedSyncToken = XMLSerializer.serialize(syncToken);
     }
 
     public String getRserializedSyncToken() {
@@ -364,7 +361,7 @@ public class ExternalResource extends Ab
     }
 
     public void setRsyncToken(final SyncToken syncToken) {
-        rserializedSyncToken = XMLSerializer.serialize(syncToken);
+        this.rserializedSyncToken = XMLSerializer.serialize(syncToken);
     }
 
     public String getPropagationActionsClassName() {

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/Policy.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/Policy.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/Policy.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/Policy.java Tue Apr  2 12:40:45 2013
@@ -69,6 +69,6 @@ public abstract class Policy extends Abs
     }
 
     public <T extends AbstractPolicySpec> void setSpecification(final T policy) {
-        specification = XMLSerializer.serialize(policy);
+        this.specification = XMLSerializer.serialize(policy);
     }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ReportletConfInstance.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ReportletConfInstance.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ReportletConfInstance.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ReportletConfInstance.java Tue Apr  2 12:40:45 2013
@@ -59,7 +59,7 @@ public class ReportletConfInstance exten
     }
 
     public void setInstance(final ReportletConf instance) {
-        serializedInstance = instance == null
+        this.serializedInstance = instance == null
                 ? null
                 : XMLSerializer.serialize(instance);
     }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java Tue Apr  2 12:40:45 2013
@@ -84,7 +84,8 @@ public class SyncTask extends SchedTask 
     }
 
     @Override
-    public void setJobClassName(String jobClassName) {
+    public void setJobClassName(final String jobClassName) {
+        // fixed to SyncJob, cannot be changed
     }
 
     public ExternalResource getResource() {

Added: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java?rev=1463506&view=auto
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java (added)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java Tue Apr  2 12:40:45 2013
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.persistence.dao.impl;
+
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.Properties;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractContentDealer {
+
+    protected static final Logger LOG = LoggerFactory.getLogger(AbstractContentDealer.class);
+
+    private static final String VIEWS_FILE = "/views.xml";
+
+    private static final String INDEXES_FILE = "/indexes.xml";
+
+    protected void createIndexes(final Connection conn) {
+        LOG.debug("Creating indexes");
+
+        InputStream indexesStream = null;
+        Properties indexes = new Properties();
+        try {
+            indexesStream = getClass().getResourceAsStream(INDEXES_FILE);
+            indexes.loadFromXML(indexesStream);
+        } catch (Exception e) {
+            throw new RuntimeException("Error loading properties from stream", e);
+        } finally {
+            IOUtils.closeQuietly(indexesStream);
+        }
+
+        for (String idx : indexes.stringPropertyNames()) {
+            LOG.debug("Creating index {}", indexes.get(idx).toString());
+            PreparedStatement statement = null;
+            try {
+                final String updateIndexed = indexes.get(idx).toString();
+                statement = conn.prepareStatement(updateIndexed);
+                statement.executeUpdate();
+            } catch (SQLException e) {
+                LOG.error("Could not create index ", e);
+            } finally {
+                closeStatement(statement);
+            }
+        }
+    }
+
+    protected void createViews(final Connection conn) {
+        LOG.debug("Creating views");
+        InputStream viewsStream = null;
+        try {
+            viewsStream = getClass().getResourceAsStream(VIEWS_FILE);
+            Properties views = new Properties();
+            views.loadFromXML(viewsStream);
+
+            for (String idx : views.stringPropertyNames()) {
+                LOG.debug("Creating view {}", views.get(idx).toString());
+                PreparedStatement statement = null;
+                try {
+                    final String updateViews = views.get(idx).toString().replaceAll("\\n", " ");
+                    statement = conn.prepareStatement(updateViews);
+                    statement.executeUpdate();
+                } catch (SQLException e) {
+                    LOG.error("Could not create view ", e);
+                } finally {
+                    if (statement != null) {
+                        statement.close();
+                    }
+                }
+            }
+
+            LOG.debug("Views created, go for indexes");
+        } catch (Exception e) {
+            LOG.error("While creating views", e);
+        } finally {
+            IOUtils.closeQuietly(viewsStream);
+        }
+    }
+
+    protected void closeStatement(final PreparedStatement statement) {
+        if (statement != null) {
+            try {
+                statement.close();
+            } catch (SQLException e) {
+                LOG.error("Error closing SQL statement", e);
+            }
+        }
+    }
+}

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractContentDealer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/ContentLoader.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/ContentLoader.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/ContentLoader.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/ContentLoader.java Tue Apr  2 12:40:45 2013
@@ -23,15 +23,12 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Properties;
 import javax.sql.DataSource;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import org.apache.commons.io.IOUtils;
 import org.apache.syncope.core.persistence.beans.SyncopeConf;
 import org.apache.syncope.core.util.ImportExport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.datasource.DataSourceUtils;
 import org.springframework.stereotype.Component;
@@ -41,13 +38,7 @@ import org.springframework.transaction.a
  * Initialize Database with default content if no data is present already.
  */
 @Component
-public class ContentLoader {
-
-    private static final String VIEWS_FILE = "/views.xml";
-
-    private static final String INDEXES_FILE = "/indexes.xml";
-
-    private static final Logger LOG = LoggerFactory.getLogger(ContentLoader.class);
+public class ContentLoader extends AbstractContentDealer {
 
     @Autowired
     private DataSource dataSource;
@@ -111,67 +102,6 @@ public class ContentLoader {
         }
     }
 
-    private void createViews(final Connection conn) {
-        LOG.debug("Creating views");
-        InputStream viewsStream = null;
-        try {
-            viewsStream = getClass().getResourceAsStream(VIEWS_FILE);
-            Properties views = new Properties();
-            views.loadFromXML(viewsStream);
-
-            for (String idx : views.stringPropertyNames()) {
-                LOG.debug("Creating view {}", views.get(idx).toString());
-                PreparedStatement statement = null;
-                try {
-                    final String updateViews = views.get(idx).toString().replaceAll("\\n", " ");
-                    statement = conn.prepareStatement(updateViews);
-                    statement.executeUpdate();
-                } catch (SQLException e) {
-                    LOG.error("Could not create view ", e);
-                } finally {
-                    if (statement != null) {
-                        statement.close();
-                    }
-                }
-            }
-
-            LOG.debug("Views created, go for indexes");
-        } catch (Exception e) {
-            LOG.error("While creating views", e);
-        } finally {
-            IOUtils.closeQuietly(viewsStream);
-        }
-    }
-
-    private void createIndexes(final Connection conn) {
-        LOG.debug("Creating indexes");
-
-        InputStream indexesStream = null;
-        Properties indexes = new Properties();
-        try {
-            indexesStream = getClass().getResourceAsStream(INDEXES_FILE);
-            indexes.loadFromXML(indexesStream);
-        } catch (Exception e) {
-            throw new RuntimeException("Error loading properties from stream", e);
-        } finally {
-            IOUtils.closeQuietly(indexesStream);
-        }
-
-        for (String idx : indexes.stringPropertyNames()) {
-            LOG.debug("Creating index {}", indexes.get(idx).toString());
-            PreparedStatement statement = null;
-            try {
-                final String updateIndexed = indexes.get(idx).toString();
-                statement = conn.prepareStatement(updateIndexed);
-                statement.executeUpdate();
-            } catch (SQLException e) {
-                LOG.error("Could not create index ", e);
-            } finally {
-                closeStatement(statement);
-            }
-        }
-    }
-
     private void loadDefaultContent() {
         SAXParserFactory factory = SAXParserFactory.newInstance();
         InputStream in = null;
@@ -187,14 +117,4 @@ public class ContentLoader {
             IOUtils.closeQuietly(in);
         }
     }
-
-    private void closeStatement(final PreparedStatement statement) {
-        if (statement != null) {
-            try {
-                statement.close();
-            } catch (SQLException e) {
-                LOG.error("Error closing SQL statement", e);
-            }
-        }
-    }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java Tue Apr  2 12:40:45 2013
@@ -132,7 +132,7 @@ public class ResourceDataBinder {
         resource.setSyncPolicy(resourceTO.getSyncPolicy() == null
                 ? null : (SyncPolicy) policyDAO.find(resourceTO.getSyncPolicy()));
 
-        resource.setConnectorConfigurationProperties(new HashSet<ConnConfProperty>(resourceTO.getConnConfProperties()));
+        resource.setConnInstanceConfiguration(new HashSet<ConnConfProperty>(resourceTO.getConnConfProperties()));
 
         if (resourceTO.getUsyncToken() == null) {
             resource.setUserializedSyncToken(null);
@@ -223,7 +223,7 @@ public class ResourceDataBinder {
     public ConnInstance getConnInstance(final ExternalResource resource) {
         final ConnInstance connInstanceClone = (ConnInstance) SerializationUtils.clone(resource.getConnector());
 
-        return getConnInstance(connInstanceClone, resource.getConfiguration());
+        return getConnInstance(connInstanceClone, resource.getConnInstanceConfiguration());
     }
 
     public ConnInstance getConnInstance(final ResourceTO resourceTO) {
@@ -326,7 +326,7 @@ public class ResourceDataBinder {
         resourceTO.setSyncPolicy(resource.getSyncPolicy() == null
                 ? null : resource.getSyncPolicy().getId());
 
-        resourceTO.setConnectorConfigurationProperties(resource.getConfiguration());
+        resourceTO.setConnectorConfigurationProperties(resource.getConnInstanceConfiguration());
 
         resourceTO.setUsyncToken(resource.getUserializedSyncToken());
         resourceTO.setRsyncToken(resource.getRserializedSyncToken());

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeAuthenticationProvider.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeAuthenticationProvider.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeAuthenticationProvider.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeAuthenticationProvider.java Tue Apr  2 12:40:45 2013
@@ -45,7 +45,7 @@ public class SyncopeAuthenticationProvid
     /**
      * Logger.
      */
-    private static final Logger LOG = LoggerFactory.getLogger(SyncopeAuthenticationProvider.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(SyncopeAuthenticationProvider.class);
 
     @Autowired
     private AuditManager auditManager;
@@ -115,7 +115,7 @@ public class SyncopeAuthenticationProvid
 
         String username = authentication.getName();
         if (adminUser.equals(username)) {
-            authenticated = PasswordEncoder.verify(
+            authenticated = authenticate(
                     authentication.getCredentials().toString(),
                     CipherAlgorithm.valueOf(adminPasswordAlgorithm),
                     adminPassword);
@@ -126,7 +126,7 @@ public class SyncopeAuthenticationProvid
                 if (user.isSuspended()) {
                     throw new DisabledException("User " + user.getUsername() + " is suspended");
                 }
-                authenticated = PasswordEncoder.verify(
+                authenticated = authenticate(
                         authentication.getCredentials().toString(),
                         user.getCipherAlgorithm(),
                         user.getPassword());
@@ -171,6 +171,12 @@ public class SyncopeAuthenticationProvid
         return token;
     }
 
+    protected boolean authenticate(final String password, final CipherAlgorithm cipherAlgorithm,
+            final String digestedPassword) {
+
+        return PasswordEncoder.verify(password, cipherAlgorithm, digestedPassword);
+    }
+
     @Override
     public boolean supports(final Class<? extends Object> type) {
         return type.equals(UsernamePasswordAuthenticationToken.class);

Added: syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java?rev=1463506&view=auto
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java (added)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java Tue Apr  2 12:40:45 2013
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.security;
+
+import org.apache.syncope.common.types.CipherAlgorithm;
+import org.jasypt.commons.CommonUtils;
+import org.jasypt.digest.StandardStringDigester;
+
+/**
+ * Extend standard authentication by checking passwords using MD5 (not supported anymore as per SYNCOPE-51).
+ */
+public class SyncopeMD5FallbackAuthenticationProvider extends SyncopeAuthenticationProvider {
+
+    @Override
+    protected boolean authenticate(final String password, final CipherAlgorithm cipherAlgorithm,
+            final String digestedPassword) {
+
+        boolean authenticated = super.authenticate(password, cipherAlgorithm, digestedPassword);
+        // if "normal" authentication fails and cipher is SMD5, we're probably handling an "old" MD5 password
+        if (!authenticated && CipherAlgorithm.SMD5 == cipherAlgorithm) {
+            StandardStringDigester digester = new StandardStringDigester();
+            digester.setAlgorithm("MD5");
+            digester.setIterations(1);
+            digester.setSaltSizeBytes(0);
+            digester.setStringOutputType(CommonUtils.STRING_OUTPUT_TYPE_HEXADECIMAL);
+
+            authenticated = digester.matches(password, digestedPassword);
+        }
+        return authenticated;
+    }
+}

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: syncope/trunk/core/src/main/java/org/apache/syncope/core/security/SyncopeMD5FallbackAuthenticationProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/util/PasswordEncoder.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/util/PasswordEncoder.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/util/PasswordEncoder.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/util/PasswordEncoder.java Tue Apr  2 12:40:45 2013
@@ -31,6 +31,7 @@ import javax.crypto.NoSuchPaddingExcepti
 import javax.crypto.spec.SecretKeySpec;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.syncope.common.types.CipherAlgorithm;
+import org.jasypt.commons.CommonUtils;
 import org.jasypt.digest.StandardStringDigester;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -163,7 +164,7 @@ public final class PasswordEncoder {
             digester.setSaltSizeBytes(0);
         }
 
-        digester.setStringOutputType("hexadecimal");
+        digester.setStringOutputType(CommonUtils.STRING_OUTPUT_TYPE_HEXADECIMAL);
         return digester;
     }
 

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/ActivitiDetector.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/ActivitiDetector.java?rev=1463506&r1=1463505&r2=1463506&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/ActivitiDetector.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/ActivitiDetector.java Tue Apr  2 12:40:45 2013
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.workflow;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 import org.apache.commons.io.IOUtils;
@@ -31,7 +30,7 @@ public class ActivitiDetector {
 
     private static final Logger LOG = LoggerFactory.getLogger(ActivitiDetector.class);
 
-    private static final String XX = "/workflow.properties";
+    private static final String WORKFLOW_PROPERTIES = "/workflow.properties";
 
     private static String uwfAdapterClassName;
 
@@ -39,24 +38,14 @@ public class ActivitiDetector {
 
     private static String activitiVersion;
 
-    static {
-        try {
-            init();
-        } catch (IOException e) {
-            LOG.error("Could not read from {}", XX, e);
-        }
-    }
-
     /**
      * Read classpath:/workflow.properties in order to determine the configured workflow adapter class name.
-     *
-     * @throws IOException if anything goes wrong
      */
-    private static void init() throws IOException {
-        Properties props = new java.util.Properties();
+    static {
+        Properties props = new Properties();
         InputStream propStream = null;
         try {
-            propStream = ContentLoader.class.getResourceAsStream(XX);
+            propStream = ContentLoader.class.getResourceAsStream(WORKFLOW_PROPERTIES);
             props.load(propStream);
             uwfAdapterClassName = props.getProperty("uwfAdapter");
             rwfAdapterClassName = props.getProperty("rwfAdapter");