Re: Sling Posthandling - thougts about the current behavior

2013-07-04 Thread Ondrej Florian
...what about using POST.jsp for validations, implementing custom behavior etc.

in POST.jsp

* add / remove / modify / handle post parameters
* call the default POST servlet to do the actually persistence
* handle any errors

---
The reason why it doesn't work at the moment is that:
- post parameters are not mutable
- it is hard to call the default implementation (perhaps I just don't know how)
- exceptions coming from the POST servlet may not be detailed enough in order 
to provide error handling on granularity needed

I think approach could be very useful for intercepting other requests as 
well,without need to write custom filters.

Ondrej

On 26 Jun 2013, at 12:35, Dominik Süß dominik.su...@gmail.com wrote:

 Hi everyone,
 
 within the last weeks I spent some time on a project that is heavily
 relying on data being submitted by users of the system and setting up
 complex structures, users, groups and ACLs based on the operations
 performed by a user. I reallized that a lot of those things could be done
 by utilizing the SlingPostServlet and extending it by custom Postprocessors
 and custom operations. This worked out well but I realized some things that
 I'm not so happy with and would like to start off a discussion how the
 handling of Posts, and therefore the interactive part of Sling could be
 improved.
 
 Here the points that I think are discussabble:
 a) (non-Brainer) Postoperations and Postprocessors are rarely covered by
 documentation (Postprocessors are marked as TBD) this gives the impression
 of not being ready for productive usage so the gap should be closed
 b) Postoperations and Postprocessors are always defined and called global
 so it is up to the developer to check and skip processing (Blacklisting
 approach) which is errorprone if this manual check is not restrictive
 enough (can lead to subtle regressions in completely different areas of the
 app) - I'd propose to have a declarative approach that is a
 whitelistapproach based on path and propably even by resourceType (here
 comes the clash between posted resourceType and potentially already
 existing resourceType
 c) Sometimes data submitted should just be used as parameters for
 postprocessors or operations and not persisted. Using the dot-slash
 prefixing does give such options, but since the ./ notation acts as kind
 of a magic trigger of behaviour I'd prefer to have a way to annotate such
 fields (like name@ignore or @noPersistance)
 
 All in all the web is moving in a direction where almost no page is
 delivered with options to interact with the the webpage - so Sling should
 try to give developers the tools to do this wireing without having the dev
 to write boilerplatecode for those checks over and over again and enabling
 them to implement complete interactive userstories up to a certain point of
 complexity in a standardized way.
 
 WDYT?
 
 Best regards
 Dominik



Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Dominik Süß
Hi Alex,

why do you think registering logic by path is bad. Especially if I look at
potential for multitenantsupport it would be great to be able to register
postbehavior that is tenantspecific. And the tenantsupport of Sling is
completely based on paths.

Regarding usage of Servlet Filters as pipelline I personally think this
could probably get a bit intransparent for develpers. As previously
mentioned the various phases should/would give the option to have a
contract about what can be done during that phase. A filterbased handling
just would give the option to control order of execution, but any filter
could break this transactional contract.
The injection of such a pipeline without the need to touch the existing
servlet could be done via a filter, but I think it would make sense to
optimize the current implementation when introducing such a mechanism.

Just my 2 cents
Dominik


On Tue, Jul 2, 2013 at 8:38 PM, Alexander Klimetschek aklim...@adobe.comwrote:

 Ack on the overall goal.

 The way I see it, it boils down to having the sling post servlet (or more
 specifically that new POST-pipeline) not just one special servlet out of
 many, but an integral part of Sling.


 Registering operations, post processors or whatever we need by resource
 type sounds good. By path not so much, don't know.

 IMHO, the rt would be taken from the addressed resource (what the URL
 addresses, to be 1:1 with how GET servlet resolution works; not any
 resources that additional request parameters might address) and if not
 present (creating a new resource) from the sling:resourceType param.

 It would actually be nice if those operations or postprocessor could
 become servlets or servlet filters again. They could get the necessary
 state passed via a request attribute for example + a utility to fetch them.
 And thinking about it, filters are actually the right thing, they are
 designed for pipelines.

 I am not sure if adding a :selector parameter as proposed by Justin
 (SLING-2936) is a good idea - maybe the integration with this new pipeline
 is the better long-term approach. You'd register by resource type + http
 method + :operation. Having both :operation and :selector (in the combined
 overall picture) seems like duplication. But it's difficult.

 It was mentioned that using selectors in the URL for POST requests, such
 as POST /content/page.createChild.html, is not RESTful. Is that really the
 case? As long as the server provides the URL instead of the client building
 it himself, such as path + .createChild.html as it happens way too
 much, and you use the right HTTP methods for changing/deleting content,
 nothing here would be unRESTful afaics.

 It would only look nicer if you put all the POST related information into
 the request parameters instead of into the URL. But then it's the old
 action=create topic again, which should be covered very well with the
 default features of the Sling post servlet already, which only requires you
 to add custom code (actions) for very specific things.

 This is even less once we have a validation framework in place (also
 resource type based), where Radu did a lot of work already!

 Cheers,
 Alex


 On 02.07.2013, at 15:26, Dominik Süß dominik.su...@gmail.com wrote:

  Well, if locking is just about permission I do agree with ACLs being the
  right solution (the permission set on the node itself might be sufficient
  for that case) - if it is about businessconstraints that need to be
  fullfilled an ACL cannot solve this requirement[0]. This is why
 validation
  and so on should be performed first, I would think of a pipeline having a
  contract on each phase what can be done and what cannot be done, while a
  first phase might not write any data (even as transient changes) the next
  phase might be perform (transient) change, then the postoperations would
 be
  performed in a transient followed by another phase that might perform
  transient changes and/or stop the processing, followed by a last phase
 that
  is called after the resourceResolve has performed a commit().
 
  This is purely about giving developers a contract on what they can and
  cannot do (and therefore what they can expect 3rd party code to do) at a
  specific point in this pipeline.
 
  [0] a businessconstraint to control sepecific operations by permissions
  could be solved by a shadowstructure like proposed by Bertrand.
 
  --
  Dominik
 
 
  On Tue, Jul 2, 2013 at 2:47 PM, Bertrand Delacretaz
  bdelacre...@apache.orgwrote:
 
  On Tue, Jul 2, 2013 at 2:38 PM, Dominik Süß dominik.su...@gmail.com
  wrote:
  Facing some questions about how to prevent the SlingPostServlet to be
  able
  to perform a change I had a closer look at the current implementation
 and
  it looks like there is currently no secure way of doing that beside
  locking the target on persistancelevel (alias setting ACLs)...
 
  ...which looks to me like the right way of locking things.
 
  But maybe for the post servlet we need a parallel 

Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Bertrand Delacretaz
Hi,

