// Copyright (c) 2014-2018, MyMonero.com // // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // "use strict"; // const monero_config = require("./monero_config"); const monero_utils = require("./monero_cryptonote_utils_instance"); // const URITypes = { addressAsFirstPathComponent: 1, addressAsAuthority: 2, }; exports.URITypes = URITypes; // function New_RequestFunds_URI(args) { // -> String? const address = args.address; if (!address) { throw "missing address"; // return null } var mutable_uri = ""; mutable_uri += monero_config.coinUriPrefix; { const uriType = args.uriType; if (uriType === URITypes.addressAsAuthority) { mutable_uri += "//"; // use for inserting a // so data detectors pick it up… } else if (uriType === URITypes.addressAsFirstPathComponent) { // nothing to do } else { throw "Illegal args.uriType"; } } mutable_uri += address; var isAppendingParam0 = true; function addParam(parameterName, value) { if ( value == null || value == "" /*important*/ || typeof value === "undefined" ) { return; } var conjunctionStr = "&"; if (isAppendingParam0 === true) { isAppendingParam0 = false; conjunctionStr = "?"; } mutable_uri += conjunctionStr; mutable_uri += parameterName + "=" + encodeURIComponent(value); } { addParam("tx_amount", args.amount); if ( (args.amountCcySymbol || "").toLowerCase() != monero_config.coinSymbol.toLowerCase() ) { addParam("tx_amount_ccy", args.amountCcySymbol); } addParam("tx_description", args.description); addParam("tx_payment_id", args.payment_id); addParam("tx_message", args.message); } return mutable_uri; } exports.New_RequestFunds_URI = New_RequestFunds_URI; // function New_ParsedPayload_FromPossibleRequestURIString(string, nettype) { // throws; -> {} // // detect no-scheme moneroAddr and possible OA addr - if has no monero: prefix if (string.indexOf(monero_config.coinUriPrefix) !== 0) { const stringHasQMark = string.indexOf("?") !== -1; if (stringHasQMark) { // fairly sure this is correct.. (just an extra failsafe/filter) throw "Unrecognized URI format"; } let couldBeOAAddress = string.indexOf(".") != -1; // contains period - would be nice to get this from DoesStringContainPeriodChar_excludingAsXMRAddress_qualifyingAsPossibleOAAddress so maybe mymonero_core_js should gain local_modules/OpenAlias if (couldBeOAAddress) { return { address: string, }; } var address__decode_result; try { address__decode_result = monero_utils.decode_address( string, nettype, ); } catch (e) { throw "No Monero request info"; return; } // then it looks like a monero address return { address: string, }; } const uriString = string; const url = new URL(uriString); const protocol = url.protocol; if (protocol !== monero_config.coinUriPrefix) { throw "Request URI has non-Monero protocol"; } var target_address = url.pathname; // var instead of const as have to finalize it // it seems that if the URL has // in it, pathname will be empty, but host will contain the address instead if ( target_address === "" || typeof target_address === "undefined" || !target_address ) { target_address = url.host || url.hostname; } if (target_address.indexOf("//") == 0) { target_address = target_address.slice( 0 + "//".length, target_address.length, ); // strip prefixing "//" in case URL had protocol:// instead of protocol: } const searchParams = url.searchParams; // needs to be parsed it seems // const payload = { address: target_address, }; const keyPrefixToTrim = "tx_"; const lengthOf_keyPrefixToTrim = keyPrefixToTrim.length; searchParams.forEach(function(value, key) { var storeAt_key = key; if (key.indexOf(keyPrefixToTrim) === 0) { storeAt_key = key.slice(lengthOf_keyPrefixToTrim, key.length); } payload["" + storeAt_key] = value; }); // return payload; } exports.New_ParsedPayload_FromPossibleRequestURIString = New_ParsedPayload_FromPossibleRequestURIString;