Skip to content

Commit 4f3a008

Browse files
authored
Merge pull request #858 from solid/feature/delete-pod
Delete account implementation
2 parents 119e2d4 + 225463b commit 4f3a008

20 files changed

+1176
-48
lines changed
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

default-templates/new-account/index.html

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
</div>
2121
</nav>
2222

23-
2423
<p class="lead">
2524
<span>
2625
This is a public homepage of {{#if name}}{{name}}, whose WebID is{{else}}a user with WebID{{/if}}
@@ -54,26 +53,49 @@ <h1>Apps</h1>
5453
</a>
5554
</div>
5655
</section>
56+
57+
<section class="hidden" id="account-settings">
58+
<h1>Account settings</h1>
59+
<div class="list-group">
60+
<a href="/account/delete/" class="list-group-item">
61+
<span class="lead">Delete account</span>
62+
</a>
63+
</div>
64+
</section>
5765
</div>
5866

5967
<script src="/common/js/solid-auth-client.bundle.js"></script>
6068
<script type="text/javascript">
6169
(function () {
62-
'use strict'
63-
var button = document.getElementById('session-action')
64-
var loggedIn = false
70+
'use strict';
71+
var button = document.getElementById('session-action');
72+
var loggedIn = false;
73+
var accountSettings = document.getElementById('account-settings');
6574

66-
solid.auth.trackSession(session => {
67-
loggedIn = !!session
68-
button.innerText = loggedIn ? 'Log out' : 'Log in'
75+
solid.auth.trackSession(function(session) {
76+
loggedIn = !!session;
77+
button.innerText = loggedIn ? 'Log out' : 'Log in';
6978
button.classList.remove('btn-default');
70-
button.classList.add(loggedIn ? 'btn-danger' : 'btn-primary')
71-
})
79+
button.classList.add(loggedIn ? 'btn-danger' : 'btn-primary');
80+
if (loggedIn) {
81+
var sessionOrigin = getOriginFromWebId(session.webId);
82+
var isOwner = sessionOrigin === location.origin;
83+
accountSettings.classList.toggle('hidden', !isOwner);
84+
}
85+
});
7286

7387
button.addEventListener('click', function () {
74-
loggedIn ? solid.auth.logout() : solid.auth.popupLogin()
75-
})
76-
})()
88+
loggedIn ? solid.auth.logout() : solid.auth.popupLogin();
89+
});
90+
91+
function getOriginFromWebId(webId) {
92+
if (window.URL.prototype) {
93+
return new URL(webId).origin;
94+
}
95+
var uriParts = webId.split('/');
96+
return uriParts[0] + '//' + uriParts[2];
97+
}
98+
})();
7799
</script>
78100
</body>
79101
</html>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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>Account Deleted</title>
7+
<link rel="stylesheet" href="/common/css/bootstrap.min.css">
8+
</head>
9+
<body>
10+
<div class="container">
11+
<h4>Account Deleted</h4>
12+
</div>
13+
<div class="container">
14+
<p>Your account has been deleted.</p>
15+
</div>
16+
</body>
17+
</html>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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>Delete Account</title>
7+
<link rel="stylesheet" href="/common/css/bootstrap.min.css">
8+
</head>
9+
<body>
10+
<div class="container">
11+
<h4>Delete Account</h4>
12+
</div>
13+
<div class="container">
14+
<form method="post" action="/account/delete/confirm">
15+
{{#if error}}
16+
<div class="form-group">
17+
<div class="row">
18+
<div class="col-md-12">
19+
<p class="text-danger"><strong>{{error}}</strong></p>
20+
</div>
21+
</div>
22+
</div>
23+
{{/if}}
24+
25+
{{#if validToken}}
26+
<p>Beware that this is an irreversible action. All your data that is stored in the POD will be deleted.</p>
27+
28+
<div class="form-group">
29+
<div class="row">
30+
<div class="col-md-2">
31+
<button type="submit" class="btn btn-danger">Delete account</button>
32+
</div>
33+
</div>
34+
35+
<input type="hidden" name="token" value="{{token}}" />
36+
</div>
37+
{{else}}
38+
<div class="form-group">
39+
<div class="row">
40+
<div class="col-md-12">
41+
<div>
42+
<strong>Token not valid</strong>
43+
</div>
44+
</div>
45+
</div>
46+
</div>
47+
{{/if}}
48+
</form>
49+
</div>
50+
</body>
51+
</html>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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>Delete Account Link Sent</title>
7+
<link rel="stylesheet" href="/common/css/bootstrap.min.css">
8+
</head>
9+
<body>
10+
<div class="container">
11+
<h4>Confirm account deletion</h4>
12+
</div>
13+
<div class="container">
14+
<p>A link to confirm the deletion of this account has been sent to your email.</p>
15+
</div>
16+
</body>
17+
</html>

default-views/account/delete.hbs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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>Delete Account</title>
7+
<link rel="stylesheet" href="/common/css/bootstrap.min.css">
8+
<script></script>
9+
</head>
10+
<body>
11+
<div class="container">
12+
<h4>Delete Account</h4>
13+
</div>
14+
<div class="container">
15+
<form method="post" action="/account/delete">
16+
<div class="form-group">
17+
{{#if error}}
18+
<div class="row">
19+
<div class="col-md-12">
20+
<p class="text-danger"><strong>{{error}}</strong></p>
21+
</div>
22+
</div>
23+
{{/if}}
24+
<div class="row">
25+
<div class="col-md-12">
26+
{{#if multiuser}}
27+
<p>Please enter your account name. A delete account link will be
28+
emailed to the address you provided during account registration.</p>
29+
30+
<label for="username">Account Name:</label>
31+
<input type="text" class="form-control" name="username" id="username"
32+
placeholder="alice" />
33+
{{else}}
34+
<p>A delete account link will be
35+
emailed to the address you provided during account registration.</p>
36+
{{/if}}
37+
</div>
38+
</div>
39+
</div>
40+
41+
<div class="form-group">
42+
<div class="row">
43+
<div class="col-md-2">
44+
<button type="submit" class="btn btn-primary">Send Delete Account Link</button>
45+
</div>
46+
</div>
47+
</div>
48+
</form>
49+
</div>
50+
</body>
51+
</html>

lib/api/accounts/user-accounts.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const debug = require('../../debug').accounts
66

77
const CreateAccountRequest = require('../../requests/create-account-request')
88
const AddCertificateRequest = require('../../requests/add-cert-request')
9+
const DeleteAccountRequest = require('../../requests/delete-account-request')
10+
const DeleteAccountConfirmRequest = require('../../requests/delete-account-confirm-request')
911

1012
/**
1113
* Returns an Express middleware handler for checking if a particular account
@@ -68,6 +70,12 @@ function middleware (accountManager) {
6870

6971
router.post('/api/accounts/cert', bodyParser, newCertificate(accountManager))
7072

73+
router.get('/account/delete', DeleteAccountRequest.get)
74+
router.post('/account/delete', bodyParser, DeleteAccountRequest.post)
75+
76+
router.get('/account/delete/confirm', DeleteAccountConfirmRequest.get)
77+
router.post('/account/delete/confirm', bodyParser, DeleteAccountConfirmRequest.post)
78+
7179
return router
7280
}
7381

lib/debug.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ exports.server = debug('solid:server')
1111
exports.subscription = debug('solid:subscription')
1212
exports.container = debug('solid:container')
1313
exports.accounts = debug('solid:accounts')
14+
exports.email = debug('solid:email')
1415
exports.ldp = debug('solid:ldp')

0 commit comments

Comments
 (0)