On Wed, Jul 3, 2013 at 12:55 PM, Dominik Süß dominik.su...@gmail.com wrote:
 ...why do you think registering logic by path is bad. Especially if I look at
 potential for multitenantsupport it would be great to be able to register
 postbehavior that is tenantspecific. And the tenantsupport of Sling is
 completely based on paths

In general we want people to get away from the notion that paths drive
your app, it should be resource types that do.

Also, the problem with paths is that they are usually hidden in code,
whereas resource types are transparently exposed in the content.

For the POST handling, we could very well take the resource type of
the parent/ancestors into account, instead of relying on paths.

-Bertrand


Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Dominik Süß
Hi Bertrand,

while I agree that paths should not drive the app they might build a scope
for the logic, since the content is organized in a tree structure and not
in by it's resourceType hierarchy, Therefore you often do have pathspecific
operations (just think of workflows and workflowlaunchers in CQ). Or to
come up with another scenario.
Changing resourceTypes depending on the location of the same data on the
other hand would be redundant information.

So - the main Driver should be the resourceType is what is defining the
behavior of a component while the contentpath in my eyes could act as
restricting criteria.

WDYT?


On Wed, Jul 3, 2013 at 1:22 PM, Bertrand Delacretaz
bdelacre...@apache.orgwrote:

 Hi,

 On Wed, Jul 3, 2013 at 12:55 PM, Dominik Süß dominik.su...@gmail.com
 wrote:
  ...why do you think registering logic by path is bad. Especially if I
 look at
  potential for multitenantsupport it would be great to be able to register
  postbehavior that is tenantspecific. And the tenantsupport of Sling is
  completely based on paths

 In general we want people to get away from the notion that paths drive
 your app, it should be resource types that do.

 Also, the problem with paths is that they are usually hidden in code,
 whereas resource types are transparently exposed in the content.

 For the POST handling, we could very well take the resource type of
 the parent/ancestors into account, instead of relying on paths.

 -Bertrand



Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Justin Edelson
Hi Dominik,
Wouldn't a ResourceDecorator be a better solution in those case? I.e. if a
resource is of type app/foo and is under /content/bar, decorate the
resource to app/bar ?

The fact that you can register servlets by path should *not* in my opinion
be a reason to extend behavior-by-path to other parts of Sling.

Regards,
Justin


On Wed, Jul 3, 2013 at 8:22 AM, Dominik Süß dominik.su...@gmail.com wrote:

 Hi Bertrand,

 while I agree that paths should not drive the app they might build a scope
 for the logic, since the content is organized in a tree structure and not
 in by it's resourceType hierarchy, Therefore you often do have pathspecific
 operations (just think of workflows and workflowlaunchers in CQ). Or to
 come up with another scenario.
 Changing resourceTypes depending on the location of the same data on the
 other hand would be redundant information.

 So - the main Driver should be the resourceType is what is defining the
 behavior of a component while the contentpath in my eyes could act as
 restricting criteria.

 WDYT?


 On Wed, Jul 3, 2013 at 1:22 PM, Bertrand Delacretaz
 bdelacre...@apache.orgwrote:

  Hi,
 
  On Wed, Jul 3, 2013 at 12:55 PM, Dominik Süß dominik.su...@gmail.com
  wrote:
   ...why do you think registering logic by path is bad. Especially if I
  look at
   potential for multitenantsupport it would be great to be able to
 register
   postbehavior that is tenantspecific. And the tenantsupport of Sling is
   completely based on paths
 
  In general we want people to get away from the notion that paths drive
  your app, it should be resource types that do.
 
  Also, the problem with paths is that they are usually hidden in code,
  whereas resource types are transparently exposed in the content.
 
  For the POST handling, we could very well take the resource type of
  the parent/ancestors into account, instead of relying on paths.
 
  -Bertrand
 



Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Bertrand Delacretaz
On Wed, Jul 3, 2013 at 2:53 PM, Dominik Süß dominik.su...@gmail.com wrote:
 ...I bet a bunch of
 scripts/servlet currently check the contentpath first and react on this...

