diff --git a/extension/background/wallet.js b/extension/background/wallet.js index 2d3687f98..6c596899f 100644 --- a/extension/background/wallet.js +++ b/extension/background/wallet.js @@ -1,75 +1,106 @@ 'use strict'; -//chrome.browserAction.setBadgeBackgroundColor({color: "#000"}) -chrome.browserAction.setBadgeText({text: "42"}) -chrome.browserAction.setTitle({title: "Taler: 42 EUR"}) +const DONE = 4; +const DB_NAME = "taler"; +const DB_VERSION = 1; -function test_emscripten () -{ - var cur_time = TWRALLgetCurrentTime(); - var fancy_time = TWRgetFancyTime(cur_time); - console.log('current time: '+ fancy_time); -} +// Shown in the UI. +let backendFailed = false; -test_emscripten(); - -DB.open(function () { - console.log ("DB: ready"); -}); - -let DONE = 4; - -chrome.runtime.onMessage.addListener( - function (req, sender, onresponse) { - console.log("Message: " + req.type + - (sender.tab - ? " from a content script: "+ sender.tab.url - : " from the extension")); - switch (req.type) - { - case "db-get-wallet": - DB.wallet_get (onresponse); - break; - - case "db-list-transactions": - DB.transaction_list (onresponse); - break; - - case "db-list-reserves": - DB.reserve_list (onresponse); - break; - case "confirm-reserve": - console.log('detail: ' + JSON.stringify(req.detail)); - let keypair = createEddsaKeyPair(); - let form = new FormData(); - form.append(req.detail.field_amount, req.detail.amount_str); - form.append(req.detail.field_reserve_pub, keypair.pub); - form.append(req.detail.field_mint, req.detail.mint); - // XXX: set bank-specified fields. - let myRequest = new XMLHttpRequest(); - console.log("making request to " + req.detail.post_url); - myRequest.open('post', req.detail.post_url); - myRequest.send(form); - myRequest.addEventListener('readystatechange', (e) => { - if (myRequest.readyState == DONE) { - let resp = {}; - resp.status = myRequest.status; - resp.text = myRequest.responseText; - switch (myRequest.status) { - case 200: - resp.success = true; - // We can't show the page directly, so - // we show some generic page from the wallet. - resp.backlink = chrome.extension.getURL("pages/reserve-success.html"); - break; - default: - resp.success = false; - } - onresponse(resp); - } - }); - // Allow async response - return true; +/** + * Run a function with the opened taler DB. + */ +function withTalerDb(f) { + let req = indexedDB.open(DB_NAME, DB_VERSION); + req.addEventListener("error", (e) => { + // XXX: more details + backendFailed = true; + }); + req.addEventListener("success", (e) => { + var db = e.target.result; + f(db); + }); + req.addEventListener("upgradeneeded", (e) => { + console.log ("DB: upgrade needed: oldVersion = "+ event.oldVersion); + db = event.target.result; + switch (event.oldVersion) { + case 0: // DB does not exist yet + db.createObjectStore("mints", { keyPath: "mint_pub" }); + db.createObjectStore("reserves", { keyPath: "reserve_pub"}); + db.createObjectStore("denoms", { keyPath: "denom_pub" }); + db.createObjectStore("coins", { keyPath: "coin_pub" }); + db.createObjectStore("withdrawals", { keyPath: "id", autoIncrement: true }); + db.createObjectStore("transactions", { keyPath: "id", autoIncrement: true }); break; } }); +} + + +function confirmReserve(db, detail, sendResponse) { + console.log('detail: ' + JSON.stringify(detail)); + let keypair = createEddsaKeyPair(); + let form = new FormData(); + let now = new Date(); + form.append(detail.field_amount, detail.amount_str); + form.append(detail.field_reserve_pub, keypair.pub); + form.append(detail.field_mint, detail.mint); + // XXX: set bank-specified fields. + let myRequest = new XMLHttpRequest(); + console.log("making request to " + detail.post_url); + myRequest.open('post', detail.post_url); + myRequest.send(form); + myRequest.addEventListener('readystatechange', (e) => { + if (myRequest.readyState == DONE) { + let resp = {}; + resp.status = myRequest.status; + resp.text = myRequest.responseText; + let reserveRecord = { + reserve_pub: keypair.pub, + reserve_priv: keypair.priv, + keypair: keypair, + mint_base_url: detail.mint, + created: now, + last_query: null, + current_amount: null, + // XXX: set to actual amount + initial_amount: null + }; + // XXX: insert into db. + switch (myRequest.status) { + case 200: + resp.success = true; + // We can't show the page directly, so + // we show some generic page from the wallet. + resp.backlink = chrome.extension.getURL("pages/reserve-success.html"); + let tx = db.transaction(['reserves'], 'readwrite'); + tx.objectStore('reserves').add(reserveRecord); + tx.addEventListener('complete', (e) => { + console.log('tx complete'); + sendResponse(resp); + }); + break; + default: + resp.success = false; + sendResponse(resp); + } + } + }); + // Allow async response + return true; +} + +withTalerDb((db) => { + console.log("db loaded"); + chrome.runtime.onMessage.addListener( + function (req, sender, onresponse) { + // XXX: use assoc. instead of switch? + switch (req.type) + { + case "confirm-reserve": + return confirmReserve(db, req.detail, onresponse) + break; + } + }); +}); +