"""OMEMO key backup restored in another browser: the decrypted messages come with it, including our own (edited) ones that are never encrypted for the sending device.""" import asyncio from playwright.async_api import async_playwright from browser import login, BASE, OUT from browser_edit import send, edit_last, bubbles, open_chat async def main(): async with async_playwright() as p: browser = await p.chromium.launch() actx, alice, aerr = await login(browser, "alice@localhost", "alicepass", "restorealice") bctx, bob, berr = await login(browser, "bob@localhost", "bobpass", "restorebob") await alice.wait_for_timeout(4000) await open_chat(alice, "bob@localhost") await open_chat(bob, "alice@localhost") await alice.evaluate("ChatOmemo.enableContactState('bob@localhost', false)") await alice.wait_for_timeout(5000) await send(alice, "Khôi phục: bản gốc") await edit_last(alice, "Khôi phục: đã sửa") await send(bob, "Khôi phục: trả lời của bob") print("before, alice:", await bubbles(alice, 2)) # Backup await alice.goto(BASE + "/configuration") await alice.wait_for_timeout(3000) await alice.evaluate("Account_ajaxOmemoBackup()") await alice.wait_for_selector("form[name=omemo_backup] input[name=password]", timeout=10000) await alice.fill("form[name=omemo_backup] input[name=password]", "secret") await alice.fill("form[name=omemo_backup] input[name=password_confirmation]", "secret") async with alice.expect_download() as dl: await alice.evaluate("Account.omemoBackup()") path = f"{OUT}/restore_backup.json" await (await dl.value).save_as(path) # Restore in a fresh browser ctx2, alice2, a2err = await login(browser, "alice@localhost", "alicepass", "restorealice2") await alice2.wait_for_timeout(4000) await alice2.goto(BASE + "/configuration") await alice2.wait_for_timeout(3000) await alice2.evaluate("Account_ajaxOmemoRestore()") await alice2.wait_for_selector("form[name=omemo_restore] input[name=file]", timeout=10000) await alice2.set_input_files("form[name=omemo_restore] input[name=file]", path) await alice2.fill("form[name=omemo_restore] input[name=password]", "secret") async with alice2.expect_navigation(): await alice2.evaluate("Account.omemoRestore()") await alice2.wait_for_timeout(4000) await open_chat(alice2, "bob@localhost") print("restored, alice:", await bubbles(alice2, 2)) await alice2.screenshot(path=f"{OUT}/restore_alice2.png") for e in aerr + berr + a2err: print(e) await browser.close() asyncio.run(main())