Those servlets should die ;-)

-Bertrand


Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Justin Edelson
Hi,


On Tue, Jul 2, 2013 at 2:38 PM, Alexander Klimetschek aklim...@adobe.comwrote:

 Ack on the overall goal.

 The way I see it, it boils down to having the sling post servlet (or more
 specifically that new POST-pipeline) not just one special servlet out of
 many, but an integral part of Sling.



 Registering operations, post processors or whatever we need by resource
 type sounds good. By path not so much, don't know.

 IMHO, the rt would be taken from the addressed resource (what the URL
 addresses, to be 1:1 with how GET servlet resolution works; not any
 resources that additional request parameters might address) and if not
 present (creating a new resource) from the sling:resourceType param.

 It would actually be nice if those operations or postprocessor could
 become servlets or servlet filters again. They could get the necessary
 state passed via a request attribute for example + a utility to fetch them.
 And thinking about it, filters are actually the right thing, they are
 designed for pipelines.


 I am not sure if adding a :selector parameter as proposed by Justin
 (SLING-2936) is a good idea - maybe the integration with this new pipeline
 is the better long-term approach. You'd register by resource type + http
 method + :operation. Having both :operation and :selector (in the combined
 overall picture) seems like duplication. But it's difficult.


Why wouldn't you register by resource type + method + selector? After all,
that's what you do now. For pipeline components, we could add a phase
registration property (or maybe ranking is enough).

IMHO :operation is an aspect of the current default POST servlet. If we are
going to move more POST-specific handling into the engine, then we should
be using selectors.

Justin


 It was mentioned that using selectors in the URL for POST requests, such
 as POST /content/page.createChild.html, is not RESTful. Is that really the
 case? As long as the server provides the URL instead of the client building
 it himself, such as path + .createChild.html as it happens way too
 much, and you use the right HTTP methods for changing/deleting content,
 nothing here would be unRESTful afaics.

 It would only look nicer if you put all the POST related information into
 the request parameters instead of into the URL. But then it's the old
 action=create topic again, which should be covered very well with the
 default features of the Sling post servlet already, which only requires you
 to add custom code (actions) for very specific things.


 This is even less once we have a validation framework in place (also
 resource type based), where Radu did a lot of work already!


 Cheers,
 Alex


 On 02.07.2013, at 15:26, Dominik Süß dominik.su...@gmail.com wrote:

  Well, if locking is just about permission I do agree with ACLs being the
  right solution (the permission set on the node itself might be sufficient
  for that case) - if it is about businessconstraints that need to be
  fullfilled an ACL cannot solve this requirement[0]. This is why
 validation
  and so on should be performed first, I would think of a pipeline having a
  contract on each phase what can be done and what cannot be done, while a
  first phase might not write any data (even as transient changes) the next
  phase might be perform (transient) change, then the postoperations would
 be
  performed in a transient followed by another phase that might perform
  transient changes and/or stop the processing, followed by a last phase
 that
  is called after the resourceResolve has performed a commit().
 
  This is purely about giving developers a contract on what they can and
  cannot do (and therefore what they can expect 3rd party code to do) at a
  specific point in this pipeline.
 
  [0] a businessconstraint to control sepecific operations by permissions
  could be solved by a shadowstructure like proposed by Bertrand.
 
  --
  Dominik
 
 
  On Tue, Jul 2, 2013 at 2:47 PM, Bertrand Delacretaz
  bdelacre...@apache.orgwrote:
 
  On Tue, Jul 2, 2013 at 2:38 PM, Dominik Süß dominik.su...@gmail.com
  wrote:
  Facing some questions about how to prevent the SlingPostServlet to be
  able
  to perform a change I had a closer look at the current implementation
 and
  it looks like there is currently no secure way of doing that beside
  locking the target on persistancelevel (alias setting ACLs)...
 
  ...which looks to me like the right way of locking things.
 
  But maybe for the post servlet we need a parallel structure to define
  who's allowed to do what. You could for example have
 
   /user-rights/sling/post-servlet/post/content/foo
 
  and whoever's allowed to read that is allowed to post to /content/foo,
  barring other ACL limitations.
 
  Just thinking outloud mostly...my point is that any security-related
  stuff should be driven by ACLs, and in some case indirect ACLs can
  be useful.
 
  -Bertrand
 




Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Bertrand Delacretaz
On Wed, Jul 3, 2013 at 2:58 PM, Justin Edelson jus...@justinedelson.com wrote:
 ...Why wouldn't you register by resource type + method + selector? After all,
 that's what you do now. For pipeline components, we could add a phase
 registration property (or maybe ranking is enough)

