Thanks. Fair enough indeed. And thanks for sticking with me through the process. I know it's a pain when n00bs like me get involved trying to use bleeding edge code :-) I look forward to the consumer version.
In fact, I have feeling that Kingsley may have found much of what I want at http://dig.csail.mit.edu/2009/mod_authz_webid/README -- ** this might be what you need re. Apache ** . In fact I don't have access to the Apache config on the machine I was using, but I will have a go on a machine I do when I have a minute. If I (or someone else) is successful, a report back with the absolute minimum for doing the whole WebID thing that way would be a nice resource. And of course I would love to see a Wordpress plugin (the Drupal plugin seemed to have to many dependencies for me to even think about writing my first wordpress plugin!) Best Hugh On 9 Aug 2013, at 19:17, Henry Story <[email protected]> wrote: > > On 9 Aug 2013, at 19:34, Hugh Glaser <[email protected]> wrote: > >> Thanks Henry. >> Well I had looked there, but it all looked quite complicated - I have never >> cloned a git thingy before and I don't even know if Java is available on the >> host :-) >> But emboldened by your encouragement I went for the "The short version". >> I was very encouraged, as it seemed to do quite a lot, but seemed to hang >> after getting >> play-2-TLS-e6c58f64585b182f937358fa984474b86984d77d.tar.bz2 >> >> But, even when I tried to do it by hand (the Longer Version), I eventually >> got the java was killed for excessive resource usage. >> By which tim sit had downloaded 427MB of stuff. >> I don't think these are the sort of hosting costs I want to have. >> So I have a sense this is not the solution I was looking for :-) > > Well this is not optimised yet. It's for developers. At the moment you need a > powerful modern machine. I am assuming people here on the Linked Data List > are interested in working with bleeding edge code, and getting an idea of > where things are heading to. > > If you want the couch potatoe version, then you need to wait for > the consumer version. :-) > > >> >> Very best >> Hugh >> >> By the way, the link in "An initial implementation of Linked Data Basic >> Profile" does a 404. >> >> On 9 Aug 2013, at 18:09, Henry Story <[email protected]> >> wrote: >> >>> >>> On 9 Aug 2013, at 18:55, Hugh Glaser <[email protected]> wrote: >>> >>>> Thanks. >>>> I've looked at quite a bit of this stuff, but still don't see where the >>>> ACL document gets stored and used. >>>> >>>> I am beginning to get the sense that I may have to write some code, other >>>> than the ACL rdf to do this. >>>> Surely Apache or something else will do this for me? >>>> Can't I "just" put the ACL in a file (as in htpasswd) and point something >>>> at it? >>>> I certainly don't want to be writing code to make one photo (or simply a >>>> static web site) available. >>>> Or is that the "delegated service" you are talking about? >>>> >>>> I've got my fingers crossed here. >>> >>> You can follow the instructions on installing >>> https://github.com/stample/rww-play >>> (It's under the Apache Licence and patches and contributions are welcome ) >>> >>> Then you'll be able to do the following: >>> >>> An initial implementation of the Linked Data Platform spec is implemented >>> here. The same way as theApache httpd server it servers resource from the >>> file system and maps them to the web. By default we map the test_www >>> directory's content to http://localhost:8443/2013/. >>> >>> The test_www directory starts with a few files to get you going >>> >>> $ cd >>> test_www >>> >>> $ >>> ls -al >>> total 48 >>> drwxr-xr-x 4 hjs admin 340 9 Jul 19:04 . >>> drwxr-xr-x 15 hjs admin 1224 9 Jul 19:04 .. >>> -rw-r--r-- 1 hjs staff 229 1 Jul 08:10 .acl.ttl >>> -rw-r--r-- 1 hjs admin 109 9 Jul 19:04 .ttl >>> lrwxr-xr-x 1 hjs admin 8 27 Jun 20:29 card -> card.ttl >>> -rw-r--r-- 1 hjs admin 167 7 Jul 22:42 card.acl.ttl >>> -rw-r--r-- 1 hjs admin 896 27 Jun 21:41 card.ttl >>> -rw-r--r-- 1 hjs admin 102 27 Jun 22:32 index.ttl >>> drwxr-xr-x 2 hjs admin 102 27 Jun 22:56 raw >>> drwxr-xr-x 3 hjs admin 204 28 Jun 12:51 >>> test >>> All files with the same initial name up to the . are considered to work >>> together, (and in the current implementation are taken care of by the same >>> agent). >>> >>> Symbolic links are useful in that they: >>> >>> • allow one to write and follow linked data that works on the file >>> system without needing to name files by their extensions. For example a >>> statement such as [] wac:agent <card#me> can work on the file system just >>> as well as on the web. >>> • they guide the web agent to which the default representation should be >>> • currently they also help the web agent decide which are the resources >>> it should serve. >>> There are three types of resources in this directory: >>> >>> • The symbolic links such as card distinguish the default resources >>> that can be found by an httpGET on http://localhost:8443/2013/card. Above >>> the card -> card.ttl shows that card has a defaultturtle representation. >>> • Each resource also comes with a Web Access Control List, in this >>> example card.acl.ttl, which set access control restrictions on resources on >>> the file system. >>> • Directories store extra data (in addition to their contents) in the >>> .ttl file. (TODO: not quite working) >>> • Directories also have their access control list which are published >>> in a file named .acl.ttl. >>> These conventions are provisional implementation decisions, and >>> improvements are to be expected here . (TODO: >>> >>> • updates to the file system are not reflected yet in the server >>> • allow symbolic links to point to different default formats ) >>> Let us look at some of these files in more detail >>> >>> The acl for card just includes the acl for the directory/collection . >>> (TODO: wac:include has not yet been defined in the Web Access Control >>> Ontology) >>> >>> $ >>> cat card.acl.ttl >>> @prefix wac: < >>> http://www.w3.org/ns/auth/acl# >>>> . >>> @prefix foaf: < >>> http://xmlns.com/foaf/0.1/ >>>> . >>> >>> <> wac:include <.acl> . >>> >>> The acl for the directory allows access to all resources in the >>> subdirectories of test_www when accessed from the web as >>> https://localhost:8443/2013/ only to the user authenticated >>> as<https://localhost:8443/2013/card#me>. (TODO: wac:regex is not defined in >>> it's namespace - requires standardisation.) >>> >>> $ >>> cat .acl.ttl >>> @prefix acl: < >>> http://www.w3.org/ns/auth/acl# >>>> . >>> @prefix foaf: < >>> http://xmlns.com/foaf/0.1/ >>>> . >>> >>> >>> [] acl:accessToClass [ acl:regex "https://localhost:8443/2013/.*" ] >>> ; >>> acl:mode acl:Read, acl:Write; >>> acl:agent <card#me> . >>> >>> Since card's acl includes only the above directory acl, <card#me> can read >>> that file. The following curlcommand does not specify the public and >>> private keys to use for authentication and so fails: >>> >>> $ curl -i -k https://localhost:8443/2013/card >>> >>> curl: >>> (56) SSL read >>> : error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate, >>> errno 0 >>> >>> As curl does not allow WANT TLS connections, but only NEED, a failure to >>> authenticate closes the connection. Most browsers have the more friendly >>> behavior allowing the server to return an HTTP error code and an >>> explanatory body. >>> >>> Requesting the same resource with a curl that knows which client >>> certificate to use, the request goes through. >>> >>> $ curl -i -k --cert ../eg/test-localhost.pem:test >>> https://localhost:8443/2013/card >>> >>> HTTP/1.1 200 OK >>> Link: < >>> MailScanner has detected a possible fraud attempt from "localhost:8443" >>> claiming to be https://localhost:8443/2013/card.acl>; rel= >>> acl >>> Content-Type: text/turtle >>> Content-Length: 1005 >>> >>> >>> < >>> #me> <http://www.w3.org/ns/auth/cert#key> _:node17vcshtjbx1 ; >>> >>> < >>> http://xmlns.com/foaf/0.1/name> "Your >>> Name"^^<http://www.w3.org/2001/XMLSchema#string >>>> ; >>> < >>> http://xmlns.com/foaf/0.1/knows> <http://bblfish.net/people/henry/card#me >>>> . >>> >>> _:node17vcshtjbx1 a < >>> http://www.w3.org/ns/auth/cert#RSAPublicKey >>>> ; >>> < >>> http://www.w3.org/ns/auth/cert#exponent> >>> "65537"^^<http://www.w3.org/2001/XMLSchema#integer >>>> ; >>> < >>> http://www.w3.org/ns/auth/cert#modulus> >>> "C13AB88098CF47FCE6B3463FC7E8762036154FE616B956544D50EE63133CC8748D692A00DAFF5331D2564BB1DD5AEF94636ED09EFFA9E776CA6B4A92022BB060BF18FC709936EF43D345289A7FD91C81801A921376D7BCC1C63BD3335FB385A01EC0B71877FCBD1E4525393CCD5F2922D68840945943A675CCAE245222E3EB99B87B180807002063CB78174C1605EA1ECFECF57264F7F60CD8C270175A1D8DD58DFC7D3C56DB273B0494B034EC185B09977CBB530E7E407206107A73CD4B49E17610559F2A81EA8E3F613C3D3C161C06FE5CB114A8522D20DED77CAAA8C761090022F9CD4AF2C8F21DF7CF05287E379225AEA6A3A6610D02C4A44AA7CEED2CC3"^^<http://www.w3.org/2001/XMLSchema#hexBinary >>>> . >>> >>> Notice the Link header above. Every resource points to its ACL file in such >>> a header. >>> >>> The client certificate in ../eg/test-localhost.pem contains exactly the >>> private key given in the above cert as you can see by comparing the modulus >>> and exponents in both representations. This is what allows the >>> authentication to go through, using the (WebID over TLS >>> protocol)[http://webid.info/spec/]. >>> >>> $ >>> openssl x509 -in ../eg/test-localhost.pem -inform pem -text >>> Certificate: >>> Data: >>> Version: 3 >>> (0x2) >>> >>> Serial Number: 13633800264985240815 >>> (0xbd34fd1b251264ef) >>> >>> Signature Algorithm: sha1WithRSAEncryption >>> Issuer: >>> O=\xE2\x88\x85, CN= >>> WebID >>> Validity >>> Not Before: May 3 19:36:33 2013 GMT >>> Not After : May 3 19:46:33 2014 GMT >>> Subject: >>> O=ReadWriteWeb, CN=test >>> @localhost >>> Subject Public Key Info: >>> Public Key Algorithm: rsaEncryption >>> Public-Key: >>> (2048 bit) >>> >>> Modulus: >>> 00:c1:3a:b8:80:98:cf:47:fc:e6:b3:46:3f:c7:e8: >>> 76:20:36:15:4f:e6:16:b9:56:54:4d:50:ee:63:13: >>> 3c:c8:74:8d:69:2a:00:da:ff:53:31:d2:56:4b:b1: >>> dd:5a:ef:94:63:6e:d0:9e:ff:a9:e7:76:ca:6b:4a: >>> 92:02:2b:b0:60:bf:18:fc:70:99:36:ef:43:d3:45: >>> 28:9a:7f:d9:1c:81:80:1a:92:13:76:d7:bc:c1:c6: >>> 3b:d3:33:5f:b3:85:a0:1e:c0:b7:18:77:fc:bd:1e: >>> 45:25:39:3c:cd:5f:29:22:d6:88:40:94:59:43:a6: >>> 75:cc:ae:24:52:22:e3:eb:99:b8:7b:18:08:07:00: >>> 20:63:cb:78:17:4c:16:05:ea:1e:cf:ec:f5:72:64: >>> f7:f6:0c:d8:c2:70:17:5a:1d:8d:d5:8d:fc:7d:3c: >>> 56:db:27:3b:04:94:b0:34:ec:18:5b:09:97:7c:bb: >>> 53:0e:7e:40:72:06:10:7a:73:cd:4b:49:e1:76:10: >>> 55:9f:2a:81:ea:8e:3f:61:3c:3d:3c:16:1c:06:fe: >>> 5c:b1:14:a8:52:2d:20:de:d7:7c:aa:a8:c7:61:09: >>> 00:22:f9:cd:4a:f2:c8:f2:1d:f7:cf:05:28:7e:37: >>> 92:25:ae:a6:a3:a6:61:0d:02:c4:a4:4a:a7:ce:ed: >>> 2c:c3 >>> Exponent: 65537 >>> (0x10001) >>> >>> X509v3 extensions: >>> X509v3 Basic Constraints: >>> CA:FALSE >>> X509v3 Key Usage: critical >>> Digital Signature, Non Repudiation, Key Encipherment, Key >>> Agreement >>> Netscape Cert Type: >>> SSL Client, S/MIME >>> X509v3 Subject Alternative Name: critical >>> URI:https://localhost:8443/2013/card#me >>> X509v3 Subject Key Identifier: >>> 3C:1B:CF:F2:E5:59:9A:E8:76:BE:83:1D:64:FB:07:4E:08:C6:FC:14 >>> Signature Algorithm: sha1WithRSAEncryption >>> 07:97:78:f5:11:58:00:50:17:91:14:e8:e3:0d:34:22:74:07: >>> ae:61:39:87:23:7a:6c:5c:14:af:13:a6:c8:54:ac:55:d4:41: >>> 25:45:eb:52:90:ff:56:b0:f9:71:be:ec:c8:2c:a1:19:1c:86: >>> 42:04:3c:55:7c:96:5c:60:70:0a:d7:ed:5b:53:11:56:7e:14: >>> 32:92:b9:22:a7:c6:ce:ff:77:17:4a:ac:da:02:ac:24:0e:0e: >>> 35:18:bd:e3:73:00:3b:8a:aa:ec:86:76:66:dd:4b:1b:da:0c: >>> c8:a1:d3:27:26:df:bf:6f:55:11:50:3b:8e:04:12:5a:b9:d4: >>> 7d:7e >>> >>> We would of course like to make the card world readable so that the >>> certificate can be used to login to other servers too. To do this the user >>> <card#me> can append to the <card.acl.ttl> file an authorization making >>> card world readable, using an obvious subset of SPARQL Update >>> >>> $ >>> cat ../eg/card.acl.update >>> PREFIX foaf: < >>> http://xmlns.com/foaf/0.1/ >>>> >>> INSERT DATA >>> { >>> [] acl:accessTo <https://localhost:8443/2013/card >>>> ; >>> acl:mode acl:Read; >>> acl:agentClass foaf:Agent . >>> >>> } >>> $ curl -X PATCH -k -i --data-binary @../eg/card.acl.update -H >>> "Content-Type: application/sparql-update; utf-8" --cert >>> ../eg/test-localhost.pem:test MailScanner has detected a possible fraud >>> attempt from "localhost:8443" claiming to be >>> https://localhost:8443/2013/card.acl >>> It is now possible to read the card without authentication >>> >>> $ curl -i -k https://localhost:8443/2013/card >>> >>> HTTP/1.1 200 OK >>> Link: < >>> MailScanner has detected a possible fraud attempt from "localhost:8443" >>> claiming to be https://localhost:8443/2013/card.acl>; rel= >>> acl >>> Content-Type: text/turtle >>> >>> [...] >>> Next we can publish a couch surfing opportunity using HTTP's POST method as >>> explained by the LDP spec >>> >>> $ curl -X POST -k -i -H "Content-Type: text/turtle; utf-8" --cert >>> ../eg/test-localhost.pem:test -H "Slug: couch" -d @../eg/couch.ttl >>> https://localhost:8443/2013/ >>> >>> HTTP/1.1 201 Created >>> Location: >>> https://localhost:8443/2013/couch >>> >>> Content-Length: 0 >>> >>> The Location: header in the above response tells us that the name of the >>> created resource ishttps://localhost:8443/2013/couch. >>> >>> We can now look at the contents of the https://localhost:8443/2013/ >>> collection, where we should see - and do - the new couch resource listed as >>> having been created by ldp. >>> >>> $ curl -k -i -X GET --cert ../eg/test-localhost.pem:test >>> https://localhost:8443/2013/ >>> >>> HTTP/1.1 200 OK >>> Link: < >>> MailScanner has detected a possible fraud attempt from "localhost:8443" >>> claiming to be https://localhost:8443/2013/.acl>; rel= >>> acl >>> Content-Type: text/turtle >>> Content-Length: 119 >>> >>> >>> <> < >>> http://www.w3.org/ns/ldp#created> <raw/> , <card> , <test >>> /> , <couch> ; >>> a < >>> http://www.w3.org/ns/ldp#Container >>>> . >>> >>> We can find out about the ACL for this resource using HEAD (TODO: OPTIONS >>> would be better, but is not implemented yet ) >>> >>> $ curl -X HEAD -k -i --cert ../eg/test-localhost.pem:test >>> https://localhost:8443/2013/couch >>> >>> HTTP/1.1 200 OK >>> Link: < >>> MailScanner has detected a possible fraud attempt from "localhost:8443" >>> claiming to be https://localhost:8443/2013/couch.acl>; rel= >>> acl >>> Content-Type: text/turtle >>> Content-Length: 0 >>> >>> ( TODO: The Content-Length should not be 0 for HEAD. Bug in Play2.0 >>> probably ) >>> >>> So we add the couch acl which gives access to that information in addition >>> to the default owner of the collection, to two groups of people >>> >>> $ curl -X PATCH -k -i -H "Content-Type: application/sparql-update; utf-8" >>> --cert ../eg/test-localhost.pem:test --data-binary @../eg/couch.acl.patch >>> MailScanner has detected a possible fraud attempt from "localhost:8443" >>> claiming to be https://localhost:8443/2013/couch.acl >>> >>> HTTP/1.1 200 OK >>> Content-Type: text/plain; >>> charset= >>> utf-8 >>> Content-Length: 9 >>> >>> Succeeded >>> >>> This makes it available to the test user and the members of the WebID and >>> OuiShare groups. If you have a WebID then try adding yours and test it. You >>> can also request different formats by changing theAccept: header such as >>> with the following request for RDF/XML >>> >>> $ curl -k -i -X GET -H "Accept: application/rdf+xml" --cert >>> ../eg/test-localhost.pem:test https://localhost:8443/2013/couch >>> or if you prefer rdf/xml over turtle as described by the Content >>> Negotiation section of the HTTP1.1 spec: >>> >>> $ curl -k -i -X GET -H "Accept:application/rdf+xml;q=0.9,text/turtle;q=0.7" >>> --cert ../eg/test-localhost.pem:test https://localhost:8443/2013/couch >>> It is then possible to also use SPARQL queries on particular resources. >>> (TODO: find a better example) >>> >>> $ >>> cat ../eg/couch.sparql >>> PREFIX gr: < >>> http://purl.org/goodrelations/v1# >>>> >>> SELECT ?D >>> WHERE >>> { >>> >>> >>> [] a <http://bblfish.net/2013/05/10/couch#Surf >>>> ; >>> gr:description ?D . >>> >>> } >>> >>> >>> >>> $ curl -X POST -k -i -H "Content-Type: application/sparql-query; >>> charset=UTF-8" --cert ../eg/test-localhost.pem:test --data-binary >>> @../eg/couch.sparql https://localhost:8443/2013/couch >>> >>> HTTP/1.1 200 OK >>> Content-Type: application/sparql-results+xml >>> Content-Length: 337 >>> >>> <?xml >>> version='1.0' encoding='UTF-8' >>> ?> >>> <sparql >>> xmlns='http://www.w3.org/2005/sparql-results#' >>>> >>> <head> >>> <variable >>> name='D' >>> /> >>> </head> >>> <results> >>> <result> >>> <binding >>> name='D' >>>> >>> <literal >>> datatype='http://www.w3.org/2001/XMLSchema#string' >>>> Comfortable couch in Artist Stables</literal> >>> </binding> >>> </result> >>> </results> >>> </sparql> >>> >>> >>> Finally if you no longer want the couch surfing opportunity to be published >>> you can DELETE it. ( It would be better to express that it was sold: >>> DELETEing resources on the Web is usually bad practice: it breaks the links >>> that other people set up to your services ) >>> >>> curl -k -i -X DELETE -H "Accept: text/turtle" --cert >>> ../eg/test-localhost.pem:test https://localhost:8443/2013/couch >>> >>> HTTP/1.1 200 OK >>> Content-Length: 0 >>> >>> And so the resource no longer is listed in the LDPC >>> >>> $ curl -k -i -X GET --cert ../eg/test-localhost.pem:test >>> https://localhost:8443/2013/ >>> >>> HTTP/1.1 200 OK >>> Link: < >>> MailScanner has detected a possible fraud attempt from "localhost:8443" >>> claiming to be https://localhost:8443/2013/.acl>; rel= >>> acl >>> Content-Type: text/turtle >>> Content-Length: 109 >>> >>> >>> <> a < >>> http://www.w3.org/ns/ldp#Container >>>> ; >>> < >>> http://www.w3.org/ns/ldp#created> <card> , <raw/> , <test >>> /> . >>> >>> To create a new container one just creates an LDP Resource that contains >>> the triple<> a ldp:Container. >>> >>> $ >>> cat ../eg/newContainer.ttl >>> @prefix ldp: < >>> http://www.w3.org/ns/ldp# >>>> . >>> @prefix foaf: < >>> http://xmlns.com/foaf/0.1/ >>>> . >>> >>> <> a ldp:Container; >>> foaf:topic >>> "A container for some type X of resources" >>> ; >>> foaf:maker <../card#me> . >>> >>> >>> $ curl -X POST -k -i -H "Content-Type: text/turtle; utf-8" --cert >>> ../eg/test-localhost.pem:test -H "Slug: XDir" -d @../eg/newContainer.ttl >>> https://localhost:8443/2013/ >>> >>> HTTP/1.1 201 Created >>> Location: >>> https://localhost:8443/2013/XDir/ >>> >>> Content-Length: 0 >>> >>> Note that directories can only be deleted if all ldp:created resources were >>> previously deleted. >>> >>> Creating a WebID Certificate >>> >>> After starting your server you can point your browser to >>> http://localhost:9000/srv/certgen or to the service over https and create >>> yourself a certificate. For testing purposes and in order to be able to >>> work without the need for network connectivity use >>> `http://localhost:8443/2013/cert#me'. The WebID Certificate will be signed >>> by the agent with Distinguished Name "CN=WebID,O=∅" and added by your >>> browser to its keychain. >>> >>> ( Todo: later we will add functionality to add create a local webid that >>> also published the RDF ) To make the WebID valid you will need to publish >>> the relavant rdf at that document location as explained in the WebID spec >>> >> > > Social Web Architect > http://bblfish.net/ >
