Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
raffaeleflorio committed Sep 1, 2017
0 parents commit 36c80a7
Show file tree
Hide file tree
Showing 12 changed files with 266 additions and 0 deletions.
3 changes: 3 additions & 0 deletions README.md
@@ -0,0 +1,3 @@
# qubes-url-redirector 0.5

Qubes OS URL Redirector 0.5
1 change: 1 addition & 0 deletions TODO
@@ -0,0 +1 @@
- webRequest redirection
3 changes: 3 additions & 0 deletions backgrounds/main.js
@@ -0,0 +1,3 @@
browser.browserAction.onClicked.addListener(() => {
browser.runtime.openOptionsPage();
});
83 changes: 83 additions & 0 deletions backgrounds/menus.js
@@ -0,0 +1,83 @@
function createMenus()
{
browser.contextMenus.create({
id: "dvm",
title: "Open in dvm",
contexts: ["link"]
});

getVmName().then(item => {
browser.contextMenus.create({
id: "default-vm",
title: "Open in " + item.vmname + " VM",
contexts: ["link"],
enabled: item.menu_enabled
});

browser.contextMenus.create({
id: "some-vm",
title: "Open in VM...",
contexts: ["link"]
});

browser.contextMenus.create({
id: "here",
title: "Open here",
contexts: ["link"]
});
});

browser.contextMenus.onClicked.addListener((info, tab) => {
switch (info.menuItemId) {
case "dvm":
/* in native.js */
openurl("$dispvm", info.linkUrl);
break;
case "default-vm":
/* in native.js */
getVmName().then(item => {
openurl(item.vmname, info.linkUrl);
});
break;
case "some-vm":
browser.windows.create({
type: "popup",
url: "choose-vm/popup.html?url=" + info.linkUrl,

This comment has been minimized.

Copy link
@jpouellet

jpouellet Sep 5, 2017

Should this be url encoded? Does a & in info.linkUrl cause truncation?

This comment has been minimized.

Copy link
@raffaeleflorio

raffaeleflorio Sep 5, 2017

Author Owner

Yeah, thanks for the feedback. I've just patched it.

width: 600,
height: 160
});
break;
case "here":
browser.tabs.create({url: info.linkUrl});
break;
}
});
}

function getVmName()
{
return browser.storage.local.get("settings")
.then(item => {
if (item.settings)
item = item.settings;
else
item = {}

item.menu_enabled = !item.vmname || item.vmname == "" ? false : true;
item.vmname = !item.vmname || item.vmname == "" ? "default" : item.vmname;
return item;
});
}

function updateMenus()
{
getVmName().then(item => {
browser.contextMenus.update("default-vm", {
title: "Open in " + item.vmname + " VM",
enabled: item.menu_enabled
});
});
}

createMenus();
browser.storage.onChanged.addListener(updateMenus);
8 changes: 8 additions & 0 deletions backgrounds/native.js
@@ -0,0 +1,8 @@
function openurl(vm, url)
{
browser.runtime.sendNativeMessage("qvm_open_in_vm", {"vmname": vm, "url": url});
}

browser.runtime.onMessage.addListener((req, sender, sendResponse) => {
openurl(req.vmname, req.url);
});
26 changes: 26 additions & 0 deletions choose-vm/popup.html
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
span {
display: inline-block;
margin-bottom: 10px;
}

#vmname {
width: 95%;
margin-bottom: 10px;
}
</style>
</head>
<body>
<form id="urlForm">
<span id="url">URL: </span><br>
<label for="vmname">Insert VM Name:</label><br>
<input type="text" id="vmname" name="vmname">
<button type="submit">Open</button>
</form>
<script src="popup.js"></script>
</body>
</html>
17 changes: 17 additions & 0 deletions choose-vm/popup.js
@@ -0,0 +1,17 @@
function redirect(e)
{
let form = e.target;

let vmname = form["vmname"].value;

if (vmname == null || vmname == "")
alert("VM name cannot be empty!");

browser.runtime.sendMessage({"vmname": vmname, "url": url});
e.preventDefault();
window.close();
}

document.getElementById("urlForm").addEventListener("submit", redirect);
let url = (new URL(document.location.href)).searchParams.get("url");
document.getElementById("url").textContent = "URL: " + url;
39 changes: 39 additions & 0 deletions manifest.json
@@ -0,0 +1,39 @@
{
"manifest_version": 2,

"name": "qubes-url-redirector",
"version": "0.5",
"applications": {
"gecko": {
"id": "qubes-url-redirector@raffaeleflorio.github.io"
}
},

"author": "Raffaele Florio",
"homepage_url": "https://github.com/raffaeleflorio/qubes-url-redirector",

"options_ui": {
"page": "options/settings.html",
"browser_style": true
},

"browser_action": {
"browser_style": true,
"default_title": "Qubes URL Redirector"
},

"background": {
"scripts": [
"backgrounds/main.js",
"backgrounds/native.js",
"backgrounds/menus.js"
]
},

"permissions": [
"contextMenus",
"storage",
"nativeMessaging",
"webRequest"
]
}
21 changes: 21 additions & 0 deletions native-host/qvm-open-in-vm-we.py
@@ -0,0 +1,21 @@
#!/usr/bin/env python3
import sys
import json
import struct
import re
import os

def getMessage():
msglen = sys.stdin.buffer.read(4)
if len(msglen) == 0:
sys.exit(1)
msglen = struct.unpack("@I", msglen)[0]
msg = sys.stdin.buffer.read(msglen).decode("utf-8")
return json.loads(msg)

msg = getMessage()
if not re.match(".*://.*", msg["url"]):
sys.exit(1)

#check msg["vmname"]
os.execvp("qvm-open-in-vm", ["qvm-open-in-vm", msg["vmname"], msg["url"]]);
7 changes: 7 additions & 0 deletions native-host/qvm_open_in_vm.json
@@ -0,0 +1,7 @@
{
"name": "qvm_open_in_vm",
"description": "Open URL in other VM",
"allowed_extensions": ["qubes-url-redirector@raffaeleflorio.github.io"],
"type": "stdio",
"path": "/usr/local/bin/qvm-open-in-vm-we.py"
}
21 changes: 21 additions & 0 deletions options/settings.html
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
#settings > * {
margin: 5px;
}
</style>
</head>
<body>
<form id="settings">
Default action:<br>
<label><input type="radio" name="default" id="dvm" value="dvm" checked>Open in dvm</label><br>
<label><input type="radio" name="default" id="vm" value="vm">Open in VM:</label><input type="text" name="vmname"><br>
<label style="color: red"><input type="radio" name="default" id="here" value="here">Open here</label><br>
<button type="submit">Save</button>
</form>
<script src="settings.js"></script>
</body>
</html>
37 changes: 37 additions & 0 deletions options/settings.js
@@ -0,0 +1,37 @@
function save(e)
{
let form = e.target;

let settings = {
default_action: form["default"].value,
vmname: form["vmname"].value /* check esitenza ? */
};

browser.storage.local.set({"settings": settings})
.then(
() => alert("Saved succesfully!"),
() => {
alert("Failed to save!");
restore();
}
);

e.preventDefault();
}

function restore()
{
let form = document.getElementById("settings");

browser.storage.local.get("settings")
.then(item => {
if (!item.settings)
return;
item = item.settings;
form[item.default_action].checked = true;
form["vmname"].value = item.vmname;
});
}

restore();
document.getElementById("settings").addEventListener("submit", save);

0 comments on commit 36c80a7

Please sign in to comment.