From e6c3273e4ea4f5ee63eb2b6b44b159b34677104b Mon Sep 17 00:00:00 2001 From: Fomafix Date: Sat, 14 Feb 2015 10:24:15 +0000 Subject: [PATCH] mediawiki.user: Simplify mw.user.generateRandomSessionId * Remove lookup table for hex strings. * Convert 32 bit instead of 8 bit to hex at once. Change-Id: I6e6ac9e0813c4ba540e0a53b8e6667162cb60bf7 --- resources/src/mediawiki/mediawiki.user.js | 44 +++++++++-------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/resources/src/mediawiki/mediawiki.user.js b/resources/src/mediawiki/mediawiki.user.js index 240d1bd1b1..c4c91f95b1 100644 --- a/resources/src/mediawiki/mediawiki.user.js +++ b/resources/src/mediawiki/mediawiki.user.js @@ -2,11 +2,9 @@ * @class mw.user * @singleton */ -/* global Uint8Array */ +/* global Uint32Array */ ( function ( mw, $ ) { - var i, - userInfoPromise, - byteToHex = []; + var userInfoPromise; /** * Get the current user's groups or rights @@ -21,12 +19,6 @@ return userInfoPromise; } - // Map from numbers 0-255 to a hex string (with padding) - for ( i = 0; i < 256; i++ ) { - // Padding: Add a full byte (0x100, 256) and strip the extra character - byteToHex[ i ] = ( i + 256 ).toString( 16 ).slice( 1 ); - } - // mw.user with the properties options and tokens gets defined in mediawiki.js. $.extend( mw.user, { @@ -51,36 +43,32 @@ * @return {string} 64 bit integer in hex format, padded */ generateRandomSessionId: function () { - /* eslint-disable no-bitwise */ - var rnds, i, r, - hexRnds = new Array( 8 ), + var rnds, i, + hexRnds = new Array( 2 ), // Support: IE 11 crypto = window.crypto || window.msCrypto; - // Based on https://github.com/broofa/node-uuid/blob/bfd9f96127/uuid.js if ( crypto && crypto.getRandomValues ) { - // Fill an array with 8 random values, each of which is 8 bits. - // Note that Uint8Array is array-like but does not implement Array. - rnds = new Uint8Array( 8 ); + // Fill an array with 2 random values, each of which is 32 bits. + // Note that Uint32Array is array-like but does not implement Array. + rnds = new Uint32Array( 2 ); crypto.getRandomValues( rnds ); } else { - rnds = new Array( 8 ); - for ( i = 0; i < 8; i++ ) { - if ( ( i & 3 ) === 0 ) { - r = Math.random() * 0x100000000; - } - rnds[ i ] = r >>> ( ( i & 3 ) << 3 ) & 255; - } + rnds = [ + Math.floor( Math.random() * 0x100000000 ), + Math.floor( Math.random() * 0x100000000 ) + ]; } - // Convert from number to hex - for ( i = 0; i < 8; i++ ) { - hexRnds[ i ] = byteToHex[ rnds[ i ] ]; + // Convert number to a string with 16 hex characters + for ( i = 0; i < 2; i++ ) { + // Add 0x100000000 before converting to hex and strip the extra character + // after converting to keep the leading zeros. + hexRnds[ i ] = ( rnds[ i ] + 0x100000000 ).toString( 16 ).slice( 1 ); } // Concatenation of two random integers with entropy n and m // returns a string with entropy n+m if those strings are independent return hexRnds.join( '' ); - /* eslint-enable no-bitwise */ }, /** -- 2.20.1