And phase could be just a fake selector, PPP_foo or something where
PP_ means POST Pipeline Phase.

-Bertrand


Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Dominik Süß
If I got the implementation right you always trigger exactly one, so this
is not an aspect, this is wat actualy is done to perform the post.
Aspects are handled via PostProcessors.


On Wed, Jul 3, 2013 at 2:58 PM, Justin Edelson jus...@justinedelson.comwrote:

 Hi,


 On Tue, Jul 2, 2013 at 2:38 PM, Alexander Klimetschek aklim...@adobe.com
 wrote:

  Ack on the overall goal.
 
  The way I see it, it boils down to having the sling post servlet (or more
  specifically that new POST-pipeline) not just one special servlet out
 of
  many, but an integral part of Sling.


 
  Registering operations, post processors or whatever we need by resource
  type sounds good. By path not so much, don't know.
 
  IMHO, the rt would be taken from the addressed resource (what the URL
  addresses, to be 1:1 with how GET servlet resolution works; not any
  resources that additional request parameters might address) and if not
  present (creating a new resource) from the sling:resourceType param.
 
  It would actually be nice if those operations or postprocessor could
  become servlets or servlet filters again. They could get the necessary
  state passed via a request attribute for example + a utility to fetch
 them.
  And thinking about it, filters are actually the right thing, they are
  designed for pipelines.


  I am not sure if adding a :selector parameter as proposed by Justin
  (SLING-2936) is a good idea - maybe the integration with this new
 pipeline
  is the better long-term approach. You'd register by resource type + http
  method + :operation. Having both :operation and :selector (in the
 combined
  overall picture) seems like duplication. But it's difficult.
 

 Why wouldn't you register by resource type + method + selector? After all,
 that's what you do now. For pipeline components, we could add a phase
 registration property (or maybe ranking is enough).

 IMHO :operation is an aspect of the current default POST servlet. If we are
 going to move more POST-specific handling into the engine, then we should
 be using selectors.

 Justin


  It was mentioned that using selectors in the URL for POST requests, such
  as POST /content/page.createChild.html, is not RESTful. Is that really
 the
  case? As long as the server provides the URL instead of the client
 building
  it himself, such as path + .createChild.html as it happens way too
  much, and you use the right HTTP methods for changing/deleting content,
  nothing here would be unRESTful afaics.
 
  It would only look nicer if you put all the POST related information into
  the request parameters instead of into the URL. But then it's the old
  action=create topic again, which should be covered very well with the
  default features of the Sling post servlet already, which only requires
 you
  to add custom code (actions) for very specific things.


  This is even less once we have a validation framework in place (also
  resource type based), where Radu did a lot of work already!


  Cheers,
  Alex
 
 
  On 02.07.2013, at 15:26, Dominik Süß dominik.su...@gmail.com wrote:
 
   Well, if locking is just about permission I do agree with ACLs being
 the
   right solution (the permission set on the node itself might be
 sufficient
   for that case) - if it is about businessconstraints that need to be
   fullfilled an ACL cannot solve this requirement[0]. This is why
  validation
   and so on should be performed first, I would think of a pipeline
 having a
   contract on each phase what can be done and what cannot be done, while
 a
   first phase might not write any data (even as transient changes) the
 next
   phase might be perform (transient) change, then the postoperations
 would
  be
   performed in a transient followed by another phase that might perform
   transient changes and/or stop the processing, followed by a last phase
  that
   is called after the resourceResolve has performed a commit().
  
   This is purely about giving developers a contract on what they can and
   cannot do (and therefore what they can expect 3rd party code to do) at
 a
   specific point in this pipeline.
  
   [0] a businessconstraint to control sepecific operations by permissions
   could be solved by a shadowstructure like proposed by Bertrand.
  
   --
   Dominik
  
  
   On Tue, Jul 2, 2013 at 2:47 PM, Bertrand Delacretaz
   bdelacre...@apache.orgwrote:
  
   On Tue, Jul 2, 2013 at 2:38 PM, Dominik Süß dominik.su...@gmail.com
   wrote:
   Facing some questions about how to prevent the SlingPostServlet to be
   able
   to perform a change I had a closer look at the current implementation
  and
   it looks like there is currently no secure way of doing that beside
   locking the target on persistancelevel (alias setting ACLs)...
  
   ...which looks to me like the right way of locking things.
  
   But maybe for the post servlet we need a parallel structure to define
   who's allowed to do what. You could for example have
  
/user-rights/sling/post-servlet/post/content/foo
  
 

Re: Sling Posthandling - thougts about the current behavior

2013-07-03 Thread Alexander Klimetschek
On 03.07.2013, at 14:58, Justin Edelson jus...@justinedelson.com wrote:

 IMHO :operation is an aspect of the current default POST servlet. If we are
 going to move more POST-specific handling into the engine, then we should
 be using selectors.

