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
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel

Reply via email to