diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml index ece34a4f5c..69668b63c4 100644 --- a/config/alfresco/bootstrap-context.xml +++ b/config/alfresco/bootstrap-context.xml @@ -409,6 +409,15 @@ + + + + + + false + + + diff --git a/config/alfresco/content-services-context.xml b/config/alfresco/content-services-context.xml index 8a6d7c982d..127cda5071 100644 --- a/config/alfresco/content-services-context.xml +++ b/config/alfresco/content-services-context.xml @@ -121,14 +121,6 @@ - - - - - - false - - diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 2a9a35f464..0fc7ce3680 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -1365,9 +1365,6 @@ - - - - + diff --git a/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java b/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java index e491d0b97d..adc28501e3 100644 --- a/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java +++ b/source/java/org/alfresco/filesys/smb/server/SMBSrvPacket.java @@ -266,6 +266,25 @@ public class SMBSrvPacket return false; } + /** + * Check if the SMB packet has an SMB2 signature. + * + * @return boolean True if the packet has an SMB2 signature, else false. + */ + public final boolean isSMB2() + { + + // Check for the SMB2 signature block + + if (m_smbbuf[SIGNATURE] == (byte) 0xFE && m_smbbuf[SIGNATURE + 1] == 'S' && m_smbbuf[SIGNATURE + 2] == 'M' + && m_smbbuf[SIGNATURE + 3] == 'B') + return true; + + // Not an SMB2 packet + + return false; + } + /** * Clear the data byte count */ diff --git a/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java b/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java index 60428451aa..53aa5a6cbd 100644 --- a/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java +++ b/source/java/org/alfresco/filesys/smb/server/SMBSrvSession.java @@ -1321,6 +1321,35 @@ public class SMBSrvSession extends SrvSession implements Runnable continue; } + // Check the packet signature if we are in an SMB state + + if ( m_state > SMBSrvSessionState.NBSESSREQ) + { + // Check for an SMB2 packet signature + + if ( m_smbPkt.isSMB2()) + { + // Debug + + if ( logger.isDebugEnabled() && hasDebug(DBG_PKTTYPE)) + logger.debug("SMB2 request received, ignoring"); + + continue; + } + + // Check the packet signature + + if ( m_smbPkt.checkPacketSignature() == false) + { + // Debug + + if ( logger.isDebugEnabled() && hasDebug(DBG_PKTTYPE)) + logger.debug("Invalid SMB packet signature received, packet ignored"); + + continue; + } + } + // Store the received data length m_smbPkt.setReceivedLength(m_rxlen); diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 7be35373f7..5e89be0eab 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -1616,7 +1616,7 @@ public class AVMRepository { throw new AVMNotFoundException("Store not found."); } - Lookup lookup = store.lookup(version, pathParts[1], false, false); + Lookup lookup = store.lookup(version, pathParts[1], false, true); if (lookup == null) { throw new AVMNotFoundException("Path not found."); diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 2e37892c83..be342a431a 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -101,6 +101,34 @@ import org.alfresco.util.Pair; */ public class AVMServiceTest extends AVMServiceTestBase { + public void testHeadPathsInLayers() + { + try + { + setupBasicTree(); + fService.createStore("user"); + fService.createLayeredDirectory("main:/a", "user:/", "a"); + fService.createStore("sandbox"); + fService.createLayeredDirectory("main:/a", "sandbox:/", "a"); + fService.createDirectory("user:/a/b", "newdir"); + fService.createFile("user:/a/b/newdir", "bibble.txt").close(); + List diffs = fSyncService.compare(-1, "user:/a", -1, "sandbox:/a", null); + System.out.println(diffs); + fSyncService.update(diffs, null, false, false, false, false, null, null); + AVMNodeDescriptor dir = fService.lookup(-1, "user:/a/b/newdir"); + List> paths = fService.getHeadPaths(dir); + System.out.println(paths); + AVMNodeDescriptor file = fService.lookup(-1, "user:/a/b/newdir/bibble.txt"); + paths = fService.getHeadPaths(file); + System.out.println(paths); + } + catch (Exception e) + { + e.printStackTrace(); + fail(); + } + } + /** * Minimal testing of Locking Aware service. */ diff --git a/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java b/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java index 184c0f5ab1..e5a52366ff 100644 --- a/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java +++ b/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java @@ -154,17 +154,28 @@ public class AVMSubmitPackageHandler private void recursivelyRemoveLocks(final String webProject, final int version, final String path) { LOGGER.debug("removing lock on " + path); - final AVMNodeDescriptor desc = fAVMService.lookup(version, path, true); + AVMNodeDescriptor desc = fAVMService.lookup(version, path, true); if (desc.isFile() || desc.isDeletedFile()) { fAVMLockingService.removeLock(webProject, path.substring(path.indexOf(":") + 1)); } - else + else { - for (final AVMNodeDescriptor child : fAVMService.getDirectoryListingArray(version, path, true)) - { - this.recursivelyRemoveLocks(webProject, version, child.getPath()); - } + if (desc.isDeletedDirectory()) + { + // lookup the previous child and get its contents + final List history = fAVMService.getHistory(desc, 2); + if (history.size() == 1) + { + return; + } + desc = history.get(1); + } + + for (final AVMNodeDescriptor child : fAVMService.getDirectoryListingArray(desc.getVersionID(), desc.getPath(), true)) + { + this.recursivelyRemoveLocks(webProject, child.getVersionID(), child.getPath()); + } } } } diff --git a/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java index c47b872852..e0e10b65c4 100644 --- a/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java +++ b/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java @@ -210,7 +210,7 @@ public class AVMFullIndexRecoveryComponent extends AbstractReindexComponent return null; } }; - transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true); + transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true, true); // done } diff --git a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java index f4b725127d..da09492a73 100644 --- a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java +++ b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java @@ -277,7 +277,7 @@ public class FullIndexRecoveryComponent extends AbstractReindexComponent return null; } }; - transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true); + transactionService.getRetryingTransactionHelper().doInTransaction(reindexWork, true, true); // done } } \ No newline at end of file diff --git a/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java b/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java index 5797358c30..62a0f3fedd 100644 --- a/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java +++ b/source/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java @@ -27,6 +27,7 @@ package org.alfresco.repo.transaction; import java.sql.BatchUpdateException; import java.util.Random; +import javax.transaction.RollbackException; import javax.transaction.Status; import javax.transaction.SystemException; import javax.transaction.UserTransaction; @@ -297,8 +298,16 @@ public class RetryingTransactionHelper throw new AlfrescoRuntimeException("Failure during rollback: " + cb, e1); } } - lastException = (e instanceof RuntimeException) ? - (RuntimeException)e : new AlfrescoRuntimeException("Unknown Exception in Transaction.", e); + if (e instanceof RollbackException) + { + lastException = (e.getCause() instanceof RuntimeException) ? + (RuntimeException)e.getCause() : new AlfrescoRuntimeException("Exception in Transaction.", e.getCause()); + } + else + { + lastException = (e instanceof RuntimeException) ? + (RuntimeException)e : new AlfrescoRuntimeException("Exception in Transaction.", e); + } // Check if there is a cause for retrying Throwable retryCause = extractRetryCause(e); if (retryCause != null) diff --git a/source/java/org/alfresco/util/OpenOfficeConnectionTester.java b/source/java/org/alfresco/util/OpenOfficeConnectionTester.java index c20b2d4bba..65a57b15e3 100644 --- a/source/java/org/alfresco/util/OpenOfficeConnectionTester.java +++ b/source/java/org/alfresco/util/OpenOfficeConnectionTester.java @@ -32,15 +32,15 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.i18n.I18NUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.context.ApplicationEvent; /** - * Simple class that checks for the presence of a valid OpenOffice - * connection, as provided by the + * A bootstrap class that checks for the presence of a valid OpenOffice connection, as provided by the * net.sf.jooreports.openoffice.connection.OpenOfficeConnection implementations. * * @author Derek Hulley */ -public class OpenOfficeConnectionTester +public class OpenOfficeConnectionTester extends AbstractLifecycleBean { private static final String INFO_CONNECTION_VERIFIED = "system.openoffice.info.connection_verified"; private static final String ERR_CONNECTION_FAILED = "system.openoffice.err.connection_failed"; @@ -73,12 +73,29 @@ public class OpenOfficeConnectionTester this.strict = strict; } + /** + * @see #checkConnection() + */ + @Override + protected void onBootstrap(ApplicationEvent event) + { + checkConnection(); + } + + /** + * Does nothing. + */ + @Override + protected void onShutdown(ApplicationEvent event) + { + } + /** * Perform the actual connection check. If this component is {@link #setStrict(boolean) strict}, * then a disconnected {@link #setConnection(OpenOfficeConnection) connection} will result in a * runtime exception being generated. */ - public synchronized void checkConnection() + private synchronized void checkConnection() { PropertyCheck.mandatory(this, "connection", connection); String connectedMessage = I18NUtil.getMessage(INFO_CONNECTION_VERIFIED);