Yes, my main point was to have only one. You are right, selector is the broader 
concept, so we could drop operation here.

Looking at the existing operations [0], IMO all of them could/should be 
replaced by a param@Something style notation. We do this with @CopyFrom 
already, same could be done with @Checkin etc. Even import can be done this 
way.

This moves it down from some request-global operation to a parameter specific 
option, with the benefit of allowing multiple ones in a single request. Then 
the POST is always the default create-or-modify operation.

With the new pipeline, things can hook in and either overlay the default 
behaviour for certain parameters or handle custom ones (as PostProcessors 
typically do). We should make it simpler to read and modify the special 
RequestParameter map that is passed through, it is currently quite some work to 
read a custom @Something and get the right path for it etc.

[0] 
http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html#ManipulatingContent-TheSlingPostServlet%2528servlets.post%2529-SlingPostServletOperations

Cheers,
Alex

Re: Sling Posthandling - thougts about the current behavior

2013-07-02 Thread Bertrand Delacretaz
On Tue, Jul 2, 2013 at 2:38 PM, Dominik Süß dominik.su...@gmail.com wrote:
 Facing some questions about how to prevent the SlingPostServlet to be able
 to perform a change I had a closer look at the current implementation and
 it looks like there is currently no secure way of doing that beside
 locking the target on persistancelevel (alias setting ACLs)...

...which looks to me like the right way of locking things.

But maybe for the post servlet we need a parallel structure to define
who's allowed to do what. You could for example have

  /user-rights/sling/post-servlet/post/content/foo

and whoever's allowed to read that is allowed to post to /content/foo,
barring other ACL limitations.

Just thinking outloud mostly...my point is that any security-related
stuff should be driven by ACLs, and in some case indirect ACLs can
be useful.

-Bertrand


Re: Sling Posthandling - thougts about the current behavior

2013-07-02 Thread Dominik Süß
Well, if locking is just about permission I do agree with ACLs being the
right solution (the permission set on the node itself might be sufficient
for that case) - if it is about businessconstraints that need to be
fullfilled an ACL cannot solve this requirement[0]. This is why validation
and so on should be performed first, I would think of a pipeline having a
contract on each phase what can be done and what cannot be done, while a
first phase might not write any data (even as transient changes) the next
phase might be perform (transient) change, then the postoperations would be
performed in a transient followed by another phase that might perform
transient changes and/or stop the processing, followed by a last phase that
is called after the resourceResolve has performed a commit().

This is purely about giving developers a contract on what they can and
cannot do (and therefore what they can expect 3rd party code to do) at a
specific point in this pipeline.

[0] a businessconstraint to control sepecific operations by permissions
could be solved by a shadowstructure like proposed by Bertrand.

--
Dominik


On Tue, Jul 2, 2013 at 2:47 PM, Bertrand Delacretaz
bdelacre...@apache.orgwrote:

 On Tue, Jul 2, 2013 at 2:38 PM, Dominik Süß dominik.su...@gmail.com
 wrote:
  Facing some questions about how to prevent the SlingPostServlet to be
 able
  to perform a change I had a closer look at the current implementation and
  it looks like there is currently no secure way of doing that beside
  locking the target on persistancelevel (alias setting ACLs)...

 ...which looks to me like the right way of locking things.

 But maybe for the post servlet we need a parallel structure to define
 who's allowed to do what. You could for example have

   /user-rights/sling/post-servlet/post/content/foo

 and whoever's allowed to read that is allowed to post to /content/foo,
 barring other ACL limitations.

 Just thinking outloud mostly...my point is that any security-related
 stuff should be driven by ACLs, and in some case indirect ACLs can
 be useful.

 -Bertrand



Re: Sling Posthandling - thougts about the current behavior

2013-07-02 Thread Alexander Klimetschek
Ack on the overall goal.

The way I see it, it boils down to having the sling post servlet (or more 
specifically that new POST-pipeline) not just one special servlet out of 
many, but an integral part of Sling.


Registering operations, post processors or whatever we need by resource type 
sounds good. By path not so much, don't know.

IMHO, the rt would be taken from the addressed resource (what the URL 
addresses, to be 1:1 with how GET servlet resolution works; not any resources 
that additional request parameters might address) and if not present (creating 
a new resource) from the sling:resourceType param.

It would actually be nice if those operations or postprocessor could become 
servlets or servlet filters again. They could get the necessary state passed 
via a request attribute for example + a utility to fetch them. And thinking 
about it, filters are actually the right thing, they are designed for pipelines.

I am not sure if adding a :selector parameter as proposed by Justin 
(SLING-2936) is a good idea - maybe the integration with this new pipeline is 
the better long-term approach. You'd register by resource type + http method + 
:operation. Having both :operation and :selector (in the combined overall 
picture) seems like duplication. But it's difficult.

It was mentioned that using selectors in the URL for POST requests, such as 
POST /content/page.createChild.html, is not RESTful. Is that really the case? 
As long as the server provides the URL instead of the client building it 
himself, such as path + .createChild.html as it happens way too much, and 
you use the right HTTP methods for changing/deleting content, nothing here 
would be unRESTful afaics.

