Merge branch 'pharpend/develop' of https://github.com/aeternity/Vanillae into pharpend/develop
This commit is contained in:
@@ -5,14 +5,14 @@
|
|||||||
<title>Is this message good or bad?</title>
|
<title>Is this message good or bad?</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Is this message good or bad?</h1>
|
<h1>Do you want to sign this message?</h1>
|
||||||
|
|
||||||
<pre id="message"></pre>
|
<pre id="message"></pre>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<button id="good">Good</button>
|
<button id="good">Yes</button>
|
||||||
<br>
|
<br>
|
||||||
<button id="bad">Bad</button>
|
<button id="bad">No</button>
|
||||||
|
|
||||||
<script type="module" src="../dist/msg_confirm.js"></script>
|
<script type="module" src="../dist/msg_confirm.js"></script>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Do you want to sign this transaction?</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Do you want to sign this transaction?</h1>
|
||||||
|
|
||||||
|
<h2>Tx Base64</h2>
|
||||||
|
<pre id="tx-base64"></pre>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Tx Decomposed info</h2>
|
||||||
|
<pre id="tx-decomposed"></pre>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<button id="good">Yes</button>
|
||||||
|
<br>
|
||||||
|
<button id="bad">No</button>
|
||||||
|
|
||||||
|
<script type="module" src="../dist/tx_confirm.js"></script>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
</html>
|
||||||
+64
-11
@@ -321,8 +321,13 @@ bi_msg_handler_content
|
|||||||
let msg_str : string = msg.data.params.message;
|
let msg_str : string = msg.data.params.message;
|
||||||
// TODO: need to break here on whether the msg signature was good
|
// TODO: need to break here on whether the msg signature was good
|
||||||
// (signed) or bad (not)
|
// (signed) or bad (not)
|
||||||
let resultt = await msg_sign(msg_str, secret_key)
|
let resultt = await msg_sign(msg_str, secret_key);
|
||||||
return w2a_ok(resultt);
|
if (resultt.result === 'good') {
|
||||||
|
return w2a_ok({signature: resultt.signature});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return w2a_err(awcp.ERROR_CODE_RpcRejectedByUserError, "you're not pretty enough");
|
||||||
|
}
|
||||||
|
|
||||||
// right now just sign tx
|
// right now just sign tx
|
||||||
case "transaction.sign":
|
case "transaction.sign":
|
||||||
@@ -330,8 +335,19 @@ bi_msg_handler_content
|
|||||||
let tx_str : string = msg.data.params.tx;
|
let tx_str : string = msg.data.params.tx;
|
||||||
console.log('transaction: ', tx_str);
|
console.log('transaction: ', tx_str);
|
||||||
let result = await tx_sign(tx_str, secret_key)
|
let result = await tx_sign(tx_str, secret_key)
|
||||||
console.log('signed transaction: ', result.signedTransaction);
|
if
|
||||||
return w2a_ok(result);
|
('good' === result.result) {
|
||||||
|
return w2a_ok({signedTransaction: result.signedTransaction});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return w2a_err(awcp.ERROR_CODE_RpcRejectedByUserError, "your not pretty enough");
|
||||||
|
}
|
||||||
|
//if (result.result === 'good') {
|
||||||
|
// return w2a_ok({signedTransaction: result.signedTransaction});
|
||||||
|
//}
|
||||||
|
//else {
|
||||||
|
// return w2a_err(awcp.ERROR_CODE_RpcRejectedByUserError, "you will never be pretty enough");
|
||||||
|
//}
|
||||||
|
|
||||||
// default is NYI
|
// default is NYI
|
||||||
default:
|
default:
|
||||||
@@ -354,7 +370,10 @@ async function
|
|||||||
msg_sign
|
msg_sign
|
||||||
(msg_str : string,
|
(msg_str : string,
|
||||||
secret_key : Uint8Array)
|
secret_key : Uint8Array)
|
||||||
: Promise<{signature : string}>
|
: Promise< {result : 'good',
|
||||||
|
signature : string}
|
||||||
|
| {result : 'bad'}
|
||||||
|
>
|
||||||
{
|
{
|
||||||
// does the user want to sign the message
|
// does the user want to sign the message
|
||||||
let confirm_window = await browser.windows.create({url : '../pages/msg_confirm.html',
|
let confirm_window = await browser.windows.create({url : '../pages/msg_confirm.html',
|
||||||
@@ -387,11 +406,11 @@ msg_sign
|
|||||||
// @ts-ignore yes nacl is stupid
|
// @ts-ignore yes nacl is stupid
|
||||||
let signature : Uint8Array = nacl.sign.detached(hashed_salted_msg, secret_key);
|
let signature : Uint8Array = nacl.sign.detached(hashed_salted_msg, secret_key);
|
||||||
let signature_str : string = vdk_binary.bytes_to_hex_str(signature);
|
let signature_str : string = vdk_binary.bytes_to_hex_str(signature);
|
||||||
return {signature: signature_str};
|
return {result : 'good',
|
||||||
|
signature : signature_str};
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// @ts-ignore i just want things to compile FIXME
|
return {result : 'bad'};
|
||||||
return 'go please yourself';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,13 +430,41 @@ async function
|
|||||||
tx_sign
|
tx_sign
|
||||||
(tx_str : string,
|
(tx_str : string,
|
||||||
secret_key : Uint8Array)
|
secret_key : Uint8Array)
|
||||||
: Promise<{signedTransaction : string}>
|
: Promise< {result : 'good',
|
||||||
|
signedTransaction : string}
|
||||||
|
| {result : 'bad'}
|
||||||
|
>
|
||||||
{
|
{
|
||||||
|
// does the user want to sign the message
|
||||||
|
let confirm_window = await browser.windows.create({url : '../pages/tx_confirm.html',
|
||||||
|
type : 'popup'});
|
||||||
|
|
||||||
|
// @ts-ignore shut the fuck up
|
||||||
|
let tabid : number = confirm_window.tabs[0].id;
|
||||||
|
|
||||||
|
// stupid hack because otherwise the message gets sent before the listener in the page script is created
|
||||||
|
await sleep(200);
|
||||||
|
|
||||||
// debug: show tx
|
// debug: show tx
|
||||||
let mansplained_tx : object = await vdk_aeser.mansplain(tx_str);
|
let mansplained_tx : object = await vdk_aeser.mansplain(tx_str);
|
||||||
console.log('mansplained_tx,', mansplained_tx);
|
console.log('mansplained_tx,', mansplained_tx);
|
||||||
|
|
||||||
|
type browser_send_data = {tx_str : string,
|
||||||
|
tx_data : object};
|
||||||
|
|
||||||
|
let result: 'good' | 'bad'
|
||||||
|
= await browser.tabs.sendMessage(tabid,
|
||||||
|
{tx_str : tx_str,
|
||||||
|
tx_data : mansplained_tx});
|
||||||
|
|
||||||
|
|
||||||
|
console.log('result', result);
|
||||||
|
|
||||||
|
// close the popup
|
||||||
|
browser.tabs.remove(tabid);
|
||||||
|
// if we're supposed to sign the tx
|
||||||
|
if
|
||||||
|
('good' === result) {
|
||||||
let tx_bytes : Uint8Array = (await vdk_aeser.unbaseNcheck(tx_str)).bytes;
|
let tx_bytes : Uint8Array = (await vdk_aeser.unbaseNcheck(tx_str)).bytes;
|
||||||
// thank you ulf
|
// thank you ulf
|
||||||
// https://github.com/aeternity/protocol/tree/fd179822fc70241e79cbef7636625cf344a08109/consensus#transaction-signature
|
// https://github.com/aeternity/protocol/tree/fd179822fc70241e79cbef7636625cf344a08109/consensus#transaction-signature
|
||||||
@@ -431,12 +478,18 @@ tx_sign
|
|||||||
let signature : Uint8Array = nacl.sign.detached(sign_data, secret_key);
|
let signature : Uint8Array = nacl.sign.detached(sign_data, secret_key);
|
||||||
let signed_tx_bytes : Uint8Array = vdk_aeser.signed_tx([signature], tx_bytes);
|
let signed_tx_bytes : Uint8Array = vdk_aeser.signed_tx([signature], tx_bytes);
|
||||||
let signed_tx_str : string = await vdk_aeser.baseNcheck('tx', signed_tx_bytes);
|
let signed_tx_str : string = await vdk_aeser.baseNcheck('tx', signed_tx_bytes);
|
||||||
|
|
||||||
// debugging
|
// debugging
|
||||||
let mansplained_stx : object = await vdk_aeser.mansplain(signed_tx_str);
|
let mansplained_stx : object = await vdk_aeser.mansplain(signed_tx_str);
|
||||||
console.log('mansplained signed tx:', mansplained_stx);
|
console.log('mansplained signed tx:', mansplained_stx);
|
||||||
|
return {result : 'good',
|
||||||
|
signedTransaction : signed_tx_str};
|
||||||
|
}
|
||||||
|
// if user rejected the tx
|
||||||
|
else {
|
||||||
|
return {result : 'bad'};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return {signedTransaction: signed_tx_str};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+22
-5
@@ -1,17 +1,34 @@
|
|||||||
/**
|
/**
|
||||||
* Page script for "confirm sign message" popup window
|
* Page script for "confirm sign message" popup window
|
||||||
|
*
|
||||||
|
* For some reason getting "duplicate function implementation" errors from TSC
|
||||||
|
* if I give these functions normal names
|
||||||
|
*
|
||||||
|
* Getting this error on both this file and tx_confirm.ts
|
||||||
|
*
|
||||||
|
* For some reason changing the names only in this file gets rid of the errors
|
||||||
|
* in both files.
|
||||||
|
*
|
||||||
|
* No idea what the fuck is going on and I can almost guarantee I don't want to
|
||||||
|
* know.
|
||||||
|
*
|
||||||
|
* Everything about this language is painful. You know I think a lot. I wonder
|
||||||
|
* why everything is stupid. In any individual case, you can understand the
|
||||||
|
* chain of incentives for why thing X is stupid. But the majority of things
|
||||||
|
* should not be stupid. The stupid should be the exception. Instead the world
|
||||||
|
* runs on the short bus tech stack.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
main();
|
maine();
|
||||||
|
|
||||||
|
|
||||||
async function
|
async function
|
||||||
main
|
maine
|
||||||
()
|
()
|
||||||
: Promise<void>
|
: Promise<void>
|
||||||
{
|
{
|
||||||
console.log('msg_confirm main');
|
console.log('msg_confirm maine');
|
||||||
|
|
||||||
let result : '' | 'good' | 'bad'
|
let result : '' | 'good' | 'bad'
|
||||||
= '';
|
= '';
|
||||||
@@ -55,7 +72,7 @@ main
|
|||||||
(result === '') {
|
(result === '') {
|
||||||
// if haven't timed out yet
|
// if haven't timed out yet
|
||||||
if (n <= n_max) {
|
if (n <= n_max) {
|
||||||
await sleep(5);
|
await sleepy(5);
|
||||||
n = n + 1;
|
n = n + 1;
|
||||||
}
|
}
|
||||||
// if timed out
|
// if timed out
|
||||||
@@ -81,7 +98,7 @@ main
|
|||||||
* Hack from stack overflow somewhere to sleep for the given number of ms
|
* Hack from stack overflow somewhere to sleep for the given number of ms
|
||||||
*/
|
*/
|
||||||
async function
|
async function
|
||||||
sleep
|
sleepy
|
||||||
(ms: number)
|
(ms: number)
|
||||||
: Promise<void>
|
: Promise<void>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* Page script for "confirm sign message" popup window
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
main();
|
||||||
|
|
||||||
|
|
||||||
|
async function
|
||||||
|
main
|
||||||
|
()
|
||||||
|
: Promise<void>
|
||||||
|
{
|
||||||
|
console.log('msg_confirm main');
|
||||||
|
|
||||||
|
let result : '' | 'good' | 'bad'
|
||||||
|
= '';
|
||||||
|
|
||||||
|
document.getElementById('good')!.onclick
|
||||||
|
= function() {
|
||||||
|
console.log('click good');
|
||||||
|
result = 'good';
|
||||||
|
};
|
||||||
|
document.getElementById('bad')!.onclick
|
||||||
|
= function() {
|
||||||
|
console.log('click bad');
|
||||||
|
result = 'bad';
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
type bg_msg
|
||||||
|
= {tx_str : string,
|
||||||
|
tx_data : object};
|
||||||
|
|
||||||
|
async function listener
|
||||||
|
(msg : bg_msg,
|
||||||
|
_sender : any,
|
||||||
|
_sendResponse : any)
|
||||||
|
: Promise<'good' | 'bad'>
|
||||||
|
{
|
||||||
|
console.log('listener triggered', msg);
|
||||||
|
console.log('tx_str:', msg.tx_str);
|
||||||
|
console.log('tx_data:', msg.tx_data);
|
||||||
|
document.getElementById('tx-base64')!.innerHTML = msg.tx_str;
|
||||||
|
document.getElementById('tx-decomposed')!.innerHTML = JSON.stringify(msg.tx_data, undefined, 4);
|
||||||
|
|
||||||
|
// every 5 ms check
|
||||||
|
// timeout of 10 minutes = 10*60 secs * 20 iterations =
|
||||||
|
// number of iters in a full second
|
||||||
|
let ITERS = 1;
|
||||||
|
let SEC = 200*ITERS;
|
||||||
|
let MIN = 60*SEC;
|
||||||
|
//let n_max = 10*MIN;
|
||||||
|
let n = 1;
|
||||||
|
let n_max = 30*SEC;
|
||||||
|
|
||||||
|
// result starts as neutral
|
||||||
|
// if user clicks good, result will be updated to 'good'
|
||||||
|
// if user clicks bad, result will be updated to 'bad'
|
||||||
|
// if user doesn't click in 30 seconds, default to 'bad'
|
||||||
|
// this has the effect of sitting and waiting until the user clicks a button
|
||||||
|
// with a timeout as a backstop
|
||||||
|
while
|
||||||
|
(result === '') {
|
||||||
|
// if haven't timed out yet
|
||||||
|
if (n <= n_max) {
|
||||||
|
await sleep(5);
|
||||||
|
n = n + 1;
|
||||||
|
}
|
||||||
|
// if timed out
|
||||||
|
else {
|
||||||
|
result = 'bad';
|
||||||
|
// this break is implied but you're not smart enough to figure
|
||||||
|
// that out yourself
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// send result back
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add listener
|
||||||
|
browser.runtime.onMessage.addListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hack from stack overflow somewhere to sleep for the given number of ms
|
||||||
|
*/
|
||||||
|
async function
|
||||||
|
sleep
|
||||||
|
(ms: number)
|
||||||
|
: Promise<void>
|
||||||
|
{
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user