Initial commit

This commit is contained in:
Mikal Villa
2019-06-06 00:41:23 +02:00
commit 4398063e38
11 changed files with 397 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
pkg
*.swp
.DS_Store
Thumbs.db

25
makexpi.sh Executable file
View 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
View 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
View 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
View 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

View 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

View 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]);

View 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]);

View 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
View 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
View 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