diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/_locales/br/messages.json | 890 | ||||
-rw-r--r-- | src/_locales/tr/messages.json | 890 | ||||
-rw-r--r-- | src/bg/ChildPolicies.js | 130 | ||||
-rw-r--r-- | src/bg/ContentScriptOnce.js | 52 | ||||
-rw-r--r-- | src/bg/RequestGuard.js | 17 | ||||
-rw-r--r-- | src/bg/RequestUtil.js | 169 | ||||
-rw-r--r-- | src/bg/Settings.js | 3 | ||||
-rw-r--r-- | src/bg/defaults.js | 1 | ||||
-rw-r--r-- | src/bg/deferWebTraffic.js | 10 | ||||
-rw-r--r-- | src/bg/main.js | 7 | ||||
-rw-r--r-- | src/content/content.js | 77 | ||||
-rw-r--r-- | src/content/media.js | 103 | ||||
-rw-r--r-- | src/content/webglHook.js | 10 | ||||
-rw-r--r-- | src/lib/ResponseMetaData.js | 54 | ||||
-rw-r--r-- | src/manifest.json | 6 | ||||
-rw-r--r-- | src/xss/InjectionChecker.js | 2 | ||||
-rw-r--r-- | src/xss/XSS.js | 5 | ||||
-rw-r--r-- | src/xss/sanitizeName.js | 13 |
18 files changed, 2124 insertions, 315 deletions
diff --git a/src/_locales/br/messages.json b/src/_locales/br/messages.json new file mode 100644 index 0000000..86ebea9 --- /dev/null +++ b/src/_locales/br/messages.json @@ -0,0 +1,890 @@ +{ + "Add": { + "message": "Ouzhpennañ", + "description": "" + }, + "Add_accesskey": { + "message": "A", + "description": "" + }, + "AdditionalPermissions": { + "message": "Aotreadurioù ouzhpenn evit lec'hiennoù a c'haller kaout fiziañs enno", + "description": "" + }, + "AdditionalRestrictions": { + "message": "Aotreadurioù ouzhpenn evit lec'hiennoù n'haller ket kaout fiziañs enno", + "description": "" + }, + "SectionAdvanced": { + "message": "Araokaet", + "description": "" + }, + "Allow": { + "message": "Aotren", + "description": "" + }, + "Allow_accesskey": { + "message": "l", + "description": "" + }, + "AllowBookmarks": { + "message": "Aotren al lec'hiennoù digoret dre ar sinedoù", + "description": "" + }, + "AllowClipboard": { + "message": "Aotren an eilañ kopiañ gant testennoù pinvidikaet diwar ar golver diavaez", + "description": "" + }, + "AllowLocalLinks": { + "message": "Aotren al liammoù lec'hel", + "description": "" + }, + "AllowPage": { + "message": "Aotren ar bajenn a-bezh", + "description": "" + }, + "AllowPage_accesskey": { + "message": "A", + "description": "" + }, + "AllowPing": { + "message": "Aotren <A PING…>", + "description": "" + }, + "AllowViaBookmarks": { + "message": "Aotren al lec'hiennoù digoret dre ar sinedoù", + "description": "" + }, + "AlwaysBlockUntrustedContent": { + "message": "Stankañ an holl objedoù o tont eus ul lec'hienn merket evel bezañ disfizius", + "description": "" + }, + "SectionAppearance": { + "message": "Tres", + "description": "" + }, + "AutoAllowTopLevel": { + "message": "Termeniñ evit ur mareig al lec'hiennoù pennañ war FIZIET", + "description": "" + }, + "AutoReload": { + "message": "Emfreskaat ar pajennoù sevet pa cheñch an aotreadurioù", + "description": "" + }, + "AutoReload_currentTab": { + "message": "Freskaat an ivinell red hepken", + "description": "" + }, + "BaseDom": { + "message": "Domanioù diazez a live 2 (noscript.net)", + "description": "" + }, + "BlockedItems": { + "message": "Stanket $1 diwar $2 a elfennoù.", + "description": "" + }, + "BlockedObjects": { + "message": "NoScript objedoù stanket", + "description": "" + }, + "BookmarkSync": { + "message": "Enrolladur ar c'heflunian NoScript e-barzh ur sined evit aesaat ar sinkroneladur", + "description": "" + }, + "Cancel": { + "message": "Nullañ", + "description": "" + }, + "CascadePermissions": { + "message": "Aotreadurioù e skaleriad an teul uhel war skriptoù 3tredeoù", + "description": "" + }, + "ClearClickDescription": { + "message": "NoScript en deus dastapet un etregwerad logodenn pe glavier gant un elfenn peuz-goachet. Klikit war ar skeudenn dindan evit merdeiñ etre ar stumm stanket hag ar stumm sklaer.", + "description": "" + }, + "ClearClickHeader": { + "message": "Bogodennoù-klikañ a c'hallfe bezañ / O klask ratreañ Etrefas an Implijer!", + "description": "" + }, + "ClearClickOpt": { + "message": "Gwarez ClearClick war ar pajennoù...", + "description": "" + }, + "ClearClickReport": { + "message": "Danevell", + "description": "" + }, + "ClearClickReport_accesskey": { + "message": "D", + "description": "" + }, + "ClearClickReportId": { + "message": "Danevell ID:", + "description": "" + }, + "ClearClickTitle": { + "message": "Kemenn ClearClick", + "description": "" + }, + "Close": { + "message": "Serriñ", + "description": "" + }, + "CollapseBlockedObjects": { + "message": "Bihanaat an objedoù stanket", + "description": "" + }, + "ConfirmUnblock": { + "message": "Goulenn ur c'hadarnadur a-raok distankañ evit ur mare un objed", + "description": "" + }, + "ContentBlocker": { + "message": "Arloañ ivez ar strishadurioù-mañ d'al lec'hiennoù a zo war ar gwennlistenn", + "description": "" + }, + "CtxMenu": { + "message": "Lañser kendestennel", + "description": "" + }, + "Custom": { + "message": "Personnel", + "description": "" + }, + "CustomizePresets": { + "message": "Personneladur rakwelet (evit al lec'hiennoù a rann ur rakreoliñ)", + "description": "" + }, + "Default": { + "message": "Dre ziouer", + "description": "" + }, + "DefaultPolicies": { + "message": "Politikerezhioù dre ziouer", + "description": "" + }, + "Description": { + "message": "Gwarez ouzhpenn evit ho Firefox: NoScript a aotren JavaScript, Flash (ha lugantoù all) nemetken evit an domanioù a c'heller kaout fiziañs enno diouzh ho c'hoant (da skouer, ho lec'hienn bank er gêr). An hentenn stankañ-mañ dizarbenn diazezet war ar wennlistenn a vir ouzh ar c'horvoiñ frailhoù surentez (anaveet ha dianaveet!) Hep koll arc'hweladur ebet... An dud arbennig a lavaro deoc'h: Firefox a zo suroc'h hag a galz gant NoScript :-)", + "description": "" + }, + "Donate": { + "message": "Reiñ arc'hant", + "description": "" + }, + "Donate_accesskey": { + "message": "o", + "description": "" + }, + "Embeddings": { + "message": "Enkorfadurioù", + "description": "" + }, + "Exceptions": { + "message": "Nemedennoù…", + "description": "" + }, + "Export": { + "message": "Ezporzhiañ", + "description": "" + }, + "Export_accesskey": { + "message": "E", + "description": "" + }, + "FixLinks": { + "message": "Klask kempenn al liammoù JavaScript", + "description": "" + }, + "Hider": { + "message": "Bihanaat amañ evit kuzhat.", + "description": "" + }, + "Reveal": { + "message": "Klikit amañ evit adpakañ ar boutonioù a vank...", + "description": "" + }, + "ShowFullAddresses": { + "message": "Listenn ar chomlec'hioù klok e-barzh prenestr kendestennel an aotreadurioù (https://www.noscript.net)", + "description": "" + }, + "SectionGeneral": { + "message": "Hollek", + "description": "" + }, + "GlobalHttpsWhitelist": { + "message": "Aotren ar skriptoù HTTPS hollek war an teulioù HTTPS", + "description": "" + }, + "NotEnforced": { + "message": "Strishadurioù lazhet", + "description": "" + }, + "NoEnforcement": { + "message": "Lazhañ ar strishadurioù en un doare hollek (dañjerus)", + "description": "" + }, + "Enforce": { + "message": "Enaouiñ ar strishadurioù en un doare hollek", + "description": "" + }, + "NoEnforcementForTab": { + "message": "Lazhañ ar strishadurioù evit an ivinell-mañ", + "description": "" + }, + "EnforceForTab": { + "message": "Enaouiñ ar strishadurioù evit an ivinell-mañ", + "description": "" + }, + "httpsOnly": { + "message": "Klotañ a ra gant an endalc'had HTTPS hepken", + "description": "" + }, + "Https": { + "message": "HTTPS", + "description": "" + }, + "Https_always": { + "message": "Atav", + "description": "" + }, + "Https_behavior": { + "message": "Perc'henner", + "description": "" + }, + "Https_cookies": { + "message": "Toupinoù", + "description": "" + }, + "Https_description": { + "message": "Forbanniñ an endalc'had Web oberiant nemet e teufe eus ur c'hevreadur suraet (HTTPS):", + "description": "" + }, + "Https_never": { + "message": "Morse", + "description": "" + }, + "Https_proxy": { + "message": "En ur implijout ur proksi (aliet gant Tor)", + "description": "" + }, + "HttpsFaq": { + "message": "HTTPS FAG…", + "description": "" + }, + "HttpsFaq_accesskey": { + "message": "Q", + "description": "" + }, + "HttpsForced": { + "message": "Rediañ al lec'hiennoù da-heul d'ober gant ur c'hevreadur suraet (HTTPS):", + "description": "" + }, + "HttpsForcedExceptions": { + "message": "Chom hep rediañ ar c'hevreadurioù suraet (HTTPS) evit al lec'hiennoù da-heul:", + "description": "" + }, + "Import": { + "message": "Emporzhiañ", + "description": "" + }, + "Import_accesskey": { + "message": "I", + "description": "" + }, + "KeepLocked": { + "message": "Mirit an elfenn-mañ morailhet (aliet)", + "description": "" + }, + "MatchSample": { + "message": "Standilhon a genglot gant ar patrom:", + "description": "" + }, + "Next": { + "message": "Da-heul", + "description": "" + }, + "NoUntrustedPlaceholder": { + "message": "Endalc'her-spas ebet evit ar an objedoù o tont eus lec'hiennoù merket evel disfizius", + "description": "" + }, + "Notifications": { + "message": "Kemennadurioù", + "description": "" + }, + "Notify": { + "message": "Diskouez ur gemennadenn diwar-benn ar skriptoù stanket", + "description": "" + }, + "Notify_bottom": { + "message": "Lakaat ar gemennadenn en traoñ", + "description": "" + }, + "NotifyMeta": { + "message": "Diskouez ur gemennadenn war an adhenchadurioù META stanket", + "description": "" + }, + "NotifyMeta_accesskey": { + "message": "D", + "description": "" + }, + "NselForce": { + "message": "Diskouez an <NOSCRIPT> elfenn hag a heul un <SCRIPT> stanket", + "description": "" + }, + "NselNever": { + "message": "Kuzhat <NOSCRIPT> a elfennoù", + "description": "" + }, + "OK": { + "message": "Mat eo", + "description": "" + }, + "OptBlockCssScanners": { + "message": "Stankiñ ar skanerioù diazezet war CSS", + "description": "" + }, + "OptFilterXGet": { + "message": "Diziñfektiñ ar rekestoù susped dreuz-lec'hiennoù", + "description": "" + }, + "OptFilterXPost": { + "message": "Treuzfurmiñ ar rekestoù POST dreuz-lec'hiennoù e-barzh rekestoù GET diroadenn", + "description": "" + }, + "Options": { + "message": "Dibarzhioù...", + "description": "" + }, + "Options_accesskey": { + "message": "O", + "description": "" + }, + "OptionsLong": { + "message": "Dibarzhioù NoScript", + "description": "" + }, + "OptionsWidth": { + "message": "40em", + "description": "" + }, + "PermanentInPrivate": { + "message": "Urzhiad \"Aotren\" peurbadel e-barzh ar prenestr prevez", + "description": "" + }, + "SectionSitePermissions": { + "message": "Aotradurioù dre lec'hienn", + "description": "" + }, + "PermissionsText": { + "message": "Gellout a rit spisaat al lec'hiennoù Web aotreet da sevenniñ skriptoù. Skrivit ar chomlec'h pe an domani (da skouer, «http://www.site.com» pe «site.com») al lec'hienn ho peus c'hoant implijout, klikit war Aotren.", + "description": "" + }, + "Plugins": { + "message": "Lugantoù", + "description": "" + }, + "Policies": { + "message": "Politikerezhioù", + "description": "" + }, + "Preset": { + "message": "Live surentez", + "description": "" + }, + "Preset_high": { + "message": "Kreñvlec'h (morailhaj klok)", + "description": "" + }, + "Preset_low": { + "message": "Aes da vont enno (Listenn-zu + surentez Web)", + "description": "" + }, + "Preset_medium": { + "message": "Klasel (Gwennlistenn + Web surentez)", + "description": "" + }, + "Preset_off": { + "message": "Off (sirius out?!)", + "description": "" + }, + "Prev": { + "message": "Kent", + "description": "" + }, + "RecentBlocked": { + "message": "Lec'hiennoù stanket nevez 'zo", + "description": "" + }, + "Refresh": { + "message": "Freskaat", + "description": "" + }, + "ReloadWarn": { + "message": "An dibarzhioù-mañ a vo kemeret e kont war ar pajennoù nevez (gant an dorn) pe adfreskaet", + "description": "" + }, + "RemoveSelected": { + "message": "Dilemel al lec'hiennoù diuzet", + "description": "" + }, + "Reset": { + "message": "Adderaouekaat", + "description": "" + }, + "Reset_accesskey": { + "message": "s", + "description": "" + }, + "ResetDef": { + "message": "Adlakaat dre ziouer", + "description": "" + }, + "ResetDef_accesskey": { + "message": "D", + "description": "" + }, + "RestrictSubdocScripting": { + "message": "Stankiñ ar skriptoù e-barzh is-teulioù ar gwennlistenn ar pajenn hep gwennlistenn", + "description": "" + }, + "RevokeTemp": { + "message": "Dizober an aotradurioù padennek", + "description": "" + }, + "RevokeTemp_accesskey": { + "message": "D", + "description": "" + }, + "SecureCookies": { + "message": "Enaouiñ an emverañ an toupinoù suraet", + "description": "" + }, + "SecureCookiesExceptions": { + "message": "Na ober van ouzh an toupinoù nann-suraet termennet war HTTPS evit al lec'hiennoù da-heul:", + "description": "" + }, + "SecureCookiesForced": { + "message": "Rediañ ar renigadur evit an toupinoù termenet war HTTPS gant al lec'hiennoù da-heul:", + "description": "" + }, + "SecurityManager": { + "message": "Merour ar sutentez", + "description": "" + }, + "Show": { + "message": "Diskouez...", + "description": "" + }, + "ShowConsole": { + "message": "Diskouez ar c'hoñsol...", + "description": "" + }, + "ShowConsole_accesskey": { + "message": "S", + "description": "" + }, + "ShowPlaceholder": { + "message": "Diskouez arlun an endelc'her-spas", + "description": "" + }, + "ShowReleaseNotes": { + "message": "Diskouez an notennoù diwar-benn hizivadurioù an embannadur", + "description": "" + }, + "ShowCtxMenuItem": { + "message": "Diskouez objed lañser kendestennel NoScript", + "description": "" + }, + "ShowCountBadge": { + "message": "Diskouez an elfennoù badj kont stanket", + "description": "" + }, + "SitePermissions": { + "message": "Aotreadurioù al lec'hienn", + "description": "" + }, + "SitePermissions_accessKey": { + "message": "S", + "description": "" + }, + "SitePolicies": { + "message": "Politikerezhioù ispisial al lec'hienn", + "description": "" + }, + "TempTrustPage": { + "message": "Lakaat hollad ar bajenn da FIZIUS evit ur mare", + "description": "" + }, + "TempTrustPage_accesskey": { + "message": "T", + "description": "" + }, + "TempToPerm": { + "message": "Lakaat an aotradurioù pajenn war padel", + "description": "" + }, + "TempToPerm_accesskey": { + "message": "M", + "description": "" + }, + "Trust": { + "message": "Merkañ evel fizius", + "description": "" + }, + "Trust_accesskey": { + "message": "T", + "description": "" + }, + "Trusted": { + "message": "A c'haller kaout fiziañs enno", + "description": "" + }, + "Trusted_temporary": { + "message": "FIZIUS evit ur mare", + "description": "" + }, + "Trusted_permanent": { + "message": "FIZIUS", + "description": "" + }, + "TrustedPagesAdj": { + "message": "fizius", + "description": "" + }, + "Uninstall": { + "message": "Distialiañ", + "description": "" + }, + "Unknown": { + "message": "Dizanv", + "description": "" + }, + "UnsafeReload": { + "message": "Freskadur dañjerus", + "description": "" + }, + "UnsafeReload_accesskey": { + "message": "D", + "description": "" + }, + "Untrust": { + "message": "Merkañ evel disfizius", + "description": "" + }, + "Untrust_accesskey": { + "message": "U", + "description": "" + }, + "Untrusted": { + "message": "Disfizius", + "description": "" + }, + "UntrustedPagesAdj": { + "message": "disfizius", + "description": "" + }, + "WebAddress": { + "message": "Klask pe ouzhpennañ ul lec'hienn Web:", + "description": "" + }, + "WebAddress_accesskey": { + "message": "w", + "description": "" + }, + "Whitelist": { + "message": "Listenn-wenn", + "description": "" + }, + "XSS_notify": { + "message": "Diskouez ar c'hemennadurioù XSS", + "description": "" + }, + "XSS_clearUserChoices": { + "message": "Freskaat an dibaboù XSS", + "description": "" + }, + "XSS_promptTitle": { + "message": "Kemennoù NoScript XSS", + "description": "" + }, + "XSS_promptMessage": { + "message": "NoScript a zo bet diguzhet un dagadenn skriptiñ Dreuz-Lec'hienn eus $1 da $2.\nRoadennoù susped:\n$3", + "description": "" + }, + "XSS_optBlock": { + "message": "Stankañ ar rekest-mañ", + "description": "" + }, + "XSS_optSanitize": { + "message": "Yac'haat ar rekest-mañ", + "description": "" + }, + "XSS_optAllow": { + "message": "Aotren ar rekest-mañ", + "description": "" + }, + "XSS_optAlwaysAllow": { + "message": "Aotren dalc'hmat ar rekestoù goulenn eus $1 da $2", + "description": "" + }, + "XSS_optAlwaysBlock": { + "message": "Aotren rekest bloc'had an teulioù gant $1 da $2", + "description": "" + }, + "Xss": { + "message": "XSS", + "description": "" + }, + "Xss_accesskey": { + "message": "X", + "description": "" + }, + "XssExceptions": { + "message": "Nemedennoù gwareziñ enep-XSS", + "description": "" + }, + "XssExceptions_description": { + "message": "Al lec'hioù kas a genglot gant an troiennoù reoliataet na vezo KET gwarezet a-enep XSS.", + "description": "" + }, + "XssFaq": { + "message": "XSS FAG…", + "description": "" + }, + "XssFaq_accesskey": { + "message": "Q", + "description": "" + }, + "about": { + "message": "Diwar-benn $1", + "description": "" + }, + "allowFrom": { + "message": "Aotren pep-tra digant $1", + "description": "" + }, + "allowGlobal": { + "message": "Lazhañ an holl wiriadennoù aotradurioù (dañjerus)", + "description": "" + }, + "allowLocal": { + "message": "Aotren $1", + "description": "" + }, + "allowTemp": { + "message": "Aotren evit ur mare $1", + "description": "" + }, + "allowTempFrom": { + "message": "Aotren evit ur mare pep-tra digant $1", + "description": "" + }, + "allowed_no": { + "message": "Skriptoù forbannet er mare-mañ", + "description": "" + }, + "allowed_prt": { + "message": "Skriptoù aotreet a-zarn", + "description": "" + }, + "allowed_yes": { + "message": "Skriptoù aotreet er mare-mañ", + "description": "" + }, + "alwaysAsk": { + "message": "Goulenn dalc'hmat evit kadarnaat", + "description": "" + }, + "audio_samples": { + "message": "Standilhonoù aodio", + "description": "" + }, + "bookmarkSync_confirm": { + "message": "NoScript a zo bet kavet gantañ ur sined kefluniañ hag a zo enrollet war a-seblant war \n$1.\nHa fellout a ra deoc'h da vat dreist-skrivañ ho keflunadurioù lec'hel eus NoScript gant endalc'had ar sined?", + "description": "" + }, + "bookmarkSync_message": { + "message": "NEKET sañset bezañ digoret ar sined-mañ, met da vezañ sinkronelaet en ur ober gant ur servij evel Weave pe an astenn XMarks.", + "description": "" + }, + "bookmarkSync_title": { + "message": "Sined Kefluniadur NoScript", + "description": "" + }, + "cap_script": { + "message": "skript", + "description": "" + }, + "cap_frame": { + "message": "fram", + "description": "" + }, + "cap_object": { + "message": "objed", + "description": "" + }, + "cap_media": { + "message": "media", + "description": "" + }, + "cap_font": { + "message": "font", + "description": "" + }, + "cap_webgl": { + "message": "webgl", + "description": "" + }, + "cap_fetch": { + "message": "fetch", + "description": "" + }, + "cap_other": { + "message": "traoù all", + "description": "" + }, + "changelog": { + "message": "Cheñchamantoù", + "description": "" + }, + "changelog_tip": { + "message": "Diskouez ar cheñchamantoù", + "description": "" + }, + "confirm": { + "message": "Ha sur oc'h?", + "description": "" + }, + "disable": { + "message": "Diweredekaat $1", + "description": "" + }, + "disable_accessKey": { + "message": "D", + "description": "" + }, + "distrust": { + "message": "Merkañ $1 evel disfizius", + "description": "" + }, + "extensionContributors": { + "message": "Kendaolerien:", + "description": "" + }, + "extensionContributors_tip": { + "message": "An dud da drugarekaat evit al lugant-mañ", + "description": "" + }, + "extensionCreator_tip": { + "message": "Gweladennit pajenn-degemer an aozer", + "description": "" + }, + "extensionCreatorLabel": { + "message": "Aozer:", + "description": "" + }, + "extensionHomepage_tip": { + "message": "Gweladennit pajenn-degemer al lugant", + "description": "" + }, + "forbidGlobal": { + "message": "Forbannañ hollad ar skriptoù (aliet)", + "description": "" + }, + "forbidLocal": { + "message": "Forbannañ $1", + "description": "" + }, + "freshInstallReload": { + "message": "Evit gellout kas da benn an oberiadenn war an ivinell-mañ, NoScript a rank freskaat anezhi. Kenderc'hel?", + "description": "" + }, + "privilegedPage": { + "message": "Ur bajenn brienten a zo anezhi, n'hall ket bezañ kefluniet an aotreadurioù.", + "description": "" + }, + "incompatibleOptions": { + "message": "\"$1\"\na zo digenglotus gant \"$2\".\nHa c'hoant ho peus c'hoant da enaouiñ ar stummer ha lazhañ an diwezher?", + "description": "" + }, + "incompatibleOptions_title": { + "message": "Kemenn dibarzhioù digenglotus", + "description": "" + }, + "informaction_tip": { + "message": "Gweladenniñ pajenn-degemer InformAction", + "description": "" + }, + "license": { + "message": "Lisañs", + "description": "" + }, + "license_tip": { + "message": "Lenn al lisañs implijer fin", + "description": "" + }, + "logo_tip": { + "message": "Gweladennit pajenn-degemer al lugant", + "description": "" + }, + "metaRefresh_notify": { + "message": "NoScript en deus stanket un <META> adhenchañ e-barzh un elfenn <NOSCRIPT>: $1 en $2 eilennoù.", + "description": "" + }, + "Reload": { + "message": "Freskaat", + "description": "" + }, + "removal_message": { + "message": "Dre ziweredekaat pe distaliañ NoScript, reiñ a reoc'h un termen d'an HOLL gwarezioù pourvezet gant NoScript.\n\nMa 'z oc'h just skuizh gant ar fed da verañ an aotreoù eus an eil lec'hienn war-lerc'h ebenn, bez ez eus ur choaz suroc'h.\n\nNoScript a c'hall paouez da stankañ ar skriptoù, war-bouez ar re ho peus merket evel disfizius, en ur genderc'hel da wareziñ ac'hanoc'h gant an enep-muzulioù araokaetañ a-enep XSS, Clickjacking, CSRF ha gourdrouzioù all ar web.\n\nDaoust hag-eñ e fell deoc'h da vat da zilemel HOLLAD gwarezioù NoScript?\n", + "description": "" + }, + "removal_no": { + "message": "Ket, paouez da herzel ar skriptoù", + "description": "" + }, + "removal_title": { + "message": "Kemenn Diglasadur Surentez", + "description": "" + }, + "removal_yes": { + "message": "Ya, dilemel an holl warezoù", + "description": "" + }, + "reset_title": { + "message": "Addeouerekadur NoScript", + "description": "" + }, + "reset_warning": { + "message": "HOLLAD arventennoù NoScript hag aotreoù lec'hienn a vo adlakaet d'o zalvoud orin diouzhtu-dak.\nAn obererezh-mañ n'hall ket bezañ nullet.\nHa fellout a ra deoc'h kenderc'hel?", + "description": "" + }, + "siteInfo_confirm": { + "message": "Emaoc'h war-nes goulenn war-lerc'h titouroù diwar-benn al lec'hienn \"$1\"\nen ur gas ur reked da $2.\nHa fellout a ra deoc'h kenderc'hel ganti?", + "description": "" + }, + "siteInfo_tooltip": { + "message": "Klik-kreiz pe Pennlizh+klik evit muioc'h a ditouroù...", + "description": "" + }, + "sponsor_tip": { + "message": "Gweladennit pajenn-degemer ar sponsor", + "description": "" + }, + "unsafeReload_warning": { + "message": "Oc'h adkargañ ur suspisionus DIASUR\n\n$1 [$2]\n\nADALEK [$3]\n\nNoScript NA warezo KET ar reked-mañ!\n", + "description": "" + }, + "untrustedOrigin": { + "message": "un orin disfizius", + "description": "" + }, + "version": { + "message": "Stumm $1", + "description": "" + }, + "versionShort": { + "message": "v $1", + "description": "" + } +}
\ No newline at end of file diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json new file mode 100644 index 0000000..49bd43c --- /dev/null +++ b/src/_locales/tr/messages.json @@ -0,0 +1,890 @@ +{ + "Add": { + "message": "Ekle", + "description": "" + }, + "Add_accesskey": { + "message": "E", + "description": "" + }, + "AdditionalPermissions": { + "message": "Güvenilir siteler için ek izinler", + "description": "" + }, + "AdditionalRestrictions": { + "message": "Güvenilmez siteler için ek kısıtlamalar", + "description": "" + }, + "SectionAdvanced": { + "message": "Gelişmiş", + "description": "" + }, + "Allow": { + "message": "İzin Ver", + "description": "" + }, + "Allow_accesskey": { + "message": "l", + "description": "" + }, + "AllowBookmarks": { + "message": "Yer imlerinden açılan sitelere izin verilsin", + "description": "" + }, + "AllowClipboard": { + "message": "Dış panodan zengin metin kopyalama ve yapıştırma yapılabilsin", + "description": "" + }, + "AllowLocalLinks": { + "message": "Yerel bağlantılara izin verilsin", + "description": "" + }, + "AllowPage": { + "message": "Bu sayfada tümüne izin verilsin", + "description": "" + }, + "AllowPage_accesskey": { + "message": "A", + "description": "" + }, + "AllowPing": { + "message": "İzin Ver <A PING…>", + "description": "" + }, + "AllowViaBookmarks": { + "message": "Yer imlerinden açılan sitelere izin verilsin", + "description": "" + }, + "AlwaysBlockUntrustedContent": { + "message": "Güvenilmez olarak işaretlenmiş bir siteden gelen her nesne engellensin", + "description": "" + }, + "SectionAppearance": { + "message": "Görünüm", + "description": "" + }, + "AutoAllowTopLevel": { + "message": "Geçici olarak üst düzey siteleri GÜVENİLİR olarak ayarla", + "description": "" + }, + "AutoReload": { + "message": "İzinler değiştiğinde etkilenen sayfalar otomatik olarak yeniden yüklensin", + "description": "" + }, + "AutoReload_currentTab": { + "message": "Yalnız geçerli sekme yeniden yüklensin", + "description": "" + }, + "BaseDom": { + "message": "Temel 2. düzey etki alanları (noscript.net)", + "description": "" + }, + "BlockedItems": { + "message": "$1/$2 öge engellendi.", + "description": "" + }, + "BlockedObjects": { + "message": "NoScript Tarafından Engellenen Nesneler", + "description": "" + }, + "BookmarkSync": { + "message": "Kolay eşitleme için NoScript yapılandırmasını bir yer imine yedekle", + "description": "" + }, + "Cancel": { + "message": "İptal", + "description": "" + }, + "CascadePermissions": { + "message": "Üst belgenin izinleri 3. taraf betiklerine yansıtılsın", + "description": "" + }, + "ClearClickDescription": { + "message": "NoScript gizli bir bileşenden gelen bir fare ya da tuş takımı etkileşimini engelledi. Aşağıdaki görsele tıklayarak engellenmiş ve temiz sürümler arasında geçiş yapabilirsiniz.", + "description": "" + }, + "ClearClickHeader": { + "message": "Olası Clickjacking / Kullanıcı Arayüzü Yenileme Girişimi!", + "description": "" + }, + "ClearClickOpt": { + "message": "Sayfalarda ClearClick koruması…", + "description": "" + }, + "ClearClickReport": { + "message": "Bildir", + "description": "" + }, + "ClearClickReport_accesskey": { + "message": "B", + "description": "" + }, + "ClearClickReportId": { + "message": "Bildirim Kodu:", + "description": "" + }, + "ClearClickTitle": { + "message": "ClearClick Uyarısı", + "description": "" + }, + "Close": { + "message": "Kapat", + "description": "" + }, + "CollapseBlockedObjects": { + "message": "Engellenmiş nesneleri daralt", + "description": "" + }, + "ConfirmUnblock": { + "message": "Bir nesnenin engelini geçici olarak kaldırmadan önce onay istensin", + "description": "" + }, + "ContentBlocker": { + "message": "Bu kısıtlamalar beyaz listedeki sitelere de uygulansın", + "description": "" + }, + "CtxMenu": { + "message": "Bağlamsal menü", + "description": "" + }, + "Custom": { + "message": "Özel", + "description": "" + }, + "CustomizePresets": { + "message": "Hazır ayar özelleştirmesi (bir hazır ayarı paylaşan tüm siteler için)", + "description": "" + }, + "Default": { + "message": "Varsayılan", + "description": "" + }, + "DefaultPolicies": { + "message": "Varsayılan İlkeler", + "description": "" + }, + "Description": { + "message": "Firefox için ek koruma: NoScript, yalnız güvenilir olarak seçtiğiniz etki alanları için (İnternet bankacılığı gşbş) JavaScript, Flash (ve diğer uygulama ekleri) gibi bileşenlere izin verir. Bu beyaz liste temelli engelleme yaklaşımı, herhangi bir özellik kaybına neden olmadan güvenlik açıklarından yararlanılmasını engeller (bilinen ve bilinmeyen!)... Uzmanlar Firefox uygulamasının NoScript ile gerçekten güvenli olduğu konusunda hemfikir :-)", + "description": "" + }, + "Donate": { + "message": "Bağış Yap", + "description": "" + }, + "Donate_accesskey": { + "message": "Y", + "description": "" + }, + "Embeddings": { + "message": "Gömmeler", + "description": "" + }, + "Exceptions": { + "message": "İstisnalar…", + "description": "" + }, + "Export": { + "message": "Ver", + "description": "" + }, + "Export_accesskey": { + "message": "V", + "description": "" + }, + "FixLinks": { + "message": "JavaScript bağlantılarını onarmayı dene", + "description": "" + }, + "Hider": { + "message": "Gizlemek için buraya bırakın.", + "description": "" + }, + "Reveal": { + "message": "Eksik düğmeleri almak için buraya tıklayın…", + "description": "" + }, + "ShowFullAddresses": { + "message": "İzinler açılan penceresinde tam adresleri listele (https://www.noscript.net)", + "description": "" + }, + "SectionGeneral": { + "message": "Genel", + "description": "" + }, + "GlobalHttpsWhitelist": { + "message": "HTTPS belgelerinde HTTPS betiklerine genel olarak izin verilsin", + "description": "" + }, + "NotEnforced": { + "message": "Kısıtlamalar devre dışı bırakıldı", + "description": "" + }, + "NoEnforcement": { + "message": "Kısıtlamaları genel olarak devre dışı bırak (tehlikeli)", + "description": "" + }, + "Enforce": { + "message": "Kısıtlamaları genel olarak etkinleştir", + "description": "" + }, + "NoEnforcementForTab": { + "message": "Bu sekme için kısıtlamaları devre dışı bırak", + "description": "" + }, + "EnforceForTab": { + "message": "Bu sekme için kısıtlamaları etkinleştir", + "description": "" + }, + "httpsOnly": { + "message": "Yalnız HTTPS içeriğine uyan", + "description": "" + }, + "Https": { + "message": "HTTPS", + "description": "" + }, + "Https_always": { + "message": "Her zaman", + "description": "" + }, + "Https_behavior": { + "message": "Davranış", + "description": "" + }, + "Https_cookies": { + "message": "Çerezler", + "description": "" + }, + "Https_description": { + "message": "Güvenli (HTTPS) bir bağlantıdan gelmeyen etkin web içeriği engellensin:", + "description": "" + }, + "Https_never": { + "message": "Asla", + "description": "" + }, + "Https_proxy": { + "message": "Bir vekil sunucu kullanıldığında (Tor ile önerilir)", + "description": "" + }, + "HttpsFaq": { + "message": "HTTPS SSS…", + "description": "" + }, + "HttpsFaq_accesskey": { + "message": "T", + "description": "" + }, + "HttpsForced": { + "message": "Şu siteler için güvenli (HTTPS) bağlantısı kullanılsın:", + "description": "" + }, + "HttpsForcedExceptions": { + "message": "Şu siteler için hiç bir zaman güvenli (HTTPS) bağlantısı kullanılmasın:", + "description": "" + }, + "Import": { + "message": "İçe Aktar", + "description": "" + }, + "Import_accesskey": { + "message": "R", + "description": "" + }, + "KeepLocked": { + "message": "Bu bileşeni kilitlenmiş olarak tut (önerilir)", + "description": "" + }, + "MatchSample": { + "message": "Örüntü eşleşme örneği:", + "description": "" + }, + "Next": { + "message": "Sonraki", + "description": "" + }, + "NoUntrustedPlaceholder": { + "message": "Güvenilmez olarak işaretlenmiş nesneler için yer belirteci kullanılmasın", + "description": "" + }, + "Notifications": { + "message": "Bildirimler", + "description": "" + }, + "Notify": { + "message": "Engellenmiş betikler hakkında ileti görüntüle", + "description": "" + }, + "Notify_bottom": { + "message": "İleti aşağıda görüntülensin", + "description": "" + }, + "NotifyMeta": { + "message": "Engellenmiş META yönlendirmeleri hakkında ileti görüntülensin", + "description": "" + }, + "NotifyMeta_accesskey": { + "message": "B", + "description": "" + }, + "NselForce": { + "message": "Engellenmiş bir <SCRIPT> nesnesini izleyen <NOSCRIPT> bileşeni görüntülensin", + "description": "" + }, + "NselNever": { + "message": "<NOSCRIPT> bileşenleri gizlensin", + "description": "" + }, + "OK": { + "message": "TAMAM", + "description": "" + }, + "OptBlockCssScanners": { + "message": "CSS temelli tarayıcılar engellensin", + "description": "" + }, + "OptFilterXGet": { + "message": "Siteler arası şüpheli istekler arındırılsın", + "description": "" + }, + "OptFilterXPost": { + "message": "Siteler arası POST istekleri veriden arındırılmış GET isteklerine dönüştürülsün", + "description": "" + }, + "Options": { + "message": "Ayarlar…", + "description": "" + }, + "Options_accesskey": { + "message": "A", + "description": "" + }, + "OptionsLong": { + "message": "NoScript Ayarları", + "description": "" + }, + "OptionsWidth": { + "message": "40em", + "description": "" + }, + "PermanentInPrivate": { + "message": "Gizli pencerelerde kalıcı \"İzin Verilsin\" komutları", + "description": "" + }, + "SectionSitePermissions": { + "message": "Siteye Özel İzinler", + "description": "" + }, + "PermissionsText": { + "message": "Betiklerin yürütülmesine izin verilecek web sitelerini belirtebilirsiniz. İzin vermek istediğiniz sitenin adres ya da etki alanını (http://www.sitem.com ya da \"site.com\") yazıp İzin Ver üzerine tıklayın.", + "description": "" + }, + "Plugins": { + "message": "Uygulama Ekleri", + "description": "" + }, + "Policies": { + "message": "İlkeler", + "description": "" + }, + "Preset": { + "message": "Güvenlik Düzeyi", + "description": "" + }, + "Preset_high": { + "message": "Güvenli (Tam Kilitleme)", + "description": "" + }, + "Preset_low": { + "message": "Kolay (Kara Liste + Web Güvenliği)", + "description": "" + }, + "Preset_medium": { + "message": "Klasik (Beyaz Liste + Web Güvenliği)>", + "description": "" + }, + "Preset_off": { + "message": "Kapalı (emin misiniz?!)", + "description": "" + }, + "Prev": { + "message": "Önceki", + "description": "" + }, + "RecentBlocked": { + "message": "Son engellenen siteler", + "description": "" + }, + "Refresh": { + "message": "Yenile", + "description": "" + }, + "ReloadWarn": { + "message": "Bu ayarlar yeni ya da (el ile) yeniden yüklenen sayfalarda etkili olur", + "description": "" + }, + "RemoveSelected": { + "message": "Seçilmiş Sayfaları Sil", + "description": "" + }, + "Reset": { + "message": "Sıfırla", + "description": "" + }, + "Reset_accesskey": { + "message": "f", + "description": "" + }, + "ResetDef": { + "message": "Varsayılanlara Sıfırla", + "description": "" + }, + "ResetDef_accesskey": { + "message": "V", + "description": "" + }, + "RestrictSubdocScripting": { + "message": "Beyaz listede olmayan sitelerde beyaz listedeki olan alt belgelerdeki betikler engellensin", + "description": "" + }, + "RevokeTemp": { + "message": "Geçici İzinleri Geri Al", + "description": "" + }, + "RevokeTemp_accesskey": { + "message": "G", + "description": "" + }, + "SecureCookies": { + "message": "Otomatik Güvenli Çerez Yönetimi Kullanılsın", + "description": "" + }, + "SecureCookiesExceptions": { + "message": "Şu siteler için HTTPS üzerinden ayarlanan güvensiz çerezler yok sayılsın:", + "description": "" + }, + "SecureCookiesForced": { + "message": "Şu siteler için HTTPS üzerinden ayarlanan tüm çerezler şifrelensin:", + "description": "" + }, + "SecurityManager": { + "message": "Güvenlik Yönetimi", + "description": "" + }, + "Show": { + "message": "Görüntüle…", + "description": "" + }, + "ShowConsole": { + "message": "Konsolu Görüntüle…", + "description": "" + }, + "ShowConsole_accesskey": { + "message": "K", + "description": "" + }, + "ShowPlaceholder": { + "message": "Yer belirteci simgesi görüntülensin", + "description": "" + }, + "ShowReleaseNotes": { + "message": "Güncellemelerde yayın notları görüntülensin", + "description": "" + }, + "ShowCtxMenuItem": { + "message": "NoScript sağ tık menüsü görüntülensin", + "description": "" + }, + "ShowCountBadge": { + "message": "Engellenmiş öge sayısı etiketi görüntülensin", + "description": "" + }, + "SitePermissions": { + "message": "Site İzinleri", + "description": "" + }, + "SitePermissions_accessKey": { + "message": "S", + "description": "" + }, + "SitePolicies": { + "message": "Siteye Özel İlkeler", + "description": "" + }, + "TempTrustPage": { + "message": "Bu sayfadakilerin tümüne geçici olarak GÜVENİLSİN", + "description": "" + }, + "TempTrustPage_accesskey": { + "message": "T", + "description": "" + }, + "TempToPerm": { + "message": "Sayfa izinlerini kalıcı yap", + "description": "" + }, + "TempToPerm_accesskey": { + "message": "Y", + "description": "" + }, + "Trust": { + "message": "Güvenilir Olarak İşaretle", + "description": "" + }, + "Trust_accesskey": { + "message": "G", + "description": "" + }, + "Trusted": { + "message": "Güvenilir", + "description": "" + }, + "Trusted_temporary": { + "message": "Geçici GÜVENİLİR", + "description": "" + }, + "Trusted_permanent": { + "message": "GÜVENİLİR", + "description": "" + }, + "TrustedPagesAdj": { + "message": "güvenilir", + "description": "" + }, + "Uninstall": { + "message": "Kaldır", + "description": "" + }, + "Unknown": { + "message": "Bilinmeyen", + "description": "" + }, + "UnsafeReload": { + "message": "Güvenli Olmayan Yeniden Yükleme", + "description": "" + }, + "UnsafeReload_accesskey": { + "message": "B", + "description": "" + }, + "Untrust": { + "message": "Güvenilmez Olarak İşaretle", + "description": "" + }, + "Untrust_accesskey": { + "message": "V", + "description": "" + }, + "Untrusted": { + "message": "Güvenilmez", + "description": "" + }, + "UntrustedPagesAdj": { + "message": "güvenilmez", + "description": "" + }, + "WebAddress": { + "message": "Arayın ya da web sitesi ekleyin:", + "description": "" + }, + "WebAddress_accesskey": { + "message": "w", + "description": "" + }, + "Whitelist": { + "message": "Beyaz Liste", + "description": "" + }, + "XSS_notify": { + "message": "XSS bildirimleri görüntülensin", + "description": "" + }, + "XSS_clearUserChoices": { + "message": "XSS Seçimlerini Temizle", + "description": "" + }, + "XSS_promptTitle": { + "message": "NoScript XSS Uyarısı", + "description": "" + }, + "XSS_promptMessage": { + "message": "NoScript $1 siteisnden $2 sitesine olası bir siteler \narası betik saldırısı algıladı.\nŞüpheli veriler:\n$3\n", + "description": "" + }, + "XSS_optBlock": { + "message": "Bu isteği engelle", + "description": "" + }, + "XSS_optSanitize": { + "message": "Bu isteği arındır", + "description": "" + }, + "XSS_optAllow": { + "message": "Bu isteğe izin ver", + "description": "" + }, + "XSS_optAlwaysAllow": { + "message": "$1 sitesinden $2 sitesine yapılan belge isteklerine her zaman izin verilsin", + "description": "" + }, + "XSS_optAlwaysBlock": { + "message": "$1 sitesinden $2 sitesine yapılan belge istekleri her zaman reddedilsin", + "description": "" + }, + "Xss": { + "message": "XSS", + "description": "" + }, + "Xss_accesskey": { + "message": "X", + "description": "" + }, + "XssExceptions": { + "message": "Anti-XSS Koruma İstisnaları", + "description": "" + }, + "XssExceptions_description": { + "message": "Bu kurallı ifadelere uyan hedefler için XSS koruması uygulanmaz.", + "description": "" + }, + "XssFaq": { + "message": "XSS SSS…", + "description": "" + }, + "XssFaq_accesskey": { + "message": "T", + "description": "" + }, + "about": { + "message": "$1 Hakkında", + "description": "" + }, + "allowFrom": { + "message": "$1 üzerindekilerin tümüne izin verilsin", + "description": "" + }, + "allowGlobal": { + "message": "Tüm izin denetimleri devre dışı bırakılsın (tehlikeli)", + "description": "" + }, + "allowLocal": { + "message": "$1 Kullanılabilsin", + "description": "" + }, + "allowTemp": { + "message": "$1 geçici olarak kullanılabilsin", + "description": "" + }, + "allowTempFrom": { + "message": "$1 üzerindekilerin tümüne geçici olarak izin verilsin", + "description": "" + }, + "allowed_no": { + "message": "Hiç Bir Betik Kullanılamaz", + "description": "" + }, + "allowed_prt": { + "message": "Betiklerin Bir Kısmı Kullanılabilir", + "description": "" + }, + "allowed_yes": { + "message": "Betikler Kullanılabilir", + "description": "" + }, + "alwaysAsk": { + "message": "Her zaman onay istensin", + "description": "" + }, + "audio_samples": { + "message": "Ses örnekleri", + "description": "" + }, + "bookmarkSync_confirm": { + "message": "NoScript şu zamanda kaydedilmiş bir yapılandırma yer imi buldu\n$1.\nYerel NoScript yapılandırmasının yerine bu yer imindeki içeriğin yazılmasını istiyor musunuz?", + "description": "" + }, + "bookmarkSync_message": { + "message": "Bu yer imi AÇILMAZ, ancak Weave ya da XMarks eklentisi gibi bir hizmet kullanılarak eşitlenir.", + "description": "" + }, + "bookmarkSync_title": { + "message": "NoScript Yapılandırma Yer İmi", + "description": "" + }, + "cap_script": { + "message": "betik", + "description": "" + }, + "cap_frame": { + "message": "çerçeve", + "description": "" + }, + "cap_object": { + "message": "nesne", + "description": "" + }, + "cap_media": { + "message": "ortam", + "description": "" + }, + "cap_font": { + "message": "yazıtipi", + "description": "" + }, + "cap_webgl": { + "message": "webgl", + "description": "" + }, + "cap_fetch": { + "message": "getir", + "description": "" + }, + "cap_other": { + "message": "diğer", + "description": "" + }, + "changelog": { + "message": "Değişiklik Günlüğü", + "description": "" + }, + "changelog_tip": { + "message": "Değişiklik günlüğünü görüntüle", + "description": "" + }, + "confirm": { + "message": "Emin misiniz?", + "description": "" + }, + "disable": { + "message": "$1 Devre Dışı Bırakılsın", + "description": "" + }, + "disable_accessKey": { + "message": "D", + "description": "" + }, + "distrust": { + "message": "$1 Güvenilmez Olarak İşaretlensin", + "description": "" + }, + "extensionContributors": { + "message": "Katkıda Bulunanlar:", + "description": "" + }, + "extensionContributors_tip": { + "message": "Bu eklentiyi geliştirdikleri için teşekkür edeceğiniz kişiler", + "description": "" + }, + "extensionCreator_tip": { + "message": "Geliştiricinin web sayfasını ziyaret edin", + "description": "" + }, + "extensionCreatorLabel": { + "message": "Geliştirici:", + "description": "" + }, + "extensionHomepage_tip": { + "message": "Eklenti web sayfasını ziyaret edin", + "description": "" + }, + "forbidGlobal": { + "message": "Genel Olarak Betikleri Engelle (önerilir)", + "description": "" + }, + "forbidLocal": { + "message": "$1 engellensin", + "description": "" + }, + "freshInstallReload": { + "message": "Bu sekmede işlem yapabilmesi için NoScript tarafından yeniden yüklenmesi gerekiyor.\nYeniden yüklensin mi?", + "description": "" + }, + "privilegedPage": { + "message": "Bu sayfa ayrıcalıklı olduğundan izinleri ayarlanamaz.", + "description": "" + }, + "incompatibleOptions": { + "message": "\"$1\"\n\"$2\" ile uyumsuz.\nBirinciyi etkinleştirip ikinciyi devre dışı bırakmak ister misiniz?", + "description": "" + }, + "incompatibleOptions_title": { + "message": "Uyumsuz Ayarlar Uyarısı", + "description": "" + }, + "informaction_tip": { + "message": "InformAction ana sayfasını ziyaret edin", + "description": "" + }, + "license": { + "message": "Lisans", + "description": "" + }, + "license_tip": { + "message": "Son kullanıcı lisans sözleşmesine bakın", + "description": "" + }, + "logo_tip": { + "message": "Eklenti web sayfasını ziyaret edin", + "description": "" + }, + "metaRefresh_notify": { + "message": "NoScript bir <NOSCRIPT> bileşen içindeki bir <META> yönlendirmeyi engelledi: $1, $2 saniye içinde.", + "description": "" + }, + "Reload": { + "message": "Yeniden Yükle", + "description": "" + }, + "removal_message": { + "message": "NoScript uygulamasını devre dışı bırakarak ya da kaldırarak NoScript tarafından sağlanan TÜM korumadan vazgeçmiş olursunuz.\n\nYalnızca her siteye tek tek izin vermekten sıkıldıysanız daha güvenli bir yol var.\n\nNoScript sizi XSS, Clickjacking, CSRF ve diğer web tehditlerinden gelebilecek saldırılarına karış en gelişmiş önlemler ile korumaya devam ederken, güvenilmez olarak işaretlediğiniz siteler dışındaki sitelerin betiklerine izin verebilir.\n\nTÜM NoScript korumasını kaldırmak istediğinize emin misiniz?\n", + "description": "" + }, + "removal_no": { + "message": "Hayır, yalnız betikleri engellemeyi durdur", + "description": "" + }, + "removal_title": { + "message": "Güvenlik Düşürme Uyarısı", + "description": "" + }, + "removal_yes": { + "message": "Evet, TÜM korumayı kaldır", + "description": "" + }, + "reset_title": { + "message": "NoScript Ayarlarını Sıfırla", + "description": "" + }, + "reset_warning": { + "message": "TÜM NoScript ayarlarını ve site izinlerini anında varsayılan değerlere sıfırlar.\nBu işlem geri alınamaz.\nDevam etmek istiyor musunuz?", + "description": "" + }, + "siteInfo_confirm": { + "message": "$2 üzerine bir sorgu gönderek \"$1\" sitesi hakkında\nbilgi istemek üzeresiniz.\nDevam etmek ister misiniz?", + "description": "" + }, + "siteInfo_tooltip": { + "message": "Site bilgileri için orta ya da shift ile sol tıklayın...", + "description": "" + }, + "sponsor_tip": { + "message": "Destekçi ana sayfasını ziyaret edin", + "description": "" + }, + "unsafeReload_warning": { + "message": "GÜVENİLMEZ bir şüpheli yeniden yükleme\n\n$1 [$2]\n\n[$3] tarafından\n\nNoScript bu isteği KORUMAYACAK!\n", + "description": "" + }, + "untrustedOrigin": { + "message": "güvenilmeyen bir kaynak", + "description": "" + }, + "version": { + "message": "$1 Sürümü", + "description": "" + }, + "versionShort": { + "message": "v $1", + "description": "" + } +}
\ No newline at end of file diff --git a/src/bg/ChildPolicies.js b/src/bg/ChildPolicies.js new file mode 100644 index 0000000..5b1b209 --- /dev/null +++ b/src/bg/ChildPolicies.js @@ -0,0 +1,130 @@ +"use strict"; +{ + let marker = JSON.stringify(uuid()); + + let Scripts = { + references: new Set(), + opts: { + js: [{}], + allFrames: true, + matchAboutBlank: true, + runAt: "document_start" + }, + forget() { + for (let script of [...this.references]) { + script.unregister(); + this.references.delete(script); + } + }, + async register(code, matches, excludeMatches) { + debug("Registering child policy.", code, matches, excludeMatches); + if (!matches.length) return; + try { + this.opts.js[0].code = code; + this.opts.matches = matches; + if (excludeMatches && excludeMatches.length) { + this.opts.excludeMatches = excludeMatches; + } else { + delete this.opts.excludeMatches; + } + this.references.add(await browser.contentScripts.register(this.opts)); + } catch (e) { + error(e); + } + } + }; + + let flatten = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []); + + let protocolRx = /^(https?):/i; + let pathRx = /[^:/]\//; + let portRx = /:\d+(?=\/|$)/; + let validMatchPatternRx = /^(?:https?|\*):\/\/(?:\*\.)?(?:[\w\u0100-\uf000][\w\u0100-\uf000.-]*)?[\w\u0100-\uf000]\/(\*|[^*]*)$/; + + let siteKey2MatchPattern = site => { + let hasProtocol = site.match(protocolRx); + let protocol = hasProtocol ? '' + : Sites.isSecureDomainKey(site) ? "https://" : "*://"; + let hostname = Sites.toggleSecureDomainKey(site, false) + .replace(portRx, ''); + if (!hasProtocol) hostname = `*.${hostname}`; + let path = pathRx.test(hostname) ? "" : "/*"; + let mp = `${protocol}${hostname}${path}`; + return validMatchPatternRx.test(mp) && (path ? mp : [mp, `${mp}?*`, `${mp}#*`]); + }; + + let siteKeys2MatchPatterns = keys => keys && flatten(keys.map(siteKey2MatchPattern)).filter(p => !!p) || []; + + var ChildPolicies = { + async storeTabInfo(tabId, info) { + try { + let preamble = info ? `${marker} + ${JSON.stringify(JSON.stringify([info]))} + ${marker} + "," + ` : ""; + await browser.tabs.executeScript(tabId, { + code: `window.name = ${preamble}window.name.split(${marker} + ",").pop();`, + allFrames: false, + matchAboutBlank: true, + runAt: "document_start", + }); + } catch (e) { + error(e); + } + }, + async update(policy) { + Scripts.forget(); + + if (!policy.enforced) { + await Scripts.register(`ns.setup(null, ${marker});`, + ["<all_urls>"]); + return; + } + + let serialized = policy.dry ? policy.dry(true) : policy; + let permsMap = new Map(); + let trusted = JSON.stringify(serialized.TRUSTED); + let untrusted = JSON.stringify(serialized.UNTRUSTED); + let presets = { + trusted, + untrusted, + temp: trusted + }; + // map presets to site keys + for (let [container, perms] of Object.entries(presets)) { + let newKeys = serialized.sites[container]; + if (!(newKeys && newKeys.length)) continue; + let keys = permsMap.get(perms); + if (keys) { + newKeys = keys.concat(newKeys); + } + permsMap.set(perms, newKeys); + } + // map custom permissions to site keys + for (let [key, perms] of Object.entries(serialized.sites.custom)) { + let permsKey = JSON.stringify(perms); + let keys = permsMap.get(permsKey); + if (keys) { + keys.push(key); + } else { + permsMap.set(permsKey, [key]); + } + } + + // compute exclusions + let permsMapEntries = [...permsMap]; + let excludeMap = new Map(); + for (let [perms, keys] of permsMapEntries) { + excludeMap.set(perms, siteKeys2MatchPatterns(flatten( + permsMapEntries.filter(([other]) => other !== perms) + .map(([otherPerms, otherKeys]) => otherKeys)) + .filter(k => k && k.includes("/")) + )); + } + + // register new content scripts + for (let [perms, keys] of [...permsMap]) { + await Scripts.register(`ns.perms.CURRENT = ${perms};`, siteKeys2MatchPatterns(keys), excludeMap.get(perms)); + } + await Scripts.register(`ns.setup(${JSON.stringify(serialized.DEFAULT)}, ${marker});`, + ["<all_urls>"]); + } + } +} diff --git a/src/bg/ContentScriptOnce.js b/src/bg/ContentScriptOnce.js new file mode 100644 index 0000000..5be602e --- /dev/null +++ b/src/bg/ContentScriptOnce.js @@ -0,0 +1,52 @@ +var ContentScriptOnce = (() => { + "use strict"; + + let requestMap = new Map(); + + { + let cleanup = r => { + let {requestId} = r; + let scripts = requestMap.get(requestId); + if (scripts) { + window.setTimeout(() => { + requestMap.delete(requestId); + for (let s of scripts) s.unregister(); + }, 0); + } + } + + let filter = { + urls: ["<all_urls>"], + types: ["main_frame", "sub_frame", "object"] + }; + let wr = browser.webRequest; + for (let event of ["onCompleted", "onErrorOccurred"]) { + wr[event].addListener(cleanup, filter); + } + } + + return { + async execute(request, options) { + let {requestId, url} = request; + let scripts = requestMap.get(requestId); + if (!scripts) requestMap.set(requestId, scripts = new Set()); + try { + let urlObj = new URL(url); + if (urlObj.port) { + urlObj.port = ""; + url = urlObj.toString(); + } + } catch (e) {} + let defOpts = { + runAt: "document_start", + matchAboutBlank: true, + matches: [url], + allFrames: true, + }; + + scripts.add(await browser.contentScripts.register( + Object.assign(defOpts, options) + )); + } + } +})(); diff --git a/src/bg/RequestGuard.js b/src/bg/RequestGuard.js index fcd6fa7..703623f 100644 --- a/src/bg/RequestGuard.js +++ b/src/bg/RequestGuard.js @@ -437,22 +437,7 @@ var RequestGuard = (() => { blocker = CSP.createBlocker(...blockedTypes); } - if (canScript && !isObject) { - if (!capabilities.has("webgl")) { - RequestUtil.executeOnStart(request, { - file: "/content/webglHook.js" - }); - } - if (!capabilities.has("media")) { - RequestUtil.executeOnStart(request, { - code: "window.mediaBlocker = true;" - }); - } - - RequestUtil.executeOnStart(request, { - file: "/content/media.js" - }); - } else if (request.type === "main_frame" && !TabStatus.map.has(tabId)) { + if (request.type === "main_frame" && !TabStatus.map.has(tabId)) { debug("No TabStatus data yet for noscriptFrame", tabId); TabStatus.record(request, "noscriptFrame", true); } diff --git a/src/bg/RequestUtil.js b/src/bg/RequestUtil.js deleted file mode 100644 index d6d3300..0000000 --- a/src/bg/RequestUtil.js +++ /dev/null @@ -1,169 +0,0 @@ -'use strict'; -{ - let xmlFeedOrImage = /^(?:(?:application|text)\/(?:(?:r(?:ss|df)|atom)\+)xml(;|$))|image\//i; - let rawXml = /^(?:application|text)\/xml;/i; - let brokenXMLOnLoad; - (async () => brokenXMLOnLoad = parseInt((await browser.runtime.getBrowserInfo()).version) < 61)() - - let pendingScripts = new Map(); - let NOP = () => {}; - - let reloadingTabs = new Map(); - let tabKey = (tabId, url) => `${tabId}:${url}`; - - let cleanup = r => { - pendingScripts.delete(r.requestId); - let key = tabKey(r.tabId, r.url); - if (reloadingTabs.get(key) === false) { - reloadingTabs.delete(key); - } - }; - - let executeAll = async request => { - let {url, tabId, frameId, requestId, type} = request; - let scripts = pendingScripts.get(requestId); - if (!scripts) return -1; - pendingScripts.delete(requestId); - let count = 0; - let run = async details => { - details = Object.assign({ - runAt: "document_start", - matchAboutBlank: true, - frameId - }, details); - try { - let res; - for (let attempts = 10; attempts-- > 0;) { - try { - res = await browser.tabs.executeScript(tabId, details); - break; - } catch(e) { - if (!/No matching message handler/.test(e.message)) throw e; - debug("Couldn't inject script into %s: too early? Retrying up to %s times...", url, attempts); - } - } - count++; - debug("Execute on start OK, result=%o", res, url, details); - } catch (e) { - error(e, "Execute on start failed", url, details); - } - }; - await Promise.all([...scripts.values()].map(run)); - return count; - }; - - { - let filter = { - urls: ["<all_urls>"], - types: ["main_frame", "sub_frame"] - }; - let wr = browser.webRequest; - for (let event of ["onCompleted", "onErrorOccurred"]) { - wr[event].addListener(cleanup, filter); - } - - wr.onResponseStarted.addListener(r => { - let scripts = pendingScripts.get(r.requestId); - if (scripts) scripts.runAndFlush(); - }, filter); - } - - var RequestUtil = { - - getResponseMetaData(request) { - return request.response || (request.response = new ResponseMetaData(request)); - }, - - executeOnStart(request, details) { - let {requestId, url, tabId, frameId, statusCode, type} = request; - - if (statusCode >= 300 && statusCode < 400 || type === "object") return; - if (frameId === 0) { - let key = tabKey(tabId, url); - debug("Checking whether %s is a reloading tab...", key); - if (reloadingTabs.get(key)) { - reloadingTabs.set(key, false); // doom it for removal in cleanup - return; - } - } - - let response = this.getResponseMetaData(request); - let {contentType, contentDisposition} = response; - if (contentDisposition || - xmlFeedOrImage.test(contentType) && !/\/svg\b/i.test(contentType)) { - debug("Skipping execute on start of %s %o.", url, response); - return; - } - - debug("Injecting script on start in %s (%o).", url, response); - - let scripts = pendingScripts.get(requestId); - let scriptKey = JSON.stringify(details); - if (!scripts) { - pendingScripts.set(requestId, scripts = new Map()); - scripts.set(scriptKey, details); - } else { - scripts.set(scriptKey, details); - return; - } - - if (/^(?:application|text)\//.test(contentType) - && !/[^;]+\b(html|xml)\b/i.test(contentType)) { - debug("Not HTML: defer script to onResponseStarted for %s (%o)", url, response); - return; - } - - let mustCheckFeed = brokenXMLOnLoad && frameId === 0 && rawXml.test(contentType); - debug("mustCheckFeed = %s, brokenXMLOnLoad = %s", mustCheckFeed, brokenXMLOnLoad); - let filter = browser.webRequest.filterResponseData(requestId); - let buffer = []; - let responseCompleted = false; - let mustReload = false; - scripts.runAndFlush = async () => { - scripts.runAndFlush = NOP; - if (responseCompleted && buffer && !buffer.length) { - filter.disconnect(); - } - let scriptsRan = await executeAll(request); - if (mustCheckFeed && !scriptsRan) { - mustReload = true; - debug(`Marking as "must reload"`, tabId, url); - reloadingTabs.set(tabKey(tabId, url), true); - } - if (buffer) { - debug("Flushing %s buffer chunks on %s", buffer.length, url); - for (let chunk of buffer) { - filter.write(chunk); - } - buffer = null; - } - filter.disconnect(); - if (responseCompleted) { - filter.onstop(null); - } - }; - - filter.ondata = event => { - scripts.runAndFlush(); - if (buffer) { - debug("buffering", url); - buffer.push(event.data); - return; - } - - debug("ondata", url); - filter.write(event.data); - filter.disconnect(); - }; - - filter.onstop = async event => { - responseCompleted = true; - await scripts.runAndFlush(); - if (mustReload && !buffer) { - mustReload = false; - browser.tabs.update(tabId, {url}); - } - } - } - } -} diff --git a/src/bg/Settings.js b/src/bg/Settings.js index 4fb656f..56c88f4 100644 --- a/src/bg/Settings.js +++ b/src/bg/Settings.js @@ -89,7 +89,8 @@ var Settings = { } if (typeof unrestrictedTab === "boolean") { - ns.unrestrictedTabs[settings.unrestrictedTab ? "add" : "delete"](tabId); + ns.unrestrictedTabs[unrestrictedTab ? "add" : "delete"](tabId); + ChildPolicies.storeTabInfo(tabId, unrestrictedTab && {unrestricted: true}); } if (reloadAffected) { browser.tabs.reload(tabId); diff --git a/src/bg/defaults.js b/src/bg/defaults.js index 220bd23..4d071b4 100644 --- a/src/bg/defaults.js +++ b/src/bg/defaults.js @@ -28,7 +28,6 @@ ns.defaults = (async () => { // dynamic settings if (!ns.local.uuid) { - await include("/lib/uuid.js"); ns.local.uuid = uuid(); await ns.save(ns.local); } diff --git a/src/bg/deferWebTraffic.js b/src/bg/deferWebTraffic.js index fced870..15d177b 100644 --- a/src/bg/deferWebTraffic.js +++ b/src/bg/deferWebTraffic.js @@ -34,16 +34,20 @@ function deferWebTraffic(promiseToWaitFor, next) { if (frameId !== 0) { documentUrl = request.frameAncestors.pop().url; } - reloadTab(tabId); + if (tabId !== -1) { + reloadTab(tabId); + } else { + debug("No tab to reload for %s %s from %s", type, url, documentUrl); + } } } - debug("Deferring ", url, type); + debug("Deferring %s %s from %s", type, url, documentUrl); try { await promiseToWaitFor; } catch (e) { error(e); } - debug("Green light to ", url, type); + debug("Green light to %s %s from %s", type, url, documentUrl); } function spyTabs(request) { diff --git a/src/bg/main.js b/src/bg/main.js index 47ee89e..75ea868 100644 --- a/src/bg/main.js +++ b/src/bg/main.js @@ -26,15 +26,17 @@ let policyData = (await Storage.get("sync", "policy")).policy; if (policyData && policyData.DEFAULT) { ns.policy = new Policy(policyData); + await ChildPolicies.update(policyData); } else { await include("/legacy/Legacy.js"); ns.policy = await Legacy.createOrMigratePolicy(); ns.savePolicy(); } - + + await include("/bg/defaults.js"); await ns.defaults; - await include(["/bg/RequestGuard.js", "/bg/RequestUtil.js"]); + await include("/bg/RequestGuard.js"); await RequestGuard.start(); await XSS.start(); // we must start it anyway to initialize sub-objects if (!ns.sync.xss) { @@ -226,6 +228,7 @@ async savePolicy() { if (this.policy) { + await ChildPolicies.update(this.policy); await Storage.set("sync", { policy: this.policy.dry() }); diff --git a/src/content/content.js b/src/content/content.js index 886c363..8f772b1 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -1,7 +1,81 @@ 'use strict'; // debug = () => {}; // REL_ONLY - +{ + let listenersMap = new Map(); + let backlog = new Set(); + var ns = { + on(eventName, listener) { + let listeners = listenersMap.get(eventName); + if (!listeners) listenersMap.set(eventName, listeners = new Set()); + listeners.add(listener); + if (backlog.has(eventName)) this.fire(eventName, listener); + }, + detach(eventName, listener) { + let listeners = listenersMap.get(eventName); + if (listeners) listeners.delete(listener); + }, + fire(eventName, listener = null) { + if (listener) { + listener({type:eventName, source: this}); + return; + } + let listeners = listenersMap.get(eventName); + if (listeners) { + for (let l of listeners) { + this.fire(eventName, l); + } + } + backlog.add(eventName); + }, + setup(DEFAULT, MARKER) { + this.perms.DEFAULT = DEFAULT; + if(!this.perms.CURRENT) this.perms.CURRENT = DEFAULT; + + // ugly hack: since now we use registerContentScript instead of the + // filterRequest dynamic script injection hack, we use top.name + // to store per-tab information. We don't want web content to + // mess with it, though, so we wrap it around auto-hiding accessors + this.perms.MARKER = MARKER; + let eraseTabInfoRx = new RegExp(`[^]*${MARKER},?`); + if (eraseTabInfoRx.test(top.name)) { + let _name = top.name; + let tabInfoRx = new RegExp(`^${MARKER}\\[([^]*?)\\]${MARKER},`); + if (top === window) { // wrap to hide + Reflect.defineProperty(top.wrappedJSObject, "name", { + get: exportFunction(() => top.name.replace(eraseTabInfoRx, ""), top.wrappedJSObject), + set: exportFunction(value => { + let preamble = top.name.match(tabInfoRx); + top.name = `${preamble && preamble[0] || ""}${value}`; + return value; + }, top.wrappedJSObject) + }); + } + let tabInfoMatch = _name.match(tabInfoRx); + if (tabInfoMatch) try { + this.perms.tabInfo = JSON.parse(tabInfoMatch[1]); + } catch (e) { + error(e); + } + } + + if (!this.perms.DEFAULT || this.perms.tabInfo.unrestricted) { + this.allows = () => true; + } + ns.fire("perms"); + }, + perms: { DEFAULT: null, CURRENT: null, tabInfo: {}, MARKER: "" }, + allows(cap) { + let perms = this.perms.CURRENT; + return perms && perms.capabilities.includes(cap); + }, + getWindowName() { + return top !== window || !this.perms.MARKER ? window.name + : window.name.split(this.perms.MARKER + ",").pop(); + } + } +} + var canScript = true, shouldScript = false; let now = () => performance.now() + performance.timeOrigin; @@ -24,7 +98,6 @@ function probe() { var _ = browser.i18n.getMessage; - var embeddingDocument = false; var seen = { diff --git a/src/content/media.js b/src/content/media.js index ffa67e0..910fd27 100644 --- a/src/content/media.js +++ b/src/content/media.js @@ -1,60 +1,57 @@ -{ - debug("Media Hook (blocked %s)", !!window.mediaBlocker, document.URL, document.documentElement && document.documentElement.innerHTML); // DEV_ONLY - (() => { - let unpatched = new Map(); - function patch(obj, methodName, replacement) { - let methods = unpatched.get(obj) || {}; - methods[methodName] = obj[methodName]; - exportFunction(replacement, obj, {defineAs: methodName}); - unpatched.set(obj, methods); +ns.on("perms", event => { + debug("Media Hook", document.URL, document.documentElement && document.documentElement.innerHTML, ns.perms.CURRENT); // DEV_ONLY + let mediaBlocker = !ns.allows("media"); + let unpatched = new Map(); + function patch(obj, methodName, replacement) { + let methods = unpatched.get(obj) || {}; + methods[methodName] = obj[methodName]; + exportFunction(replacement, obj, {defineAs: methodName}); + unpatched.set(obj, methods); + } + let urlMap = new WeakMap(); + patch(window.URL, "createObjectURL", function(o, ...args) { + let url = unpatched.get(window.URL).createObjectURL.call(this, o, ...args); + if (o instanceof MediaSource) { + let urls = urlMap.get(o); + if (!urls) urlMap.set(o, urls = new Set()); + urls.add(url); } - let urlMap = new WeakMap(); - patch(window.URL, "createObjectURL", function(o, ...args) { - let url = unpatched.get(window.URL).createObjectURL.call(this, o, ...args); - if (o instanceof MediaSource) { - let urls = urlMap.get(o); - if (!urls) urlMap.set(o, urls = new Set()); - urls.add(url); - } - return url; - }); + return url; + }); - patch(window.MediaSource.prototype, "addSourceBuffer", function(mime, ...args) { - let ms = this; - let urls = urlMap.get(ms); + patch(window.MediaSource.prototype, "addSourceBuffer", function(mime, ...args) { + let ms = this; + let urls = urlMap.get(ms); - let request = { - id: "noscript-media", - type: "media", - url: document.URL, - documentUrl: document.URL, - embeddingDocument: true, - }; - seen.record({policyType: "media", request, allowed: false}); - notifyPage(); + let request = { + id: "noscript-media", + type: "media", + url: document.URL, + documentUrl: document.URL, + embeddingDocument: true, + }; + seen.record({policyType: "media", request, allowed: false}); + notifyPage(); - if (window.mediaBlocker) { - (async () => { - let me = Array.from(document.querySelectorAll("video,audio")) - .find(e => e.srcObject === ms || urls && urls.has(e.src)); + if (mediaBlocker) { + (async () => { + let me = Array.from(document.querySelectorAll("video,audio")) + .find(e => e.srcObject === ms || urls && urls.has(e.src)); - if (!me) return; - let exposedMime = `${mime} (MSE)`; + if (!me) return; + let exposedMime = `${mime} (MSE)`; - try { - let ph = PlaceHolder.create("media", request); - ph.replace(me); - PlaceHolder.listen(); - } catch (e) { - error(e); - } - })(); - throw new Error(`${exposedMime} blocked by NoScript`); - } - - return unpatched.get(window.MediaSource.prototype).addSourceBuffer.call(ms, mime, ...args); - }); + try { + let ph = PlaceHolder.create("media", request); + ph.replace(me); + PlaceHolder.listen(); + } catch (e) { + error(e); + } + })(); + throw new Error(`${exposedMime} blocked by NoScript`); + } - })(); - document.URL; -} + return unpatched.get(window.MediaSource.prototype).addSourceBuffer.call(ms, mime, ...args); + }); +}); diff --git a/src/content/webglHook.js b/src/content/webglHook.js index d4c064a..efafcd5 100644 --- a/src/content/webglHook.js +++ b/src/content/webglHook.js @@ -1,5 +1,6 @@ -{ - debug("WebGL Hook", document.URL, document.documentElement && document.documentElement.innerHTML); // DEV_ONLY +ns.on("perms", event => { + debug("WebGL Hook", document.URL, document.documentElement && document.documentElement.innerHTML, ns.perms.CURRENT); // DEV_ONLY + if (ns.allows("webgl")) return; let proto = HTMLCanvasElement.prototype; let getContext = proto.getContext; exportFunction(function(type, ...rest) { @@ -23,6 +24,5 @@ return {}; } return getContext.call(this, type, ...rest); - }, proto, {defineAs: "getContext"}); - document.URL; -} + }, proto, {defineAs: "getContext"}); +}); diff --git a/src/lib/ResponseMetaData.js b/src/lib/ResponseMetaData.js deleted file mode 100644 index 0d86745..0000000 --- a/src/lib/ResponseMetaData.js +++ /dev/null @@ -1,54 +0,0 @@ -class ResponseMetaData { - constructor(request) { - let {responseHeaders} = request; - this.headers = {}; - this.contentType = this.contentDisposition = null; - for (let h of responseHeaders) { - if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) { - let propertyName = RegExp.$1; - propertyName = `content${propertyName.charAt(0).toUpperCase()}${propertyName.substring(1).toLowerCase()}`; - this[propertyName] = h.value; - this.headers[propertyName] = h; - } - } - this.forcedUTF8 = false; - } - - get charset() { - let charset = ""; - if (this.contentType) { - let m = this.contentType.match(/;\s*charset\s*=\s*(\S+)/); - if (m) { - charset = m[1]; - } - } - Object.defineProperty(this, "charset", { value: charset, writable: false, configurable: true }); - return charset; - } - - get isUTF8() { - return /^utf-?8$/i.test(this.charset); - } - - forceUTF8() { - if (!(this.forcedUTF8 || this.isUTF8)) { - let h = this.headers.contentType; - if (h) { - h.value = h.value.replace(/;\s*charset\s*=.*|$/, "; charset=utf8"); - this.forcedUTF8 = true; - } // if the header doesn't exist the browser should default to UTF-8 anyway - } - return this.forcedUTF8; - } - - createDecoder() { - if (this.charset) { - try { - return new TextDecoder(this.charset); - } catch (e) { - console.error(e); - } - } - return new TextDecoder("utf-8"); - } -}; diff --git a/src/manifest.json b/src/manifest.json index 61f618b..024fb73 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -39,7 +39,6 @@ "lib/include.js", "lib/punycode.js", "lib/tld.js", - "lib/ResponseMetaData.js", "lib/LastListener.js", "common/Policy.js", "common/locale.js", @@ -49,6 +48,7 @@ "ui/Prompts.js", "xss/XSS.js", "bg/deferWebTraffic.js", + "bg/ChildPolicies.js", "bg/main.js" ] }, @@ -63,7 +63,9 @@ "lib/log.js", "content/onScriptDisabled.js", "content/content.js", - "content/PlaceHolder.js" + "content/webglHook.js", + "content/PlaceHolder.js", + "content/media.js" ] }, { diff --git a/src/xss/InjectionChecker.js b/src/xss/InjectionChecker.js index 8e2598e..93d32d9 100644 --- a/src/xss/InjectionChecker.js +++ b/src/xss/InjectionChecker.js @@ -741,7 +741,7 @@ XSS.InjectionChecker = (async () => { checkJS: function(s, unescapedUni) { this.log(s); - if (/\?name\b[\s\S]*:|[^&?]\bname\b/.test(s)) { + if (/[=\(](?:[\s\S]*(?:\?name\b[\s\S]*:|[^&?]\bname\b)|name\b)/.test(s)) { this.nameAssignment = true; } diff --git a/src/xss/XSS.js b/src/xss/XSS.js index 94e33fa..89f13f7 100644 --- a/src/xss/XSS.js +++ b/src/xss/XSS.js @@ -61,8 +61,9 @@ var XSS = (() => { let block = !!(reasons.urlInjection || reasons.postInjection) if (reasons.protectName) { - RequestUtil.executeOnStart(request, { - file: "/xss/sanitizeName.js", + await include("bg/COntentScriptOnce.js"); + await ContentScriptOnce.execute(request, { + js: [{file: "/xss/sanitizeName.js"}], }); if (!block) return ALLOW; } diff --git a/src/xss/sanitizeName.js b/src/xss/sanitizeName.js index 22185f4..4f36cbf 100644 --- a/src/xss/sanitizeName.js +++ b/src/xss/sanitizeName.js @@ -1,4 +1,9 @@ -if (/[<"'\`(=:]/.test(window.name)) { - console.log(`NoScript XSS filter sanitizing suspicious window.name "%s" on %s`, window.name, document.URL); - window.name = ""; -} +ns.on("perms", event => { + if (ns.allows("script")) { + let name = ns.getWindowName(); + if (/[<"'\`(=:]/.test(name)) { + console.log(`NoScript XSS filter sanitizing suspicious window.name "%s" on %s`, name, document.URL); + window.name = window.name.substring(0, window.name.length - name.length); + } + } +}); |