PHP WebShell

Текущая директория: /opt/bitgo-express/node_modules/bitgo/src

Просмотр файла: clientRoutes.js

var bodyParser = require('body-parser');

var BitGoJS = require('./index');
var TransactionBuilder = require('./transactionBuilder');
var common = require('./common');
var Q = require('q');
var url = require('url');
var _ = require('lodash');
var pjson = require('../package.json');

var BITGOEXPRESS_USER_AGENT = "BitGoExpress/" + pjson.version;

var handleLogin = function(req) {
  var username = req.body.username || req.body.email;
  var body = req.body;
  body.username = username;
  return req.bitgo.authenticate(body);
};

var handleDecrypt = function(req) {
  return {
    decrypted: req.bitgo.decrypt(req.body)
  };
};

var handleEncrypt = function(req) {
  return {
    encrypted: req.bitgo.encrypt(req.body)
  };
};

var handleVerifyAddress = function(req) {
  return {
    verified: req.bitgo.verifyAddress(req.body)
  };
};

var handleCreateLocalKeyChain = function(req) {
  return req.bitgo.keychains().create(req.body);
};

var handleDeriveLocalKeyChain = function(req) {
  return req.bitgo.keychains().deriveLocal(req.body);
};

var handleCreateWalletWithKeychains = function(req) {
  return req.bitgo.wallets().createWalletWithKeychains(req.body);
};

var handleEthGenerateWallet = function(req) {
  return req.bitgo.eth().wallets().generateWallet(req.body);
};

var handleSendCoins = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.sendCoins(req.body);
  })
  .catch(function(err) {
    if (err.message === "Insufficient funds") {
      throw apiResponse(400, err, "Insufficient funds");
    }
    throw err;
  })
  .then(function(result) {
    if (result.status === 'pendingApproval') {
      throw apiResponse(202, result);
    }
    return result;
  });
};

var handleSendMany = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.sendMany(req.body);
  })
  .catch(function(err) {
    if (err.message === "Insufficient funds") {
      throw apiResponse(400, err, "Insufficient funds");
    }
    throw err;
  })
  .then(function(result) {
    if (result.status === 'pendingApproval') {
      throw apiResponse(202, result);
    }
    return result;
  });
};

var handleCreateTransaction = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.createTransaction(req.body);
  })
  .catch(function(err) {
    if (err.message === "Insufficient funds") {
      throw apiResponse(400, err, "Insufficient funds");
    }
    throw err;
  });
};

var handleEthSendTransaction = function(req) {
  return req.bitgo.eth().wallets().get({ id: req.params.id })
  .then(function(wallet) {
    return wallet.sendTransaction(req.body);
  })
  .catch(function(err) {
    if (err.message === "Insufficient funds") {
      throw apiResponse(400, err, "Insufficient funds");
    }
    throw err;
  });
};

var handleSignTransaction = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.signTransaction(req.body);
  });
};

var handleShareWallet = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.shareWallet(req.body);
  });
};

var handleAcceptShare = function(req) {
  var params = req.body || {};
  params.walletShareId = req.params.shareId;
  return req.bitgo.wallets().acceptShare(params);
};

var handleApproveTransaction = function(req) {
  var params = req.body || {};
  return req.bitgo.pendingApprovals().get({id: req.params.id})
  .then(function(pendingApproval) {
    if (params.state === 'approved') {
      return pendingApproval.approve(params);
    }
    return pendingApproval.reject(params);
  });
};

var handleConstructApprovalTx = function(req) {
  var params = req.body || {};
  return req.bitgo.pendingApprovals().get({id: req.params.id})
  .then(function(pendingApproval) {
    return pendingApproval.constructApprovalTx(params);
  });
};

var handleConsolidateUnspents = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.consolidateUnspents(req.body);
  });
};

var handleFanOutUnspents = function(req) {
  return req.bitgo.wallets().get({id: req.params.id})
  .then(function(wallet) {
    return wallet.fanOutUnspents(req.body);
  });
};

var handleCalculateMinerFeeInfo = function(req) {
  return TransactionBuilder.calculateMinerFeeInfo({
    bitgo: req.bitgo,
    feeRate: req.body.feeRate,
    nP2SHInputs: req.body.nP2SHInputs,
    nP2PKHInputs: req.body.nP2PKHInputs,
    nOutputs: req.body.nOutputs
  });
};

/**
 * Builds the API's URL string, optionally building the querystring if parameters exist
 * @param req
 * @return {string}
 */
