Advertisement
Guest User

mORMotCliet.js Funcional

a guest
Apr 27th, 2016
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var mORMot;
  2. (function (mORMot) {
  3.     function getXhr() {
  4.         for (var i = 0; i < 4; i++) {
  5.             try  {
  6.                 return i ? new ActiveXObject([, "Msxml2", "Msxml3", "Microsoft"][i] + ".XMLHTTP") : new XMLHttpRequest;
  7.             } catch (e) {
  8.                 // ignore when it fails.
  9.             }
  10.         }
  11.     }
  12.  
  13.     var Client = (function () {
  14.         function Client() {
  15.             this.User = "";
  16.             this.Root = "";
  17.             this.ServerURL = "";
  18.             this.loggedIn = false;
  19.             this.SessionID = 0;
  20.             this.SessionIDHexa8 = "";
  21.             this.SessionPrivateKey = 0;
  22.             this.SessionTickCountOffset = 0;
  23.             this.PasswordHashHexa = "";
  24.             this.ServerTimeStampOffset = 0;
  25.             /*
  26.             CRC-32 (as it is in ZMODEM) in table form
  27.            
  28.             Copyright (C) 1986 Gary S. Brown. You may use this program, or
  29.             code or tables extracted from it, as desired without restriction.
  30.            
  31.             Modified by Anders Danielsson, February 5, 1989 and March 10, 2006.
  32.            
  33.             This is also known as FCS-32 (as it is in PPP), described in
  34.             RFC-1662 by William Allen Simpson, see RFC-1662 for references.
  35.             */
  36.             this.Crc32Tab = [
  37.                 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
  38.                 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
  39.                 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  40.                 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
  41.                 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
  42.                 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  43.                 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
  44.                 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
  45.                 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  46.                 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
  47.                 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
  48.                 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  49.                 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
  50.                 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
  51.                 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  52.                 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
  53.                 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
  54.                 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  55.                 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
  56.                 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
  57.                 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  58.                 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
  59.                 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
  60.                 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  61.                 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
  62.                 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
  63.                 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  64.                 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
  65.                 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
  66.                 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  67.                 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
  68.                 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D];
  69.             //Login callbacks
  70.             this.onGotTimestamp = function (ev) {
  71.                 if (this.readyState == 4) {
  72.                     if (this.status !== 200) {
  73.                         if (Client._instance.LoginCallback instanceof Function) {
  74.                             Client._instance.LoginCallback(false, this.status + " " + this.statusText);
  75.                         }
  76.                     } else {
  77.                         var s = '', d = new Date(), clientTime = '';
  78.                         var timestamp = parseInt(this.responseText, 10);
  79.                         s = d.getFullYear().toString(2);
  80.                         while (s.length < 13) {
  81.                             s = '0' + s;
  82.                         }
  83.                         clientTime = s;
  84.                         s = d.getMonth().toString(2);
  85.                         while (s.length < 4) {
  86.                             s = '0' + s;
  87.                         }
  88.                         clientTime = clientTime + s;
  89.                         s = (d.getDate() - 1).toString(2);
  90.                         while (s.length < 5) {
  91.                             s = '0' + s;
  92.                         }
  93.                         clientTime = clientTime + s;
  94.                         s = d.getHours().toString(2);
  95.                         while (s.length < 5) {
  96.                             s = '0' + s;
  97.                         }
  98.                         clientTime = clientTime + s;
  99.                         s = d.getMinutes().toString(2);
  100.                         while (s.length < 6) {
  101.                             s = '0' + s;
  102.                         }
  103.                         clientTime = clientTime + s;
  104.                         s = d.getSeconds().toString(2);
  105.                         while (s.length < 6) {
  106.                             s = '0' + s;
  107.                         }
  108.                         clientTime = clientTime + s;
  109.                         Client._instance.ServerTimeStampOffset = (timestamp - parseInt(clientTime, 2));
  110.                         var XHR = getXhr();
  111.                         XHR.open("GET", Client._instance.ServerURL + "/" + Client._instance.Root + "/Auth?UserName=" + Client._instance.User, true);
  112.                         XHR.onreadystatechange = Client._instance.onGotNonce;
  113.                         XHR.send(null);
  114.                         XHR.ontimeout = function () {
  115.                             alert("timeout!");
  116.                         };
  117.                     }
  118.                 }
  119.             };
  120.             this.onGotNonce = function (ev) {
  121.                 if (this.readyState == 4) {
  122.                     if (this.status !== 200) {
  123.                         if (Client._instance.LoginCallback instanceof Function) {
  124.                             Client._instance.LoginCallback(false, this.status + " " + this.statusText);
  125.                         }
  126.                     } else {
  127.                         //create client nonce
  128.                         var aClientNonce = "", s = "", d = new Date();
  129.                         aClientNonce = d.getFullYear().toString();
  130.                         s = d.getMonth().toString();
  131.                         if (s.length === 1) {
  132.                             s = '0' + s;
  133.                         }
  134.                         aClientNonce = aClientNonce + '-' + s;
  135.                         s = d.getDate().toString();
  136.                         if (s.length === 1) {
  137.                             s = '0' + s;
  138.                         }
  139.                         aClientNonce = aClientNonce + '-' + s + ' ';
  140.                         s = d.getHours().toString();
  141.                         if (s.length === 1) {
  142.                             s = '0' + s;
  143.                         }
  144.                         aClientNonce = aClientNonce + s;
  145.                         s = d.getMinutes().toString();
  146.                         if (s.length === 1) {
  147.                             s = '0' + s;
  148.                         }
  149.                         aClientNonce = aClientNonce + ':' + s;
  150.                         s = d.getSeconds().toString();
  151.                         if (s.length === 1) {
  152.                             s = '0' + s;
  153.                         }
  154.                         aClientNonce = aClientNonce + ':' + s;
  155.                         aClientNonce = Client._instance.Sha256hash(aClientNonce);
  156.                         var data = JSON.parse(this.responseText);
  157.                         s = Client._instance.ServerURL + "/" + Client._instance.Root + "/Auth?UserName=" + Client._instance.User + "&Password=" +
  158.  
  159. Client._instance.Sha256hash(Client._instance.Root + data.result + aClientNonce + Client._instance.User + Client._instance.PasswordHashHexa) +
  160.  
  161. "&ClientNonce=" + aClientNonce;
  162.                         var XHR = getXhr();
  163.                         XHR.open("GET", s, true);
  164.                         XHR.onreadystatechange = Client._instance.onGotSession;
  165.                         XHR.send(null);
  166.                     }
  167.                 }
  168.             };
  169.             this.onGotSession = function (ev) {
  170.                 if (this.readyState == 4) {
  171.                     if (this.status !== 200) {
  172.                         if (Client._instance.LoginCallback instanceof Function) {
  173.                             Client._instance.LoginCallback(false, this.status + " " + this.statusText);
  174.                         }
  175.                     } else {
  176.                         var data = JSON.parse(this.responseText);
  177.                         var i = data.result.indexOf("+");
  178.                         Client._instance.SessionID = parseInt(data.result.slice(0, i), 10);
  179.                         Client._instance.SessionIDHexa8 = Client._instance.SessionID.toString(16);
  180.                         while (Client._instance.SessionIDHexa8.length < 8) {
  181.                             Client._instance.SessionIDHexa8 = '0' + Client._instance.SessionIDHexa8;
  182.                         }
  183.                         Client._instance.loggedIn = true;
  184.                         Client._instance.SessionPrivateKey = Client._instance.crc32(Client._instance.PasswordHashHexa, Client._instance.crc32
  185.  
  186. (data.result, 0));
  187.                         if (Client._instance.LoginCallback instanceof Function) {
  188.                             Client._instance.LoginCallback(true, Client._instance.User);
  189.                         }
  190.                     }
  191.                 }
  192.             };
  193.             this.onLogout = function (ev) {
  194.                 if (this.readyState == 4) {
  195.                     var success = (this.status >= 200 && this.status < 300);
  196.                     if (Client._instance.LogoutCallback instanceof Function) {
  197.                         Client._instance.LogoutCallback(success, "");
  198.                     }
  199.                     if (success) {
  200.                         Client._instance.ServerURL = '';
  201.                         Client._instance.Root = '';
  202.                         Client._instance.User = '';
  203.                         Client._instance.SessionID = 0;
  204.                         Client._instance.SessionIDHexa8 = "";
  205.                         Client._instance.SessionPrivateKey = 0;
  206.                         Client._instance.LoginCallback = null;
  207.                         Client._instance.LogoutCallback = null;
  208.                     }
  209.                 }
  210.             };
  211.             this.onRetrieveRecordCallback = function (ev) {
  212.                 if (this.readyState == 4) {
  213.                     //var success = (this.status >= 200 && this.status < 300);
  214.                     var obj = JSON.parse(this.response) || {};
  215.                     if (Client._instance.onRetrieveRecord instanceof Function) {
  216.                         Client._instance.onRetrieveRecord(this.status, obj);
  217.                     }
  218.                 }
  219.             };
  220.            
  221.             this.onRetrievePageCallback = function (ev) {
  222.                 if (this.readyState == 4) {
  223.                     //var success = (this.status >= 200 && this.status < 300);
  224.                     var obj = this.respons || {};
  225.                     if (Client._instance.onRetrievePage instanceof Function) {
  226.                         Client._instance.onRetrievePage(this.status, obj);
  227.                     }
  228.                 }
  229.             };
  230.            
  231.             this.onAddRecordCallback = function (ev) {
  232.                 if (this.readyState == 4) {
  233.                     if (Client._instance.onAddRecord instanceof Function) {
  234.                         Client._instance.onAddRecord(this.status, this.getResponseHeader('Location'));
  235.                     }
  236.                 }
  237.             };
  238.             this.onUnlockRecordCallback = function (ev) {
  239.                 if (this.readyState == 4) {
  240.                     var success = (this.status >= 200 && this.status < 300);
  241.                     if (Client._instance.onUnlockRecord instanceof Function) {
  242.                         Client._instance.onUnlockRecord(success);
  243.                     }
  244.                 }
  245.             };
  246.             if (!Client.allowInstantiation) {
  247.                 throw new Error("Error: Instantiation failed: Use mORMot.Client.getInstance() instead of new.");
  248.             }
  249.         }
  250.         Client.getInstance = function () {
  251.             if (Client._instance == null) {
  252.                 Client.allowInstantiation = true;
  253.                 Client._instance = new Client();
  254.                 Client.allowInstantiation = false;
  255.             }
  256.             return Client._instance;
  257.         };
  258.  
  259.         //
  260.         //   hexadecimal representation of a number
  261.         //   (note toString(16) is implementation-dependant, and
  262.         //   in IE returns signed numbers when used on full words)
  263.         //
  264.         Client.prototype.Sha256toHexStr = function (n) {
  265.             var s = "", v, i;
  266.             for (i = 7; i >= 0; i = i - 1) {
  267.                 v = (n >>> (i * 4)) & 0xf;
  268.                 s += v.toString(16);
  269.             }
  270.             return s;
  271.         };
  272.  
  273.         /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
  274.         /*  Utf8 class: encode / decode between multi-byte Unicode characters and UTF-8 multiple          */
  275.         /*              single-byte character encoding (c) Chris Veness 2002-2010                         */
  276.         /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
  277.         //var Utf8 = {};  // Utf8 namespace
  278.         /**
  279.         * Encode multi-byte Unicode string into utf-8 multiple single-byte characters
  280.         * (BMP / basic multilingual plane only)
  281.         *
  282.         * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars
  283.         *
  284.         * @param {String} strUni Unicode string to be encoded as UTF-8
  285.         * @returns {String} encoded string
  286.         */
  287.         Client.prototype.Utf8encode = function (strUni) {
  288.             // use regular expressions & String.replace callback function for better efficiency
  289.             // than procedural approaches
  290.             var strUtf = strUni.replace(/[\u0080-\u07ff]/g, function (c) {
  291.                 var cc = c.charCodeAt(0);
  292.                 return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f);
  293.             });
  294.             strUtf = strUtf.replace(/[\u0800-\uffff]/g, function (c) {
  295.                 var cc = c.charCodeAt(0);
  296.                 return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f);
  297.             });
  298.             return strUtf;
  299.         };
  300.  
  301.         /**
  302.         * Decode utf-8 encoded string back into multi-byte Unicode characters
  303.         *
  304.         * @param {String} strUtf UTF-8 string to be decoded back to Unicode
  305.         * @returns {String} decoded string
  306.         */
  307.         Client.prototype.Utf8decode = function (strUtf) {
  308.             // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
  309.             var strUni = strUtf.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, function (c) {
  310.                 var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f);
  311.                 return String.fromCharCode(cc);
  312.             });
  313.             strUni = strUni.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, function (c) {
  314.                 var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f;
  315.                 return String.fromCharCode(cc);
  316.             });
  317.             return strUni;
  318.         };
  319.  
  320.         Client.prototype.Sha256ROTR = function (n, x) {
  321.             return (x >>> n) | (x << (32 - n));
  322.         };
  323.         Client.prototype.Sha256Sigma0 = function (x) {
  324.             return this.Sha256ROTR(2, x) ^ this.Sha256ROTR(13, x) ^ this.Sha256ROTR(22, x);
  325.         };
  326.         Client.prototype.Sha256Sigma1 = function (x) {
  327.             return this.Sha256ROTR(6, x) ^ this.Sha256ROTR(11, x) ^ this.Sha256ROTR(25, x);
  328.         };
  329.         Client.prototype.Sha256sigma0 = function (x) {
  330.             return this.Sha256ROTR(7, x) ^ this.Sha256ROTR(18, x) ^ (x >>> 3);
  331.         };
  332.         Client.prototype.Sha256sigma1 = function (x) {
  333.             return this.Sha256ROTR(17, x) ^ this.Sha256ROTR(19, x) ^ (x >>> 10);
  334.         };
  335.         Client.prototype.Sha256Ch = function (x, y, z) {
  336.             return (x & y) ^ (~x & z);
  337.         };
  338.         Client.prototype.Sha256Maj = function (x, y, z) {
  339.             return (x & y) ^ (x & z) ^ (y & z);
  340.         };
  341.  
  342.         Client.prototype.Sha256hash = function (msg, utf8encode) {
  343.             var K, H, l, N, M, i, j, W, a, b, c, d, e, f, g, h, t, T1, T2;
  344.             utf8encode = (typeof utf8encode == 'undefined') ? true : utf8encode;
  345.  
  346.             // convert string to UTF-8, as SHA only deals with byte-streams
  347.             if (utf8encode) {
  348.                 msg = this.Utf8encode(msg);
  349.             }
  350.  
  351.             // constants [§4.2.2]
  352.             K = [
  353.                 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  354.                 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  355.                 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  356.                 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  357.                 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  358.                 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  359.                 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  360.                 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
  361.  
  362.             // initial hash value [§5.3.1]
  363.             H = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];
  364.  
  365.             // PREPROCESSING
  366.             msg += String.fromCharCode(0x80); // add trailing '1' bit (+ 0's padding) to string [§5.1.1]
  367.  
  368.             // convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1]
  369.             l = msg.length / 4 + 2; // length (in 32-bit integers) of msg + ‘1’ + appended length
  370.             N = Math.ceil(l / 16); // number of 16-integer-blocks required to hold 'l' ints
  371.             M = [N]; //new Array(N);
  372.  
  373.             for (i = 0; i < N; i = i + 1) {
  374.                 M[i] = new Array(16);
  375.                 for (j = 0; j < 16; j = j + 1) {
  376.                     M[i][j] = (msg.charCodeAt(i * 64 + j * 4) << 24) | (msg.charCodeAt(i * 64 + j * 4 + 1) << 16) | (msg.charCodeAt(i * 64 + j * 4 + 2)
  377.  
  378. << 8) | (msg.charCodeAt(i * 64 + j * 4 + 3));
  379.                 }
  380.             }
  381.  
  382.             // add length (in bits) into final pair of 32-bit integers (big-endian) [§5.1.1]
  383.             // note: most significant word would be (len-1)*8 >>> 32, but since JS converts
  384.             // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
  385.             M[N - 1][14] = ((msg.length - 1) * 8) / Math.pow(2, 32);
  386.             M[N - 1][14] = Math.floor(M[N - 1][14]);
  387.             M[N - 1][15] = (((msg.length - 1) * 8) & 0xffffffff);
  388.  
  389.             // HASH COMPUTATION [§6.1.2]
  390.             W = new Array(64);
  391.             for (i = 0; i < N; i = i + 1) {
  392.                 for (t = 0; t < 16; t = t + 1) {
  393.                     W[t] = M[i][t];
  394.                 }
  395.                 for (t = 16; t < 64; t = t + 1) {
  396.                     W[t] = (this.Sha256sigma1(W[t - 2]) + W[t - 7] + this.Sha256sigma0(W[t - 15]) + W[t - 16]) & 0xffffffff;
  397.                 }
  398.  
  399.                 // 2 - initialise working variables a, b, c, d, e, f, g, h with previous hash value
  400.                 a = H[0];
  401.                 b = H[1];
  402.                 c = H[2];
  403.                 d = H[3];
  404.                 e = H[4];
  405.                 f = H[5];
  406.                 g = H[6];
  407.                 h = H[7];
  408.  
  409.                 for (t = 0; t < 64; t = t + 1) {
  410.                     T1 = h + this.Sha256Sigma1(e) + this.Sha256Ch(e, f, g) + K[t] + W[t];
  411.                     T2 = this.Sha256Sigma0(a) + this.Sha256Maj(a, b, c);
  412.                     h = g;
  413.                     g = f;
  414.                     f = e;
  415.                     e = (d + T1) & 0xffffffff;
  416.                     d = c;
  417.                     c = b;
  418.                     b = a;
  419.                     a = (T1 + T2) & 0xffffffff;
  420.                 }
  421.  
  422.                 // 4 - compute the new intermediate hash value (note 'addition modulo 2^32')
  423.                 H[0] = (H[0] + a) & 0xffffffff;
  424.                 H[1] = (H[1] + b) & 0xffffffff;
  425.                 H[2] = (H[2] + c) & 0xffffffff;
  426.                 H[3] = (H[3] + d) & 0xffffffff;
  427.                 H[4] = (H[4] + e) & 0xffffffff;
  428.                 H[5] = (H[5] + f) & 0xffffffff;
  429.                 H[6] = (H[6] + g) & 0xffffffff;
  430.                 H[7] = (H[7] + h) & 0xffffffff;
  431.             }
  432.  
  433.             return this.Sha256toHexStr(H[0]) + this.Sha256toHexStr(H[1]) + this.Sha256toHexStr(H[2]) + this.Sha256toHexStr(H[3]) + this.Sha256toHexStr(H
  434.  
  435. [4]) + this.Sha256toHexStr(H[5]) + this.Sha256toHexStr(H[6]) + this.Sha256toHexStr(H[7]);
  436.         };
  437.  
  438.         Client.prototype.Crc32Add = function (crc, c) {
  439.             return Client._instance.Crc32Tab[(crc ^ c) & 0xFF] ^ ((crc >> 8) & 0xFFFFFF);
  440.         };
  441.  
  442.         Client.prototype.crc32 = function (str, crc) {
  443.             var n, len;
  444.             len = str.length;
  445.  
  446.             //var crc;
  447.             if (typeof (crc) == "undefined") {
  448.                 crc = 0xFFFFFFFF;
  449.             } else {
  450.                 crc = crc ^ 0xFFFFFFFF; //crc = ~crc;
  451.                 if (crc < 0) {
  452.                     crc = 4294967296 + crc;
  453.                 }
  454.             }
  455.  
  456.             for (n = 0; n < len; n = n + 1) {
  457.                 crc = Client._instance.Crc32Add(crc, str.charCodeAt(n));
  458.             }
  459.             crc = crc ^ 0xFFFFFFFF; //crc = ~crc;
  460.             if (crc < 0) {
  461.                 crc = 4294967296 + crc;
  462.             }
  463.             return crc;
  464.         };
  465.  
  466.         Client.prototype.logIn = function (url, root, username, password, callbackFunc) {
  467.             var SynAuth = this, d = new Date();
  468.             SynAuth.ServerURL = url;
  469.             SynAuth.Root = root;
  470.             SynAuth.User = username;
  471.             SynAuth.PasswordHashHexa = SynAuth.Sha256hash("salt" + password);
  472.             SynAuth.SessionTickCountOffset = d.getTime();
  473.             if (callbackFunc) {
  474.                 SynAuth.LoginCallback = callbackFunc;
  475.             }
  476.             var XHR = getXhr();
  477.             XHR.open("GET", SynAuth.ServerURL + "/" + SynAuth.Root + "/TimeStamp");
  478.             XHR.onreadystatechange = SynAuth.onGotTimestamp;
  479.             XHR.send(null);
  480.         };
  481.  
  482.         Client.prototype.logout = function (callbackFunc) {
  483.             if (callbackFunc) {
  484.                 Client._instance.LogoutCallback = callbackFunc;
  485.             }
  486.             var XHR = getXhr();
  487.             XHR.open("GET", Client._instance.ServerURL + "/" + Client._instance.signUrl(Client._instance.Root + "/Auth?UserName=" + Client._instance.User
  488.  
  489. + "&Session=" + Client._instance.SessionID));
  490.  
  491.             //XHR.onreadystatechange = Client._instance.onLogout;
  492.             XHR.send(null);
  493.         };
  494.  
  495.         Client.prototype.logoutSync = function () {
  496.             var XHR = getXhr();
  497.             XHR.open("GET", Client._instance.ServerURL + "/" + Client._instance.signUrl(Client._instance.Root + "/Auth?UserName=" + Client._instance.User
  498.  
  499. + "&Session=" + Client._instance.SessionID), false);
  500.             XHR.send(null);
  501.             var success = (XHR.status >= 200 && XHR.status < 300);
  502.             if (success) {
  503.                 Client._instance.ServerURL = '';
  504.                 Client._instance.Root = '';
  505.                 Client._instance.User = '';
  506.                 Client._instance.SessionID = 0;
  507.                 Client._instance.SessionIDHexa8 = '';
  508.                 Client._instance.SessionPrivateKey = 0;
  509.                 Client._instance.LoginCallback = null;
  510.                 Client._instance.LogoutCallback = null;
  511.             }
  512.             return success;
  513.         };
  514.  
  515.         Client.prototype.signUrl = function (url) {
  516.             if (Client._instance.loggedIn === true) {
  517.                 var Tix, Nonce, s, ss, d = new Date();
  518.                 Tix = d.getTime() - Client._instance.SessionTickCountOffset;
  519.                 Nonce = Tix.toString(16);
  520.                 while (Nonce.length < 8) {
  521.                     Nonce = '0' + Nonce;
  522.                 }
  523.                 if (Nonce.length > 8) {
  524.                     Nonce = Nonce.slice(Nonce.length - 8);
  525.                 }
  526.                 ss = Client._instance.crc32(url, Client._instance.crc32(Nonce, Client._instance.SessionPrivateKey)).toString(16);
  527.                 while (ss.length < 8) {
  528.                     ss = '0' + ss;
  529.                 }
  530.                 s = url.indexOf("?") === -1 ? url + '?session_signature=' : url + '&session_signature=';
  531.                 return s + Client._instance.SessionIDHexa8 + Nonce + ss;
  532.             } else {
  533.                 return url;
  534.             }
  535.         };
  536.  
  537.         Client.prototype.retrieveRecordWhere = function (table, select, where, callback) {
  538.             var XHR = getXhr(), s = Client._instance.ServerURL + '/' + Client._instance.signUrl(Client._instance.Root + '/' + table + '?select=' + select
  539.  
  540. + '&where=' + where + '&limit=1');
  541.             XHR.onreadystatechange = Client._instance.onRetrieveRecordCallback;
  542.             XHR.open("GET", s);
  543.             XHR.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
  544.             XHR.send(null);
  545.         };
  546.  
  547.         Client.prototype.retrieveRecord = function (table, id, forUpdate) {
  548.             var XHR = getXhr();
  549.             XHR.onreadystatechange = Client._instance.onRetrieveRecordCallback;
  550.             var s = Client._instance.ServerURL + "/" + Client._instance.signUrl(Client._instance.Root + "/" + table + "/" + id);
  551.             if (!forUpdate) {
  552.                 XHR.open("GET", s);
  553.             } else {
  554.                 XHR.open("LOCK", s);
  555.             }
  556.             XHR.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
  557.             XHR.send(null);
  558.         };
  559.        
  560.         Client.prototype.retrievePage = function (url) {
  561.             var XHR = getXhr();
  562.            
  563.             //XHR.onreadystatechange = Client._instance.onRetrievePageCallback;
  564.             var s = Client._instance.ServerURL + "/" + Client._instance.signUrl(Client._instance.Root + "/" + url);
  565.             window.location.href = s;
  566.             //XHR.open("GET", s);            
  567.             //XHR.setRequestHeader('Content-Type', 'application/html; charset=UTF-8');
  568.             //XHR.send(null);
  569.            
  570.         };
  571.        
  572.  
  573.         Client.prototype.addRecord = function (table, record) {
  574.             var XHR = getXhr();
  575.             var s = Client._instance.ServerURL + "/" + Client._instance.signUrl(Client._instance.Root + "/" + table);
  576.             XHR.onreadystatechange = Client._instance.onAddRecordCallback;
  577.             XHR.open("POST", s);
  578.             XHR.send(JSON.stringify(record || {}));
  579.         };
  580.  
  581.         Client.prototype.unlockRecord = function (table, id) {
  582.             //UNLOCK
  583.             var s = Client._instance.ServerURL + "/" + Client._instance.signUrl(Client._instance.Root + "/" + table + "/" + id);
  584.             var XHR = getXhr();
  585.             XHR.open("UNLOCK", "/" + s);
  586.             XHR.onreadystatechange = Client._instance.onUnlockRecordCallback;
  587.             XHR.send(null);
  588.         };
  589.         return Client;
  590.     })();
  591.     mORMot.Client = Client;
  592. })(mORMot || (mORMot = {}));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement