Skip to content

Commit e4d0b8d

Browse files
Initialize a default index.html for new user accounts
1 parent 8eaf259 commit e4d0b8d

File tree

15 files changed

+247
-216
lines changed

15 files changed

+247
-216
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>Solid User Profile</title>
7+
<link rel="stylesheet" href="/common/css/bootstrap.min.css">
8+
</head>
9+
<body>
10+
<div class="container">
11+
<h3>Solid User Profile</h3>
12+
</div>
13+
<div class="container">
14+
<div class="row">
15+
<div class="col-md-12">
16+
<p style="margin-top: 3em; margin-bottom: 3em;">
17+
Welcome to your Solid user profile.
18+
</p>
19+
<p>
20+
Your Web ID is:<br />
21+
22+
<code>{{webId}}</code>
23+
</p>
24+
</div>
25+
</div>
26+
</div>
27+
</body>
28+
</html>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
2+
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
3+
4+
<#owner>
5+
a acl:Authorization;
6+
7+
acl:agent
8+
<{{webId}}>;
9+
10+
acl:accessTo </index.html>;
11+
12+
acl:mode
13+
acl:Read, acl:Write, acl:Control.
14+
15+
<#public>
16+
a acl:Authorization;
17+
18+
acl:agentClass foaf:Agent; # everyone
19+
20+
acl:accessTo <./index.html>;
21+
22+
acl:mode acl:Read.

default-templates/server/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ <h3>Welcome to Solid</h3>
3030
</form>
3131
</div>
3232
</div>
33+
</div>
3334
</body>
3435
</html>

lib/api/accounts/user-accounts.js

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,6 @@ function checkAccountExists (accountManager) {
3131
}
3232
}
3333

34-
/**
35-
* Returns an Express middleware handler for intercepting any GET requests
36-
* for first time users (in single user mode), and redirecting them to the
37-
* signup page.
38-
*
39-
* @param accountManager {AccountManager}
40-
*
41-
* @return {Function}
42-
*/
43-
function firstTimeSignupRedirect (accountManager) {
44-
return (req, res, next) => {
45-
// Only redirect browser (HTML) requests to first-time signup
46-
if (!req.accepts('text/html')) { return next() }
47-
48-
accountManager.accountExists()
49-
.then(found => {
50-
if (!found) {
51-
debug('(single user mode) Redirecting to account creation')
52-
53-
res.redirect(302, '/signup.html')
54-
} else {
55-
next()
56-
}
57-
})
58-
.catch(next)
59-
}
60-
}
61-
6234
/**
6335
* Returns an Express middleware handler for adding a new certificate to an
6436
* existing account (POST to /api/accounts/cert).
@@ -88,22 +60,7 @@ function newCertificate (accountManager) {
8860
function middleware (accountManager) {
8961
let router = express.Router('/')
9062

91-
if (accountManager.multiUser) {
92-
router.get('/', checkAccountExists(accountManager))
93-
} else {
94-
// In single user mode, if account has not yet been created, intercept
95-
// all GET requests and redirect to the Signup form
96-
accountManager.accountExists()
97-
.then(found => {
98-
if (!found) {
99-
router.use('/signup.html', express.static('./static/signup.html'))
100-
router.get('/*', firstTimeSignupRedirect(accountManager))
101-
}
102-
})
103-
.catch(error => {
104-
debug('Error during accountExists(): ', error)
105-
})
106-
}
63+
router.get('/', checkAccountExists(accountManager))
10764

10865
router.post('/api/accounts/new', bodyParser, CreateAccountRequest.post)
10966
router.get(['/register', '/api/accounts/new'], CreateAccountRequest.get)
@@ -116,6 +73,5 @@ function middleware (accountManager) {
11673
module.exports = {
11774
middleware,
11875
checkAccountExists,
119-
firstTimeSignupRedirect,
12076
newCertificate
12177
}

lib/create-app.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ function createApp (argv = {}) {
7676
}
7777

7878
if (argv.webid) {
79+
ensureWelcomePage(argv)
80+
7981
var accountRecovery = AccountRecovery({ redirect: '/' })
8082
// adds GET /api/accounts/recover
8183
// adds POST /api/accounts/recover
@@ -141,9 +143,43 @@ function initTemplateDirs (configPath) {
141143
path.join(configPath, 'templates', 'emails')
142144
)
143145

146+
let serverTemplatePath = ensureDirCopy(
147+
'./default-templates/server',
148+
path.join(configPath, 'templates', 'server')
149+
)
150+
144151
return {
145152
account: accountTemplatePath,
146-
email: emailTemplatesPath
153+
email: emailTemplatesPath,
154+
server: serverTemplatePath
155+
}
156+
}
157+
158+
function ensureWelcomePage (argv) {
159+
let multiUser = argv.idp
160+
if (!argv.root) {
161+
console.error('Cannot ensure welcome page, no root param')
162+
return
163+
}
164+
let rootDir = path.resolve(argv.root)
165+
let templates = argv.templates
166+
let serverRootDir
167+
168+
if (multiUser) {
169+
serverRootDir = path.join(rootDir, argv.host.hostname)
170+
} else {
171+
serverRootDir = rootDir
172+
}
173+
174+
let defaultIndexPage = path.join(templates.server, 'index.html')
175+
let existingIndexPage = path.join(serverRootDir, 'index.html')
176+
let defaultIndexPageAcl = path.join(templates.server, 'index.html.acl')
177+
let existingIndexPageAcl = path.join(serverRootDir, 'index.html.acl')
178+
179+
if (!fs.existsSync(existingIndexPage)) {
180+
fs.mkdirp(serverRootDir)
181+
fs.copySync(defaultIndexPage, existingIndexPage)
182+
fs.copySync(defaultIndexPageAcl, existingIndexPageAcl)
147183
}
148184
}
149185

lib/models/account-template.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,17 @@ class AccountTemplate {
171171
* @return {string} Result, e.g. 'Hello, Alice'
172172
*/
173173
processTemplate (source) {
174-
let template = Handlebars.compile(source)
175-
return template(this.substitutions)
174+
let template, result
175+
176+
try {
177+
template = Handlebars.compile(source)
178+
result = template(this.substitutions)
179+
} catch (error) {
180+
console.log('Error processing template: ', error)
181+
return source
182+
}
183+
184+
return result
176185
}
177186

178187
/**

test/integration/account-creation-oidc.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ describe('AccountManager (OIDC account creation tests)', function () {
1313
var serverUri = 'https://localhost:3457'
1414
var host = 'localhost:3457'
1515
var ldpHttpsServer
16+
let rootPath = path.join(__dirname, '../resources/accounts/')
1617
let dbPath = path.join(__dirname, '../resources/accounts/db')
1718

1819
var ldp = ldnode.createServer({
19-
root: path.join(__dirname, '../resources/accounts/'),
20+
root: rootPath,
2021
sslKey: path.join(__dirname, '../keys/key.pem'),
2122
sslCert: path.join(__dirname, '../keys/cert.pem'),
2223
auth: 'oidc',
@@ -34,6 +35,8 @@ describe('AccountManager (OIDC account creation tests)', function () {
3435
after(function () {
3536
if (ldpHttpsServer) ldpHttpsServer.close()
3637
fs.removeSync(path.join(dbPath, 'oidc/users/users'))
38+
fs.removeSync(path.join(rootPath, 'localhost/index.html'))
39+
fs.removeSync(path.join(rootPath, 'localhost/index.html.acl'))
3740
})
3841

3942
var server = supertest(serverUri)

test/integration/account-creation-tls.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const $rdf = require('rdflib')
44

55
const { rm, read } = require('../test-utils')
66
const ldnode = require('../../index')
7+
const fs = require('fs-extra')
78
const path = require('path')
89

910
describe('AccountManager (account creation tests)', function () {
@@ -13,8 +14,9 @@ describe('AccountManager (account creation tests)', function () {
1314
var address = 'https://localhost:3457'
1415
var host = 'localhost:3457'
1516
var ldpHttpsServer
17+
let rootPath = path.join(__dirname, '../resources/accounts/')
1618
var ldp = ldnode.createServer({
17-
root: path.join(__dirname, '../resources/accounts/'),
19+
root: rootPath,
1820
sslKey: path.join(__dirname, '../keys/key.pem'),
1921
sslCert: path.join(__dirname, '../keys/cert.pem'),
2022
auth: 'tls',
@@ -29,6 +31,8 @@ describe('AccountManager (account creation tests)', function () {
2931

3032
after(function () {
3133
if (ldpHttpsServer) ldpHttpsServer.close()
34+
fs.removeSync(path.join(rootPath, 'localhost/index.html'))
35+
fs.removeSync(path.join(rootPath, 'localhost/index.html.acl'))
3236
})
3337

3438
var server = supertest(address)

test/integration/acl.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var assert = require('chai').assert
2-
var fs = require('fs')
2+
var fs = require('fs-extra')
33
var $rdf = require('rdflib')
44
var request = require('request')
55
var path = require('path')
@@ -18,11 +18,11 @@ describe('ACL HTTP', function () {
1818
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
1919

2020
var address = 'https://localhost:3456/test/'
21-
21+
let rootPath = path.join(__dirname, '../resources')
2222
var ldpHttpsServer
2323
var ldp = ldnode.createServer({
2424
mount: '/test',
25-
root: path.join(__dirname, '../resources'),
25+
root: rootPath,
2626
sslKey: path.join(__dirname, '../keys/key.pem'),
2727
sslCert: path.join(__dirname, '../keys/cert.pem'),
2828
webid: true,
@@ -35,6 +35,8 @@ describe('ACL HTTP', function () {
3535

3636
after(function () {
3737
if (ldpHttpsServer) ldpHttpsServer.close()
38+
fs.removeSync(path.join(rootPath, 'index.html'))
39+
fs.removeSync(path.join(rootPath, 'index.html.acl'))
3840
})
3941

4042
var aclExtension = '.acl'

0 commit comments

Comments
 (0)