var createAPIPath = function(req) {
  var apiPath = '/' + req.params[0];
  if (!_.isEmpty(req.query)) {
    // req.params does not contain the querystring, so we manually add them here
    var urlDetails = url.parse(req.url);
    if (urlDetails.search) {
      // "search" is the properly URL encoded query params, prefixed with "?"
      apiPath += urlDetails.search;
    }
  }
  return apiPath;
};

// handle any other API call
var handleREST = function(req, res, next) {
  var method = req.method;
  var bitgo = req.bitgo;
  var bitgoURL = bitgo.url(createAPIPath(req));
  return redirectRequest(bitgo, method, bitgoURL, req, next);
};

// handle new wallet creation
var handleV2GenerateWallet = function(req) {
  var bitgo = req.bitgo;
  var coin = bitgo.coin(req.params.coin);
  return coin.wallets().generateWallet(req.body);
};

// handle send one
var handleV2SendOne = function(req) {
  var bitgo = req.bitgo;
  var coin = bitgo.coin(req.params.coin);
  return coin.wallets().get({ id: req.params.id })
  .then(function(wallet) {
    return wallet.send(req.body);
  })
  .catch(function(err) {
    if (err.message === "Insufficient funds") {
      throw apiResponse(400, err, "Insufficient funds");
    }
    throw err;
  })
  .then(function(result) {
    if (result.status === 'pendingApproval') {
      throw apiResponse(202, result);
    }
    return result;
  });
};

// handle send many
var handleV2SendMany = function(req) {
  var bitgo = req.bitgo;
  var coin = bitgo.coin(req.params.coin);
  return coin.wallets().get({ id: req.params.id })
  .then(function(wallet) {
    return wallet.sendMany(req.body);
  })
  .catch(function(err) {
    if (err.message === "Insufficient funds") {
      throw apiResponse(400, err, "Insufficient funds");
    }
    throw err;
  })
  .then(function(result) {
    if (result.status === 'pendingApproval') {
      throw apiResponse(202, result);
    }
    return result;
  });
};

// handle any other API call
var handleV2REST = function(req, res, next) {
  var method = req.method;
  var bitgo = req.bitgo;
  var coin = bitgo.coin(req.params.coin);
  var coinURL = coin.url(createAPIPath(req));
  return redirectRequest(bitgo, method, coinURL, req, next);
};

var redirectRequest = function(bitgo, method, url, req, next){
  switch (method) {
    case 'GET':
      return bitgo.get(url).result().nodeify();
    case 'POST':
      return bitgo.post(url).send(req.body).result().nodeify();
    case 'PUT':
      return bitgo.put(url).send(req.body).result().nodeify();
    case 'DELETE':
      return bitgo.del(url).send(req.body).result().nodeify();
  }
  // something has presumably gone wrong
  next();
};

var apiResponse = function(status, result, message) {
  var err = new Error(message);
  err.status = status;
  err.result = result;
  return err;
};

// Perform body parsing here only on routes we want
var parseBody = bodyParser.json();
// Create the bitgo object in the request
var prepareBitGo = function(args) {
  var params = { env: args.env };
  if (args.customrooturi) {
    params.customRootURI = args.customrooturi;
  }
  if (args.custombitcoinnetwork) {
    params.customBitcoinNetwork = args.custombitcoinnetwork;
  }

  return function(req, res, next) {
    // Get access token
    var accessToken;
    if (req.headers.authorization) {
      var authSplit = req.headers.authorization.split(" ");
      if (authSplit.length === 2 && authSplit[0].toLowerCase() === 'bearer') {
        accessToken = authSplit[1];
      }
    }

    var userAgent = req.headers['user-agent'] ? BITGOEXPRESS_USER_AGENT + " " + req.headers['user-agent'] : BITGOEXPRESS_USER_AGENT;
    params.accessToken = accessToken;
    params.userAgent = userAgent;

    req.bitgo = new BitGoJS.BitGo(params);
    req.bitgo._promise.longStackSupport = true;

    next();
  }
};