It would only look nicer if you put all the POST related information into the 
request parameters instead of into the URL. But then it's the old 
action=create topic again, which should be covered very well with the default 
features of the Sling post servlet already, which only requires you to add 
custom code (actions) for very specific things.

This is even less once we have a validation framework in place (also resource 
type based), where Radu did a lot of work already!

Cheers,
Alex


On 02.07.2013, at 15:26, Dominik Süß dominik.su...@gmail.com wrote:

 Well, if locking is just about permission I do agree with ACLs being the
 right solution (the permission set on the node itself might be sufficient
 for that case) - if it is about businessconstraints that need to be
 fullfilled an ACL cannot solve this requirement[0]. This is why validation
 and so on should be performed first, I would think of a pipeline having a
 contract on each phase what can be done and what cannot be done, while a
 first phase might not write any data (even as transient changes) the next
 phase might be perform (transient) change, then the postoperations would be
 performed in a transient followed by another phase that might perform
 transient changes and/or stop the processing, followed by a last phase that
 is called after the resourceResolve has performed a commit().
 
 This is purely about giving developers a contract on what they can and
 cannot do (and therefore what they can expect 3rd party code to do) at a
 specific point in this pipeline.
 
 [0] a businessconstraint to control sepecific operations by permissions
 could be solved by a shadowstructure like proposed by Bertrand.
 
 --
 Dominik
 
 
 On Tue, Jul 2, 2013 at 2:47 PM, Bertrand Delacretaz
 bdelacre...@apache.orgwrote:
 
 On Tue, Jul 2, 2013 at 2:38 PM, Dominik Süß dominik.su...@gmail.com
 wrote:
 Facing some questions about how to prevent the SlingPostServlet to be
 able
 to perform a change I had a closer look at the current implementation and
 it looks like there is currently no secure way of doing that beside
 locking the target on persistancelevel (alias setting ACLs)...
 
 ...which looks to me like the right way of locking things.
 
 But maybe for the post servlet we need a parallel structure to define
 who's allowed to do what. You could for example have
 
  /user-rights/sling/post-servlet/post/content/foo
 
 and whoever's allowed to read that is allowed to post to /content/foo,
 barring other ACL limitations.
 
 Just thinking outloud mostly...my point is that any security-related
 stuff should be driven by ACLs, and in some case indirect ACLs can
 be useful.
 
 -Bertrand
 



Re: Sling Posthandling - thougts about the current behavior

2013-06-28 Thread Daniel Platon
Hi everyone,

I stand corrected, such a feature would not remove the SlingServlets
entirely from the picture, since they are still needed for GET requests.

+1 for the pipeline of operations concept.

__
Dan




--
View this message in context: 
http://apache-sling.73963.n3.nabble.com/Sling-Posthandling-thougts-about-the-current-behavior-tp4024713p4024751.html
Sent from the Sling - Dev mailing list archive at Nabble.com.


Re: Sling Posthandling - thougts about the current behavior

2013-06-28 Thread Dominik Süß
As far as I got it right most agree that it would be great to have an
optimized way to utilize the SlingPostServlet.
I also +1 the idea of having a pipeline with different stages of
processing  where a dev can hook in based on some criteria (like
resourcetype, path, extension and so on) to be able to break down the
processing in the various aspects and therefore be able to implement
reusable parts.

There also where some concerns about having this as the only way of
posting. And I also +1 that the support of custom Servlets should be
optimized anyway and not be dropped. If a developer decides to get rid of
this pipeline and taking care of all the aspects on his own he should be
free to do that. In this case he would (intentionally) lose all the
implicit logic provided by the SlingPostServlet and is completely on his
own just having the SlingHttpServletResquest  Response like for the GET
Servlets.

I think the next step would be to define the pipeline, the serverside logic
that is applied on each step and the criteteria that shall be available to
register the extensions. An interesting aspect of that is transactional
behavior (like preventing session.save() up to a certain point  in the
pipeline to have a contract how long the data in any case is just in a
transient state).

Another idea that came into my mind on validation is the possiblity to have
the post params returned in an annotated response that allows the client to
resolve the problems and resubmit this (like Oak will be able to return
such Conflictannotations on Concurrent Changes on a node). And this could
also be used to implement multistepforms that need to be verified on the
intermediate steps without actually persisting something (creating a
restfull multistep form that way).

WDYT?
Dominik




On Fri, Jun 28, 2013 at 8:51 AM, Daniel Platon dpla...@gmail.com wrote:

 Hi everyone,

 I stand corrected, such a feature would not remove the SlingServlets
 entirely from the picture, since they are still needed for GET requests.

 +1 for the pipeline of operations concept.

 __
 Dan




 --
 View this message in context:
 http://apache-sling.73963.n3.nabble.com/Sling-Posthandling-thougts-about-the-current-behavior-tp4024713p4024751.html
 Sent from the Sling - Dev mailing list archive at Nabble.com.



Re: Sling Posthandling - thougts about the current behavior

