Carlo, Thanks for your detailed testing and thinking about this problem.
1. Given the results, is it a bug? > Am I correct in thinking that the given endpoint cannot be used for editing; or is it possible to update the entire file in one go and have it preserve order? If the existing endpoint cannot be used with POST or PUT then I would consider this a bug to be fixed. There may also be a second bug: Andrea is correct about the JSON representation not providing a list to represent order as significant. This may be the point to do a breaking change for the JSON representation. 2. Should I open a ticket or we should reopen the previous one? > I think it would be kinder to reopen the previous ticket; so it is clear that the attempted fix does not work. 3. I see a function which is intentionally limiting only to ADMIN role > these kind of calls checkUserIsAdmin(); > Are you seeking to setup a new built-in role? In my thinking a user having admin access grants ability to update the system (it should not matter if they are using the REST API or the Admin Console). -- Jody Garnett On Oct 26, 2023 at 10:51:11 AM, carlo cancellieri < geo.ccancelli...@gmail.com> wrote: > Dear Andrea and List, > thank you for your reply and your explanations. > > Unfortunately we've *tested all the *documented* combinations* (json, > xml) with no luck over the *geoserver** main branch or releases 2.17.2 > and 2.23.2*. > Let me share an example: > > Given a default* rest.properties:* > ----------------------------------------------------------- > /**;POST,DELETE,PUT=ADMIN > /**;GET=ADMIN > ----------------------------------------------------------- > > performing a *POST with XML* body (same will happen with json): > > curl -X *POST* > http://localhost:8080/geoserver/rest/rest/security/acl/rest.xml -H > "accept: application/json" -H "content-type: application/xml" -u > admin:geoserver -d " > <rules> > *<rule resource="/xyz/**:GET">ROLE_AUTHENTICATED</rule>* > </rules>" > > The *resulting rest.properties* file looks correct as the order is > respected: > ----------------------------------------------------------- > /**;POST,DELETE,PUT=ADMIN > /**;GET=ADMIN > */xyz/**;GET=ROLE_AUTHENTICATED* > ----------------------------------------------------------- > The rule is appended to the end as expected and looks correct. > > Performing a *POST with XML* body like below (same will happen with json) > everything changes: > > curl -X *POST* > http://localhost:8080/geoserver/rest/rest/security/acl/rest.xml -H > "accept: application/json" -H "content-type: application/xml" -u > admin:geoserver -d " > <rules> > *<rule resource="/abc/**:GET">ROLE_AUTHENTICATED</rule>* > </rules>" > > *Example 2*: - Pushing a new rule in *the rest.properties* file: > ----------------------------------------------------------- > /**;POST,DELETE,PUT=ADMIN > * /abc/**;GET=ROLE_AUTHENTICATED* > /**;GET=ADMIN > /xyz/**;GET=ROLE_AUTHENTICATED > ----------------------------------------------------------- > It goes in the middle, so it is not appended anymore to the end (should be > the key natural order but I'm not sure). > > *Example 2*: - Manually fixing the order in *the rest.properties* file > (before the rest call): > ----------------------------------------------------------- > /abc/**;GET=ROLE_AUTHENTICATED > /xyz/**;GET=ROLE_AUTHENTICATED > /**;GET=ADMIN > /**;POST,DELETE,PUT=ADMIN > ----------------------------------------------------------- > > Then performing a *PUT with XML* body to update a rule: > > curl -X PUT > http://localhost:8080/geoserver/rest/rest/security/acl/rest.xml -H > "accept: application/json" -H "content-type: type: application/xml" -u > admin:geoserver -d " > <?xml version=\"1.0\" encoding=\"UTF-8\"?> > <rules> > *<rule resource=\"/abc/**:GET\">ROLE_AUTHENTICATED,TEST</rule>* > </rules>" > > The *resulting rest.properties file is rewritten *messing up the work > done manually > ----------------------------------------------------------- > /**;POST,DELETE,PUT=ADMIN > /abc/**;GET=ROLE_AUTHENTICATED > /**;GET=ADMIN > /xyz/**;GET=ROLE_AUTHENTICATED,*TEST* > ----------------------------------------------------------- > > TEST role is added to the rule but the *order is changed again*! > > For reference from the openapi documentation page: > https://docs.geoserver.org/latest/en/api/#1.0.0/security.yaml > > In the patch I'm preparing I was thinking about fixing the situation by > adding an additional endpoint as you (Andrea) suggested. > > */security/acl/rest/update* > > Performing a PUT on the rest (the above) endpoint the user may be able to > send the entire properties file content updating the current rest resource > (inserting, appending, deleting and updating in one call). > > This will allow people with rights to /security/acl/rest to properly > update the rest.properties file in the way they prefer to respect the order > and being able to also *insert,* not only to append to the end making the > management of the *rest* resource easier and the update operation atomic. > > Example: > > Given the following rest.properties file, we want to insert something > after row 2 > --------------------------- > /rest/**;GET=ROLE_AUTHENTICATED > /**;POST,DELETE,PUT=ADMIN > /**;GET=ADMIN > --------------------------- > > We can get the entire file with a GET and than insert the row in the body > resending the whole body updated: > curl -X *PUT* > http://localhost:8080/geoserver/rest/rest/security/acl/rest.xml -H > "accept: application/json" -H "content-type: type: application/xml" -u > admin:geoserver -d " > <?xml version=\"1.0\" encoding=\"UTF-8\"?> > <rules> > <rule resource=\"/rest/**:GET\">ROLE_AUTHENTICATED</rule> > *<rule resource=\"/rest/**:PUT,POST,DELETE\">ROLE_AUTHENTICATED</rule>* > <rule resource=\"/**:POST,DELETE,PUT\">ADMIN</rule> > <rule resource=\"/**:GET\">ADMIN</rule> > </rules>" > > Will result in: > --------------------------- > /rest/**;GET=ROLE_AUTHENTICATED > */rest/**;**PUT,**POST,DELETE=ROLE_AUTHENTICATED* > /**;POST,DELETE,PUT=ADMIN > /**;GET=ADMIN > --------------------------- > > This is the branch with the changes I was planning to do a lot more: > - checking roles during the load from the rest file or api to validate > that the role already exists > - filter by the ROLE so an user can only modify the rules where the role > is applied > - file upload endpoint > - provide an interface > > This is why a big chunk of the work has been pushed into a dedicated class > to better represent, validate and manage the model content (AntRule). > Here is a diff against the geoserver master, all the old tests are > running, I'm only missing the new endpoint test which will come. > > > https://github.com/geoserver/geoserver/compare/main...ccancellieri:geoserver:rest_access_rule_editing > > I'm open to implement the tests and document as well as change the current > implementation. > I'd love to have an endpoint to update the rest configuration. > > Questions: > 1. Given the results, is it a bug? > 2. Should I open a ticket or we should reopen the previous one? > 3. I see a function which is intentionally limiting only to ADMIN role > these kind of calls checkUserIsAdmin(); this is also affecting us as we > would like to use a MNG group to manage rest permissions which may not be > entitled to do all the rest ADMIN can do, so I'm trying to inherit MNG from > GROUP_ADMIN but even doing this the check is not allowing an user of MNG to > work under /security/acl/... how can this better managed? > > *NOTE*: using the main branch I'm seeing that sometimes changing the > group permission from the UI a tomcat restart is required to make changes > effective while in the past we used it with no issue afaik. > > Best, > C. > > > > Il giorno mer 25 ott 2023 alle ore 00:28 Andrea Aime < > andrea.a...@geosolutionsgroup.com> ha scritto: > >> Hi Carlo, >> I can confirm that all PUT operations in the whole GeoServer API have >> been operating like PATCH since day one (around 2007?), >> the ACL one is no exception. There is no way to fully overwrite any >> resource like a PUT would do. >> To achieve what you want you'd first have to delete everything and then >> start over.... to be honest I don't see an easy way to do that. >> >> Maybe modify the controller method for PUT to have a new "replace" mode >> as a query parameter? >> Currently it just seems to be trying to locate existing rules that match >> and update them, which means, it would preserve the order of the rules as >> they were in the file, rather than the one you provided. >> >> Also about the ordering... are you using JSON or XML? Remember that JSON >> is not order preserving, a representation >> like this one has no order by definition (a JSON object is "an unordered >> collection of zero or more name/value pairs"): >> >> { >> "/**:GET":"ADMIN", >> "/**:POST,DELETE,PUT":"ADMIN" >> } >> >> while this one does have order instead (by XML definition): >> >> <rules> >> <rule resource="/**:GET">ADMIN</rule> >> <rule resource="/**:POST,DELETE,PUT">ADMIN</rule> >> </rules> >> >> The default JSON representation of this resource really does not make >> sense for this use case, should be a list.... using Map in the backend is >> not a good fit for this case. >> >> Cheers >> Andrea >> >> On Tue, Oct 24, 2023 at 11:07 PM carlo cancellieri < >> geo.ccancelli...@gmail.com> wrote: >> >>> Dear List, >>> looking for a REST api to update the rest.properties file I'm using the >>> features provided by: >>> https://github.com/geoserver/geoserver/wiki/GSIP-120 >>> >>> Unfortunately it seems that it's still affected by the ordering problem. >>> I see it should be solved here >>> https://osgeo-org.atlassian.net/browse/GEOS-5139 >>> but I'm testing the main branch now and every time a post is >>> performed the order of the file is messed up and all the settings (in terms >>> of rule ordering) are lost. >>> >>> In addition to that it's not possible to operate with a real PUT >>> operation replacing all the rules, it looks like it has been implemented >>> more like a PATCH where only existing rules can be updated with a PUT. >>> >>> I've a branch with some ideas which is trying to address all the >>> problems with minimum changes but I'm still confused about this rest api, >>> and I don't want to go too far if this is not an issue.... >>> >>> I'd love to have the confirmation that this is still an open issue or >>> I'm doing something wrong. >>> >>> Thank you all. >>> >>> Best, >>> Carlo >>> >>> -- >>> Carlo Cancellieri >>> *Skype*: ccancellieri >>> *Twitter*: @cancellieric >>> *LinkedIn*: http://it.linkedin.com/in/ccancellieri/ >>> _______________________________________________ >>> Geoserver-devel mailing list >>> Geoserver-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/geoserver-devel >>> >> >> >> -- >> >> Regards, >> >> Andrea Aime >> >> == >> GeoServer Professional Services from the experts! >> >> Visit http://bit.ly/gs-services-us for more information. >> == >> >> Ing. Andrea Aime >> @geowolf >> Technical Lead >> >> GeoSolutions Group >> phone: +39 0584 962313 >> >> fax: +39 0584 1660272 >> >> mob: +39 339 8844549 >> >> https://www.geosolutionsgroup.com/ >> >> http://twitter.com/geosolutions_it >> >> ------------------------------------------------------- >> >> Con riferimento alla normativa sul trattamento dei dati personali (Reg. >> UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si >> precisa che ogni circostanza inerente alla presente email (il suo >> contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è >> riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il >> messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra >> operazione è illecita. Le sarei comunque grato se potesse darmene notizia. >> >> This email is intended only for the person or entity to which it is >> addressed and may contain information that is privileged, confidential or >> otherwise protected from disclosure. We remind that - as provided by >> European Regulation 2016/679 “GDPR” - copying, dissemination or use of this >> e-mail or the information herein by anyone other than the intended >> recipient is prohibited. If you have received this email by mistake, please >> notify us immediately by telephone or e-mail >> > > > -- > Carlo Cancellieri > *Skype*: ccancellieri > *Twitter*: @cancellieric > *LinkedIn*: http://it.linkedin.com/in/ccancellieri/ > _______________________________________________ > Geoserver-devel mailing list > Geoserver-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/geoserver-devel >
_______________________________________________ Geoserver-devel mailing list Geoserver-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geoserver-devel