| 1 | var PLUGIN_INFO = |
|---|
| 2 | <VimperatorPlugin> |
|---|
| 3 | <name>{NAME}</name> |
|---|
| 4 | <description>clear privacy data</description> |
|---|
| 5 | <minVersion>2.0pre</minVersion> |
|---|
| 6 | <maxVersion>2.0pre</maxVersion> |
|---|
| 7 | <author mail="teramako@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/teramako/">teramako</author> |
|---|
| 8 | <license>MPL 1.1/GPL 2.0/LGPL 2.1</license> |
|---|
| 9 | <version>0.1</version> |
|---|
| 10 | <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/clear_privacy_data.js</updateURL> |
|---|
| 11 | <detail lang="ja"><![CDATA[ |
|---|
| 12 | == 注意 == |
|---|
| 13 | このプラグインはFirefox 3.1用です。 |
|---|
| 14 | |
|---|
| 15 | == Command == |
|---|
| 16 | :clearp[rivacy]: |
|---|
| 17 | 既定の設定でプライバシーデータを削除します。 |
|---|
| 18 | |
|---|
| 19 | :clearp[rivacy] -l[ist] {itemName}: |
|---|
| 20 | {itemName}のデータを削除します。 |
|---|
| 21 | 省略すると既定の値が用いられます。 |
|---|
| 22 | 既定の値は「プライバシー情報の消去」設定で行えます。 |
|---|
| 23 | |
|---|
| 24 | {itemName}: |
|---|
| 25 | cache: Webキャッシュ |
|---|
| 26 | cookies: Cookie |
|---|
| 27 | offlineApps: Webサイトのオフライン作業用データ |
|---|
| 28 | history: 表示したページの履歴 |
|---|
| 29 | formdata: フォームと検索エントリーの履歴 |
|---|
| 30 | sessions: 現在のログイン情報 |
|---|
| 31 | |
|---|
| 32 | :clearp[rivacy] -t[ime] {timeSpan}: |
|---|
| 33 | 現在から{timeSpan}分の期間のデータを削除します。 |
|---|
| 34 | 省略すると既定の値が用いられます。 |
|---|
| 35 | 既定の値は、about:config にある privacy.sanitize.timeSpan になり、 |
|---|
| 36 | 0:全て,1:1時間以内,2:2時間以内,3:4時間以内,4:今日 となっています。 |
|---|
| 37 | |
|---|
| 38 | 期間内指定で有効なのは |
|---|
| 39 | + cookies |
|---|
| 40 | + history |
|---|
| 41 | のみで、それ以外は指定にかかわらず全て削除されます。 |
|---|
| 42 | |
|---|
| 43 | {timeSpan} format: |
|---|
| 44 | 数値m数値d数値h |
|---|
| 45 | - m は30日 |
|---|
| 46 | - d は日数 |
|---|
| 47 | - h は時間 |
|---|
| 48 | で 1m2d3h は 32日と3時間 という意味になり、現在から32日と3時間前までのデータを削除します。 |
|---|
| 49 | |
|---|
| 50 | ]]></detail> |
|---|
| 51 | </VimperatorPlugin>; |
|---|
| 52 | liberator.plugins.privacySanitizer = (function(){ |
|---|
| 53 | |
|---|
| 54 | var isFx31 = (Application.version.substring(0, 3) == "3.1") |
|---|
| 55 | var prefPrefix = isFx31 ? "privacy.cpd." : "privacy.item."; |
|---|
| 56 | |
|---|
| 57 | var privacyManager = { // {{{ |
|---|
| 58 | cache: { |
|---|
| 59 | clear: function(){ |
|---|
| 60 | var cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService); |
|---|
| 61 | try { |
|---|
| 62 | getCacheService.evictEntries(Ci.nsICache.STORE_ANYWHERE); |
|---|
| 63 | } catch (er){} |
|---|
| 64 | }, |
|---|
| 65 | getPref: function() options.getPref(prefPrefix + "cache") |
|---|
| 66 | }, |
|---|
| 67 | cookies: { |
|---|
| 68 | clear: function(range){ |
|---|
| 69 | var cookieMgr = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager); |
|---|
| 70 | if (range){ |
|---|
| 71 | let cookiesEnum = cookieMgr.enumrator; |
|---|
| 72 | while (cookiesEnum.hasMoreElements()){ |
|---|
| 73 | let cookie = cookiesEnum.getNext().QueryInterface(Ci.nsICookie2); |
|---|
| 74 | if (cookie.creationTime > this.range[0]) |
|---|
| 75 | cookieMgr.remove(cookie.host, cookie.name, cookie.path, false); |
|---|
| 76 | } |
|---|
| 77 | } else { |
|---|
| 78 | cookieMgr.removeAll(); |
|---|
| 79 | } |
|---|
| 80 | }, |
|---|
| 81 | getPref: function() options.getPref(prefPrefix + "cookies") |
|---|
| 82 | }, |
|---|
| 83 | offlineApps: { |
|---|
| 84 | clear: function(){ |
|---|
| 85 | var cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService); |
|---|
| 86 | try { |
|---|
| 87 | cacheService.evictEntries(Ci.nsICache.STORE_OFFLINE); |
|---|
| 88 | } catch(er){} |
|---|
| 89 | |
|---|
| 90 | var storageManagerService = Cc["@mozilla.org/dom/storagemanager;1"].getService(Ci.nsIDOMStorageManager); |
|---|
| 91 | storageManagerService.clearOfflineApps(); |
|---|
| 92 | }, |
|---|
| 93 | getPref: function() options.getPref(prefPrefix + "offlineApps") |
|---|
| 94 | }, |
|---|
| 95 | history: { |
|---|
| 96 | clear: function(range){ |
|---|
| 97 | var globalHistory = Cc["@mozilla.org/browser/global-history;2"].getService(Ci.nsIBrowserHistory); |
|---|
| 98 | if (range) |
|---|
| 99 | globalHistory.removePageByTimeframe(range[0], range[1]); |
|---|
| 100 | else |
|---|
| 101 | globalHistory.removeAllPages(); |
|---|
| 102 | |
|---|
| 103 | try { |
|---|
| 104 | let os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); |
|---|
| 105 | os.notifyObservers(null, "browser:purge-session-history", ""); |
|---|
| 106 | } catch(e){} |
|---|
| 107 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2); |
|---|
| 108 | try { |
|---|
| 109 | prefs.clearUserPref("general.open_location.last_url"); |
|---|
| 110 | } catch(er){} |
|---|
| 111 | }, |
|---|
| 112 | getPref: function() options.getPref(prefPrefix + "history") |
|---|
| 113 | }, |
|---|
| 114 | formdata: { |
|---|
| 115 | clear: function(range){ |
|---|
| 116 | var windowManager = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); |
|---|
| 117 | var windows = windowManager.getEnumerator("navigator:browser"); |
|---|
| 118 | while (windows.hasMoreElements()){ |
|---|
| 119 | let searchBar = windows.getNext().document.getElementById("searchbar"); |
|---|
| 120 | if (searchBar){ |
|---|
| 121 | searchBar.value = ""; |
|---|
| 122 | searchBar.textbox.editor.transactionManager.clear(); |
|---|
| 123 | } |
|---|
| 124 | } |
|---|
| 125 | var formHistory = Cc["@mozilla.org/satchel/form-history;1"].getService(Ci.nsIFormHistory2); |
|---|
| 126 | if (range) |
|---|
| 127 | formHistory.removeEntriesByTimeframe(range[0], range[1]); |
|---|
| 128 | else |
|---|
| 129 | formHistory.removeAllEntries(); |
|---|
| 130 | }, |
|---|
| 131 | getPref: function() options.getPref(prefPrefix + "formdata") |
|---|
| 132 | }, |
|---|
| 133 | downloads: { |
|---|
| 134 | clear: function(range){ |
|---|
| 135 | var dlMgr = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager); |
|---|
| 136 | let dlIDsRemove = []; |
|---|
| 137 | if (range){ |
|---|
| 138 | dlMgr.removeDownloadsByTimeframe(range[0], range[1]); |
|---|
| 139 | let dlsEnum = dlMgr.activeDownloads; |
|---|
| 140 | while (dlsEnum.hasMoreElements()){ |
|---|
| 141 | let dl = dlsEnum.next(); |
|---|
| 142 | if (dl.startTime >= range[0]) |
|---|
| 143 | dlIDsRemove.push(dl.id); |
|---|
| 144 | } |
|---|
| 145 | } else { |
|---|
| 146 | dlMgr.cleanUp(); |
|---|
| 147 | let dlsEnum = dlMgr.activeDownloads; |
|---|
| 148 | while (dlsEnum.hasMoreElements()){ |
|---|
| 149 | dlIDsRemove.push(dlsEnum.next().id) |
|---|
| 150 | } |
|---|
| 151 | } |
|---|
| 152 | dlIDsRemove.forEach(function(id) { |
|---|
| 153 | dlMgr.removeDownload(id); |
|---|
| 154 | }); |
|---|
| 155 | }, |
|---|
| 156 | getPref: function() options.getPref(prefPrefix + "downloads") |
|---|
| 157 | }, |
|---|
| 158 | sessions: { |
|---|
| 159 | clear: function(){ |
|---|
| 160 | var sdr = Cc["@mozilla.org/security/sdr;1"].getService(Ci.nsISecretDecoderRing); |
|---|
| 161 | sdr.logoutAndTeardown(); |
|---|
| 162 | var authMgr = Cc["@mozilla.org/network/http-auth-manager;1"].getService(Ci.nsIHttpAuthManager); |
|---|
| 163 | authMgr.clearAll(); |
|---|
| 164 | }, |
|---|
| 165 | getPref: function() options.getPref(prefPrefix + "sessions") |
|---|
| 166 | } |
|---|
| 167 | }; // }}} |
|---|
| 168 | |
|---|
| 169 | function getDefaultClearList(){ |
|---|
| 170 | var list = []; |
|---|
| 171 | for (let name in privacyManager){ |
|---|
| 172 | if (privacyManager[name].getPref()) |
|---|
| 173 | list.push(name); |
|---|
| 174 | } |
|---|
| 175 | return list; |
|---|
| 176 | } |
|---|
| 177 | function getTimeRange(ts, isPref){ |
|---|
| 178 | var endDate = Date.now() * 1000; |
|---|
| 179 | var startDate; |
|---|
| 180 | if (isPref){ |
|---|
| 181 | if (ts == 0) return null; |
|---|
| 182 | switch (ts){ |
|---|
| 183 | case 1: |
|---|
| 184 | case 2: |
|---|
| 185 | startDate = endDate - (ts*60*60*1000000); |
|---|
| 186 | break; |
|---|
| 187 | case 3: |
|---|
| 188 | startDate = endDate - (4*60*60*1000000); |
|---|
| 189 | break; |
|---|
| 190 | case 4: |
|---|
| 191 | let d = new Date(); |
|---|
| 192 | d.setHours(0); |
|---|
| 193 | d.setMinutes(0); |
|---|
| 194 | d.setSeconds(0); |
|---|
| 195 | startDate = d.valueof() * 1000; |
|---|
| 196 | break; |
|---|
| 197 | default: |
|---|
| 198 | throw "Invalid time span for clear private data: " + ts; |
|---|
| 199 | } |
|---|
| 200 | } else { |
|---|
| 201 | startDate = endDate - parseTime(ts); |
|---|
| 202 | } |
|---|
| 203 | return [startDate, endDate]; |
|---|
| 204 | |
|---|
| 205 | } |
|---|
| 206 | // TODO: かなり適当なので要修正 |
|---|
| 207 | function parseTime(ts){ |
|---|
| 208 | var int = parseInt(ts, 10); |
|---|
| 209 | if (isNaN(int)){ |
|---|
| 210 | let matches = ts.match(/^(?:(\d+)m)?(?:(\d+)d)?(?:(\d+)h)?$/); |
|---|
| 211 | let [, month, day, hour] = matches; |
|---|
| 212 | let time = (month ? month * 30 * 24 * 60 * 60 * 1000000 : 0) + |
|---|
| 213 | (day ? day * 24 * 60 * 60 * 1000000 : 0) + |
|---|
| 214 | (hour ? hour * 60 * 60 * 1000000 : 0); |
|---|
| 215 | return time; |
|---|
| 216 | } |
|---|
| 217 | return int * 60 * 60 * 1000000; |
|---|
| 218 | } |
|---|
| 219 | var ops = [ |
|---|
| 220 | [["-list", "-l"], commands.OPTION_LIST, null, [[name, "-"] for (name in privacyManager)]], |
|---|
| 221 | ]; |
|---|
| 222 | if (isFx31) ops.push([["-time", "-t"], commands.OPTION_STRING]); |
|---|
| 223 | |
|---|
| 224 | // -------------------------- |
|---|
| 225 | // Command |
|---|
| 226 | // -------------------------- |
|---|
| 227 | commands.addUserCommand(["clearp[rivacy]"], "Clear Privacy data", |
|---|
| 228 | function(args){ |
|---|
| 229 | var clearList = args["-data"] || getDefaultClearList(); |
|---|
| 230 | var range = null; |
|---|
| 231 | if (isFx31){ |
|---|
| 232 | range = args["-time"] ? |
|---|
| 233 | getTimeRange(args["-time"], false) : |
|---|
| 234 | getTimeRange(options.getPref("privacy.sanitize.timeSpan"), true); |
|---|
| 235 | } |
|---|
| 236 | clearList.forEach(function(name) this[name].clear(range), plugins.privacySanitizer); |
|---|
| 237 | }, { |
|---|
| 238 | options: ops, |
|---|
| 239 | }, |
|---|
| 240 | true); |
|---|
| 241 | |
|---|
| 242 | return privacyManager; |
|---|
| 243 | |
|---|
| 244 | })(); |
|---|
| 245 | |
|---|
| 246 | // vim:sw=4 ts=4 et fdm=marker: |
|---|