2013-06-28 Thread Felix Meschberger
Hi

Thanks Dominik for bringing this up. I really like the direction this 
discussion is taking.

We really learned a lot about the Sling POST Servlet since we first created it 
and it is probably time for a complete rearchitecture.

 If we can also consider the post servlet as a pipeline of operations
 (validate, pre-process, store etc.) we'd have a flexible mechanism
 where you can avoid registering too many global things.

A Pipeline sounds great.

As for validation: This is something we are sourely lacking in Sling anyway. I 
think input validation is definitely something which should be part of the 
default Sling POST Servlet processing. But it should also be a feature, which 
is available independently for those cases, where the POST request is fully 
handled outside of the POST servlet.

 I have long thought SlingPostOperations should be registered against the
 resource type in the same way SlingServlets are registered against a
 resource type.

+1 I think all extension points for the POST servlet (as well as the future 
input validation framework) should be configurable with a resource type.

 I also +1 the idea of having a pipeline with different stages of
 processing  where a dev can hook in based on some criteria (like
 resourcetype, path, extension and so on) to be able to break down the
 processing in the various aspects and therefore be able to implement
 reusable parts.

But I think neither the request selectors nor the request extension should be 
taken into account. The request URL should solely be addressing the resource 
and -- as a compromise to not being able to fully influence the Accept request 
header -- the resource representation. It should never contain request methods.

Taking the resource path into consideration is interesting, though: For now we 
completely ignore the resource path in any resolution of scripts, filters and 
servlets. I fully agree, it may make sense for POST processing and for filters. 
But, would it maybe also make sense for general script and servlet resolution ? 
And if so, how ? (please spawn a new thread if you want to discuss this, thanks)


Regards
Felix

Am 28.06.2013 um 11:15 schrieb Dominik Süß:

 As far as I got it right most agree that it would be great to have an
 optimized way to utilize the SlingPostServlet.
 I also +1 the idea of having a pipeline with different stages of
 processing  where a dev can hook in based on some criteria (like
 resourcetype, path, extension and so on) to be able to break down the
 processing in the various aspects and therefore be able to implement
 reusable parts.
 
 There also where some concerns about having this as the only way of
 posting. And I also +1 that the support of custom Servlets should be
 optimized anyway and not be dropped. If a developer decides to get rid of
 this pipeline and taking care of all the aspects on his own he should be
 free to do that. In this case he would (intentionally) lose all the
 implicit logic provided by the SlingPostServlet and is completely on his
 own just having the SlingHttpServletResquest  Response like for the GET
 Servlets.
 
 I think the next step would be to define the pipeline, the serverside logic
 that is applied on each step and the criteteria that shall be available to
 register the extensions. An interesting aspect of that is transactional
 behavior (like preventing session.save() up to a certain point  in the
 pipeline to have a contract how long the data in any case is just in a
 transient state).
 
 Another idea that came into my mind on validation is the possiblity to have
 the post params returned in an annotated response that allows the client to
 resolve the problems and resubmit this (like Oak will be able to return
 such Conflictannotations on Concurrent Changes on a node). And this could
 also be used to implement multistepforms that need to be verified on the
 intermediate steps without actually persisting something (creating a
 restfull multistep form that way).
 
 WDYT?
 Dominik
 
 
 
 
 On Fri, Jun 28, 2013 at 8:51 AM, Daniel Platon dpla...@gmail.com wrote:
 
 Hi everyone,
 
 I stand corrected, such a feature would not remove the SlingServlets
 entirely from the picture, since they are still needed for GET requests.
 
 +1 for the pipeline of operations concept.
 
 __
 Dan
 
 
 
 
 --
 View this message in context:
 http://apache-sling.73963.n3.nabble.com/Sling-Posthandling-thougts-about-the-current-behavior-tp4024713p4024751.html
 Sent from the Sling - Dev mailing list archive at Nabble.com.
 



Re: Sling Posthandling - thougts about the current behavior

2013-06-28 Thread Radu Cotescu
Something might come up this afternoon for SLING-2803 [1]. :)

[1] - https://issues.apache.org/jira/browse/SLING-2803


 As for validation: This is something we are sourely lacking in Sling
 anyway. I think input validation is definitely something which should be
 part of the default Sling POST Servlet processing. But it should also be a
 feature, which is available independently for those cases, where the POST
 request is fully handled outside of the POST servlet.



Re: Sling Posthandling - thougts about the current behavior

2013-06-28 Thread Felix Meschberger
Hi Radu

That would be great ! Thanks.

Regards
Felix

Am 28.06.2013 um 12:49 schrieb Radu Cotescu:

 Something might come up this afternoon for SLING-2803 [1]. :)
 
 [1] - https://issues.apache.org/jira/browse/SLING-2803
 
 
 As for validation: This is something we are sourely lacking in Sling
 anyway. I think input validation is definitely something which should be
 part of the default Sling POST Servlet processing. But it should also be a
 feature, which is available independently for those cases, where the POST
 request is fully handled outside of the POST servlet.
 