// Promise handler wrapper to handle sending responses and error cases
var promiseWrapper = function(promiseRequestHandler, args) {
  return function (req, res, next) {
    if (args.debug) {
      console.log('handle: ' + url.parse(req.url).pathname);
    }
    Q.fcall(promiseRequestHandler, req, res, next)
    .then(function (result) {
      var status = 200;
      if (result.__redirect) {
        res.redirect(result.url);
        status = 302;
      } else if (result.__render) {
        res.render(result.template, result.params);
      } else {
        res.status(status).send(result);
      }
    })
    .catch(function(caught) {
      var err;
      if (caught instanceof Error) {
        err = caught;
      } else if (typeof caught === 'string') {
        err = new Error("(string_error) " + caught);
      } else {
        err = new Error("(object_error) " + JSON.stringify(caught));
      }

      var message = err.message || 'local error';
      // use attached result, or make one
      var result = err.result || {error: message};
      result = _.extend({}, result);
      result.message = err.message;
      var status = err.status || 500;
      if (!(status >= 200 && status < 300)) {
        console.log('error %s: %s', status, err.message);
      }
      if (status == 500) {
        console.log(err.stack);
      }
      res.status(status).send(result);
    })
    .done();
  };
};

exports = module.exports = function(app, args) {
  // auth
  app.post('/api/v1/user/login', parseBody, prepareBitGo(args), promiseWrapper(handleLogin, args));

  app.post('/api/v1/decrypt', parseBody, prepareBitGo(args), promiseWrapper(handleDecrypt, args));
  app.post('/api/v1/encrypt', parseBody, prepareBitGo(args), promiseWrapper(handleEncrypt, args));
  app.post('/api/v1/verifyaddress', parseBody, prepareBitGo(args), promiseWrapper(handleVerifyAddress, args));
  app.post('/api/v1/calculateminerfeeinfo', parseBody, prepareBitGo(args), promiseWrapper(handleCalculateMinerFeeInfo, args));

  app.post('/api/v1/keychain/local', parseBody, prepareBitGo(args), promiseWrapper(handleCreateLocalKeyChain, args));
  app.post('/api/v1/keychain/derive', parseBody, prepareBitGo(args), promiseWrapper(handleDeriveLocalKeyChain, args));
  app.post('/api/v1/wallets/simplecreate', parseBody, prepareBitGo(args), promiseWrapper(handleCreateWalletWithKeychains, args));

  app.post('/api/v1/wallet/:id/sendcoins', parseBody, prepareBitGo(args), promiseWrapper(handleSendCoins, args));
  app.post('/api/v1/wallet/:id/sendmany', parseBody, prepareBitGo(args), promiseWrapper(handleSendMany, args));
  app.post('/api/v1/wallet/:id/createtransaction', parseBody, prepareBitGo(args), promiseWrapper(handleCreateTransaction, args));
  app.post('/api/v1/wallet/:id/signtransaction', parseBody, prepareBitGo(args), promiseWrapper(handleSignTransaction, args));

  app.post('/api/v1/wallet/:id/simpleshare', parseBody, prepareBitGo(args), promiseWrapper(handleShareWallet, args));
  app.post('/api/v1/walletshare/:shareId/acceptShare', parseBody, prepareBitGo(args), promiseWrapper(handleAcceptShare, args));

  app.put('/api/v1/pendingapprovals/:id/express', parseBody, prepareBitGo(args), promiseWrapper(handleApproveTransaction, args));
  app.put('/api/v1/pendingapprovals/:id/constructTx', parseBody, prepareBitGo(args), promiseWrapper(handleConstructApprovalTx, args));

  app.put('/api/v1/wallet/:id/consolidateunspents', parseBody, prepareBitGo(args), promiseWrapper(handleConsolidateUnspents, args));
  app.put('/api/v1/wallet/:id/fanoutunspents', parseBody, prepareBitGo(args), promiseWrapper(handleFanOutUnspents, args));

  // eth
  app.post('/api/v1/eth/wallet/generate', parseBody, prepareBitGo(args), promiseWrapper(handleEthGenerateWallet, args));
  app.post('/api/v1/eth/wallet/:id/sendtransaction', parseBody, prepareBitGo(args), promiseWrapper(handleEthSendTransaction, args));

  // any other API call
  app.use('/api/v1/*', parseBody, prepareBitGo(args), promiseWrapper(handleREST, args));

  // API v2

  // generate wallet
  app.post('/api/v2/:coin/wallet/generate', parseBody, prepareBitGo(args), promiseWrapper(handleV2GenerateWallet, args));

  // send transaction
  app.post('/api/v2/:coin/wallet/:id/sendcoins', parseBody, prepareBitGo(args), promiseWrapper(handleV2SendOne, args));
  app.post('/api/v2/:coin/wallet/:id/sendmany', parseBody, prepareBitGo(args), promiseWrapper(handleV2SendMany, args));

  // any other API v2 call
  app.use('/api/v2/:coin/*', parseBody, prepareBitGo(args), promiseWrapper(handleV2REST, args));

};

Выполнить команду


Для локальной разработки. Не используйте в интернете!