Generating hard to guess content URLs in Sling

In RESTful apps, it is often useful to create hard to guess URLs, as a simple privacy device.

Here's a self-explaining example (with hardcoded parameters) of how to do that in Sling.

After installing this component, an HTTP POST to a node named 'foo' creates a child node with a somewhat long hex string as its name, instead of the usual simple names generated by Sling.

package foo;

import java.util.Random;

import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.servlets.post.NodeNameGenerator;

/** Example that generates hard-to-guess node names in Sling, * for nodes added under nodes named 'foo' * * To test, build and install a bundle that includes this component, * and run *

*   curl -X MKCOL http://admin:admin@localhost:4502/foo
*   curl -F title=bar http://admin:admin@localhost:4502/foo/
* 
* The output of the second curl call should return something like *
*   Content created /foo/dd712dd234637bb9a9a3b3a10221eb1f
* 
* Which is the path of the created node. */ @Component @Service public class FooNodeNameGenerator implements NodeNameGenerator { private static final Random random = new Random(System.currentTimeMillis());

/\*\* @inheritDoc \*/
public String getNodeName(
        SlingHttpServletRequest request, 
        String parentPath, 
        boolean requirePrefix, 
        NodeNameGenerator defaultNng) 
{
    if(parentPath.endsWith("/foo")) {
        final StringBuilder name = new StringBuilder();
        for(int i=0; i < 2; i++) {
            name.append(Long.toHexString(random.nextLong()));
        }
        return name.toString();
    }
    return null;
}

}