LP#1641208: util.file no longer mangles UTF8 when writing JSON
authorGalen Charlton <gmc@esilibrary.com>
Fri, 11 Nov 2016 19:52:11 +0000 (14:52 -0500)
committerJason Etheridge <jason@esilibrary.com>
Wed, 17 May 2017 17:42:40 +0000 (13:42 -0400)
This patch ensures that JSON strings are converted to UTF8
before they are writing to XUL profile files by util.file. Doing this
fixes a bug where by OU names like "ბიზნესისა" can get mangled
in certain XUL client interfaces.

To test
-------
[1] Set an OU name to ბიზნესისა
[2] In the transit list, note that the OU selector displays
    the name as ÑØÖÜÔáØáÐ.
[3] Apply the patch (note that it's not necessary to rebuild
    the staff client to test this).
[4] Restart the staff client, clearing cache beforehand.
[5] Note that the OU name is now displayed correctly in the transit
    list.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Signed-off-by: Jason Etheridge <jason@esilibrary.com>
Open-ILS/xul/staff_client/chrome/content/util/file.js

index bc696dd..857f32f 100644 (file)
@@ -103,7 +103,12 @@ util.file.prototype = {
             var obj_json; 
             try { obj_json = js2JSON( obj ) + '\n'; } catch(E) { throw('Could not JSONify the object: ' + E); }
 
-            this.write_content(write_type,obj_json);
+            var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
+                .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
+            converter.charset = "UTF-8";
+            var converted = converter.ConvertFromUnicode(obj_json);
+
+            this.write_content(write_type,converted);
 
         } catch(E) {
             this.error.sdump('D_ERROR',this._file.path + '\nutil.file.write_object(): ' + E);
@@ -126,7 +131,11 @@ util.file.prototype = {
     'get_object' : function() {
         try {
             var data = this.get_content();
-            var obj; try { obj = JSON2js( data ); } catch(E) { throw('Could not js-ify the JSON: '+E); }
+            var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
+                .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
+            converter.charset = "UTF-8";
+            var converted = converter.ConvertToUnicode(data);
+            var obj; try { obj = JSON2js( converted ); } catch(E) { throw('Could not js-ify the JSON: '+E); }
             return obj;
         } catch(E) {
             this.error.sdump('D_ERROR',this._file.path + '\nutil.file.get_object(): ' + E);