Skip to content

Commit e117cfc

Browse files
authored
Merge pull request #1333 from solid/fixTLSTests
Fix tls tests
2 parents 7ca978d + b183c7a commit e117cfc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+1571
-62
lines changed

test/integration/acl-tls-test.js

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ var rm = require('../utils').rm
1919
var ldnode = require('../../index')
2020
var ns = require('solid-namespace')($rdf)
2121

22-
var address = 'https://localhost:3456/test/'
23-
let rootPath = path.join(__dirname, '../resources')
24-
let configPath = path.join(rootPath, 'config')
22+
const port = 7777
23+
const serverUri = `https://localhost:7777`
24+
const rootPath = path.join(__dirname, '../resources/acl-tls')
25+
const dbPath = path.join(rootPath, 'db')
26+
const configPath = path.join(rootPath, 'config')
2527

2628
var aclExtension = '.acl'
2729
var metaExtension = '.meta'
@@ -37,8 +39,9 @@ var globFile = testDir + '/*'
3739
var origin1 = 'http://example.org/'
3840
var origin2 = 'http://example.com/'
3941

40-
var user1 = 'https://user1.databox.me/profile/card#me'
41-
var user2 = 'https://user2.databox.me/profile/card#me'
42+
var user1 = 'https://tim.localhost:7777/profile/card#me'
43+
var user2 = 'https://nicola.localhost:7777/profile/card#me'
44+
var address = 'https://tim.localhost:7777'
4245
var userCredentials = {
4346
user1: {
4447
cert: fs.readFileSync(path.join(__dirname, '../keys/user1-cert.pem')),
@@ -50,22 +53,38 @@ var userCredentials = {
5053
}
5154
}
5255

53-
describe('ACL with WebID+TLS', function () {
56+
// TODO Remove skip. TLS is currently broken, but is not a priority to fix since
57+
// the current Solid spec does not require supporting webid-tls on the resource
58+
// server. The current spec only requires the resource server to support webid-oidc,
59+
// and it requires the IDP to support webid-tls as a log in method, so that users of
60+
// a webid-tls client certificate can still use their certificate (and not a
61+
// username/password pair or other login method) to "bridge" from webid-tls to
62+
// webid-oidc.
63+
describe.skip('ACL with WebID+TLS', function () {
5464
var ldpHttpsServer
55-
var ldp = ldnode.createServer({
56-
mount: '/test',
65+
var serverConfig = {
5766
root: rootPath,
67+
serverUri,
68+
dbPath,
69+
port,
5870
configPath,
5971
sslKey: path.join(__dirname, '../keys/key.pem'),
6072
sslCert: path.join(__dirname, '../keys/cert.pem'),
6173
webid: true,
62-
strictOrigin: true,
74+
multiuser: true,
6375
auth: 'tls',
64-
rejectUnauthorized: false
65-
})
76+
rejectUnauthorized: false,
77+
strictOrigin: true,
78+
host: { serverUri }
79+
}
80+
var ldp = ldnode.createServer(serverConfig)
6681

6782
before(function (done) {
68-
ldpHttpsServer = ldp.listen(3456, done)
83+
ldpHttpsServer = ldp.listen(port, () => {
84+
setTimeout(() => {
85+
done()
86+
}, 0)
87+
})
6988
})
7089

7190
after(function () {
@@ -466,7 +485,7 @@ describe('ACL with WebID+TLS', function () {
466485
})
467486

468487
describe('Read-only', function () {
469-
var body = fs.readFileSync(path.join(__dirname, '../resources/acl-tls/read-acl/.acl'))
488+
var body = fs.readFileSync(path.join(__dirname, '../resources/acl-tls/tim.localhost/read-acl/.acl'))
470489
it('user1 should be able to access ACL file', function (done) {
471490
var options = createOptions('/acl-tls/read-acl/.acl', 'user1')
472491
request.head(options, function (error, response, body) {

test/keys/user1-cert.pem

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
Bag Attributes
2-
friendlyName: user1 [on user1.databox.me]'s WebID ID
3-
localKeyID: 4A 83 02 D8 45 D4 50 5C 29 45 D7 6E 75 41 5A 71 C2 D7 ED 1B
4-
subject=/O=WebID/CN=user1 [on user1.databox.me]
5-
issuer=/O=WebID/CN=user1 [on user1.databox.me]
61
-----BEGIN CERTIFICATE-----
7-
MIIC6TCCAlSgAwIBAgIBKjALBgkqhkiG9w0BAQswNjEOMAwGA1UEChMFV2ViSUQx
8-
JDAiBgNVBAMMG3VzZXIxIFtvbiB1c2VyMS5kYXRhYm94Lm1lXTAeFw0wMDAxMDEw
9-
MDAwMDBaFw00OTEyMzEyMzU5NTlaMDYxDjAMBgNVBAoTBVdlYklEMSQwIgYDVQQD
10-
DBt1c2VyMSBbb24gdXNlcjEuZGF0YWJveC5tZV0wggEiMA0GCSqGSIb3DQEBAQUA
11-
A4IBDwAwggEKAoIBAQC9prgg9hPV1ICTDJpOphfO46KpDSnsE8L+JI2wp5nIxgAK
12-
WDGfOmjLfJN3JJk90G0Tr8FjrY230XBL8yW7JG9K94NhPzltcP3lbMPRub9CYPP+
13-
z8pMiJdwI3W4gIM9BTWP83p+/DIwL8xVreTGh8hd2BuWCOOBO35NrHRC0wf55GwS
14-
LF+PHHy5JCHJyIN6sDsoAqjgH1/cmH7VGyiJ8AdbZePavMQSmo/9aADPH2qC/se4
15-
tHp8NCww2ed9iZ5Eb+R1foK7SICZOZaOKZzIbWUsnIE9jDZDC/HTGjx04v69xm9n
16-
okAiNWOZ23NwYE6VJtKbypgEZ9Sw1pxW3FOMM2RbAgMBAAGjgYYwgYMwDAYDVR0T
17-
AQH/BAIwADAdBgNVHQ4EFgQUMIIBIjANBgkqhkiG9w0BAQEFAAMwHwYDVR0jBBgw
18-
FoAUMIIBIjANBgkqhkiG9w0BAQEFAAMwMwYDVR0RBCwwKoYoaHR0cHM6Ly91c2Vy
19-
MS5kYXRhYm94Lm1lL3Byb2ZpbGUvY2FyZCNtZTALBgkqhkiG9w0BAQsDgYEAPY/B
20-
4LdzOshkaVp9WVm53SEHq2pgXzlZQqTaFkXzGg9OkTA0yh/J0PQkYbs/a9xZOQj4
21-
Ki8VpoGoxAEtpf5IrchAKU+9i7EdC7eadfHwoo5FKt1XUX1r+71kvWmvABHCV4Nq
22-
RGPUoNEE9gJ1OJxx1mEI1+xTq05ZOm1NRSU2Sbs=
23-
-----END CERTIFICATE-----
2+
MIID0zCCArugAwIBAgIJAJIyT436cY6uMA0GCSqGSIb3DQEBBQUAMGAxIjAgBgNV
3+
BAMTGVdlYklEIGZvciBUaW0gQmVybmVycy1MZWUxOjA4BgoJkiaJk/IsZAEBFCpo
4+
dHRwczovL3RpbS5sb2NhbGhvc3Q6Nzc3Ny9wcm9maWxlL2NhcmQjbWUwHhcNMTkx
5+
MDI0MTgyMzUyWhcNMjkxMDIxMTgyMzUyWjBgMSIwIAYDVQQDExlXZWJJRCBmb3Ig
6+
VGltIEJlcm5lcnMtTGVlMTowOAYKCZImiZPyLGQBARQqaHR0cHM6Ly90aW0ubG9j
7+
YWxob3N0Ojc3NzcvcHJvZmlsZS9jYXJkI21lMIIBIjANBgkqhkiG9w0BAQEFAAOC
8+
AQ8AMIIBCgKCAQEAtVinQ0UG3k3P0G/rQiH8hzTdpyeHePZXZHEx4fTXiIrPgDyY
9+
oLxzzzl3A6VQ+zCV0SQ17npauEGQzVXg+QhOwRUbH4rfOoT6CrYmcnhrmkiGAqfY
10+
HO2I5DsJAyiLtuTmMPBVkLgDuhs0eOR0jsjbBE1AJ809i4Nngu5vYSNhf3rZz/qU
11+
ZEvvWDnb50EQJrAGeWndNl/+EohENPKlpFmBedgttwJGc/skuNpAwBta+F03EdO8
12+
6V2Z+qDQKdyG1VvXVF5SVB9jPOXkWLQrTTyjcyyE8Sx62ZXxDlsYvQAGd27Iuw4E
13+
emmST8jxvjob8mC5Pb1KAhAK7EIbMIUAP456TwIDAQABo4GPMIGMMB0GA1UdDgQW
14+
BBSKeuVdr8beU5Y6NkeggCSCtlZZrDA4BgNVHREBAf8ELjAshipodHRwczovL3Rp
15+
bS5sb2NhbGhvc3Q6Nzc3Ny9wcm9maWxlL2NhcmQjbWUwCQYDVR0TBAIwADATBgNV
16+
HSUEDDAKBggrBgEFBQcDAjARBglghkgBhvhCAQEEBAMCB4AwDQYJKoZIhvcNAQEF
17+
BQADggEBACH7beIj0OFsq6FwkthagI53cxPhjIxFOYdy8G5mN/JcCyL0xemJm5Fz
18+
HEXKv/QhFdbX6NCCal/d+2r566fRf1C/8sY/Cx4yKqYaZ/ZZeH/q3IlfQSyEZEJy
19+
XLARCG9WzeXHJsL6u/lN/rcrI3ylUb9qAAzlNWyg3xtb58ieUSUjuO0fOfKMu+LJ
20+
VGPpMyhtjwBhelJ32l6ffHpnyzj6v14QxTEGWQpLvtX1iUDExNbHcm8khlbEgGzG
21+
Zyrojk0cHg3tH4nmBei7QvuLOiDaBs2N5ITTETwExiWD2CUPCiYO0DMr0oljN/nS
22+
KRRJsj1QOjM4/A46RjXWhmvx7RTXQdM=
23+
-----END CERTIFICATE-----

test/keys/user1-key.pem

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
-----BEGIN RSA PRIVATE KEY-----
2-
MIIEowIBAAKCAQEAvaa4IPYT1dSAkwyaTqYXzuOiqQ0p7BPC/iSNsKeZyMYAClgx
3-
nzpoy3yTdySZPdBtE6/BY62Nt9FwS/MluyRvSveDYT85bXD95WzD0bm/QmDz/s/K
4-
TIiXcCN1uICDPQU1j/N6fvwyMC/MVa3kxofIXdgblgjjgTt+Tax0QtMH+eRsEixf
5-
jxx8uSQhyciDerA7KAKo4B9f3Jh+1RsoifAHW2Xj2rzEEpqP/WgAzx9qgv7HuLR6
6-
fDQsMNnnfYmeRG/kdX6Cu0iAmTmWjimcyG1lLJyBPYw2Qwvx0xo8dOL+vcZvZ6JA
7-
IjVjmdtzcGBOlSbSm8qYBGfUsNacVtxTjDNkWwIDAQABAoIBABMncnNJxykShEXV
8-
wQPufHsVvIjsXm6MdGYslO7hjoObk8d3rtNRF+JtW4tt89gtY8bYOmTx011cVsYk
9-
8YucG21r4CYDN66Y+duhB4n4A5wVpK74l4rxRLI7spkGybpw+z7lrVqD6CG7whxp
10-
KrDuZ8sql2ao0SltM81ufHN/Us/nGEIho8YUAh3/aIwqHPEb8OPmlbDcTJBwN0kh
11-
54YeGN/1QT81DXWomg2VR9KTzfy9Z0v7jl3phcAEvM6Kp2rvSKFWnw7DvB/+XTQf
12-
6ekN0elBF8aIp+5lC2Kpui+DqQjSFaMhkZnnX0Yd4OjX3RE8CzpYUa60lydZjZVd
13-
mszCKDkCgYEA9xiEfWIfcBSx5jt3+o+U4MHJCw5kF5i07E/4IetZ9mAHemr8UCmO
14-
uGRxgokFrOapXIMTY4wPKSIl5Jb9laDEfUZcQs4Fl0cs9aE21JN9QeeusRzOiTMo
15-
5MGOqDIqn6XUukDCVAQ0fQuY8uAEkFHLbq+MwMOsooiR2Ta9+XhfyrcCgYEAxHxF
16-
OSuQ3RHrTstvyAenmCIY6XQOsO8eVSpk8afsAYJYSwTWlrEUNRw310YnVT2FuW/r
17-
pPqXbiHAeNCFsT8LdCfGiEaS0kegXYg66ZX85wIiaXTEsnmNWjNr6K6iOi1xl92J
18-
OEqtCwI+rBX0tl6K1BvA/e2uoaoARMW5ZlLo330CgYBdVKNmgJODUC3J2ph8yZLg
19-
OhHn3S2tQ/7Ca4o7tZurVaY9dP+Mf8Xqm/XL6ll8bzt1OAUwyoxHayCI8QcjZzAQ
20-
aW0bxpmSBE5VEOmW7YaYSBxRxaG1bN97WCi8GwbCem6ZUzCTb2sr+B9zTW4r3NlM
21-
G368qKwiUBdWxjiHbBIyjQKBgDrK3IPAz3X22KwZH3eBItrYyQ+B1KuIwVDGgLH2
22-
hx3kfLrl1bf9gIhryyG1MivFXvAf1yjkes9PdiIwcvCYZrr48+TvCRu2pvuVudsP
23-
MD+HWfioIfstd+hXnqBfMNerpWPFvDuFzMWQhGRFpZW0MGJLc7IHnsts7OunJlTB
24-
1kCZAoGBAO1//QwkCvgnS5Na8zjBFa5K48llYC2eZ4L21/PI1DNXO5phvdy2r3rW
25-
h3LbL05PNFPIDX5JkGJslO7M3o/dbMMY9rKZ/EOsveYYD292oZVbUXFZkF9yQWkY
26-
8daXg7oMOkkKy7WzHI3fAxJVquaobdHyIImwpB1YUzyXpuaihecj
27-
-----END RSA PRIVATE KEY-----
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1WKdDRQbeTc/Q
3+
b+tCIfyHNN2nJ4d49ldkcTHh9NeIis+APJigvHPPOXcDpVD7MJXRJDXuelq4QZDN
4+
VeD5CE7BFRsfit86hPoKtiZyeGuaSIYCp9gc7YjkOwkDKIu25OYw8FWQuAO6GzR4
5+
5HSOyNsETUAnzT2Lg2eC7m9hI2F/etnP+pRkS+9YOdvnQRAmsAZ5ad02X/4SiEQ0
6+
8qWkWYF52C23AkZz+yS42kDAG1r4XTcR07zpXZn6oNAp3IbVW9dUXlJUH2M85eRY
7+
tCtNPKNzLITxLHrZlfEOWxi9AAZ3bsi7DgR6aZJPyPG+OhvyYLk9vUoCEArsQhsw
8+
hQA/jnpPAgMBAAECggEBAKEUhzYciTZLfa1SzHCoyau7jKseVJpgjk38sedYWV7C
9+
lf/9U0FrQ58tFwcY/+6vQFROSs1yx0RlkN6jSrtJ4tJlEfuZmiFb3tJG663AQyv/
10+
AXI4bqF7aJ35xk6U5E1n0wRjZk2u9jiIU7qSiuoNhWWzzKnOB7310aseabap+7+D
11+
+/gTd4rrJUCM3K4BMCLmtGUKSh/F2EpIyGM2qQC7zhsvj/F1W3V6n2UhxyNs/2dn
12+
MS34ddmuYRTUt4qbOXeRt2duKFGHmlBhey0Q+/hdE74zV7n2Rq92UvSitP3me5al
13+
RPpgTZ4NFa4w0rshvzbWXKBJWRj2bBk5aumx9ZWlimECgYEA4NQ7MIVpsBGwFiss
14+
JqD4eBr+7lRRxe0+oUtYdHkoC5iGnRQACQyKjk7/5kZRWEvix9SsnhJ5YZ/GWpEl
15+
T8FR/tCjVyOMyuNfQJ2RQ/sPcVVUys4/CCTg4UROJygpP4fz46mHysL9mREA9rFK
16+
QWprKAZEBYi+Rv0Q9hJNRMaxDd8CgYEAzn0bVVSQ6pmqk+s1GRG62UHlXyDRn7kH
17+
0XvK/wQqO0A1QJzdKefXgZL6m+PI7wuYvrL9PzSYb8THwAnWWIKTqeK+T7Nb4Dzx
18+
MSgj2DNLzGpbXdC8TlNJRytAzoVN7dhiXuyfWWZjQRe8l1NMD9h1wIqROWG152GC
19+
xgA8MddAQZECgYBsPqIUtVbyF0IBGl4SZxPZt52fn2cTdSrfO0hmI2LdWl0NSXDO
20+
6oPXCj/4XUiSy05vSXymSly4XNWCCzm8kWXp2geaT5pcoGXe1T34TercdOnzDqOY
21+
RzEiI+HAxnw9gzYwGRIw0/qG9IHTQ/5tSlA3H/Ul+PUrdnHxF1SuVT8vXwKBgAQO
22+
4WKj7tUtf/S4QqrjdlCewutDsdr5v/WWAT9RzaKseF90tcQFEm8xfEtkBqbsC2x0
23+
CBYd6oEH1QUpLFVA+7XzBtp6I+wcRoE40LuHBo5V6MXHPGwtptsHNpbYd9ec0RIc
24+
hGU1Ze35kXNH587H6kiGcKQ4D2Mkv3U0u/oeyNyBAoGAfUJI8H63XOar6TXs0Ug4
25+
IW34WrdC8BM4cz342rXKusS6+o15wnI8kAyVkSEx54W/cK5QaIUIQNGia74UlGhq
26+
wqGyBxn3ahZPZhu0eOE2PHIDcxS+09d87bNjpUjMcysORJV2u9klyVMc5ornV6aO
27+
cpKHUgbAsaKX3NgPiLrgxFQ=
28+
-----END PRIVATE KEY-----
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
'use strict'
2+
3+
/**
4+
* Returns a partial Email object (minus the `to` and `from` properties),
5+
* suitable for sending with Nodemailer.
6+
*
7+
* Used to send a Delete Account email, upon user request
8+
*
9+
* @param data {Object}
10+
*
11+
* @param data.deleteUrl {string}
12+
* @param data.webId {string}
13+
*
14+
* @return {Object}
15+
*/
16+
function render (data) {
17+
return {
18+
subject: 'Delete Solid-account request',
19+
20+
/**
21+
* Text version
22+
*/
23+
text: `Hi,
24+
25+
We received a request to delete your Solid account, ${data.webId}
26+
27+
To delete your account, click on the following link:
28+
29+
${data.deleteUrl}
30+
31+
If you did not mean to delete your account, ignore this email.`,
32+
33+
/**
34+
* HTML version
35+
*/
36+
html: `<p>Hi,</p>
37+
38+
<p>We received a request to delete your Solid account, ${data.webId}</p>
39+
40+
<p>To delete your account, click on the following link:</p>
41+
42+
<p><a href="${data.deleteUrl}">${data.deleteUrl}</a></p>
43+
44+
<p>If you did not mean to delete your account, ignore this email.</p>
45+
`
46+
}
47+
}
48+
49+
module.exports.render = render
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module.exports.render = render
2+
3+
function render (data) {
4+
return {
5+
subject: `Invalid username for account ${data.accountUri}`,
6+
7+
/**
8+
* Text version
9+
*/
10+
text: `Hi,
11+
12+
We're sorry to inform you that the username for account ${data.accountUri} is not allowed after changes to username policy.
13+
14+
This account has been set to be deleted at ${data.dateOfRemoval}.
15+
16+
${data.supportEmail ? `Please contact ${data.supportEmail} if you want to move your account.` : ''}`,
17+
18+
/**
19+
* HTML version
20+
*/
21+
html: `<p>Hi,</p>
22+
23+
<p>We're sorry to inform you that the username for account ${data.accountUri} is not allowed after changes to username policy.</p>
24+
25+
<p>This account has been set to be deleted at ${data.dateOfRemoval}.</p>
26+
27+
${data.supportEmail ? `<p>Please contact ${data.supportEmail} if you want to move your account.</p>` : ''}
28+
`
29+
}
30+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
'use strict'
2+
3+
/**
4+
* Returns a partial Email object (minus the `to` and `from` properties),
5+
* suitable for sending with Nodemailer.
6+
*
7+
* Used to send a Reset Password email, upon user request
8+
*
9+
* @param data {Object}
10+
*
11+
* @param data.resetUrl {string}
12+
* @param data.webId {string}
13+
*
14+
* @return {Object}
15+
*/
16+
function render (data) {
17+
return {
18+
subject: 'Account password reset',
19+
20+
/**
21+
* Text version
22+
*/
23+
text: `Hi,
24+
25+
We received a request to reset your password for your Solid account, ${data.webId}
26+
27+
To reset your password, click on the following link:
28+
29+
${data.resetUrl}
30+
31+
If you did not mean to reset your password, ignore this email, your password will not change.`,
32+
33+
/**
34+
* HTML version
35+
*/
36+
html: `<p>Hi,</p>
37+
38+
<p>We received a request to reset your password for your Solid account, ${data.webId}</p>
39+
40+
<p>To reset your password, click on the following link:</p>
41+
42+
<p><a href="${data.resetUrl}">${data.resetUrl}</a></p>
43+
44+
<p>If you did not mean to reset your password, ignore this email, your password will not change.</p>
45+
`
46+
}
47+
}
48+
49+
module.exports.render = render
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'use strict'
2+
3+
/**
4+
* Returns a partial Email object (minus the `to` and `from` properties),
5+
* suitable for sending with Nodemailer.
6+
*
7+
* Used to send a Welcome email after a new user account has been created.
8+
*
9+
* @param data {Object}
10+
*
11+
* @param data.webid {string}
12+
*
13+
* @return {Object}
14+
*/
15+
function render (data) {
16+
return {
17+
subject: 'Welcome to Solid',
18+
19+
/**
20+
* Text version of the Welcome email
21+
*/
22+
text: `Welcome to Solid!
23+
24+
Your account has been created.
25+
26+
Your Web Id: ${data.webid}`,
27+
28+
/**
29+
* HTML version of the Welcome email
30+
*/
31+
html: `<p>Welcome to Solid!</p>
32+
33+
<p>Your account has been created.</p>
34+
35+
<p>Your Web Id: ${data.webid}</p>`
36+
}
37+
}
38+
39+
module.exports.render = render
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Root ACL resource for the user account
2+
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
3+
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
4+
5+
# The homepage is readable by the public
6+
<#public>
7+
a acl:Authorization;
8+
acl:agentClass foaf:Agent;
9+
acl:accessTo </>;
10+
acl:mode acl:Read.
11+
12+
# The owner has full access to every resource in their pod.
13+
# Other agents have no access rights,
14+
# unless specifically authorized in other .acl resources.
15+
<#owner>
16+
a acl:Authorization;
17+
acl:agent <{{webId}}>;
18+
# Optional owner email, to be used for account recovery:
19+
{{#if email}}acl:agent <mailto:{{{email}}}>;{{/if}}
20+
# Set the access to the root storage folder itself
21+
acl:accessTo </>;
22+
# All resources will inherit this authorization, by default
23+
acl:default </>;
24+
# The owner has all of the access modes allowed
25+
acl:mode
26+
acl:Read, acl:Write, acl:Control.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Root Meta resource for the user account
2+
# Used to discover the account's WebID URI, given the account URI
3+
<{{webId}}>
4+
<http://www.w3.org/ns/solid/terms#account>
5+
</>.

0 commit comments

Comments
 (0)