Hi All,
We have had multiple requests from users bemoaning the fact that
CryptoMapper does not encrypt request listener URLs for mounted pages
and the home page. I've been working on CryptoMapper to add support for
this, but there is some change in behavior, so I am asking for review of
the changes before I commit.
The changes are in two commits to sandbox/cryptomapper-request-listener.
We're talking about these URLs: /mount/path?5-1.ILinkListener-link
In WICKET-4140, Martin provides a custom CryptoMapper, as do I in
WICKET-5326. (I was not aware of the solution in 4140). Its time to have
the solution provided by default.
I have modified CryptoMapper to only encrypt all parts of the URL
(segments as well as query parameters) if the URL starts with
"/wicket/". This covers all wicket generated URLs, except home page and
mounts.
For mounted pages and the home page, we only encrypt the
PageComponentInfo parameter - the "5-1.ILinkListener-link" part. We dont
want to encrypt all query parameters, because people want to be able to
edit some query parameters.
/my/mounted/page?5-1.ILinkListener-link becomes
/my/mounted/page?wicket=asdjkghasfhajksdhfjksdhfkjsdhfkjsdk.
This means that CryptoMapper now can, and probably should, be installed
AFTER mounting pages etc.
It also means that URLs generated for pages that are mounted before
CryptoMapper is installed will no longer be encrypted in full, only the
PageComponentInfo parameter will be encrypted. I dont think this is a
problem though, since why would you mount a page and then be upset that
the mounted URL is being used?
I imagine that there will be times when a page is mounted after
CryptoMapper is installed, but the user would like request listener URLs
for this page to be encrypted too, and will therefore install a second
CryptoMapper. I added test to make sure we can support this.
Issue #2:
Sometimes users use KeyInSessionSunJceCryptFactory, which stores the
crypt key in the session, unique per session. When the session expires,
and a user attempt to open a URL encrypted by the now expired session,
the URL cannot be decrypted and he gets a 404 error.
In the discussion around WICKET-5326, a wanted to see a
PageExpiredException in these circumstances, not 404. Makes sense to me.
To do this I have added a setting to CryptoMapper which will prepend
"crypt." to fully encrypted URLs, to clearly mark the URL as definitely
encrypted, and definitely should be decryptable. When the URL is
decrypted later, CryptoMapper knows that this URL should definitely be
decryptable and, if not, it can throw a PageExpiredException.
This option is off by default.
Also included are some other small fixes for CryptoMapper, like
getCompatabilityScore() not really working, and encrypted URLs being too
long by one segment.
Please let me know if this is all fine, then I will delete the sandbox
branch and put these change into wicket-6.x and master.
Thanks,
Jesse