I already tried to catch a lot of those when adjusting for the windows absolute paths.
We could add some logic and provide a warning if any absolute paths get through? And the call Resources.fromURL(base, url) … Still we may be getting into a technical detail here. What needs to be changed or clarified; then we can adjust the code to march. On Thu, Jul 13, 2023 at 1:42 AM Niels Charlier <ni...@scitus.be> wrote: > In theory I agree but there is always a risk to changing lenient behavior > to throwing exceptions, if there is code or production configs that have > relied on paths starting with '/' just passing as relative... > On 11/07/2023 22:27, Jody Garnett wrote: > > Thanks: > > Reading the docs, it is *okay* but not *great*. > > I think we we made it so the ResourceStore implementations fail when > provided an absolute path it would be best; and remove the test case that > is causing problem. > > That way only Resources.fromURL(base, url) would support "absolute" paths > and life would be more clear? > -- > Jody Garnett > > > On Jul 9, 2023 at 10:53:22 PM, Niels Charlier <ni...@scitus.be> wrote: > >> Hello Jody, >> >> My comment about deprecating the file() was in response to what Gabriel >> said about that. >> >> Resource: urls are indeed for instance supported by SLD, if you want to >> link to a resource inside your data directory / resource store. But I think >> they can be used about anywhere where file: or other URLs are supported. As >> the javadoc for Resources.fromURL says: relative file: URLs are deprecated, >> use resource: instead. I don't know why they were never documented. >> >> Kind Regards >> >> Niels >> On 07/07/2023 16:48, Jody Garnett wrote: >> >> Niels, >> >> I do not understand the comment about deprecating the file() method? I >> agree with everything you said about how it is used and useful. >> >> I am not sure when resource URLs were added, I thought they were only >> added to pass information over to geotools side of things for SLD >> validation and did not expect to see them used directly in any user >> configuration. I guess we could talk resource: URL here in the developers >> docs explicitly. Do we know who wrote that (I hope it was not me). >> >> Still let's take this discussion and update the docs and API. >> -- >> Jody Garnett >> >> >> On Jul 5, 2023 at 11:48:50 PM, Niels Charlier <ni...@scitus.be> wrote: >> >>> Hello Gabriel and Jody, >>> >>> I agree with most of what Gabriel says, it is mainly the same point as >>> mine except that I think it is unrealistic to deprecate the file() method. >>> First of all we would need to to move the resource API to geotools because >>> SLD files are stored in the resource store, but there are still tertiary >>> tools that require files like template and image processors. The idea is >>> that the file created on disk is only a cache for these tertiary tools and >>> manipulating it will have no effect. >>> >>> Jody, most of the docs seem fine, except that the second blue box >>> explanation for 'path' is confusing paths with URLs: 'file:/' URLs are >>> not part of the resourcestore and resource rest API, and the other problems >>> is that docs are missing any mention of the "resource:" URLs. We must >>> first of all distinguish between (1) resourcestore API and (2) >>> Resources.fromURL method, I think there might be some confusion there. Then >>> the distinction between file: and resource: urls need to be in the docs. >>> >>> The (1) Resourcestore does not deal with URLs or absolute paths, only >>> relative paths. Internally, geoserver modules load their configuration >>> files in the resource store directly from this API. >>> >>> The (2) Resources.fromURL deals with URLS and can handle both absolute >>> file paths and resources from the resourcestore using the 'resource:' >>> protocol prefix. This is for external use: the purpose is so that people >>> can refer to both files on disk and resources in the resource store >>> wherever they can specify a URL, for instance inside style files or in the >>> parameters of a data store. File: URLs is for the entire file system, not >>> the data directory and get 'converted' to a resource using the >>> Files.asResource wrapping method. Resource: URLs refer to anything in the >>> data directory or alternative resource store. >>> >>> As legacy from pre-resourcestore times, geoserver supports (supported?) >>> 'file:' URLs relative to the data directory (this is a little bit 'dodgy' >>> since 'file:' urls are standardized and do not paths without leading slash >>> - https://en.wikipedia.org/wiki/File_URI_scheme ). Note that the >>> Resources.fromURL javadoc says this is deprecated and should be replaced >>> with resource: URLs. >>> >>> Kind Regards >>> >>> Niels >>> On 05/07/2023 15:06, Jody Garnett wrote: >>> >>> Hey folks, I was tired and not in position to act clearly when these >>> gaps were noticed last year. >>> >>> We can tighten up the api definition, at least with the changes made we >>> can now notice when an absolute path was used. >>> >>> I never quite managed to communicate the separation between using a file >>> URL and File access (when DataStores wish to access local files) as >>> distinct from use of a resource for managing configuration files. >>> >>> I suspect you both (Niels and Gabe) have met this distinction first >>> hand - but it is hard to explain the value. >>> >>> Documentation is as added here: >>> >>> https://docs.geoserver.org/latest/en/developer/programming-guide/config/resource.html >>> >>> This could your review and input. >>> >>> Jody >>> >>> On Wed, Jul 5, 2023 at 2:34 PM Gabriel Roldan <gabriel.rol...@gmail.com> >>> wrote: >>> >>>> If "the codebase had drifted away from the intended use over time" I >>>> think it's even more important to stick to the contract and not the other >>>> way around. >>>> As far as I can see, there are two abstractions, ResourceStore and >>>> Resource, the former clearly says >>>> "This abstraction assumes a unix like file system, all paths are >>>> relative and use forward slash {@code /} as the separator", >>>> the latter "Resource used for configuration storage.". >>>> Only by adhering to this contract, we could provide alternative >>>> implementations. >>>> So if the changes were made to accommodate "common usage" on the >>>> specific case of a filesystem-based ResourceStore >>>> implementation, it should be the other way around, to find out usages >>>> that don't adhere to the spec and fix them. >>>> >>>> Concretely, I _think_ the only place where absolute URI's would be >>>> requested to the ResourceStore, is where a data, not configuration, >>>> file, is resolved, expecting the ResourceStore to be smart and resolve >>>> "file:data/roads.shp" relative to the datadir, and >>>> "file:/data/roads.shp" >>>> relative to the file system. >>>> Now, in doing so, we're asking the ResourceStore to do what it's not >>>> intended to. The test case Niels mentioned used to check that a leading "/" >>>> had no meaning for the resource store (i.e. /data/roads.shp == >>>> data/roads.shp), and that was changed to mean the opposite. >>>> So, IMHO, the responsibility of resolving files outside the datadir >>>> shouldn't be on ResourceStore, but on the client code. Something like: >>>> >>>> String path = ... >>>> File shp; >>>> if(Paths.isAbsolute(path)) >>>> shp = new File(path); >>>> else >>>> shp = resourceStore.get(path).file(); >>>> >>>> As a matter of fact, Resource.file():java.io.File should be deprecated >>>> and eventually removed. Resource is for config contents and >>>> has Resource.in():InputStream and Resource.out():OutputStream. >>>> >>>> It is hard enough already to adhere to lax interface contracts >>>> (catalog's default workspace hello) as to keep on making it more and more >>>> difficult. >>>> >>>> So what do we do? can we get to an agreement that the contract in the >>>> interfaces is mandatory and work from there? >>>> >>>> cheers, >>>> On Tue, 4 Jul 2023 at 17:49, Niels Charlier via Geoserver-devel < >>>> geoserver-devel@lists.sourceforge.net> wrote: >>>> >>>>> Hello Jody, >>>>> >>>>> Yes, I admit it's my own fault for missing this discussion at the >>>>> time. >>>>> >>>>> I think it would be a shame to let the codebase further drift away >>>>> from the intended use of the resource store. We have done the work to make >>>>> the entirety of geoserver generic with respect to the implementation of >>>>> the >>>>> data directory and it is only a minimal effort to keep it this way. Even >>>>> though jdbc store is still a community module and the Redis based >>>>> geoserver >>>>> project has been discontinued, it has been proven that alternative >>>>> implementations for the data directory work and the jdbc store module is >>>>> actually being used in production successfully. >>>>> >>>>> Now, interestingly, I have discovered that there are contradictions in >>>>> how it works / is documented now. >>>>> >>>>> - I discovered that while 'theoryRootIsAbsolute' test is successful, >>>>> it is actually very misleading. At least on linux, paths starting with '/' >>>>> *still create a file relative to the data directory*!. The only difference >>>>> is the string returned by the path() method. So while the path might seem >>>>> absolute, the file you are accessing is not. So the path() method is >>>>> misleading and in reality the leading slash is still being ignored (again, >>>>> at least on linux). >>>>> >>>>> - Note that the javadoc of ResourceStore still says: >>>>> >>>>> This abstraction assumes a unix like file system, *all paths are >>>>> relative* >>>>> >>>>> There it says it: all paths are relative for the resourcestore. >>>>> Absolute paths have no meaning or function when it comes to the resource >>>>> store. >>>>> >>>>> - I think this contradiction could be resolved in two possible ways: >>>>> >>>>> 1) the test 'theoryIsRootSlashIsIgnored' should come back instead of >>>>> 'theoryRootIsAbsolute'. The root slash is ignored and removed from the >>>>> path. >>>>> >>>>> 2) The resource store throws an exception when you ask for an absolute >>>>> path. >>>>> >>>>> Either way, all absolute paths should be handled *outside of* the >>>>> ResourceStore, for instance by calling Files.asResource(). So problems >>>>> with >>>>> absolute paths in the rest service should be resolved in the rest service, >>>>> or some other layer that is used by the rest service. >>>>> Kind Regards >>>>> Niels >>>>> >>>>> On 04/07/2023 21:59, Jody Garnett wrote: >>>>> >>>>> Hello Niels, >>>>> >>>>> The PRs for this activity contain extensive discussion. >>>>> >>>>> The fundamental issue was the handling of absolute paths which was >>>>> done differently by different sections of code. Specifically we found >>>>> that >>>>> the REST API endpoint was allowing paths *//data* and */data *to both >>>>> reference content in the data directory, rather than treating the first >>>>> one >>>>> as an absolute path. In response we tightened up the javadocs and added >>>>> test cases including the one you mentioned. >>>>> >>>>> I agree that this goes against the goal of resource store, but the >>>>> codebase had drifted away from the intended use over time. >>>>> >>>>> Now that you are present in the discussion it would be a good >>>>> opportunity to discuss this with the parties involved. >>>>> -- >>>>> Jody Garnett >>>>> >>>>> >>>>> On Jul 3, 2023 at 2:50:02 PM, Niels Charlier <ni...@scitus.be> wrote: >>>>> >>>>>> Hello Jody and others, >>>>>> >>>>>> I am having trouble understanding the changes that were made about 6 >>>>>> months ago to the ResourceStore's expected behaviour. >>>>>> >>>>>> In particular, in the class >>>>>> 'org.geoserver.platform.resource.ResourceTheoryTest', >>>>>> the unit test 'theoryRootSlashIsIgnored' was replaced by >>>>>> 'theoryRootIsAbsolute'. I cannot make sense out of this theory test at >>>>>> all. >>>>>> >>>>>> >>>>>> This seems to be entirely contradictory to the whole reason that the >>>>>> ResourceStore API was created, that is to make an abstraction of the >>>>>> *Data >>>>>> Directory*, so that it can be replaced by something else (such as >>>>>> jdbc store or other implementations that have been made). There was >>>>>> already support for absolute file paths in all circumstances by using >>>>>> "file:" URLs. This will bypass the resource store and call >>>>>> Files.asResource >>>>>> instead. But resource: URLs are for the data directory or alternative >>>>>> resource store only. How does it make sense to get absolute paths >>>>>> from the resource store? >>>>>> >>>>>> >>>>>> In order to make jdbc-config pass the tests, I will have to turn off >>>>>> this particular method. But why should the test even be there if the file >>>>>> resource store is the only one that could ever support it? Programmers >>>>>> and >>>>>> users will rely on this behaviour and support for all alternative >>>>>> implementations of ResourceStore will be broken. In this case we may as >>>>>> well do away with the API and just use the file system directly again. >>>>>> >>>>>> Kind Regards >>>>>> >>>>>> Niels >>>>>> >>>>> _______________________________________________ >>>>> Geoserver-devel mailing list >>>>> Geoserver-devel@lists.sourceforge.net >>>>> https://lists.sourceforge.net/lists/listinfo/geoserver-devel >>>> >>>> >>>>> >>>> >>>> -- >>>> Gabriel Roldán >>>> >>> -- >>> -- >>> Jody Garnett >>> >>> -- -- Jody Garnett
_______________________________________________ Geoserver-devel mailing list Geoserver-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geoserver-devel