Re: Sling Posthandling - thougts about the current behavior

2013-06-27 Thread Bertrand Delacretaz
On Thu, Jun 27, 2013 at 12:52 AM, Ian Boston i...@tfd.co.uk wrote:
 ...I have long thought SlingPostOperations should be registered against the
 resource type in the same way SlingServlets are registered against a
 resource type

Absolutely - there are other things (validation etc.) where we would
benefit from using a similar same resource - X resolution that we
have for resource - servlet, so we should generalize the mechanism.

If we can also consider the post servlet as a pipeline of operations
(validate, pre-process, store etc.) we'd have a flexible mechanism
where you can avoid registering too many global things.

-Bertrand


RE: Sling Posthandling - thougts about the current behavior

2013-06-27 Thread Jeff Young
+1

That would be very nice.

Jeff.


 -Original Message-
 From: Bertrand Delacretaz [mailto:bdelacre...@apache.org]
 Sent: 27 June 2013 08:26
 To: dev@sling.apache.org
 Subject: Re: Sling Posthandling - thougts about the current behavior
 
 On Thu, Jun 27, 2013 at 12:52 AM, Ian Boston i...@tfd.co.uk wrote:
  ...I have long thought SlingPostOperations should be registered against the
  resource type in the same way SlingServlets are registered against a
  resource type
 
 Absolutely - there are other things (validation etc.) where we would
 benefit from using a similar same resource - X resolution that we
 have for resource - servlet, so we should generalize the mechanism.
 
 If we can also consider the post servlet as a pipeline of operations
 (validate, pre-process, store etc.) we'd have a flexible mechanism
 where you can avoid registering too many global things.
 
 -Bertrand


Re: Sling Posthandling - thougts about the current behavior

2013-06-27 Thread Daniel Platon
Hi everyone,

Although I don't have that much experience with Sling, I'd +1 any feature
that allows the developer to attach behaviour to content (at least this is
what a PostProcessor sounds to me). I made extensive use of such a feature
when I use to developer content management application on Documentum.

Also, I think such a feature would make binding the SlingServlets to
resource type obsolete...
_
Dan





--
View this message in context: 
http://apache-sling.73963.n3.nabble.com/Sling-Posthandling-thougts-about-the-current-behavior-tp4024713p4024725.html
Sent from the Sling - Dev mailing list archive at Nabble.com.


Re: Sling Posthandling - thougts about the current behavior

2013-06-27 Thread Bertrand Delacretaz
On Thu, Jun 27, 2013 at 2:03 PM, Daniel Platon dpla...@gmail.com wrote:
 ...I think such a feature would make binding the SlingServlets to
 resource type obsolete...

Now you got my attention...but you'll need to clarify your use case
and ideas I guess ;-)

-Bertrand


Re: Sling Posthandling - thougts about the current behavior

2013-06-26 Thread Ian Boston
Hi,
I have long thought SlingPostOperations should be registered against the
resource type in the same way SlingServlets are registered against a
resource type.

If the operation requested is not found against the resource type then the
parent resource types are tried until the global scope. That will give
operations like move becoming meaningless in anything other than the global
context. I dont think it would that hard to do, Sling already has a
resource type hierarchy and extension mechanism.

Best Regards
Ian


On 26 June 2013 20:35, Dominik Süß dominik.su...@gmail.com wrote:

 Hi everyone,

 within the last weeks I spent some time on a project that is heavily
 relying on data being submitted by users of the system and setting up
 complex structures, users, groups and ACLs based on the operations
 performed by a user. I reallized that a lot of those things could be done
 by utilizing the SlingPostServlet and extending it by custom Postprocessors
 and custom operations. This worked out well but I realized some things that
 I'm not so happy with and would like to start off a discussion how the
 handling of Posts, and therefore the interactive part of Sling could be
 improved.

 Here the points that I think are discussabble:
 a) (non-Brainer) Postoperations and Postprocessors are rarely covered by
 documentation (Postprocessors are marked as TBD) this gives the impression
 of not being ready for productive usage so the gap should be closed
 b) Postoperations and Postprocessors are always defined and called global
 so it is up to the developer to check and skip processing (Blacklisting
 approach) which is errorprone if this manual check is not restrictive
 enough (can lead to subtle regressions in completely different areas of the
 app) - I'd propose to have a declarative approach that is a
 whitelistapproach based on path and propably even by resourceType (here
 comes the clash between posted resourceType and potentially already
 existing resourceType
 c) Sometimes data submitted should just be used as parameters for
 postprocessors or operations and not persisted. Using the dot-slash
 prefixing does give such options, but since the ./ notation acts as kind
 of a magic trigger of behaviour I'd prefer to have a way to annotate such
 fields (like name@ignore or @noPersistance)

 All in all the web is moving in a direction where almost no page is
 delivered with options to interact with the the webpage - so Sling should
 try to give developers the tools to do this wireing without having the dev
 to write boilerplatecode for those checks over and over again and enabling
 them to implement complete interactive userstories up to a certain point of
 complexity in a standardized way.

 WDYT?

 Best regards
 Dominik