michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: function getPrincipalFromDomain(aDomain) { michael@0: return Cc["@mozilla.org/scriptsecuritymanager;1"] michael@0: .getService(Ci.nsIScriptSecurityManager) michael@0: .getNoAppCodebasePrincipal(NetUtil.newURI("http://" + aDomain)); michael@0: } michael@0: michael@0: function run_test() { michael@0: let profile = do_get_profile(); michael@0: let pm = Services.perms; michael@0: let perm = 'test-idn'; michael@0: michael@0: // We create three principal linked to IDN. michael@0: // One with just a domain, one with a subdomain and one with the TLD michael@0: // containing a UTF-8 character. michael@0: let mainDomainPrincipal = getPrincipalFromDomain("fôû.com"); michael@0: let subDomainPrincipal = getPrincipalFromDomain("fôô.bàr.com"); michael@0: let tldPrincipal = getPrincipalFromDomain("fôû.bàr.côm"); michael@0: michael@0: // We add those to the permission manager. michael@0: pm.addFromPrincipal(mainDomainPrincipal, perm, pm.ALLOW_ACTION, 0, 0); michael@0: pm.addFromPrincipal(subDomainPrincipal, perm, pm.ALLOW_ACTION, 0, 0); michael@0: pm.addFromPrincipal(tldPrincipal, perm, pm.ALLOW_ACTION, 0, 0); michael@0: michael@0: // They should obviously be there now.. michael@0: do_check_eq(pm.testPermissionFromPrincipal(mainDomainPrincipal, perm), pm.ALLOW_ACTION); michael@0: do_check_eq(pm.testPermissionFromPrincipal(subDomainPrincipal, perm), pm.ALLOW_ACTION); michael@0: do_check_eq(pm.testPermissionFromPrincipal(tldPrincipal, perm), pm.ALLOW_ACTION); michael@0: michael@0: // We do the same thing with the puny-encoded versions of the IDN. michael@0: let punyMainDomainPrincipal = getPrincipalFromDomain('xn--f-xgav.com'); michael@0: let punySubDomainPrincipal = getPrincipalFromDomain('xn--f-xgaa.xn--br-jia.com'); michael@0: let punyTldPrincipal = getPrincipalFromDomain('xn--f-xgav.xn--br-jia.xn--cm-8ja'); michael@0: michael@0: // Those principals should have the permission granted too. michael@0: do_check_eq(pm.testPermissionFromPrincipal(punyMainDomainPrincipal, perm), pm.ALLOW_ACTION); michael@0: do_check_eq(pm.testPermissionFromPrincipal(punySubDomainPrincipal, perm), pm.ALLOW_ACTION); michael@0: do_check_eq(pm.testPermissionFromPrincipal(punyTldPrincipal, perm), pm.ALLOW_ACTION); michael@0: michael@0: // However, those two principals shouldn't be allowed because they are like michael@0: // the IDN but without the UT8-8 characters. michael@0: let witnessPrincipal = getPrincipalFromDomain("foo.com"); michael@0: do_check_eq(pm.testPermissionFromPrincipal(witnessPrincipal, perm), pm.UNKNOWN_ACTION); michael@0: witnessPrincipal = getPrincipalFromDomain("foo.bar.com"); michael@0: do_check_eq(pm.testPermissionFromPrincipal(witnessPrincipal, perm), pm.UNKNOWN_ACTION); michael@0: }