mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-30 18:15:39 +00:00
36604: ALF-13745: Merged V3.4-BUG-FIX (3.4.10) to V4.0-BUG-FIX (4.0.3) 36602: ALF-13667 Additional OpenOffice mimetypes to be added to the mime-type maps - xls to pdf limit had been commented out - failover.transformer.PdfRenderer.PdfToImage and failover.transformer.PdfBox.PdfToImage should not have been been registered. Introduced an unregisteredBaseContentTransformer. In the case of these two transforms this would not have been a problem, as they were disable anyway due to EXPLICIT setting elsewhere. 36608: First part of ALF-14209 SOLR - does not support query for all stores - dynamic SOLR cores to track a store - NEW, DELETE, and change properties and reload 36635: ALF-13404 for documentlibrary-v2 APIs 36669: Fix issue with rendering multi-valued properties in JSON from server-side JS (from DaveD) 36676: Fix for ALF-14216 Solr Exception when you try to sort folders or files by size. 36692: Fix ALF-12966 - Comments doesn't work on iOS Safari. Anywhere TinyMCE is present does not work correctly e.g. comments, blogs, wiki, HTML content creation. 36693: ALF-14138: Prevent default Surf CMIS content WebScript clashing with Alfreco version (updated Surf libs r1081) 36714: ALF-14224: WorkflowTaskDefinition form-key fetching fixed for multi-instance UserTasks 36721: Fix for ALF-8374 - Simple view: incorrect file type icon for *.page and *.eps files 36726: Merged BRANCHES/DEV/V3.4-BUG-FIX to BRANCHES/DEV/V4.0-BUG-FIX 36724: Fix for ALF-14207 - cm:link not correctly handled in Share's doclist when users don't have permission 36728: Fix for ALF-14002: "No dashlets listed when customizing Site dashboard for the "Web Site Design Project" sample Share Site " 36732: Merged V3.4-BUG-FIX to V4.0-BUG-FIX 36637: ALF-6162 Thumbnail is not produced for PDFs encoded with JBIG2Decode << Reported problem still exists, but have made improvements see https://issues.alfresco.com/jira/browse/ALF-6162?focusedCommentId=162936&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-162936 >> - PDFRenderer now fails with an exception in more cases, rather than just silently continuing. Specific case was not handling JBig2 images. previously just resulted in a black box) - Handle the font family CIDFontType0 which includes HiddenHorzOCR 36640: ALF-13769: Merged BELARUS/DEV/V3.4-BUG-FIX-2012_05_04 to V3.4-BUG-FIX (3.4.10) 36440: ALF-11956: WCM accessibility Assignment of TinyMCE accessibility hotkeys only to activated RTE between multiple instances is added. Headings and some other related labels within the context of 'Create Web Content Wizard' were shortened and clarified. Fixed some issues related to hidden text for accessibility support in context of IE, which doesn't calculate styles and dimensions that are applied to elements before adding to DOM 36443: ALF-11956: WCM accessibility Added some changes missed in r36440 36645: ALF-13769: Merged DEV/V3.4-BUG-FIX-2012_01_10 to V3.4-BUG-FIX (3.4.10) 33381: ALF-10162: Web Form validation can be bypassed 1. New method was introduced to XFormsBean which allows it to validate the last inserted values. 2. CreateWebContentWizard finds XFormsBean in session and invokes isXformValid. If any validation errors exist it goes back and show the JSF error. 3. xform.js - contains code that removes JSF error as well as the XForms error. This is necessary because we need to clear the JSF error on the Javascript actions 4. container.jsp - includes a div wrapper with the id to be able unambiguously find the JSF error block. 36700: Merged DEV to V3.4-BUG-FIX (Reviewed by Erik) 36450: ALF-12261 : IE8 Specific: It's impossible add relationship type "Parent/Child" The type of the submit button should be set to 'button' in 'new-rmreference.get.html.ftl'. 36702: Merged DEV to V3.4-BUG-FIX (Reviewed by Erik) 36670: ALF-12825: Impossible choose the "Publication Date", the calendar isn't displayed The DatePicker component register a validation handler for the date entry field so that the submit button disables when an invalid date is entered. This handler register with the forms runtime instance. We should create this instance in FormUI_consructor, not is onReady method (form.js), because constructors always in order will be invoked. 36703: Fix for Mac Office 2011 Powerpoint save fails on CIFS. ALF-13615. 36733: Merged V4.0 to V4.0-BUG-FIX 36628: Added ${NOW} variable option for schema bootstrap scripts (see ALF-14174) 36632: Fix last part of ALF-14174: The patch adding timestamps to acl_change_set breaks SOLR tracking - Added ${NOW} to ACL change set timestamp when upgrading: commit_time_ms = ${NOW} 36647: ALF-14190: FSTR is not working - Due to someone updating dependencies without updating the build scripts! 36734: Merged V4.0 to V4.0-BUG-FIX (RECORD ONLY) 36605: ALF-13745: Merged V4.0-BUG-FIX (4.0.3) to V4.0 (4.0.2) 36604: ALF-13745: Merged V3.4-BUG-FIX (3.4.10) to V4.0-BUG-FIX (4.0.3) 36602: ALF-13667 Additional OpenOffice mimetypes to be added to the mime-type maps 36678: Merged BRANCHES/DEV/V4.0-BUG-FIX to BRANCHES/V4.0 36675: Fix for ALF-14216 Solr Exception when you try to sort folders or files by size. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@36737 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
613 lines
28 KiB
Java
613 lines
28 KiB
Java
package org.alfresco.repo.model.filefolder;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.junit.Assert.fail;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
|
|
import javax.transaction.NotSupportedException;
|
|
import javax.transaction.Status;
|
|
import javax.transaction.SystemException;
|
|
import javax.transaction.UserTransaction;
|
|
|
|
import org.alfresco.error.AlfrescoRuntimeException;
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.repo.dictionary.DictionaryNamespaceComponent;
|
|
import org.alfresco.repo.domain.node.NodeDAO;
|
|
import org.alfresco.repo.domain.node.NodeDAO.NodeRefQueryCallback;
|
|
import org.alfresco.repo.imap.AlfrescoImapFolder;
|
|
import org.alfresco.repo.imap.AlfrescoImapUser;
|
|
import org.alfresco.repo.imap.ImapService;
|
|
import org.alfresco.repo.model.filefolder.HiddenAspect.Visibility;
|
|
import org.alfresco.repo.search.impl.lucene.LuceneQueryParser;
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
import org.alfresco.service.ServiceRegistry;
|
|
import org.alfresco.service.cmr.model.FileExistsException;
|
|
import org.alfresco.service.cmr.model.FileFolderService;
|
|
import org.alfresco.service.cmr.model.FileInfo;
|
|
import org.alfresco.service.cmr.model.FileNotFoundException;
|
|
import org.alfresco.service.cmr.repository.NodeRef;
|
|
import org.alfresco.service.cmr.repository.NodeService;
|
|
import org.alfresco.service.cmr.repository.StoreRef;
|
|
import org.alfresco.service.cmr.search.ResultSet;
|
|
import org.alfresco.service.cmr.search.SearchParameters;
|
|
import org.alfresco.service.cmr.search.SearchService;
|
|
import org.alfresco.service.cmr.security.MutableAuthenticationService;
|
|
import org.alfresco.service.cmr.security.PersonService;
|
|
import org.alfresco.service.namespace.NamespaceService;
|
|
import org.alfresco.service.namespace.QName;
|
|
import org.alfresco.service.transaction.TransactionService;
|
|
import org.alfresco.util.ApplicationContextHelper;
|
|
import org.alfresco.util.FileFilterMode;
|
|
import org.alfresco.util.FileFilterMode.Client;
|
|
import org.alfresco.util.GUID;
|
|
import org.alfresco.util.Pair;
|
|
import org.alfresco.util.PropertyMap;
|
|
import org.junit.After;
|
|
import org.junit.Before;
|
|
import org.junit.Rule;
|
|
import org.junit.Test;
|
|
import org.junit.rules.TestName;
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
public class HiddenAspectTest
|
|
{
|
|
@Rule public TestName name = new TestName();
|
|
|
|
private static final ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
|
|
|
|
private HiddenAspect hiddenAspect;
|
|
private TransactionService transactionService;
|
|
private NodeDAO nodeDAO;
|
|
private NodeService nodeService;
|
|
private FileFolderService fileFolderService;
|
|
private MutableAuthenticationService authenticationService;
|
|
private UserTransaction txn;
|
|
|
|
private SearchService searchService;
|
|
private DictionaryNamespaceComponent namespacePrefixResolver;
|
|
private ImapService imapService;
|
|
private PersonService personService;
|
|
private FilenameFilteringInterceptor interceptor;
|
|
|
|
private StoreRef storeRef;
|
|
private NodeRef rootNodeRef;
|
|
private NodeRef topNodeRef;
|
|
|
|
private final String MAILBOX_NAME_A = "mailbox_a";
|
|
private final String MAILBOX_NAME_B = ".mailbox_a";
|
|
private String anotherUserName;
|
|
private AlfrescoImapUser user;
|
|
|
|
@Before
|
|
public void setup() throws SystemException, NotSupportedException
|
|
{
|
|
ServiceRegistry serviceRegistry = (ServiceRegistry) ctx.getBean("ServiceRegistry");
|
|
transactionService = serviceRegistry.getTransactionService();
|
|
nodeService = serviceRegistry.getNodeService();
|
|
fileFolderService = serviceRegistry.getFileFolderService();
|
|
authenticationService = (MutableAuthenticationService) ctx.getBean("AuthenticationService");
|
|
hiddenAspect = (HiddenAspect) ctx.getBean("hiddenAspect");
|
|
interceptor = (FilenameFilteringInterceptor) ctx.getBean("filenameFilteringInterceptor");
|
|
namespacePrefixResolver = (DictionaryNamespaceComponent) ctx.getBean("namespaceService");
|
|
imapService = serviceRegistry.getImapService();
|
|
personService = serviceRegistry.getPersonService();
|
|
searchService = serviceRegistry.getSearchService();
|
|
nodeDAO = (NodeDAO)ctx.getBean("nodeDAO");
|
|
|
|
// start the transaction
|
|
txn = transactionService.getUserTransaction();
|
|
txn.begin();
|
|
|
|
// authenticate
|
|
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
|
|
|
|
// create a test store
|
|
storeRef = nodeService
|
|
.createStore(StoreRef.PROTOCOL_WORKSPACE, getName() + System.currentTimeMillis());
|
|
rootNodeRef = nodeService.getRootNode(storeRef);
|
|
|
|
topNodeRef = nodeService.createNode(
|
|
rootNodeRef,
|
|
ContentModel.ASSOC_CHILDREN,
|
|
QName.createQName(NamespaceService.ALFRESCO_URI, "working root"),
|
|
ContentModel.TYPE_FOLDER).getChildRef();
|
|
|
|
anotherUserName = "user" + System.currentTimeMillis();
|
|
|
|
PropertyMap testUser = new PropertyMap();
|
|
testUser.put(ContentModel.PROP_USERNAME, anotherUserName);
|
|
testUser.put(ContentModel.PROP_FIRSTNAME, anotherUserName);
|
|
testUser.put(ContentModel.PROP_LASTNAME, anotherUserName);
|
|
testUser.put(ContentModel.PROP_EMAIL, anotherUserName + "@alfresco.com");
|
|
testUser.put(ContentModel.PROP_JOBTITLE, "jobTitle");
|
|
|
|
personService.createPerson(testUser);
|
|
|
|
// create the ACEGI Authentication instance for the new user
|
|
authenticationService.createAuthentication(anotherUserName, anotherUserName.toCharArray());
|
|
|
|
user = new AlfrescoImapUser(anotherUserName + "@alfresco.com", anotherUserName, anotherUserName);
|
|
}
|
|
|
|
private String getName()
|
|
{
|
|
return name.getMethodName();
|
|
}
|
|
|
|
@After
|
|
public void tearDown() throws Exception
|
|
{
|
|
try
|
|
{
|
|
if (txn.getStatus() != Status.STATUS_ROLLEDBACK && txn.getStatus() != Status.STATUS_COMMITTED)
|
|
{
|
|
txn.rollback();
|
|
}
|
|
}
|
|
catch (Throwable e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testHiddenFilesEnhancedClient()
|
|
{
|
|
FileFilterMode.setClient(Client.webdav);
|
|
|
|
try
|
|
{
|
|
// check temporary file
|
|
NodeRef parent = fileFolderService.create(topNodeRef, "New Folder", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef child = fileFolderService.create(parent, "file.tmp", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_TEMPORARY));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_HIDDEN));
|
|
List<FileInfo> children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
|
|
// check hidden files - should be hidden for an enhanced client
|
|
parent = fileFolderService.create(topNodeRef, "abc", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
child = fileFolderService.create(parent, ".TemporaryItems", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef child1 = fileFolderService.create(child, "inTemporaryItems", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_TEMPORARY));
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(child1, ContentModel.ASPECT_TEMPORARY));
|
|
assertTrue(nodeService.hasAspect(child1, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(child1, ContentModel.ASPECT_INDEX_CONTROL));
|
|
ResultSet results = searchForName(".TemporaryItems");
|
|
assertEquals("", 0, results.length());
|
|
|
|
children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
|
|
Client saveClient = FileFilterMode.setClient(Client.script);
|
|
try
|
|
{
|
|
children = fileFolderService.list(parent);
|
|
}
|
|
finally
|
|
{
|
|
FileFilterMode.setClient(saveClient);
|
|
}
|
|
assertEquals(0, children.size());
|
|
|
|
parent = fileFolderService.create(topNodeRef, "Folder 2", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
child = fileFolderService.create(parent, "Thumbs.db", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_TEMPORARY));
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName("Thumbs.db");
|
|
assertEquals("", 0, results.length());
|
|
children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
// set hidden attribute for cifs, webdav. ftp, nfs should be able to see, other clients not
|
|
assertEquals(Visibility.Visible, hiddenAspect.getVisibility(Client.ftp, child));
|
|
assertEquals(Visibility.Visible, hiddenAspect.getVisibility(Client.nfs, child));
|
|
assertEquals(Visibility.Visible, hiddenAspect.getVisibility(Client.webdav, child));
|
|
assertEquals(Visibility.HiddenAttribute, hiddenAspect.getVisibility(Client.cifs, child));
|
|
assertEquals(Visibility.NotVisible, hiddenAspect.getVisibility(Client.script, child));
|
|
assertEquals(Visibility.NotVisible, hiddenAspect.getVisibility(Client.webclient, child));
|
|
|
|
// surf-config should not be visible to any client
|
|
NodeRef node = fileFolderService.create(topNodeRef, "surf-config", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName("surf-config");
|
|
assertEquals("", 0, results.length());
|
|
for(Client client : hiddenAspect.getClients())
|
|
{
|
|
assertEquals(Visibility.NotVisible, hiddenAspect.getVisibility(client, node));
|
|
}
|
|
|
|
// .DS_Store is a system path and so is visible in nfs and webdav, as a hidden file in cifs and hidden to all other clients
|
|
node = fileFolderService.create(topNodeRef, ".DS_Store", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName(".DS_Store");
|
|
assertEquals("", 0, results.length());
|
|
for(Client client : hiddenAspect.getClients())
|
|
{
|
|
if(client == Client.cifs)
|
|
{
|
|
assertEquals("Should have hidden attribute set for client " + client, Visibility.HiddenAttribute, hiddenAspect.getVisibility(client, node));
|
|
}
|
|
else if(client == Client.webdav || client == Client.nfs || client == Client.ftp)
|
|
{
|
|
assertEquals("Should be visible for client " + client, Visibility.Visible, hiddenAspect.getVisibility(client, node));
|
|
}
|
|
else
|
|
{
|
|
assertEquals("Should not be visible for client " + client, Visibility.NotVisible, hiddenAspect.getVisibility(client, node));
|
|
}
|
|
}
|
|
|
|
// Resource fork should not be visible to any client
|
|
node = fileFolderService.create(topNodeRef, "._resourceFork", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName("._resourceFork");
|
|
assertEquals("", 0, results.length());
|
|
for(Client client : hiddenAspect.getClients())
|
|
{
|
|
assertEquals("Client " + client.toString(), Visibility.NotVisible, hiddenAspect.getVisibility(client, node));
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
FileFilterMode.clearClient();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testImap()
|
|
{
|
|
FileFilterMode.setClient(Client.webdav);
|
|
|
|
try
|
|
{
|
|
// Test that hidden files don't apply to imap service
|
|
imapService.getOrCreateMailbox(user, MAILBOX_NAME_A, false, true);
|
|
imapService.renameMailbox(user, MAILBOX_NAME_A, MAILBOX_NAME_B);
|
|
assertFalse("Can't rename mailbox", checkMailbox(user, MAILBOX_NAME_A));
|
|
assertTrue("Can't rename mailbox", checkMailbox(user, MAILBOX_NAME_B));
|
|
assertEquals("Can't rename mailbox", 0, numMailboxes(user, MAILBOX_NAME_A));
|
|
assertEquals("Can't rename mailbox", 1, numMailboxes(user, MAILBOX_NAME_B));
|
|
}
|
|
finally
|
|
{
|
|
FileFilterMode.clearClient();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testRename()
|
|
{
|
|
FileFilterMode.setClient(Client.webdav);
|
|
|
|
try
|
|
{
|
|
// Test renaming
|
|
String nodeName = GUID.generate();
|
|
NodeRef node = fileFolderService.create(topNodeRef, nodeName, ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node11 = fileFolderService.create(node, nodeName + ".11", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node12 = fileFolderService.create(node, nodeName + ".12", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
NodeRef node21 = fileFolderService.create(node11, nodeName + ".21", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node22 = fileFolderService.create(node11, nodeName + ".22", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
NodeRef node31 = fileFolderService.create(node21, ".31", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node41 = fileFolderService.create(node31, nodeName + ".41", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node11, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node11, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node12, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node12, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node21, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node21, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node22, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node22, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node31, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node31, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node41, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node41, ContentModel.ASPECT_INDEX_CONTROL));
|
|
|
|
ResultSet results = searchForName(nodeName);
|
|
assertEquals("", 1, results.length());
|
|
|
|
try
|
|
{
|
|
fileFolderService.rename(node, "." + nodeName);
|
|
}
|
|
catch (FileExistsException e)
|
|
{
|
|
fail();
|
|
}
|
|
catch (FileNotFoundException e)
|
|
{
|
|
fail();
|
|
}
|
|
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node11, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node11, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node12, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node12, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node21, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node21, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node22, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node22, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node31, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node31, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node41, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node41, ContentModel.ASPECT_INDEX_CONTROL));
|
|
|
|
results = searchForName(nodeName);
|
|
assertEquals("", 0, results.length());
|
|
|
|
results = searchForName("." + nodeName);
|
|
assertEquals("", 0, results.length());
|
|
|
|
try
|
|
{
|
|
fileFolderService.rename(node, nodeName);
|
|
}
|
|
catch (FileExistsException e)
|
|
{
|
|
fail();
|
|
}
|
|
catch (FileNotFoundException e)
|
|
{
|
|
fail();
|
|
}
|
|
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node11, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node11, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node12, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node12, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node21, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node21, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(node22, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node22, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node31, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node31, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertTrue(nodeService.hasAspect(node41, ContentModel.ASPECT_HIDDEN));
|
|
assertTrue(nodeService.hasAspect(node41, ContentModel.ASPECT_INDEX_CONTROL));
|
|
|
|
results = searchForName(nodeName);
|
|
assertEquals("", 1, results.length());
|
|
}
|
|
finally
|
|
{
|
|
FileFilterMode.clearClient();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testHiddenFilesBasicClient()
|
|
{
|
|
FileFilterMode.setClient(Client.imap);
|
|
|
|
try
|
|
{
|
|
// check temporary file
|
|
NodeRef parent = fileFolderService.create(topNodeRef, "New Folder", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef child = fileFolderService.create(parent, "file.tmp", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertTrue(nodeService.hasAspect(child, ContentModel.ASPECT_TEMPORARY));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_INDEX_CONTROL));
|
|
ResultSet results = searchForName("file.tmp");
|
|
assertEquals("", 1, results.length());
|
|
List<FileInfo> children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
|
|
// check hidden files - should not be hidden for a basic client
|
|
parent = fileFolderService.create(topNodeRef, ".TemporaryItems", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
child = fileFolderService.create(parent, "inTemporaryItems", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(parent, ContentModel.ASPECT_TEMPORARY));
|
|
assertFalse(nodeService.hasAspect(parent, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(parent, ContentModel.ASPECT_INDEX_CONTROL));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_TEMPORARY));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName(".TemporaryItems");
|
|
assertEquals("", 1, results.length());
|
|
children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
|
|
parent = fileFolderService.create(topNodeRef, "Folder 2", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
child = fileFolderService.create(parent, "Thumbs.db", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_TEMPORARY));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(child, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName("Thumbs.db");
|
|
assertEquals("", 1, results.length());
|
|
children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
|
|
NodeRef node = fileFolderService.create(topNodeRef, "surf-config", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName("surf-config");
|
|
assertEquals("", 1, results.length());
|
|
|
|
node = fileFolderService.create(topNodeRef, ".DS_Store", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName(".DS_Store");
|
|
assertEquals("", 1, results.length());
|
|
for(Client client : hiddenAspect.getClients())
|
|
{
|
|
assertEquals("Should be visible for client " + client, Visibility.Visible, hiddenAspect.getVisibility(client, node));
|
|
}
|
|
|
|
node = fileFolderService.create(topNodeRef, "._resourceFork", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName("._resourceFork");
|
|
assertEquals("", 1, results.length());
|
|
|
|
children = fileFolderService.list(parent);
|
|
assertEquals(1, children.size());
|
|
|
|
|
|
String nodeName = "Node" + System.currentTimeMillis();
|
|
node = fileFolderService.create(topNodeRef, nodeName, ContentModel.TYPE_CONTENT).getNodeRef();
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
results = searchForName(nodeName);
|
|
assertEquals("", 1, results.length());
|
|
try
|
|
{
|
|
fileFolderService.rename(node, "." + nodeName);
|
|
}
|
|
catch (FileExistsException e)
|
|
{
|
|
fail();
|
|
}
|
|
catch (FileNotFoundException e)
|
|
{
|
|
fail();
|
|
}
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
|
|
results = searchForName(nodeName);
|
|
assertEquals("", 1, results.length());
|
|
|
|
results = searchForName("." + nodeName);
|
|
assertEquals("", 1, results.length());
|
|
|
|
try
|
|
{
|
|
fileFolderService.rename(node, nodeName);
|
|
}
|
|
catch (FileExistsException e)
|
|
{
|
|
fail();
|
|
}
|
|
catch (FileNotFoundException e)
|
|
{
|
|
fail();
|
|
}
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_HIDDEN));
|
|
assertFalse(nodeService.hasAspect(node, ContentModel.ASPECT_INDEX_CONTROL));
|
|
|
|
results = searchForName("." + nodeName);
|
|
assertEquals("", 1, results.length());
|
|
|
|
imapService.getOrCreateMailbox(user, MAILBOX_NAME_A, false, true);
|
|
imapService.renameMailbox(user, MAILBOX_NAME_A, MAILBOX_NAME_B);
|
|
assertFalse("Can't rename mailbox", checkMailbox(user, MAILBOX_NAME_A));
|
|
assertTrue("Can't rename mailbox", checkMailbox(user, MAILBOX_NAME_B));
|
|
assertEquals("Can't rename mailbox", 0, numMailboxes(user, MAILBOX_NAME_A));
|
|
assertEquals("Can't rename mailbox", 1, numMailboxes(user, MAILBOX_NAME_B));
|
|
}
|
|
finally
|
|
{
|
|
FileFilterMode.clearClient();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testCheckHidden() throws Exception
|
|
{
|
|
String nodeName = GUID.generate();
|
|
|
|
interceptor.setEnabled(false);
|
|
|
|
try
|
|
{
|
|
// Create some nodes that should be hidden but aren't
|
|
NodeRef node = fileFolderService.create(topNodeRef, nodeName, ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node11 = fileFolderService.create(node, nodeName + ".11", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node12 = fileFolderService.create(node, ".12", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
NodeRef node21 = fileFolderService.create(node11, nodeName + ".21", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node22 = fileFolderService.create(node11, nodeName + ".22", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
NodeRef node31 = fileFolderService.create(node21, ".31", ContentModel.TYPE_FOLDER).getNodeRef();
|
|
NodeRef node41 = fileFolderService.create(node31, nodeName + ".41", ContentModel.TYPE_CONTENT).getNodeRef();
|
|
|
|
assertEquals(1, searchForName(".12").length());
|
|
assertEquals(1, searchForName(".31").length());
|
|
assertEquals(1, searchForName(nodeName + ".41").length());
|
|
|
|
txn.commit();
|
|
}
|
|
finally
|
|
{
|
|
interceptor.setEnabled(true);
|
|
}
|
|
}
|
|
|
|
private List<NodeRef> getHiddenNodes(final StoreRef storeRef)
|
|
{
|
|
final List<NodeRef> nodes = new ArrayList<NodeRef>(20);
|
|
|
|
NodeRefQueryCallback resultsCallback = new NodeRefQueryCallback()
|
|
{
|
|
@Override
|
|
public boolean handle(Pair<Long, NodeRef> nodePair)
|
|
{
|
|
if(storeRef == null || nodePair.getSecond().getStoreRef().equals(storeRef))
|
|
{
|
|
nodes.add(nodePair.getSecond());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
};
|
|
nodeDAO.getNodesWithAspects(Collections.singleton(ContentModel.ASPECT_HIDDEN), 0l, Long.MAX_VALUE, resultsCallback);
|
|
|
|
return nodes;
|
|
}
|
|
|
|
private int numMailboxes(AlfrescoImapUser user, String mailboxName)
|
|
{
|
|
int numMailboxes = 0;
|
|
|
|
try
|
|
{
|
|
List<AlfrescoImapFolder> folders = imapService.listMailboxes(user, mailboxName, false);
|
|
numMailboxes = folders.size();
|
|
}
|
|
catch (AlfrescoRuntimeException e)
|
|
{
|
|
fail("Unexpected exception: " + e.getMessage());
|
|
}
|
|
|
|
return numMailboxes;
|
|
}
|
|
|
|
private boolean checkMailbox(AlfrescoImapUser user, String mailboxName)
|
|
{
|
|
try
|
|
{
|
|
imapService.getOrCreateMailbox(user, mailboxName, true, false);
|
|
}
|
|
catch (AlfrescoRuntimeException e)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private ResultSet searchForName(String name)
|
|
{
|
|
SearchParameters sp = new SearchParameters();
|
|
sp.addStore(rootNodeRef.getStoreRef());
|
|
sp.setLanguage("lucene");
|
|
sp.setQuery("@" + LuceneQueryParser.escape(ContentModel.PROP_NAME.toString()) + ":\"" + name + "\"");
|
|
sp.addLocale(new Locale("en"));
|
|
return searchService.query(sp);
|
|
}
|
|
}
|