[PATCH] add a Base64 saftURL encode and decode function

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> These two functions are similar to the functions in ui/js/novnc/base64.js usage: --- a/ui/pages/login.html.tmpl +++ b/ui/pages/login.html.tmpl @@ -36,6 +36,7 @@ <script src="$href('libs/jquery-ui.min.js')"></script> <script src="$href('libs/jquery-ui-i18n.min.js')"></script> <script src="$href('js/kimchi.min.js')"></script> +<script src="$href('js/Base64saftURL.js')"></script> <style type="text/css"> .topbar select { float: right; then in UI: Base64.encode("f4>&^bc") "ZjQ-Jl5iYw==" Base64.decode("ZjQ-Jl5iYw==") "f4>&^bc" this is just a sample. we can add it to ui/js/src/kimchi.utils.js Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- ui/js/Base64saftURL.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ui/js/Base64saftURL.js diff --git a/ui/js/Base64saftURL.js b/ui/js/Base64saftURL.js new file mode 100644 index 0000000..8880a7e --- /dev/null +++ b/ui/js/Base64saftURL.js @@ -0,0 +1,110 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/... + +/*jslint white: false, bitwise: false, plusplus: false */ +/*global console */ + +var Base64 = { + +/* Convert data (an array of integers) to a Base64 string. */ +toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_='.split(''), +base64Pad : '=', + +encode: function (data) { + "use strict"; + var result = ''; + var toBase64Table = Base64.toBase64Table; + var length = data.length + var lengthpad = (length%3); + var i = 0, j = 0; + // Convert every three bytes to 4 ascii characters. + /* BEGIN LOOP */ + for (i = 0; i < (length - 2); i += 3) { + result += toBase64Table[data.charCodeAt(i) >> 2]; + result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)]; + result += toBase64Table[((data.charCodeAt(i+1) & 0x0f) << 2) + (data.charCodeAt(i+2) >> 6)]; + result += toBase64Table[data.charCodeAt(i+2) & 0x3f]; + } + /* END LOOP */ + + // Convert the remaining 1 or 2 bytes, pad out to 4 characters. + if (lengthpad === 2) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[((data.charCodeAt(j) & 0x03) << 4) + (data.charCodeAt(j+1) >> 4)]; + result += toBase64Table[(data.charCodeAt(j+1) & 0x0f) << 2]; + result += toBase64Table[64]; + } else if (lengthpad === 1) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[(data.charCodeAt(j) & 0x03) << 4]; + result += toBase64Table[64]; + result += toBase64Table[64]; + } + + return result; +}, + +/* Convert Base64 data to a string */ +toBinaryTable : [ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,62,-1,-1, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,63, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +], + +decode: function (data, offset) { + "use strict"; + offset = typeof(offset) !== 'undefined' ? offset : 0; + var toBinaryTable = Base64.toBinaryTable; + var base64Pad = Base64.base64Pad; + var result, result_length, idx, i, c, padding; + var leftbits = 0; // number of bits decoded, but yet to be appended + var leftdata = 0; // bits decoded, but yet to be appended + + // Convert one by one. + /* BEGIN LOOP */ + result = "" + for (idx = 0, i = offset; i < data.length; i++) { + c = toBinaryTable[data.charCodeAt(i) & 0x7f]; + padding = (data.charAt(i) === base64Pad); + // Skip illegal characters and whitespace + if (c === -1) { + console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i); + continue; + } + + // Collect data into leftdata, update bitcount + leftdata = (leftdata << 6) | c; + leftbits += 6; + + // If we have 8 or more bits, append 8 bits to the result + if (leftbits >= 8) { + leftbits -= 8; + // Append if not padding. + if (!padding) { + idx++; + result += String.fromCharCode((leftdata >> leftbits) & 0xff); + } + leftdata &= (1 << leftbits) - 1; + } + } + /* END LOOP */ + + // If there are any bits left, the base64 string was corrupted + if (leftbits) { + throw {name: 'Base64-Error', + message: 'Corrupted base64 string'}; + } + + return result; +} + +}; /* End of Base64 namespace */ -- 1.9.3

Thanks for the patch, Sheldon! But for the next_url I was able to use urllib2 and encodeURIcomponent() That way we keep consistent the communication between backend and UI Maybe we can add this base64 code for future matters. On 07/16/2014 01:53 PM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
These two functions are similar to the functions in ui/js/novnc/base64.js
usage: --- a/ui/pages/login.html.tmpl +++ b/ui/pages/login.html.tmpl @@ -36,6 +36,7 @@ <script src="$href('libs/jquery-ui.min.js')"></script> <script src="$href('libs/jquery-ui-i18n.min.js')"></script> <script src="$href('js/kimchi.min.js')"></script> +<script src="$href('js/Base64saftURL.js')"></script> <style type="text/css"> .topbar select { float: right;
then in UI: Base64.encode("f4>&^bc") "ZjQ-Jl5iYw==" Base64.decode("ZjQ-Jl5iYw==") "f4>&^bc"
this is just a sample.
we can add it to ui/js/src/kimchi.utils.js
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- ui/js/Base64saftURL.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ui/js/Base64saftURL.js
diff --git a/ui/js/Base64saftURL.js b/ui/js/Base64saftURL.js new file mode 100644 index 0000000..8880a7e --- /dev/null +++ b/ui/js/Base64saftURL.js @@ -0,0 +1,110 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/... + +/*jslint white: false, bitwise: false, plusplus: false */ +/*global console */ + +var Base64 = { + +/* Convert data (an array of integers) to a Base64 string. */ +toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_='.split(''), +base64Pad : '=', + +encode: function (data) { + "use strict"; + var result = ''; + var toBase64Table = Base64.toBase64Table; + var length = data.length + var lengthpad = (length%3); + var i = 0, j = 0; + // Convert every three bytes to 4 ascii characters. + /* BEGIN LOOP */ + for (i = 0; i < (length - 2); i += 3) { + result += toBase64Table[data.charCodeAt(i) >> 2]; + result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)]; + result += toBase64Table[((data.charCodeAt(i+1) & 0x0f) << 2) + (data.charCodeAt(i+2) >> 6)]; + result += toBase64Table[data.charCodeAt(i+2) & 0x3f]; + } + /* END LOOP */ + + // Convert the remaining 1 or 2 bytes, pad out to 4 characters. + if (lengthpad === 2) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[((data.charCodeAt(j) & 0x03) << 4) + (data.charCodeAt(j+1) >> 4)]; + result += toBase64Table[(data.charCodeAt(j+1) & 0x0f) << 2]; + result += toBase64Table[64]; + } else if (lengthpad === 1) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[(data.charCodeAt(j) & 0x03) << 4]; + result += toBase64Table[64]; + result += toBase64Table[64]; + } + + return result; +}, + +/* Convert Base64 data to a string */ +toBinaryTable : [ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,62,-1,-1, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,63, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +], + +decode: function (data, offset) { + "use strict"; + offset = typeof(offset) !== 'undefined' ? offset : 0; + var toBinaryTable = Base64.toBinaryTable; + var base64Pad = Base64.base64Pad; + var result, result_length, idx, i, c, padding; + var leftbits = 0; // number of bits decoded, but yet to be appended + var leftdata = 0; // bits decoded, but yet to be appended + + // Convert one by one. + /* BEGIN LOOP */ + result = "" + for (idx = 0, i = offset; i < data.length; i++) { + c = toBinaryTable[data.charCodeAt(i) & 0x7f]; + padding = (data.charAt(i) === base64Pad); + // Skip illegal characters and whitespace + if (c === -1) { + console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i); + continue; + } + + // Collect data into leftdata, update bitcount + leftdata = (leftdata << 6) | c; + leftbits += 6; + + // If we have 8 or more bits, append 8 bits to the result + if (leftbits >= 8) { + leftbits -= 8; + // Append if not padding. + if (!padding) { + idx++; + result += String.fromCharCode((leftdata >> leftbits) & 0xff); + } + leftdata &= (1 << leftbits) - 1; + } + } + /* END LOOP */ + + // If there are any bits left, the base64 string was corrupted + if (leftbits) { + throw {name: 'Base64-Error', + message: 'Corrupted base64 string'}; + } + + return result; +} + +}; /* End of Base64 namespace */

On 07/17/2014 08:51 AM, Aline Manera wrote:
Thanks for the patch, Sheldon!
But for the next_url I was able to use urllib2 and encodeURIcomponent() That way we keep consistent the communication between backend and UI
Maybe we can add this base64 code for future matters.
I does not matter. I just make a mini change for the ui/js/novnc/base64.js Also js support a btoa/atob for base64 decode and encode btoa("abcdef") "YWJjZGVm" atob("YWJjZGVm") "abcdef" if encodeURIcomponent is OK, we can use it.
On 07/16/2014 01:53 PM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
These two functions are similar to the functions in ui/js/novnc/base64.js
usage: --- a/ui/pages/login.html.tmpl +++ b/ui/pages/login.html.tmpl @@ -36,6 +36,7 @@ <script src="$href('libs/jquery-ui.min.js')"></script> <script src="$href('libs/jquery-ui-i18n.min.js')"></script> <script src="$href('js/kimchi.min.js')"></script> +<script src="$href('js/Base64saftURL.js')"></script> <style type="text/css"> .topbar select { float: right;
then in UI: Base64.encode("f4>&^bc") "ZjQ-Jl5iYw==" Base64.decode("ZjQ-Jl5iYw==") "f4>&^bc"
this is just a sample.
we can add it to ui/js/src/kimchi.utils.js
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- ui/js/Base64saftURL.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ui/js/Base64saftURL.js
diff --git a/ui/js/Base64saftURL.js b/ui/js/Base64saftURL.js new file mode 100644 index 0000000..8880a7e --- /dev/null +++ b/ui/js/Base64saftURL.js @@ -0,0 +1,110 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/... + +/*jslint white: false, bitwise: false, plusplus: false */ +/*global console */ + +var Base64 = { + +/* Convert data (an array of integers) to a Base64 string. */ +toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_='.split(''), +base64Pad : '=', + +encode: function (data) { + "use strict"; + var result = ''; + var toBase64Table = Base64.toBase64Table; + var length = data.length + var lengthpad = (length%3); + var i = 0, j = 0; + // Convert every three bytes to 4 ascii characters. + /* BEGIN LOOP */ + for (i = 0; i < (length - 2); i += 3) { + result += toBase64Table[data.charCodeAt(i) >> 2]; + result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)]; + result += toBase64Table[((data.charCodeAt(i+1) & 0x0f) << 2) + (data.charCodeAt(i+2) >> 6)]; + result += toBase64Table[data.charCodeAt(i+2) & 0x3f]; + } + /* END LOOP */ + + // Convert the remaining 1 or 2 bytes, pad out to 4 characters. + if (lengthpad === 2) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[((data.charCodeAt(j) & 0x03) << 4) + (data.charCodeAt(j+1) >> 4)]; + result += toBase64Table[(data.charCodeAt(j+1) & 0x0f) << 2]; + result += toBase64Table[64]; + } else if (lengthpad === 1) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[(data.charCodeAt(j) & 0x03) << 4]; + result += toBase64Table[64]; + result += toBase64Table[64]; + } + + return result; +}, + +/* Convert Base64 data to a string */ +toBinaryTable : [ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,62,-1,-1, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,63, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +], + +decode: function (data, offset) { + "use strict"; + offset = typeof(offset) !== 'undefined' ? offset : 0; + var toBinaryTable = Base64.toBinaryTable; + var base64Pad = Base64.base64Pad; + var result, result_length, idx, i, c, padding; + var leftbits = 0; // number of bits decoded, but yet to be appended + var leftdata = 0; // bits decoded, but yet to be appended + + // Convert one by one. + /* BEGIN LOOP */ + result = "" + for (idx = 0, i = offset; i < data.length; i++) { + c = toBinaryTable[data.charCodeAt(i) & 0x7f]; + padding = (data.charAt(i) === base64Pad); + // Skip illegal characters and whitespace + if (c === -1) { + console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i); + continue; + } + + // Collect data into leftdata, update bitcount + leftdata = (leftdata << 6) | c; + leftbits += 6; + + // If we have 8 or more bits, append 8 bits to the result + if (leftbits >= 8) { + leftbits -= 8; + // Append if not padding. + if (!padding) { + idx++; + result += String.fromCharCode((leftdata >> leftbits) & 0xff); + } + leftdata &= (1 << leftbits) - 1; + } + } + /* END LOOP */ + + // If there are any bits left, the base64 string was corrupted + if (leftbits) { + throw {name: 'Base64-Error', + message: 'Corrupted base64 string'}; + } + + return result; +} + +}; /* End of Base64 namespace */
-- Thanks and best regards! Sheldon Feng(冯少合)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center

on 2014/07/17 08:51, Aline Manera wrote:
Thanks for the patch, Sheldon!
But for the next_url I was able to use urllib2 and encodeURIcomponent() That way we keep consistent the communication between backend and UI
Maybe we can add this base64 code for future matters.
I agree to use encodeURIcomponent() in this case. A small comment for the base64: Modern browsers natively support base64 and expose this feature to javascript. Those browsers are Firefox, Chrome, Safari, Opera and IE10+. We don't have to write base64 algorithms if we don't support IE9. We can just use those functions. alert(btoa("http://1 2/3+?aaa&bb=c")); alert(atob("aHR0cDovLzEgMi8zKz9hYWEmYmI9Yw==")); https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_...
On 07/16/2014 01:53 PM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
These two functions are similar to the functions in ui/js/novnc/base64.js
usage: --- a/ui/pages/login.html.tmpl +++ b/ui/pages/login.html.tmpl @@ -36,6 +36,7 @@ <script src="$href('libs/jquery-ui.min.js')"></script> <script src="$href('libs/jquery-ui-i18n.min.js')"></script> <script src="$href('js/kimchi.min.js')"></script> +<script src="$href('js/Base64saftURL.js')"></script> <style type="text/css"> .topbar select { float: right;
then in UI: Base64.encode("f4>&^bc") "ZjQ-Jl5iYw==" Base64.decode("ZjQ-Jl5iYw==") "f4>&^bc"
this is just a sample.
we can add it to ui/js/src/kimchi.utils.js
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- ui/js/Base64saftURL.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ui/js/Base64saftURL.js
diff --git a/ui/js/Base64saftURL.js b/ui/js/Base64saftURL.js new file mode 100644 index 0000000..8880a7e --- /dev/null +++ b/ui/js/Base64saftURL.js @@ -0,0 +1,110 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/...
+ +/*jslint white: false, bitwise: false, plusplus: false */ +/*global console */ + +var Base64 = { + +/* Convert data (an array of integers) to a Base64 string. */ +toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_='.split(''),
+base64Pad : '=', + +encode: function (data) { + "use strict"; + var result = ''; + var toBase64Table = Base64.toBase64Table; + var length = data.length + var lengthpad = (length%3); + var i = 0, j = 0; + // Convert every three bytes to 4 ascii characters. + /* BEGIN LOOP */ + for (i = 0; i < (length - 2); i += 3) { + result += toBase64Table[data.charCodeAt(i) >> 2]; + result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)]; + result += toBase64Table[((data.charCodeAt(i+1) & 0x0f) << 2) + (data.charCodeAt(i+2) >> 6)]; + result += toBase64Table[data.charCodeAt(i+2) & 0x3f]; + } + /* END LOOP */ + + // Convert the remaining 1 or 2 bytes, pad out to 4 characters. + if (lengthpad === 2) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[((data.charCodeAt(j) & 0x03) << 4) + (data.charCodeAt(j+1) >> 4)]; + result += toBase64Table[(data.charCodeAt(j+1) & 0x0f) << 2]; + result += toBase64Table[64]; + } else if (lengthpad === 1) { + j = length - lengthpad; + result += toBase64Table[data.charCodeAt(j) >> 2]; + result += toBase64Table[(data.charCodeAt(j) & 0x03) << 4]; + result += toBase64Table[64]; + result += toBase64Table[64]; + } + + return result; +}, + +/* Convert Base64 data to a string */ +toBinaryTable : [ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,62,-1,-1, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,63, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 +], + +decode: function (data, offset) { + "use strict"; + offset = typeof(offset) !== 'undefined' ? offset : 0; + var toBinaryTable = Base64.toBinaryTable; + var base64Pad = Base64.base64Pad; + var result, result_length, idx, i, c, padding; + var leftbits = 0; // number of bits decoded, but yet to be appended + var leftdata = 0; // bits decoded, but yet to be appended + + // Convert one by one. + /* BEGIN LOOP */ + result = "" + for (idx = 0, i = offset; i < data.length; i++) { + c = toBinaryTable[data.charCodeAt(i) & 0x7f]; + padding = (data.charAt(i) === base64Pad); + // Skip illegal characters and whitespace + if (c === -1) { + console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i); + continue; + } + + // Collect data into leftdata, update bitcount + leftdata = (leftdata << 6) | c; + leftbits += 6; + + // If we have 8 or more bits, append 8 bits to the result + if (leftbits >= 8) { + leftbits -= 8; + // Append if not padding. + if (!padding) { + idx++; + result += String.fromCharCode((leftdata >> leftbits) & 0xff); + } + leftdata &= (1 << leftbits) - 1; + } + } + /* END LOOP */ + + // If there are any bits left, the base64 string was corrupted + if (leftbits) { + throw {name: 'Base64-Error', + message: 'Corrupted base64 string'}; + } + + return result; +} + +}; /* End of Base64 namespace */
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
-- Zhou Zheng Sheng / 周征晟 E-mail: zhshzhou@linux.vnet.ibm.com Telephone: 86-10-82454397
participants (4)
-
Aline Manera
-
shaohef@linux.vnet.ibm.com
-
Sheldon
-
Zhou Zheng Sheng