WIP: feat/automated-account-deletion #174

Draft
b12f wants to merge 34 commits from feat/automated-account-deletion into main
3 changed files with 27 additions and 29 deletions
Showing only changes of commit 7f0bef0880 - Show all commits
flake.lock
tests
keycloak.nix
support/puppeteer-socket/src

8
flake.lock generated
View file

@ -335,11 +335,11 @@
]
},
"locked": {
"lastModified": 1737810569,
"narHash": "sha256-b3ymxmPuMPnAG6Z8FNErmKzjmUcQkXiTs6WkAE1qBkk=",
"lastModified": 1737819581,
"narHash": "sha256-i9rZSxy33BlDpp4JY9SI2zEFo5EhMnS7cAhqHAPRUZA=",
"ref": "main",
"rev": "af99e9e38fcbdd691c12aa6044cf831c8eea28b4",
"revCount": 6,
"rev": "bb9c6f3e3608f0d342ab74d921caddfe4a8bf5d6",
"revCount": 7,
"type": "git",
"url": "https://git.pub.solar/pub-solar/keycloak-event-listener"
},

View file

@ -50,26 +50,22 @@ in
def puppeteer_execute(cmd):
return client.execute(f'puppeteer-run \'{cmd}\' ')
def puppeteer_scroll_into_view(selector):
return puppeteer_succeed(f'(async () => {{ const el = await page.$(`{selector}`); console.log(el); return el.scrollIntoView(); }})()')
start_all()
acme_server.wait_for_unit("system.slice")
mail_server.wait_for_unit("dovecot2.service")
mail_server.wait_for_unit("postfix.service")
mail_server.wait_for_unit("nginx.service")
mail_server.wait_until_succeeds("curl http://mail.test.pub.solar/")
auth_server.wait_for_unit("system.slice")
auth_server.succeed("ping 127.0.0.1 -c 2")
auth_server.wait_for_unit("nginx.service")
auth_server.wait_for_unit("keycloak.service")
auth_server.wait_for_open_port(8080)
auth_server.wait_for_open_port(443)
auth_server.wait_until_succeeds("curl http://127.0.0.1:8080/")
auth_server.wait_until_succeeds("curl https://auth.test.pub.solar/")
auth_server.succeed("${pkgs.keycloak}/bin/kcadm.sh create realms -f ${realm-export} --server http://localhost:8080 --realm master --user admin --password password --no-config")
auth_server.wait_until_succeeds("curl https://auth.test.pub.solar/")
client.wait_for_unit("system.slice")
client.wait_for_file("/tmp/puppeteer.sock")
####### Registration #######
@ -88,6 +84,12 @@ in
puppeteer_succeed('page.locator("[name=password]").fill("Password1234")')
puppeteer_succeed('page.locator("[name=password-confirm]").fill("Password1234")')
client.screenshot("register-filled-in")
# Make sure the mail server is ready to send
mail_server.wait_for_unit("dovecot2.service")
mail_server.wait_for_unit("postfix.service")
mail_server.wait_until_succeeds("curl http://mail.test.pub.solar/")
puppeteer_succeed('page.locator("input[type=submit][value=Register]").click()')
puppeteer_succeed('page.waitForNetworkIdle()')
client.screenshot("before-email-confirm")
@ -187,10 +189,15 @@ in
puppeteer_succeed('page.waitForNetworkIdle()')
client.screenshot("TOTP-login-form")
print("Sleeping 30s to make sure we roll over into the next TOTP token")
time.sleep(30)
print('Setting all system clocks 30 seconds ahead for next TOTP token')
client.execute("date --set='+30 seconds'");
auth_server.execute("date --set='+30 seconds'");
dns_server.execute("date --set='+30 seconds'");
acme_server.execute("date --set='+30 seconds'");
mail_server.execute("date --set='+30 seconds'");
totp = client.execute(f'oathtool --totp -b "{totp_secret_key}"')[1].replace("\n", "")
puppeteer_succeed(f'page.locator("[name=otp]").fill("{totp}")')
puppeteer_succeed('page.locator("::-p-text(Sign In)").click()')
@ -199,10 +206,11 @@ in
####### Delete TOTP #######
puppeteer_succeed('page.locator(`[data-testid="otp/credential-list"] button::-p-text(Delete)`).click()')
puppeteer_succeed('page.waitForNetworkIdle()')
puppeteer_scroll_into_view('[data-testid="otp/credential-list"]')
time.sleep(0.2)
client.screenshot("TOTP-before-delete")
puppeteer_succeed('page.locator("main").scroll({ scrollTop: 200 })')
client.screenshot("TOTP-deleted")
# puppeteer_succeed('page.locator(`[data-testid="otp/credential-list"] button::-p-text(Delete)`).click()')
# client.screenshot("TOTP-deleted")
'';
}

View file

@ -16,13 +16,6 @@ const EXECUTABLE = process.env.EXECUTABLE || 'firefox';
});
const page = await firefoxBrowser.newPage();
// page.on('request', request => {
// console.log(`[puppeteer req] ${request.url()}`);
// });
// page.on('response', response => {
// console.log(`[puppeteer res] ${response.url()}`);
// });
await page.setViewport({
width: 1200,
@ -41,10 +34,7 @@ const EXECUTABLE = process.env.EXECUTABLE || 'firefox';
req.on('end', async () => {
try {
const content = chunks.join('');
console.log(`Executing ${content}`);
const val = await eval(content);
const responseText = (() => {
try {
return val.toString();
@ -64,6 +54,6 @@ const EXECUTABLE = process.env.EXECUTABLE || 'firefox';
});
server.listen(PUPPETEER_SOCKET, () => {
console.log('Listening!');
console.log('[puppeteer-socket] Listening!');
});
})();