diff options
| author | tg(x) <*@tg-x.net> | 2015-12-04 22:47:44 +0100 | 
|---|---|---|
| committer | tg(x) <*@tg-x.net> | 2015-12-04 22:47:44 +0100 | 
| commit | 1089b40b1c03fa69c0e73dd43e4281aa96388171 (patch) | |
| tree | 0cdffcbad05041659dc826db9f5dbf1f47de47e1 /extension | |
| parent | 5243a707260af9de820ad02b1972d3280164cf19 (diff) | |
DB structure, emscripten interface
Diffstat (limited to 'extension')
| -rw-r--r-- | extension/background/db.js | 220 | ||||
| -rw-r--r-- | extension/background/emscriptif.js | 587 | ||||
| l--------- | extension/background/libwrapper.js | 1 | ||||
| -rw-r--r-- | extension/background/wallet.js | 38 | ||||
| -rw-r--r-- | extension/lib/util.js | 91 | ||||
| -rw-r--r-- | extension/manifest.json | 16 | ||||
| -rw-r--r-- | extension/popup/transactions.html | 1 | ||||
| -rw-r--r-- | extension/popup/transactions.js | 19 | ||||
| -rw-r--r-- | extension/popup/wallet.html | 1 | ||||
| -rw-r--r-- | extension/popup/wallet.js | 30 | 
10 files changed, 967 insertions, 37 deletions
| diff --git a/extension/background/db.js b/extension/background/db.js new file mode 100644 index 000000000..9be933d9c --- /dev/null +++ b/extension/background/db.js @@ -0,0 +1,220 @@ +"use strict"; + +var DB = function () { +  let DB = {}; // returned object with exported functions + +  let DB_NAME = "taler"; +  let DB_VERSION = 1; + +  let db = null; +  let is_ready = null; + +  DB.open = function (onsuccess, onerror) +  { +    is_ready = false; + +    let req = indexedDB.open(DB_NAME, DB_VERSION); +    req.onerror = onerror; +    req.onsuccess = function (event) +    { +      db = event.target.result; +      is_ready = true; +      if (onsuccess) +        onsuccess(); +    }; + +    req.onupgradeneeded = function (event) +    { +      console.log ("DB: upgrade needed: oldVersion = "+ event.oldVersion); + +      db = event.target.result; +      db.onerror = onerror; + +      switch (event.oldVersion) +      { +        case 0: // DB does not exist yet +        { +          let example = {}; + +          let mints = db.createObjectStore("mints", { keyPath: "mint_pub" }); +          mints.createIndex("name", "name", { unique: true }); + +          example.mint = { +            mint_pub: "<mint's master pub key>",	// length: 32 +            name: "Mint One", +            url: "https://mint.one/", +          }; + +          let denoms = db.createObjectStore("denoms", { keyPath: "denom_pub" }); + +          example.denom = { +            denom_pub: "<denom pub key>",		// length: 32 +            mint_pub: "<mint's master pub key>",	// length: 32 +            mint_sig: "<mint's sig>",		// length: 64 +            withdraw_expiry_time: 1234567890, +            deposit_expiry_time: 1234567890, +            start_time: 1234567890, +            value: { +              value: 1, +              fraction: 230000, // 0..999999 +              currency: "EUR", +            }, +            fee: { +              withdraw: { +                value: 0, +                fraction: 100000, +                currency: "EUR", +              }, +              deposit: { +                value: 0, +                fraction: 100000, +                currency: "EUR", +              }, +              refresh: { +                value: 0, +                fraction: 100000, +                currency: "EUR", +              }, +            }, +          }; + +          let reserves = db.createObjectStore("reserves", { keyPath: "reserve_pub"}); +          example.reserve = { +            reserve_pub: "<pub key>", +            reserve_priv: "<priv key>", +            mint_pub: "<mint's master pub key>", +            initial: { +              value: 1, +              fraction: 230000, +              currency: "EUR", +            }, +            current: { +              value: 1, +              fraction: 230000, +              currency: "EUR", +              blind_session_pub: "<pub key>", +              status_sig: "<sig>", +            }, +          }; + +          let withdrawals = db.createObjectStore("withdrawals", { keyPath: "id", autoIncrement: true }); +          example.withdrawal = { +            id: 1, // generated +            reserve_pub: "<pub key>", +            reserve_sig: "<sig>", +            denom_pub: "<pub key", +            blind_session_pub: "<pub key>", +            blind_priv: "<priv key>", +            coin_pub: "<pub key>", +            coin_priv: "<priv key>", +            coin_ev: "", +          }; + +          let coins = db.createObjectStore("coins", { keyPath: "coin_pub" }); +          example.coin = { +            // coin either has a withdraw_id or refresh_id +            // or it is imported in which case both are null +            withdraw_id: 1,		// can be null +            refresh_id: null,	// can be null +            is_refreshed: false, +            denom_pub: "<pub key>", +            coin_pub: "<pub key>", +            coin_priv: "<priv key>", +            denom_sig: "<sig>", +            spent: { +              value: 1, +              fraction: 230000, +            }, +            transactions: [ 123, 456 ],	// list of transaction IDs where this coin was used +          }; + +          let transactions = db.createObjectStore("transactions", { keyPath: "id", autoIncrement: true }); +          example.transaction = { +            id: 1, // generated +            wire_hash: "<hash>", +            value: { +              value: 1, +              fraction: 230000, +              currency: "EUR", +            }, +            contract: "<JSON>", +            is_checkout_done: true, +            is_confirmed: true, +            fulfillment_url: "https://some.shop/transaction/completed", +          }; + +          let refresh = db.createObjectStore("refresh"); +          example.refresh = { +            // TODO +          }; +        } +      } + +      is_ready = true; +      if (onsuccess) +        onsuccess(); +    } +  }; + + +  DB.close = function () +  { +    db.close(); +  }; + + +  DB.wallet_get = function (onresult, onerror) +  { +    let wallet = { }; + +    let tr = db.transaction([ "coins", "denoms" ], "readonly"); +    let coins = tr.objectStore("coins"); +    let denoms = tr.objectStore("denoms"); + +    let coins_cur = coins.openCursor(); +    coins_cur.onerror = onerror; +    coins_cur.onsuccess = function () +    { +      let cur = event.target.result; +      if (cur) { +        let denom_get = denoms.get(cur.valcue.denom_pub); +        denom_get.onerror = onerror; +        denom_get.onsuccess = function (event) +        { +          let denom = event.target.result; +          if (denom.currency in wallet) +          { +            let w = wallet[denom.currency]; +            w.value += denom.value; +            w.fraction = (w.fraction + denom.fraction) % 1000000; +            if (1000000 <= w.fraction + denom.fraction) +              w.value++; +          } +          else +          { +            wallet[denom.currency] = denom; +          } +          cur.continue(); +        } +      } +      else // no more entries +      { +        onresult(wallet); +      } +    }; +  }; + + +  DB.transaction_list = function (onresult, onerror) +  { +    // TODO +  }; + + +  DB.reserve_list = function (onresult, onerror) +  { +    // TODO +  }; + +  return DB; +}(); diff --git a/extension/background/emscriptif.js b/extension/background/emscriptif.js new file mode 100644 index 000000000..62b233eda --- /dev/null +++ b/extension/background/emscriptif.js @@ -0,0 +1,587 @@ +/* + +  This file is part of TALER +  Copyright (C) 2014, 2015 Christian Grothoff (and other contributing authors) + +  TALER is free software; you can redistribute it and/or modify it under the +  terms of the GNU General Public License as published by the Free Software +  Foundation; either version 3, or (at your option) any later version. + +  TALER is distributed in the hope that it will be useful, but WITHOUT ANY +  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +  A PARTICULAR PURPOSE.  See the GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License along with +  TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + + +*/ + + +var EXPORTED_SYMBOLS = [ +  'TWRhelloWorld', +  'TWRgetValue', +  'TWRgetFraction', +  'TWRgetCurrency', +  'TamountCmp', +  'TWRverifyConfirmation', +  'TWRverifySignKey', +  'TWRverifyDenom', +  'TWRverifyDenoms', +  'TWRALLrsaPublicKeyHash', +  'TWRALLgetEncodingFromRsaSignature', +  'DWRtestStringCmp', +  'TWRmultiplyAmount', +  'TWRmultiplyAmounts', +  'DWRdumpAmount', +  'TWRALLgetAmount', +  'DWRtestString', +  'DWRgetPurpose', +  'TWReddsaVerify', +  'TamountAdd', +  'TamountSubtract', +  'TWRALLmakeEddsaSignature', +  'TWRALLamountAdd', +  'TWRALLeddsaPublicKeyFromPrivate', +  'TWRALLeddsaPublicKeyFromPrivString', +  'TWRALLeddsaPrivateKeyFromString', +  'TWRALLeccEcdh', +  'TWRALLhash', +  'TWRALLecdhePublicKeyFromPrivateKey', +  'TWRALLrsaPublicKeyDecodeFromString', +  'GCeddsaSign', +  'TWRALLmakeWithdrawBundle', +  'GCALLrsaSignatureDecode', +  'GCrsaSignatureEncode', +  'TWRALLsignDepositPermission', +  'GCALLrsaPublicKeyDecode', +  'GCALLrsaPublicKeyEncode', +  'WRALLeddsaPublicKey', +  'GCALLeddsaKeyCreate', +  'WRALLecdhePublicKey ', +  'GSALLdataToStringAlloc', +  'TWRgnunetFree', +  'GSstringToData', +  'TWRALLgetCurrentTime', +  'TWRgetFancyTime', +  'GChash', +  'getHashedArray', +  'TWRALLsignTest', +  'GCALLecdheKeyCreate', +  'GCecdheKeyGetPublic', +  'WRALLecdhePublicKey', +  'WRverifyTest', +  'GCeccEcdh', +  'TWRALLgenSymmetricKey', +  'TWRALLgenInitVector', +  'GCsymmetricDecrypt', +  'GCsymmetricEncrypt', +  'TWRALLgenKeyFromBlob', +  'GCALLrsaPrivateKeyGetPublic', +  'GCALLrsaPrivateKeyCreate', +  'GCALLrsaBlindingKeyCreate', +  'GCrsaBlindingKeyFree', +  'GCrsaPublicKeyFree', +  'GCrsaPrivateKeyFree', +  'GCALLrsaBlind', +  'GCALLrsaUnblind', +  'GCALLrsaSign', +  'GCrsaVerify', +  'GCrsaSignatureFree', +  'GCeddsaKeyGetPublic', +  'WRALLmakePurpose', +  'GChkdf', +  'emscMalloc', +  'emscFree' +]; + +/* The following definition is needed to make emscripted library to remain +  'alive' after its loading. Otherwise, the normal behaviour would be: +  loading -> look for a 'main()' -> if one is found execute it then exit, +  otherwise just exit. See https://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html +  DO NOTE: this definition MUST precede the importing/loading of the emscripted +  library */ + +/* FIXME +getLastWindow().Module = { + +  onRuntimeInitialized: function() { + +  } + +}; +*/ + +/* According to emscripten's design, we need our emscripted library to be executed +  with a 'window' object as its global scope. +  Note: that holds on emscripten's functions too, that is they need to be *explicitly* +  run with some 'window' object as their global scope. In practice, given a function +  'foo' pointing to some emscripted function, that is accomplished by the mean of 'call()' +  or 'apply()' methods; so, being 'someWin' a 'window' object, the statements + +  foo.call('someWin', arg1, .., argN) or foo.apply('someWin', ['arg1', .., 'argN']) will +  execute foo(arg1, .., argN) with 'someWin' as its global scope. +  See http://www.bennadel.com/blog/2265-changing-the-execution-context-of-javascript +  -functions-using-call-and-apply.htm. */ + +/* The naming convention is such that: +  - 'GCfunctionName' takes its code from GNUNET_CRYPTO_function_name +  - 'GCALLfunctionName' takes its code from GNUNET_CRYPTO_function_name and returns +     a pointer that must be deallocated using 'WRgnunetFree' (that takes its code from +     'GNUNET_free' in the wrapper) +  - 'GSfunctionName' and 'GSALLfunctionName' comply to the same convention respect to +    GNUNET_STRINGS_* realm. +  - 'TWRfunctionName' takes its code from 'TALER_function_name' in the wrapper. +  - 'TWRALLfunctionName' takes its code from 'TALER_ALL_function_name' in the wrapper +    and returns a pointer that must be deallocated using 'TWRgnunetFree' (or a function +    provided by some emscripted routine) (the 'wrapper' is an additional layer written in +    C that does some struct(s) manipulations where that is uncovenient to do from JavaScript. +    Currently located at '../../emscripten/testcases/wrap.c') +  - The same applies to 'TfunctionName' and 'TALLfunctionName', to indicate that the +    respective functions come from (the emscripted version of) TALER_* realm. */ + + +// shortcut to emscr's 'malloc' +function emscMalloc(size) { + +  var ptr = Module._malloc(size); +  return ptr; + +} + +/* shortcut to emscr's 'free'. This function is problematic: +  it randomly stops working giving 'emscFree is not a function' +  error */ +function emscFree(ptr) { + +  Module._free(ptr); + +} + +var getEmsc = Module.cwrap; + +var TWRhelloWorld = getEmsc('TALER_WR_hello_world', 'void', []); + +var TWRverifyConfirmation = getEmsc('TALER_WR_verify_confirmation', +                                    'number', +                                   ['number', +                                    'number', +     		                    'number', +                                    'number', +				    'number', +				    'number', +                                    'number', +                                    'number', +                                    'number', +                                    'number', +                                    'number']); +var TWRgetValue = getEmsc('TALER_WR_get_value', +                          'number', +			 ['number']); + +var TWRgetFraction = getEmsc('TALER_WR_get_fraction', +                             'number', +			    ['number']); + +var TWRgetCurrency = getEmsc('TALER_WR_get_currency', +                             'string', +			    ['number']); + + +var TWRmultiplyAmounts = getEmsc('TALER_WR_multiply_amounts', +                                 'number', +			        ['number', +			         'number'] ); + +var TWRmultiplyAmount = getEmsc('TALER_WR_multiply_amount', +                               'number', +			      ['number', +			       'number'] ); + +var TWRALLrsaPublicKeyHash = getEmsc('TALER_WRALL_rsa_public_key_hash', +                                     'number', +				    ['number']); + +var TWRverifyDenom = getEmsc('TALER_WR_verify_denom', +                             'number', +                            ['number', +                             'number', +		             'number', +                             'number', +                             'number', +                             'number', +                             'number', +                             'number', +                             'number', +			     'number', +			     'number']); + +var TWRverifyDenoms = getEmsc('TALER_WR_verify_denoms', +                              'number', +			     ['number', +			      'number', +                              'number', +			      'number', +                              'number']); + +var TWRverifySignKey = getEmsc('TALER_WR_verify_sign_key', +                               'number', +                              ['number', +			       'number', +			       'number', +                               'number', +			       'number', +			       'number']); + + +var TWRALLgetEncodingFromRsaSignature = getEmsc('TALER_WRALL_get_encoding_from_rsa_signature', +                                                'number', +                                               ['number']); + +var TamountCmp = getEmsc('TALER_amount_cmp', +                         'number', +			['number', +			 'number']); + +var DWRdumpAmount = getEmsc('DEBUG_WR_dump_amount', +                            'void' +			   ['number']); + +var DWRtestStringCmp = getEmsc('DEBUG_WR_test_string_cmp', +                               'number', +			      ['number', +			       'string']); + +var TWRALLgetAmount = getEmsc('TALER_WRALL_get_amount', +                              'number', +			     ['number', +			      'number', +			      'number', +			      'string']); + +var DWRgetPurpose = getEmsc('DEBUG_WR_get_purpose', +                            'number', +			   ['number']); + +var TWReddsaVerify = getEmsc('TALER_WR_eddsa_verify', +                             'number', +			    ['string', +			     'number', +			     'number', +			     'number']); + +var TWRALLmakeEddsaSignature = getEmsc('TALER_WRALL_make_eddsa_signature', +                                       'number', +				      ['number', +				       'number']); + +var TWRALLamountAdd = getEmsc('TALER_WRALL_amount_add', +                              'number', +			     ['number', +			      'number', +			      'number', +			      'number', +                              'number', +			      'number', +			      'string']); + +var TamountSubtract = getEmsc('TALER_amount_subtract', +                              'number', +			     ['number', +			      'number', +			      'number']); + +var TamountAdd = getEmsc('TALER_amount_add', +                         'number', +			['number', +			 'number', +			 'number']); +var TWRALLeddsaPublicKeyFromPrivate = getEmsc('TALER_WRALL_eddsa_public_key_from_private', +                                              'number', +                                             ['number']); + +var TWRALLeddsaPublicKeyFromPrivString = getEmsc('TALER_WRALL_eddsa_public_key_from_priv_string', +                                                 'number', +                                                ['string']); + +var TWRALLsignDepositPermission = getEmsc('TALER_WRALL_sign_deposit_permission', +                                          'number', +					 ['number', +					  'number', +                                          'number', +					  'number', +					  'number', +					  'number', +					  'number', +					  'number', +					  'number', +					  'number']); + +var TWRALLeddsaPrivateKeyFromString = getEmsc('TALER_WRALL_eddsa_private_key_from_string', +                                              'number', +					     ['string']); + +var TWRALLrsaPublicKeyDecodeFromString = getEmsc('TALER_WRALL_rsa_public_key_decode_from_string', +                                                 'number', +						['string']); + +var TWRALLecdhePublicKeyFromPrivateKey = getEmsc('TALER_WRALL_ecdhe_public_key_from_private_key', +                                                 'number', +						['number']); + +var TWRALLeccEcdh = getEmsc('TALER_WRALL_ecc_ecdh', +                            'number', +			   ['number', +			    'number', +			    'number']); + +var TWRALLmakeWithdrawBundle = getEmsc('TALER_WRALL_make_withdraw_bundle', +                                       'number', +				      ['number', +				       'number', +				       'number', +				       'number', +				       'number', +				       'number']); + +var WRALLmakePurpose = getEmsc('WRALL_make_purpose', +                               'number', +			      ['string', +			       'number', +			       'number', +			       'number']); + +var GCALLrsaSignatureDecode = getEmsc('GNUNET_CRYPTO_rsa_signature_decode', +                                      'number', +				     ['number', +				      'number']); + +var GCALLrsaSignatureEncode = getEmsc('GNUNET_CRYPTO_rsa_signature_encode', +                                      'number', +				     ['number', +				     'number']); + +var GCALLrsaPublicKeyEncode = getEmsc('GNUNET_CRYPTO_rsa_public_key_encode', +                                      'number', +				     ['number', +				      'number']); + +var GCALLrsaPublicKeyDecode = getEmsc('GNUNET_CRYPTO_rsa_public_key_decode', +                                      'number', +				     ['number', +				      'number']); + +var GCALLrsaPrivateKeyGetPublic = getEmsc('GNUNET_CRYPTO_rsa_private_key_get_public', +                                          'number', +					 ['number']); + +var GCALLrsaPrivateKeyCreate = getEmsc('GNUNET_CRYPTO_rsa_private_key_create', +                                       'number', +				      ['number']); + +var GCALLrsaBlindingKeyCreate = getEmsc('GNUNET_CRYPTO_rsa_blinding_key_create', +                                        'number', +				       ['number']); + +var GCrsaBlindingKeyFree = getEmsc('GNUNET_CRYPTO_rsa_blinding_key_free', +                                   'void', +				  ['number']); + +var GCrsaPublicKeyFree = getEmsc('GNUNET_CRYPTO_rsa_public_key_free', +                                 'void', +				['number']); + +var GCrsaPrivateKeyFree = getEmsc('GNUNET_CRYPTO_rsa_private_key_free', +                                  'void', +				 ['number']); + +var GCALLrsaBlind = getEmsc('GNUNET_CRYPTO_rsa_blind', +                            'number', +			   ['number', +			    'number', +			    'number', +			    'number']); + +var GCALLrsaUnblind = getEmsc('GNUNET_CRYPTO_rsa_unblind', +                              'number', +			     ['number', +			      'number', +			      'number']); + +var GCALLrsaSign = getEmsc('GNUNET_CRYPTO_rsa_sign', +                           'number', +			  ['number', +			   'number', +			   'number']); + +var GCrsaVerify = getEmsc('GNUNET_CRYPTO_rsa_verify', +                          'number', +			 ['number', +			  'number', +			  'number']); + +var GCrsaSignatureFree = getEmsc('GNUNET_CRYPTO_rsa_signature_free', +                                 'void', +				['number']); + +var GChkdf = getEmsc('GNUNET_CRYPTO_hkdf', +                     'number', +		    ['number', +		     'number', +		     'number', +		     'number', +		     'number', +		     'number', +		     'number', +		     'number']); + +var TWRALLgenKeyFromBlob = getEmsc('TALER_WRALL_gen_key_from_blob', +                                   'number', +				  ['string', +				   'number', +				   'number']); + +var DWRtestString = getEmsc('DEBUG_WR_test_string', +                            'void', +			   ['number', +			    'number', +			    'string']); + +var GCsymmetricDecrypt = getEmsc('GNUNET_CRYPTO_symmetric_decrypt', +                                 'number', +				['number', +				 'number', +				 'number', +				 'number', +				 'number']); + +var GCsymmetricEncrypt = getEmsc('GNUNET_CRYPTO_symmetric_encrypt', +                                 'number', +				['number', +				 'number', +				 'number', +				 'number', +				 'number']); + +/* returns a pointer to a symmetric session key strucure and takes a salt, a +  (pointer to) binary data used to generate the key, and the length of that +  data */ +var TWRALLgenSymmetricKey = getEmsc('TALER_WRALL_gen_symmetric_key', +                                    'number', +				   ['string', +				    'number', +				    'number']); + +/* returns a pointer to a init. vector strucure and takes a salt, a +  (pointer to) binary data used to generate the key, and the length of that +  data */ +var TWRALLgenInitVector = getEmsc('TALER_WRALL_gen_init_vector', +                                  'number', +				 ['string', +				  'number', +				  'number']); + +// return key material from ECC keys +var GCeccEcdh = getEmsc('GNUNET_CRYPTO_ecc_ecdh', +                        'number', +		       ['number', +		        'number', +			'number']); + +// return a pointer to a freshly allocated EddsaPublicKey structure +/* var WRALLeddsaPublicKey = getEmsc('WRALL_eddsa_public_key', +                                     'number'); */ + +// return a pointer to a freshly allocated EcdhePublicKey structure +/* var WRALLecdhePublicKey = getEmsc('WRALL_ecdhe_public_key', +                                     'number'); */ + +/* generates a new eddsa private key, returning a pointer to EddsaPrivateKey +  structure */ +var GCALLeddsaKeyCreate = getEmsc('GNUNET_CRYPTO_eddsa_key_create', +                                  'number'); + +/* extract eddsa public key from a pointer to a EddsaPrivateKey structure +  and put it in second argument */ +var GCeddsaKeyGetPublic = getEmsc('GNUNET_CRYPTO_eddsa_key_get_public', +                                  'void', +				 ['number', +				  'number']); + +/* generates a new ecdhe private key, returning a pointer to EcdhePrivateKey +  structure */ +var GCALLecdheKeyCreate = getEmsc('GNUNET_CRYPTO_ecdhe_key_create', +                                  'number'); + +/* extract eddsa public key from a pointer to a EddsaPrivateKey structure and +  put it in second argument */ +var GCecdheKeyGetPublic = getEmsc('GNUNET_CRYPTO_ecdhe_key_get_public', +                                  'void', +				 ['number', +				  'number']); + +// what to sign, the reason to sign, the location to store the signature +var GCeddsaSign = getEmsc('GNUNET_CRYPTO_eddsa_sign', +                          'int', +			 ['number', +			  'number', +			  'number']); + +/* get reference to the emscripted primitive: the first parameter is a +  pointer (note that it points to the emscripten's heap) to the data being +  encoded, the second is its length */ +var GSALLdataToStringAlloc = getEmsc('GNUNET_STRINGS_data_to_string_alloc', +                                     'number', +				    ['number', +				     'number']); + +// import GNUnet's memory deallocator +var TWRgnunetFree = getEmsc('TALER_WR_GNUNET_free', +                            'void', +			   ['number']); + +// GNUnet's base32 decoder +var GSstringToData = getEmsc('GNUNET_STRINGS_string_to_data', +                             'number', +			    ['number', +			     'number', +			     'number', +			     'number']); + +// get absolute time. Returned value has to be freed by gnunetFree +var TWRALLgetCurrentTime = getEmsc('TALER_WRALL_get_current_time', +                                   'number'); + +// prettyfy time +var TWRgetFancyTime = getEmsc('TALER_WR_get_fancy_time', +                              'string', +			     ['number']); + +var TWRALLhash = getEmsc('TALER_WRALL_hash', +                         'number', +			['number', +			 'number']); + +/* computes the hashcode of the value pointed to by 'val' and sets the +  pointer to the location holding the hashcode (which has to be previously +  allocated and is a reflection of GNUNET_HashCode type). The returned +  pointer has to be freed by gnunetFree. +  Its interface is hash('val', 'valSize', 'hashedBuf') */ +var GChash = getEmsc('GNUNET_CRYPTO_hash', +                     'void', +		    ['number', +		     'number', +		     'number']); + +/* this test just takes the private key to sign a dummy hardcoded +  message. Return a pointer to the signed message (to be freed) */ +var TWRALLsignTest = getEmsc('TALER_WRALL_sign_test', +                             'number', +			    ['number']); + +/* this test just takes the public key and the signed dummy +  message. Return GNUNET_OK (=1) if it succeeds, otherwise +  GNUNET_SYSERR (=-1) */ +var WRverifyTest = getEmsc('WR_verify_test', +                           'number', +			  ['number']); diff --git a/extension/background/libwrapper.js b/extension/background/libwrapper.js new file mode 120000 index 000000000..8a9ac8e9a --- /dev/null +++ b/extension/background/libwrapper.js @@ -0,0 +1 @@ +../../../wallet_button/firefox_src/content/lib/libWrapper.jsm
\ No newline at end of file diff --git a/extension/background/wallet.js b/extension/background/wallet.js index ec7b3fb40..c6fbb5780 100644 --- a/extension/background/wallet.js +++ b/extension/background/wallet.js @@ -1,8 +1,40 @@ -// Nothing here yet. -// Eventually, the backend for the wallet will be implemented here. -  'use strict';  //chrome.browserAction.setBadgeBackgroundColor({color: "#000"})  chrome.browserAction.setBadgeText({text: "42"})  chrome.browserAction.setTitle({title: "Taler: 42 EUR"}) + +function test_emscripten () +{ +  var cur_time = TWRALLgetCurrentTime(); +  var fancy_time = TWRgetFancyTime(cur_time); +  console.log('current time: '+ fancy_time); +} + +test_emscripten(); + +DB.open(function () { +  console.log ("DB: ready"); +}); + +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 "WALLET_GET": +        DB.wallet_get (onresponse); +        break; + +      case "TRANSACTION_LIST": +        DB.transaction_list (onresponse); +        break; + +      case "RESERVE_LIST": +        DB.reserve_list (onresponse); +        break; +    } +  }); diff --git a/extension/lib/util.js b/extension/lib/util.js new file mode 100644 index 000000000..9d83f7e74 --- /dev/null +++ b/extension/lib/util.js @@ -0,0 +1,91 @@ +'use strict'; + +/** + * Format amount as String. + * + * @param amount + *        Amount to be formatted. + * + * @return String, e.g. "1.23" + */ +function amount_format (amount) +{ +  let separator = "." // FIXME: depends on locale +  return amount.value + separator + amount.fraction.toString().replace(/0+$/, ""); +} + + +/** + * Format amount with currency as String. + * + * @param amount + *        Amount to be formatted. + * + * @return String, e.g. "1.23 EUR" + */ +function amount_format_currency (amount) +{ +  return amount_format(amount) + " " + amount.currency; +} + + +/** + * Convert Date to String. + * + * Format: YYYY-MM-DD HH:mm + * + * @param date + *        Date to be converted. + * + * @return String + */ +function date_format (date) +{ +  function pad (number) { +    if (number < 10) { +      return '0' + number; +    } +    return number; +  } + +  return date.getUTCFullYear() + +    '-' + pad(date.getUTCMonth() + 1) + +    '-' + pad(date.getUTCDate()) + +    ' ' + pad(date.getUTCHours()) + +    ':' + pad(date.getUTCMinutes()); +  //':' + pad(date.getUTCSeconds()); +} + + +/** + * Send HTTP request. + * + * @param method + *        HTTP method. + * @param url + *        URL to send to. + * @param content + *        Content of request. + * @param content_type + *        Content-Type HTTP header. + * @param onsuccess + *        Function called by XMLHttpRequest on success. + * @param onerror + *        Function called by XMLHttpRequest on error. + * + */ +function http_req (method, url, content, content_type, onsuccess, onerror) { +  var req = new XMLHttpRequest(); + +  req.onload = function(mintEvt) { +    if (req.readyState == 4) +      onsuccess(req.status, req.responseText); +  }; + +  req.onerror = onerror; +  req.open(method, url, true); +  req.setRequestHeader('Content-Type', content_type); +  req.send(content); + +  return req; +} diff --git a/extension/manifest.json b/extension/manifest.json index 1d0ad6d55..b253c2484 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -21,11 +21,6 @@      "default_popup": "popup/wallet.html"    }, -  "web_accessible_resources": [ -    "popup/reserves.html", -    "popup/wallet.html" -  ], -    "content_scripts": [      {        "matches": ["*://*/*"], @@ -35,7 +30,14 @@    ],    "background": { -    "scripts": ["background/wallet.js"] -  } +    "scripts": [ +      "lib/util.js", +      "background/libwrapper.js", +      "background/emscriptif.js", +      "background/db.js", +      "background/wallet.js" +    ] +  }, +  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"  } diff --git a/extension/popup/transactions.html b/extension/popup/transactions.html index 2dc3fbea0..f51f64cf0 100644 --- a/extension/popup/transactions.html +++ b/extension/popup/transactions.html @@ -4,6 +4,7 @@    <head>      <meta charset="utf-8">      <link rel="stylesheet" href="popup.css" type="text/css"> +    <script src="../lib/util.js" type="text/javascript"></script>      <script src="transactions.js" type="text/javascript"></script>    </head> diff --git a/extension/popup/transactions.js b/extension/popup/transactions.js index 7d38d3b36..fbd578114 100644 --- a/extension/popup/transactions.js +++ b/extension/popup/transactions.js @@ -1,22 +1,5 @@  'use strict'; -function format_date (date) -{ -  function pad (number) { -    if (number < 10) { -      return '0' + number; -    } -    return number; -  } - -  return date.getUTCFullYear() + -    '-' + pad(date.getUTCMonth() + 1) + -    '-' + pad(date.getUTCDate()) + -    ' ' + pad(date.getUTCHours()) + -    ':' + pad(date.getUTCMinutes()); -  //':' + pad(date.getUTCSeconds()); -} -  function add_transaction (date, currency, amount, status, contract)  {    let table = document.getElementById('transactions-table'); @@ -26,7 +9,7 @@ function add_transaction (date, currency, amount, status, contract)    let td_date = document.createElement('td');    td_date.className = 'date'; -  let text_date = document.createTextNode(format_date (date)); +  let text_date = document.createTextNode(date_format (date));    tr.appendChild(td_date).appendChild(text_date);    let td_amount = document.createElement('td'); diff --git a/extension/popup/wallet.html b/extension/popup/wallet.html index a6864896b..42d72e676 100644 --- a/extension/popup/wallet.html +++ b/extension/popup/wallet.html @@ -4,6 +4,7 @@    <head>      <meta charset="utf-8">      <link rel="stylesheet" href="popup.css" type="text/css"> +    <script src="../lib/util.js" type="text/javascript"></script>      <script src="wallet.js" type="text/javascript"></script>    </head> diff --git a/extension/popup/wallet.js b/extension/popup/wallet.js index cb7399dac..c148abc85 100644 --- a/extension/popup/wallet.js +++ b/extension/popup/wallet.js @@ -28,8 +28,13 @@ function select_currency (checkbox, currency, amount)  function add_currency (currency, amount)  { +  let empty = document.getElementById('wallet-empty'); +  if (! /\bhidden\b/.test(empty.className)) +    empty.className += ' hidden'; +    let table = document.getElementById('wallet-table');    table.className = table.className.replace(/\bhidden\b/, ''); +    let tr = document.createElement('tr');    tr.id = 'wallet-table-'+ currency;    table.appendChild(tr); @@ -73,13 +78,20 @@ function update_currency (currency, amount)    checkbox._amount = amount;  } -document.addEventListener('DOMContentLoaded', function () { -  let empty = document.getElementById('wallet-empty'); +document.addEventListener( +  'DOMContentLoaded', +  function () { +    chrome.runtime.sendMessage({type: "WALLET_GET"}, function(wallet) { +      for (let currency in wallet) +      { +        let amount = amount_format(wallet[currency]); +        add_currency(currency, amount); +      } +    }); -  // FIXME -  empty.className += ' hidden'; -  add_currency('EUR', 42); -  add_currency('USD', 17); -  add_currency('KUD', 1337); -  update_currency('USD', 23); -}); +    // FIXME: remove +    add_currency('EUR', 42); +    add_currency('USD', 17); +    add_currency('KUD', 1337); +    update_currency('USD', 23); +  }); | 
