root/lang/javascript/vimperator-plugins/branches/2.0/clear_privacy_data.js

Revision 28033, 9.0 kB (checked in by teramako, 20 months ago)

firefox3.0にも対応

Line 
1var 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>;
52liberator.plugins.privacySanitizer = (function(){
53
54var isFx31 = (Application.version.substring(0, 3) == "3.1")
55var prefPrefix = isFx31 ? "privacy.cpd." : "privacy.item.";
56
57var 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
169function getDefaultClearList(){
170    var list = [];
171    for (let name in privacyManager){
172        if (privacyManager[name].getPref())
173            list.push(name);
174    }
175    return list;
176}
177function 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: かなり適当なので要修正
207function 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}
219var ops = [
220    [["-list", "-l"], commands.OPTION_LIST, null, [[name, "-"] for (name in privacyManager)]],
221];
222if (isFx31) ops.push([["-time", "-t"], commands.OPTION_STRING]);
223
224// --------------------------
225// Command
226// --------------------------
227commands.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
242return privacyManager;
243
244})();
245
246// vim:sw=4 ts=4 et fdm=marker:
Note: See TracBrowser for help on using the browser.