Initial commit
This commit is contained in:
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
pkg
|
||||
|
||||
*.swp
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
25
makexpi.sh
Executable file
25
makexpi.sh
Executable file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
APP_NAME=i2pbutton
|
||||
#VERSION=`grep em:version src/install.rdf | sed -e 's/["]//g' | cut -f2 -d=`
|
||||
XPI_NAME="$APP_NAME-`grep em:version src/install.rdf | sed -e 's/[<>]/ /g' | cut -f3`.xpi"
|
||||
|
||||
if [ -e "pkg/$XPI_NAME" ]; then
|
||||
echo pkg/$XPI_NAME already exists.
|
||||
rm pkg/$XPI_NAME # meh.
|
||||
# exit 1
|
||||
fi
|
||||
|
||||
# create jar file (we're just storing files here)
|
||||
echo ---------- create $APP_NAME.jar file ----------
|
||||
cd src/chrome
|
||||
cd ../..
|
||||
|
||||
# create .xpi
|
||||
echo ---------- create $APP_NAME.xpi ----------
|
||||
# create the pkg directory if it doesn't exist yet
|
||||
mkdir -p pkg
|
||||
cd src
|
||||
echo zip -X -9r ../pkg/$XPI_NAME ./ -x "chrome/*" -x "*.diff" -x "*.svn/*"
|
||||
zip -X -9r ../pkg/$XPI_NAME ./ -x "*.svn/*" -x "*.diff" #-x "chrome/*"
|
||||
cd ..
|
||||
|
10
moz.build
Normal file
10
moz.build
Normal file
@ -0,0 +1,10 @@
|
||||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
JAR_MANIFESTS += ['src/jar.mn']
|
||||
JS_PREFERENCE_FILES += [
|
||||
'src/defaults/preferences/preferences.js',
|
||||
]
|
||||
|
22
src/chrome.manifest
Normal file
22
src/chrome.manifest
Normal file
@ -0,0 +1,22 @@
|
||||
content i2pbutton chrome/content/
|
||||
overlay chrome://browser/content/browser.xul chrome://i2pbutton/content/i2pbutton.xul
|
||||
resource i2pbutton ./
|
||||
resource i2pbutton-assets resource://i2pbutton/chrome/skin/ contentaccessible=yes
|
||||
|
||||
# browser branding
|
||||
override chrome://branding/locale/brand.dtd chrome://i2pbutton/locale/brand.dtd
|
||||
override chrome://branding/locale/brand.properties chrome://i2pbutton/locale/brand.properties
|
||||
overlay chrome://browser/content/aboutDialog.xul chrome://i2pbutton/content/aboutDialog.xul
|
||||
|
||||
skin torbutton classic/1.0 chrome/skin/
|
||||
style chrome://global/content/customizeToolbar.xul chrome://i2pbutton/skin/i2pbutton.css
|
||||
|
||||
# Firefox 4-style component registration
|
||||
component {f605ec27-d867-44b5-ad97-2a29276642c3} components/dragDropFilter.js
|
||||
contract @geti2p.net/i2pbutton-dragDropFilter;1 {f605ec27-d867-44b5-ad97-2a29276642c3}
|
||||
|
||||
component {f36d72c9-9718-4134-b550-e109638331d7} components/i2pbutton-logger.js
|
||||
contract @geti2p.net/i2pbutton-logger;1 {f36d72c9-9718-4134-b550-e109638331d7}
|
||||
|
||||
category profile-after-change DragDropFilter @geti2p.net/i2pbutton-dragDropFilter;1
|
||||
|
6
src/chrome.manifest.jar
Normal file
6
src/chrome.manifest.jar
Normal file
@ -0,0 +1,6 @@
|
||||
content i2pbutton jar:chrome/i2pbutton.jar!/content/
|
||||
overlay chrome://browser/content/browser.xul chrome://i2pbutton/content/i2pbutton.xul
|
||||
|
||||
skin i2pbutton classic/1.0 jar:chrome/i2pbutton.jar!/skin/
|
||||
style chrome://global/content/customizeToolbar.xul chrome://i2pbutton/skin/i2pbutton.css
|
||||
|
6
src/chrome.manifest.nojar
Normal file
6
src/chrome.manifest.nojar
Normal file
@ -0,0 +1,6 @@
|
||||
content torbutton chrome/content/
|
||||
overlay chrome://browser/content/browser.xul chrome://i2pbutton/content/i2pbutton.xul
|
||||
|
||||
skin i2pbutton classic/1.0 chrome/skin/
|
||||
style chrome://global/content/customizeToolbar.xul chrome://i2pbutton/skin/i2pbutton.css
|
||||
|
88
src/components/dragDropFilter.js
Normal file
88
src/components/dragDropFilter.js
Normal file
@ -0,0 +1,88 @@
|
||||
/*************************************************************************
|
||||
* Drag and Drop Handler.
|
||||
*
|
||||
* Implements an observer that filters drag events to prevent OS
|
||||
* access to URLs (a potential proxy bypass vector).
|
||||
*************************************************************************/
|
||||
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
const Cu = Components.utils;
|
||||
|
||||
Cu.import("resource://i2pbutton/modules/default-prefs.js", {}).ensureDefaultPrefs();
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
// Module specific constants
|
||||
const kMODULE_NAME = "I2pbutton Drag and Drop Handler";
|
||||
const kCONTRACT_ID = "@geti2p.net/i2pbutton-dragDropFilter;1";
|
||||
const kMODULE_CID = Components.ID("f605ec27-d867-44b5-ad97-2a29276642c3");
|
||||
|
||||
const kInterfaces = [Ci.nsIObserver, Ci.nsIClassInfo];
|
||||
|
||||
function DragDropFilter() {
|
||||
this.logger = Cc["@geti2p.net/i2pbutton-logger;1"]
|
||||
.getService(Ci.nsISupports).wrappedJSObject;
|
||||
this.logger.log(3, "Component Load 0: New DragDropFilter.");
|
||||
|
||||
try {
|
||||
var observerService = Cc["@mozilla.org/observer-service;1"].
|
||||
getService(Ci.nsIObserverService);
|
||||
observerService.addObserver(this, "on-datatransfer-available", false);
|
||||
} catch(e) {
|
||||
this.logger.log(5, "Failed to register drag observer");
|
||||
}
|
||||
}
|
||||
|
||||
DragDropFilter.prototype =
|
||||
{
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIObserver]),
|
||||
|
||||
// make this an nsIClassInfo object
|
||||
flags: Ci.nsIClassInfo.DOM_OBJECT,
|
||||
classDescription: kMODULE_NAME,
|
||||
contractID: kCONTRACT_ID,
|
||||
classID: kMODULE_CID,
|
||||
|
||||
// method of nsIClassInfo
|
||||
getInterfaces: function(count) {
|
||||
count.value = kInterfaces.length;
|
||||
return kInterfaces;
|
||||
},
|
||||
|
||||
// method of nsIClassInfo
|
||||
getHelperForLanguage: function(count) { return null; },
|
||||
|
||||
// method of nsIObserver
|
||||
observe: function(subject, topic, data) {
|
||||
if (topic == "on-datatransfer-available") {
|
||||
this.logger.log(3, "The DataTransfer is available");
|
||||
return this.filterDataTransferURLs(subject);
|
||||
}
|
||||
},
|
||||
|
||||
filterDataTransferURLs: function(aDataTransfer) {
|
||||
var types = null;
|
||||
var type = "";
|
||||
var count = aDataTransfer.mozItemCount;
|
||||
var len = 0;
|
||||
for (var i = 0; i < count; ++i) {
|
||||
this.logger.log(3, "Inspecting the data transfer: " + i);
|
||||
types = aDataTransfer.mozTypesAt(i);
|
||||
len = types.length;
|
||||
for (var j = 0; j < len; ++j) {
|
||||
type = types[j];
|
||||
this.logger.log(3, "Type is: " + type);
|
||||
if (type == "text/x-moz-url" ||
|
||||
type == "text/x-moz-url-data" ||
|
||||
type == "text/uri-list" ||
|
||||
type == "application/x-moz-file-promise-url") {
|
||||
aDataTransfer.clearData(type);
|
||||
this.logger.log(3, "Removing " + type);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var NSGetFactory = XPCOMUtils.generateNSGetFactory([DragDropFilter]);
|
184
src/components/i2pbutton-logger.js
Normal file
184
src/components/i2pbutton-logger.js
Normal file
@ -0,0 +1,184 @@
|
||||
// Bug 1506 P1: This is just a handy logger. If you have a better one, toss
|
||||
// this in the trash.
|
||||
|
||||
/*************************************************************************
|
||||
* TBLogger (JavaScript XPCOM component)
|
||||
*
|
||||
* Allows loglevel-based logging to different logging mechanisms.
|
||||
*
|
||||
*************************************************************************/
|
||||
|
||||
// Module specific constants
|
||||
const kMODULE_NAME = "I2pbutton Logger";
|
||||
const kMODULE_CONTRACTID = "@geti2p.net/i2pbutton-logger;1";
|
||||
const kMODULE_CID = Components.ID("f36d72c9-9718-4134-b550-e109638331d7");
|
||||
|
||||
const Cr = Components.results;
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
const Cu = Components.utils;
|
||||
|
||||
Cu.import("resource://i2pbutton/modules/default-prefs.js", {}).ensureDefaultPrefs();
|
||||
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
function I2pbuttonLogger() {
|
||||
// Register observer
|
||||
Services.prefs.addObserver("extensions.i2pbutton", this, false);
|
||||
|
||||
this.loglevel = Services.prefs.getIntPref("extensions.i2pbutton.loglevel");
|
||||
this.logmethod = Services.prefs.getIntPref("extensions.i2pbutton.logmethod");
|
||||
|
||||
try {
|
||||
var logMngr = Components.classes["@mozmonkey.com/debuglogger/manager;1"]
|
||||
.getService(Components.interfaces.nsIDebugLoggerManager);
|
||||
this._debuglog = logMngr.registerLogger("i2pbutton");
|
||||
} catch (exErr) {
|
||||
this._debuglog = false;
|
||||
}
|
||||
this._console = Components.classes["@mozilla.org/consoleservice;1"]
|
||||
.getService(Components.interfaces.nsIConsoleService);
|
||||
|
||||
// This JSObject is exported directly to chrome
|
||||
this.wrappedJSObject = this;
|
||||
this.log(3, "I2pbutton debug output ready");
|
||||
}
|
||||
|
||||
/**
|
||||
* JS XPCOM component registration goop:
|
||||
*
|
||||
* Everything below is boring boilerplate and can probably be ignored.
|
||||
*/
|
||||
|
||||
const nsISupports = Components.interfaces.nsISupports;
|
||||
const nsIClassInfo = Components.interfaces.nsIClassInfo;
|
||||
const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
|
||||
const nsIObserverService = Components.interfaces.nsIObserverService;
|
||||
|
||||
const logString = { 1:"VERB", 2:"DBUG", 3: "INFO", 4:"NOTE", 5:"WARN" };
|
||||
|
||||
function padInt(i)
|
||||
{
|
||||
return (i < 10) ? '0' + i : i;
|
||||
}
|
||||
|
||||
TorbuttonLogger.prototype =
|
||||
{
|
||||
QueryInterface: function(iid)
|
||||
{
|
||||
if (!iid.equals(nsIClassInfo) &&
|
||||
!iid.equals(nsISupports)) {
|
||||
Components.returnCode = Cr.NS_ERROR_NO_INTERFACE;
|
||||
return null;
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
wrappedJSObject: null, // Initialized by constructor
|
||||
|
||||
// make this an nsIClassInfo object
|
||||
flags: nsIClassInfo.DOM_OBJECT,
|
||||
|
||||
// method of nsIClassInfo
|
||||
classDescription: "I2pbuttonLogger",
|
||||
classID: kMODULE_CID,
|
||||
contractID: kMODULE_CONTRACTID,
|
||||
|
||||
// method of nsIClassInfo
|
||||
getInterfaces: function(count) {
|
||||
var interfaceList = [nsIClassInfo];
|
||||
count.value = interfaceList.length;
|
||||
return interfaceList;
|
||||
},
|
||||
|
||||
// method of nsIClassInfo
|
||||
getHelperForLanguage: function(count) { return null; },
|
||||
|
||||
formatLog: function(str, level) {
|
||||
var d = new Date();
|
||||
var now = padInt(d.getUTCMonth()+1)+"-"+padInt(d.getUTCDate())+" "+padInt(d.getUTCHours())+":"+padInt(d.getUTCMinutes())+":"+padInt(d.getUTCSeconds());
|
||||
return "["+now+"] I2pbutton "+logString[level]+": "+str;
|
||||
},
|
||||
|
||||
// error console log
|
||||
eclog: function(level, str) {
|
||||
switch(this.logmethod) {
|
||||
case 0: // stderr
|
||||
if(this.loglevel <= level)
|
||||
dump(this.formatLog(str, level)+"\n");
|
||||
break;
|
||||
default: // errorconsole
|
||||
if(this.loglevel <= level)
|
||||
this._console.logStringMessage(this.formatLog(str,level));
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
safe_log: function(level, str, scrub) {
|
||||
if (this.loglevel < 4) {
|
||||
this.eclog(level, str+scrub);
|
||||
} else {
|
||||
this.eclog(level, str+" [scrubbed]");
|
||||
}
|
||||
},
|
||||
|
||||
log: function(level, str) {
|
||||
switch(this.logmethod) {
|
||||
case 2: // debuglogger
|
||||
if(this._debuglog) {
|
||||
this._debuglog.log((6-level), this.formatLog(str,level));
|
||||
break;
|
||||
}
|
||||
// fallthrough
|
||||
case 0: // stderr
|
||||
if(this.loglevel <= level)
|
||||
dump(this.formatLog(str,level)+"\n");
|
||||
break;
|
||||
default:
|
||||
dump("Bad log method: "+this.logmethod);
|
||||
case 1: // errorconsole
|
||||
if(this.loglevel <= level)
|
||||
this._console.logStringMessage(this.formatLog(str,level));
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
// Pref observer interface implementation
|
||||
|
||||
// topic: what event occurred
|
||||
// subject: what nsIPrefBranch we're observing
|
||||
// data: which pref has been changed (relative to subject)
|
||||
observe: function(subject, topic, data)
|
||||
{
|
||||
if (topic != "nsPref:changed") return;
|
||||
switch (data) {
|
||||
case "extensions.i2pbutton.logmethod":
|
||||
this.logmethod = Services.prefs.getIntPref("extensions.i2pbutton.logmethod");
|
||||
if (this.logmethod === 0) {
|
||||
Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
|
||||
true);
|
||||
} else if (Services.prefs.
|
||||
getIntPref("extensions.torlauncher.logmethod", 3) !== 0) {
|
||||
// If Tor Launcher is not available or its log method is not 0
|
||||
// then let's reset the dump pref.
|
||||
Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
|
||||
false);
|
||||
}
|
||||
break;
|
||||
case "extensions.i2pbutton.loglevel":
|
||||
this.loglevel = Services.prefs.getIntPref("extensions.i2pbutton.loglevel");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
|
||||
* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
|
||||
*/
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
if (XPCOMUtils.generateNSGetFactory)
|
||||
var NSGetFactory = XPCOMUtils.generateNSGetFactory([I2pbuttonLogger]);
|
||||
else
|
||||
var NSGetModule = XPCOMUtils.generateNSGetModule([I2pbuttonLogger]);
|
||||
|
4
src/defaults/preferences/preferences.js
Normal file
4
src/defaults/preferences/preferences.js
Normal file
@ -0,0 +1,4 @@
|
||||
// debug prefs
|
||||
pref("extensions.i2pbutton.loglevel",4);
|
||||
pref("extensions.i2pbutton.logmethod",1); // 0=stdout, 1=errorconsole, 2=debuglog
|
||||
|
24
src/install.rdf
Normal file
24
src/install.rdf
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0"?>
|
||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
||||
|
||||
<Description about="urn:mozilla:install-manifest">
|
||||
<em:name>I2pbutton</em:name>
|
||||
<em:creator>Meeh, Mikal Villa</em:creator>
|
||||
<em:id>i2pbutton@geti2p.net</em:id>
|
||||
<em:version>2.2</em:version>
|
||||
<em:multiprocessCompatible>true</em:multiprocessCompatible>
|
||||
<em:homepageURL>https://geti2p.net/en/download/lab</em:homepageURL>
|
||||
<em:iconURL>chrome://i2pbutton/skin/i2p.png</em:iconURL>
|
||||
<em:updateURL>data:text/plain,</em:updateURL>
|
||||
<em:updateKey>-</em:updateKey>
|
||||
<!-- firefox -->
|
||||
<em:targetApplication>
|
||||
<Description>
|
||||
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
|
||||
<em:minVersion>60.0</em:minVersion>
|
||||
<em:maxVersion>10000.0</em:maxVersion>
|
||||
</Description>
|
||||
</em:targetApplication>
|
||||
</Description>
|
||||
</RDF>
|
22
src/jar.mn
Normal file
22
src/jar.mn
Normal file
@ -0,0 +1,22 @@
|
||||
#filter substitution
|
||||
|
||||
i2pbutton.jar:
|
||||
|
||||
% content i2pbutton %content/
|
||||
|
||||
content/ (chrome/content/*)
|
||||
components/ (components/*)
|
||||
defaults/ (defaults/*)
|
||||
modules/ (modules/*)
|
||||
skin/ (chrome/skin/*)
|
||||
|
||||
% overlay chrome://browser/content/browser.xul chrome://i2pbutton/content/i2pbutton.xul
|
||||
|
||||
% resource i2pbutton %
|
||||
% resource i2pbutton-assets resource://i2pbutton/skin/ contentaccessible=yes
|
||||
|
||||
# browser branding
|
||||
% override chrome://branding/locale/brand.dtd chrome://i2pbutton/locale/brand.dtd
|
||||
% override chrome://branding/locale/brand.properties chrome://i2pbutton/locale/brand.properties
|
||||
% overlay chrome://browser/content/aboutDialog.xul chrome://i2pbutton/content/aboutDialog.xul
|
||||
|
Reference in New Issue
Block a user