Hi Grzegorz,
On 20 Nov 2008, at 23:21, Grzegorz Kossakowski wrote:
Robin Wyles pisze:
Hi,
Apologies for posting on the dev list, but I've been asking this
for a
while on users and am still searching for an answer (I'm kind of
desperate now!)....
Sorry for not responding on users mailing list. I've been offline
for some time and didn't have a
touch with a project.
In the default sitemap generated with the block archetype there is a
pipeline as follows:
<map:pipeline id="internal-resource" internal-only="true">
<!-- Put matchers for internal (accessible only to Cocoon
blocks)
resources here
More details:
http://cocoon.zones.apache.org/daisy/cdocs-site-main/g2/1345.html -->
<map:match pattern="resource/internal/**">
<map:read src="resource/internal/{1}"/>
</map:match>
</map:pipeline>
On the docs page linked to above it states that blocks may have
"internal resources that are accessible to other block via servlet:
protocol". However, from my tests it seems that internal-only
pipelines
are still not accessible via the servlet protocol. So, out of the box
any matchers placed in the above pipeline result in a
SourceNotFoundException when accessed via the servlet protocol.
Can any devs please confirm whether:
1. Internal pipelines *should* be accessible via the servlet
protocol.
Yes, it should be.
Phew :-)
2. Internal pipelines *are* accessible via the servlet protocol.
No they aren't.
Boo :-(
If 1 is true and 2 is false then I'm very surprised that this hasn't
been bought up before on the user list as it seems to contradict the
documentation and also severely limit the usefulness of the servlet
protocol - I can't believe we're supposed to leave our SSF only
pipelines accessible to the world at large! I have a test block here
that demonstrates the issue if anyone is interested...
Actually, I've been aware of this problem for a long time but never
got myself to fix it, which is a
shame, of course.
The thing is about SSF's design, it's really designed such a way
that request coming from SSF looks
very the same way as it was coming from an external client (like
browser). That's been done on
purpose in order to avoid any hidden dependencies between SSF and
Cocoon's core.
As a consequence of this design, there is no way how sitemap
processor can allow requests coming
from SSF to access internal-only pipelines.
When it comes to documentation, it was written before the actual
implementation was made and later
on the whole issue has been forgotten.
I don't recall the proposal for implementing this functionality but
probably the simplest possible
approach would be to introduce common contract that both sides (SSF
and Cocoon's Core) agree to
follow but the one that does not introduce any hard dependencies on
each other. This leaves
implementing special interface (indicator) out of consideration.
I had a dig around in the code yesterday and more or less came to the
same conclusion - very hard to do without spoiling SSF's nice lack of
dependencies.
Nevertheless, SSF could still indicate that coming request is
performed internally by adding some
special request attribute. This might be a potential security hole
so I would classify such a
solution a temporary one.
It seems the check on the pipeline type and environment type is done
by o.a.c.components.treeprocessor.sitemap.PipelineNode, I made a
simple patch here that checks the request's scheme; if it is
'servlet' and the pipeline is internal only, then processing is
allowed to continue. While not ideal, I think this method poses less
of a security risk than using a special request attribute. Also it's
only one extra line in one class. WDYT?
I believe implementing such a functionality on both SSF and Sitemap-
engine sides would be rather
easy task and I'm willing to help with preparing the patch and
applying it. I would require a valid
test-case for it before it gets accepted.
Can you give me some hints as to how I can write a unit test for
this? I'm familiar with writing tests for sitemap components but I'm
not sure how to set up a test pipeline and set its attributes
accordingly.
Cheers,
Robin