OSDN Git Service

add the sign Message method.
authorZhiting Lin <zlin035@uottawa.ca>
Tue, 28 May 2019 07:21:35 +0000 (15:21 +0800)
committerZhiting Lin <zlin035@uottawa.ca>
Tue, 28 May 2019 07:21:35 +0000 (15:21 +0800)
build/webpack.base.conf.js
src/assets/language/cn.js
src/assets/language/en.js
src/background.js
src/content.js
src/dapp.js
src/messages/types.js
src/models/transaction.js
src/router.js
src/views/sendTransaction/signMessage.vue [new file with mode: 0644]

index 33d01f2..b2098f0 100644 (file)
@@ -104,7 +104,7 @@ module.exports = {
       chunks: ['options']
     }),
     page({
-      title: '转账',
+      title: 'Byone notification',
       name: 'prompt',
       chunks: ['prompt']
     }),
index be71f7b..9108044 100644 (file)
@@ -45,6 +45,12 @@ const cn = {
     view:'展示全部',
     hide:'隐藏全部'
   },
+  signMessage:{
+    title:'请求签名',
+    address: '签名地址',
+    message:'签名消息',
+    confirmSignature:'确认签名'
+  },
   receive:{
     address: '地址',
     tips:'提示:点击地址进行拷贝。'
index 9ec9850..a7fe5cf 100644 (file)
@@ -45,6 +45,12 @@ const en = {
     view:'View All',
     hide:'Hide All'
   },
+  signMessage:{
+    title:'Request Signature',
+    address: 'Sign Address',
+    message:'Sign Message',
+    confirmSignature:'Sign'
+  },
   receive:{
     address: 'Address',
     tips:'Tips: Click address to copy directly.'
index 54ebd8e..a3913e2 100644 (file)
@@ -50,6 +50,9 @@ export default class Background {
       case MsgTypes.SEND:
         this.send(sendResponse, message.payload)
         break
+      case MsgTypes.SIGNMESSAGE:
+        this.signMessage(sendResponse, message.payload)
+        break
       case MsgTypes.REQUEST_CURRENT_ACCOUNT:
         this.requestCurrentAccount(sendResponse)
         break
@@ -62,13 +65,62 @@ export default class Background {
     }
   }
 
+  signMessage(sendResponse, payload) {
+    var promptURL = chrome.extension.getURL('pages/prompt.html')
+    var requestBody = payload
+    var queryString = new URLSearchParams(requestBody).toString()
+    console.log(promptURL, queryString)
+
+    if(requestBody.address === undefined){
+      sendResponse(Error.typeMissed('address'));
+      return false;
+    }
+    if(requestBody.message === undefined){
+      sendResponse(Error.typeMissed('message'));
+      return false;
+    }
+
+    chrome.windows.create(
+      {
+        url: `${promptURL}#signMessage?${queryString}`,
+        type: 'popup',
+        width: 360,
+        height: 623,
+        top: 0,
+        left: 0
+      },
+      (window) => {
+        chrome.runtime.onMessage.addListener(function(request, sender) {
+          if(sender.tab.windowId === window.id){
+            switch (request.method){
+              case 'sign-message':
+                if (request.action === 'success'){
+                  sendResponse(request.message);
+                  return true;
+                } else if (request.action === 'reject'){
+                  sendResponse(request.message);
+                  return false;
+                }
+            }
+          }
+        });
+
+        chrome.windows.onRemoved.addListener(function(windowId){
+          if(windowId === window.id) {
+            sendResponse(Error.promptClosedWithoutAction());
+            return false;
+          }
+        });
+      }
+    )
+  }
+
   transfer(sendResponse, payload) {
     var promptURL = chrome.extension.getURL('pages/prompt.html')
     var requestBody = payload
     requestBody.type = "popup"
     var queryString = new URLSearchParams(requestBody).toString()
     console.log(promptURL, queryString)
-    payload.asset
 
     if(requestBody.from === undefined){
       sendResponse(Error.typeMissed('from'));
@@ -140,10 +192,7 @@ export default class Background {
       sendResponse(Error.typeMissed('gas'));
       return false;
     }
-    if(payload.args === undefined){
-      sendResponse(Error.typeMissed('args'));
-      return false;
-    }
+
     chrome.windows.create(
       {
         url: `${promptURL}#advancedTransfer?${queryString}`,
index d1bc101..37c3fe4 100644 (file)
@@ -79,6 +79,10 @@ class Content {
 
     if (!isReady) return
     if (!msg) return
+    if(!stream.synced && (!msg.hasOwnProperty('type') || msg.type !== 'sync')) {
+      stream.send(new Error('inject Error'), PairingTags.INJECTED);
+      return;
+    }
 
     let networkMessage = NetworkMessage.fromJson(msg)
     switch (msg.type) {
@@ -87,6 +91,7 @@ class Content {
         break
       case MsgTypes.TRANSFER:
       case MsgTypes.ADVTRANSFER:
+      case MsgTypes.SIGNMESSAGE:
       case MsgTypes.SEND:
         this.transfer(msg.type, networkMessage)
         break
index 6a93b68..2b9ce68 100644 (file)
@@ -57,8 +57,7 @@ const _send = (_type, _payload) => {
 
 export default class Bytomdapp {
   constructor(_stream, _options) {
-    currentVersion = parseFloat(_options.version)
-    // this.useIdentity(_options.identity)
+    // currentVersion = parseFloat(_options.version)
     stream = _stream
     resolvers = []
     this.default_account = _options.defaultAccount
@@ -75,4 +74,8 @@ export default class Bytomdapp {
   send_advanced_transaction(params) {
     return _send(MsgTypes.ADVTRANSFER, params)
   }
+
+  sign_message(params) {
+    return _send(MsgTypes.SIGNMESSAGE, params)
+  }
 }
index b81f669..d6b9a4e 100644 (file)
@@ -5,6 +5,7 @@ export const UPDATE_BYTOM = 'updateBytom'
 export const AUTHENTICATE = 'authenticate'
 export const TRANSFER = 'transfer'
 export const ADVTRANSFER = 'advTransfer'
+export const SIGNMESSAGE = 'signMessage'
 export const SEND = 'send'
 
 
index 2a731ac..063e0de 100644 (file)
@@ -77,6 +77,11 @@ transaction.transfer = function(guid, transaction, password) {
   return retPromise;
 };
 
+
+transaction.signMessage = function(message, password, address) {
+  return bytom.keys.signMessage(message, password,address);
+};
+
 transaction.advancedTransfer = function(guid, transaction, password, arrayData) {
   let retPromise = new Promise((resolve, reject) => {
     bytom.transaction
index 3ac275b..dac05cc 100644 (file)
@@ -18,6 +18,14 @@ const routers = [
         }
       },
       {
+        path: '/signMessage',
+        name: 'sign-message',
+        meta: { title: '请求签名' },
+        component: resolve => {
+          require(['@/views/sendTransaction/signMessage.vue'], resolve)
+        }
+      },
+      {
         path: '/received',
         name: 'received',
         meta: { title: '接收' },
diff --git a/src/views/sendTransaction/signMessage.vue b/src/views/sendTransaction/signMessage.vue
new file mode 100644 (file)
index 0000000..0d83f51
--- /dev/null
@@ -0,0 +1,219 @@
+<style lang="" scoped>
+  .warp {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 600px;
+    z-index: 2;
+    overflow: scroll;
+  }
+  .header {
+    display: flex;
+  }
+  .header p{
+    text-align: center;
+    width: 280px;
+    padding-top: 17px;
+  }
+
+  .balance {
+    width: 280px;
+    height: 40px;
+    margin: 20px;
+    padding: 20px;
+    display: flex;
+  }
+  .balance .token-amount {
+    display: inline-block;
+  }
+  .balance .token-amount .asset {
+    font-size: 18px;
+  }
+  .small{
+    font-size: 12px;
+  }
+  .transfer-header{
+    background-image: url("../../assets/img/backgroundHead/transfer.svg");
+    background-size: 320px 80px;
+  }
+  .wallet{
+    width: 40px;
+    height: 40px;
+    background: rgba(255,255,255,0.1);
+    border-radius: 50%;
+    color: white;
+    margin-right: 20px;
+    line-height: 40px;
+    text-align: center;
+  }
+  .content {
+    margin: 20px;
+    padding: 20px;
+    overflow: hidden;
+    border-radius:4px;
+    width: 280px;
+  }
+  .divider {
+    margin: 12px 0;
+  }
+
+  .value .uint {
+    font-size: 12px;
+    margin-left: 3px;
+  }
+  .btn-inline .btn {
+    margin: 10px 15px;
+  }
+  .row{
+    word-break: break-all;
+  }
+  .col{
+    font-size: 14px;
+    width: 35%;
+  }
+  .label{
+    color: #7B7B7B;
+  }
+  .value{
+    color: #282828;
+    width: 60%;
+  }
+  table{
+    width: 100%;
+  }
+  .form-item{
+    padding:0;
+    margin:0;
+    margin-bottom: 10px;
+  }
+  .btn-container .btn{
+    height: 48px;
+    bottom: 20px;
+    position: absolute;
+    width: 320px;
+  }
+</style>
+
+<template>
+  <div class="warp bg-gray">
+    <section class="header bg-header">
+      <i class="iconfont icon-back" @click="close"></i>
+      <p>{{$t('signMessage.title')}}</p>
+    </section>
+
+    <section class="balance transfer-header">
+      <div class="wallet">
+        <i class="iconfont icon-wallet"></i>
+      </div>
+      <div>
+        <div class="token-amount">
+          {{account.balance}}
+          <span class="asset">BTM</span>
+        </div>
+        <div class="small color-grey">
+          {{account.alias}}
+        </div>
+      </div>
+    </section>
+
+    <section class="content bg-white">
+      <table>
+        <tbody>
+          <tr class="row">
+            <td class="col label">{{ $t('signMessage.address') }}</td>
+            <td class="col value">{{address}}</td>
+          </tr>
+
+          <div class="divider"></div>
+
+          <tr class="row">
+            <td class="col label">{{ $t('signMessage.message') }}</td>
+            <td class="col value">{{message}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </section>
+    <section class="content bg-white">
+      <div class="form">
+        <div class="form-item">
+          <label class="form-item-label">{{ $t('transfer.confirmPassword') }}</label>
+          <div class="form-item-content">
+            <input type="password"  v-model="password" autofocus>
+          </div>
+        </div>
+      </div>
+    </section>
+
+    <div class="row btn-container" style="margin: 20px; position: static;">
+      <div class="btn bg-green" @click="sign">{{ $t('signMessage.confirmSignature') }}</div>
+    </div>
+
+  </div>
+</template>
+
+<script>
+import transaction from "@/models/transaction";
+import account from "@/models/account";
+import getLang from "@/assets/language/sdk";
+import { LocalStream } from 'extension-streams';
+
+export default {
+    data() {
+        return {
+            full: false,
+            accounts:{},
+            account: {},
+            address: '',
+            message: '',
+            password:''
+        };
+    },
+    computed: {
+    },
+    watch: {
+    },
+    methods: {
+        close: function () {
+            window.close();
+        },
+        sign: function () {
+            let loader = this.$loading.show({
+                container: null,
+                canCancel: true,
+                onCancel: this.onCancel
+            });
+
+            transaction.signMessage(this.message, this.password, this.address).then((resp) => {
+                loader.hide();
+                LocalStream.send({method:'sign-message',action:'success', message:resp});
+                this.$dialog.show({
+                    type: 'success',
+                    body: this.$t("transfer.success")
+                });
+                window.close();
+            }).catch(error => {
+                loader.hide();
+
+                this.$dialog.show({
+                    body: getLang(error.message)
+                });
+            });
+        }
+    }, mounted() {
+        const object = this.$route.query
+        if(object.address !== undefined){
+           this.address = object.address
+        }
+        if(object.message !== undefined){
+            this.message = object.message
+        }
+
+        account.setupNet(localStorage.bytomNet);
+        account.list().then(accounts => {
+          const account = accounts.filter(a => a.address === this.address)[0]
+          this.account = account
+        });
+      }
+};
+</script>