github.com/muhammedhassanm/blockchain@v0.0.0-20200120143007-697261defd4d/build-blockchain-insurance-app-master/web/src/shop/api.js (about)

     1  'use strict';
     2  
     3  import fetch from 'isomorphic-fetch';
     4  
     5  export function getContractTypes(shopType) {
     6    return fetch('/shop/api/contract-types', {
     7      method: 'POST',
     8      headers: new Headers({
     9        'Content-Type': 'application/json'
    10      }),
    11      body: JSON.stringify({ shopType })
    12    }).then(async res => {
    13      let contractTypes = (await res.json())
    14        .map(c => Object.assign({}, c, {
    15          formulaPerDay: new Function('price', 'return ' + preventXssForFormula(c.formulaPerDay))
    16        }));
    17      return contractTypes;
    18    });
    19  }
    20  
    21  export function requestNewUser(user) {
    22    return fetch('/shop/api/request-user', {
    23      method: 'POST',
    24      headers: new Headers({
    25        'Content-Type': 'application/json'
    26      }),
    27      body: JSON.stringify({ user })
    28    }).then(async res => {
    29      return await res.json();
    30    });
    31  }
    32  
    33  export function enterContract(user, contractTypeUuid, additionalInfo) {
    34    return fetch('/shop/api/enter-contract', {
    35      method: 'POST',
    36      headers: new Headers({
    37        'Content-Type': 'application/json'
    38      }),
    39      body: JSON.stringify({ user, contractTypeUuid, additionalInfo })
    40    }).then(async res => {
    41      const response = await res.json();
    42      if (response.success) {
    43        return response.loginInfo;
    44      } else {
    45        throw new Error(response.error);
    46      }
    47    });
    48  }
    49  
    50  /**
    51   * Function parses formula, to prevent cross site scripting attacks.
    52   *
    53   * @param {string} formula The formula as a string.
    54   * @returns {string} A parsed and filtered fomula as a string.
    55   */
    56  function preventXssForFormula(formula) {
    57    if (typeof formula !== 'string') {
    58      return null;
    59    }
    60    let lexemes = formulaLexer(formula).filter(l =>
    61      (l === '(' ||
    62        l === ')' ||
    63        l === '+' ||
    64        l === '-' ||
    65        l === '*' ||
    66        l === '/' ||
    67        l === 'price' ||
    68        Number(l)));
    69    return lexemes.join(' ');
    70  }
    71  
    72  function formulaLexer(formula) {
    73    let lexemes = formula;
    74    lexemes = splitFormulaPart(lexemes, /( )/);
    75    lexemes = splitFormulaPart(lexemes, /(\()/);
    76    lexemes = splitFormulaPart(lexemes, /(\))/);
    77    lexemes = splitFormulaPart(lexemes, /(\+)/);
    78    lexemes = splitFormulaPart(lexemes, /(\-)/);
    79    lexemes = splitFormulaPart(lexemes, /(\*)/);
    80    lexemes = splitFormulaPart(lexemes, /(\/)/);
    81    lexemes = splitFormulaPart(lexemes, /([0-9]+\.[0-9]+|[0-9]+)/);
    82    lexemes = splitFormulaPart(lexemes, /([A-Za-z]+)/);
    83    return lexemes;
    84  }
    85  
    86  function splitFormulaPart(part, splitQualifier) {
    87    if (Array.isArray(part)) {
    88      let results = [];
    89      part.forEach(e => results.push(...splitFormulaPart(e, splitQualifier)));
    90      return results;
    91    } else if (typeof part === 'string') {
    92      return part.split(splitQualifier).filter(p => !!p.trim());
    93    } else {
    94      return null;
    95    }
    96  }