solid-client-js icon indicating copy to clipboard operation
solid-client-js copied to clipboard

inrupt.com does not accept application/ld+json

Open scenaristeur opened this issue 4 years ago • 8 comments

inrupt.com does not accept application/json+ld as mimetype, only application/json

shouldn't Entreprise inrupt server accept application/json+ld ?

      try{
        const savedFile = await overwriteFile(
          n['ve:url'],
          new Blob([JSON.stringify(n, undefined, 2)], { type: "application/json" }),
          { contentType: "application/json", fetch: sc.fetch }
          // new Blob([JSON.stringify(n, undefined, 2)], { type: "application/ld+json" }),
          // { contentType: "application/ld+json", fetch: sc.fetch }
        );
        console.log(`File saved at ${getSourceUrl(savedFile)}`);
        //n.url = await getSourceUrl(savedFile)
        //  store.dispatch('nodes/saveNode', n)
        return n
      }catch(e){
        console.log(e)
      }

the app https://scenaristeur.github.io/verse/ the code https://github.com/scenaristeur/verse/blob/e2e7f4c895d62222d33eee6d05e6033c2c96e36c/src/plugins/solid-data.js#L55

Capture du 2021-12-20 10-06-37 Capture du 2021-12-20 10-05-55

scenaristeur avatar Dec 20 '21 09:12 scenaristeur

The mime-type application/json+ld is not valid. Perhaps you mean application/ld+json?

acoburn avatar Dec 20 '21 13:12 acoburn

@acoburn sorry a miss-copy. i've got ld+json in the code, fixed in the issue

scenaristeur avatar Dec 20 '21 14:12 scenaristeur

@scenaristeur the server may not support arbitrary external contexts. If you must use JSON-LD for writes, try embedding the context in the data payload.

acoburn avatar Dec 20 '21 14:12 acoburn

is there a list of compatible / not arbitrary external contexts ?

scenaristeur avatar Dec 21 '21 10:12 scenaristeur

@acoburn I just saw this, and, I'm wondering why ESS would care about the contentType of a file? (i.e., arbitrary blob of data) — the code above is using overwriteFile

ThisIsMissEm avatar Mar 02 '22 23:03 ThisIsMissEm

In order to support content negotiation (per Solid protocol) for RDF resources, if a client uploads a JSON-LD document and then tries to content negotiate the representation as Turtle, the server necessarily has to download the (arbitrary) context URL.

A client forcing a server to download arbitrary resources on the web is a classic example of Server Side Request Forgery. Without any sort of allow list of the remote context documents, you can use your imagination for the kinds of exploits that are possible here.

acoburn avatar Mar 02 '22 23:03 acoburn

In order to support content negotiation (per Solid protocol) for RDF resources, if a client uploads a JSON-LD document and then tries to content negotiate the representation as Turtle, the server necessarily has to download the (arbitrary) context URL.

A client forcing a server to download arbitrary resources on the web is a classic example of Server Side Request Forgery. Without any sort of allow list of the remote context documents, you can use your imagination for the kinds of exploits that are possible here.

Right, but here we're working with a File not a Resource. Though I've just checked the spec and it doesn't seem to differentiate, though our SDK definitely does.

if I upload a File that's an image/png, would it make sense that you would content-negotiate it to turtle? That seems like it'd be asking for trouble?

ThisIsMissEm avatar Mar 03 '22 12:03 ThisIsMissEm

JSON-LD is an RDF resource. Unless you are uploading that with Content-Type: text/plain or Content-Type: application/octet-stream, that resource will be treated as RDF. Therefore, a client can content negotiate it. This is unrelated to PNGs.

The client may distinguish between Files and Resources, but from a server's perspective, there are two indicators: HTTP Method (e.g., PUT) and Content-Type (e.g., application/ld+json). Given a PUT with application/ld+json, it's an RDF resource, regardless of what the SDK may think it is.

acoburn avatar Mar 03 '22 13:03 acoburn