|
|
|
@ -20,106 +20,234 @@
@@ -20,106 +20,234 @@
|
|
|
|
|
<noscript>You need to enable JavaScript to run the Converse.js chat app.</noscript> |
|
|
|
|
<div id="conversejs-bg"></div> |
|
|
|
|
<script> |
|
|
|
|
// access the pre-bundled global API functions |
|
|
|
|
const { invoke } = window.__TAURI__.tauri; |
|
|
|
|
const { getClient, ResponseType } = window.__TAURI__.http; |
|
|
|
|
const tauriFetch = window.__TAURI__.http.fetch; |
|
|
|
|
|
|
|
|
|
const realFetch = window.fetch; |
|
|
|
|
|
|
|
|
|
// this is clearly not a complete fetch implementation |
|
|
|
|
// but it's enough for the omemo downloadFile() function... |
|
|
|
|
window.fetch = async function(url) { |
|
|
|
|
console.log("fetching url: " + url); |
|
|
|
|
|
|
|
|
|
const client = await getClient(); |
|
|
|
|
let response = await await client.get( |
|
|
|
|
url, { |
|
|
|
|
timeout: 30, |
|
|
|
|
responseType: ResponseType.Binary |
|
|
|
|
}); |
|
|
|
|
// access the pre-bundled global API functions |
|
|
|
|
const { invoke } = window.__TAURI__.tauri; |
|
|
|
|
const { getClient, ResponseType, Body } = window.__TAURI__.http; |
|
|
|
|
const tauriFetch = window.__TAURI__.http.fetch; |
|
|
|
|
|
|
|
|
|
const realFetch = window.fetch; |
|
|
|
|
|
|
|
|
|
// this is clearly not a complete fetch implementation |
|
|
|
|
// but it's enough for the omemo downloadFile() function... |
|
|
|
|
window.fetch = async function (url) { |
|
|
|
|
console.log("fetching url: " + url); |
|
|
|
|
|
|
|
|
|
let data = new Uint8Array(response.data).buffer; |
|
|
|
|
const client = await getClient(); |
|
|
|
|
let response = await await client.get(url, { |
|
|
|
|
timeout: 30, |
|
|
|
|
responseType: ResponseType.Binary, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
response.arrayBuffer = async function() { |
|
|
|
|
return data; |
|
|
|
|
}; |
|
|
|
|
let data = new Uint8Array(response.data).buffer; |
|
|
|
|
|
|
|
|
|
return response; |
|
|
|
|
response.arrayBuffer = async function () { |
|
|
|
|
return data; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
function addCredentials (login, password) { |
|
|
|
|
localStorage.setItem('login', login); |
|
|
|
|
localStorage.setItem('password', password); |
|
|
|
|
} |
|
|
|
|
return response; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
function getCredentials () { |
|
|
|
|
const credentials = {} |
|
|
|
|
credentials.login = localStorage.getItem('login') || ''; |
|
|
|
|
if (credentials.login) { |
|
|
|
|
credentials.password = localStorage.getItem('password'); |
|
|
|
|
} |
|
|
|
|
// this is clearly not a complete XMLHttpRequest implementation |
|
|
|
|
// but it's enough for http upload and gif download |
|
|
|
|
const realXMLHttpRequest = window.XMLHttpRequest; |
|
|
|
|
|
|
|
|
|
function fXMLHttpRequest() { |
|
|
|
|
//this._xhr = new realXMLHttpRequest(); |
|
|
|
|
this.upload = {}; |
|
|
|
|
this.upload.addEventListener = function (type, listener, useCapture) { |
|
|
|
|
console.log("fake XMLHttpRequest.upload.addEventListener()"); |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Constructor |
|
|
|
|
function cXMLHttpRequest() { |
|
|
|
|
return new fXMLHttpRequest(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cXMLHttpRequest.prototype = fXMLHttpRequest.prototype; |
|
|
|
|
|
|
|
|
|
cXMLHttpRequest.DONE = 4; |
|
|
|
|
|
|
|
|
|
return credentials; |
|
|
|
|
cXMLHttpRequest.prototype.open = function (sMethod, sUrl, bAsync, sUser, sPassword) { |
|
|
|
|
this._method = sMethod; |
|
|
|
|
this._url = sUrl; |
|
|
|
|
this._async = bAsync; |
|
|
|
|
// Delete headers, required when object is reused |
|
|
|
|
delete this._headers; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cXMLHttpRequest.prototype.setRequestHeader = function (sName, sValue) { |
|
|
|
|
if (!this._headers) { |
|
|
|
|
this._headers = {}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function removeCredentials () { |
|
|
|
|
localStorage.removeItem('login'); |
|
|
|
|
localStorage.removeItem('password'); |
|
|
|
|
this._headers[sName] = sValue; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cXMLHttpRequest.prototype.overrideMimeType = function (mimeType) { |
|
|
|
|
this._mimeType = mimeType; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cXMLHttpRequest.prototype.send = function (vData) { |
|
|
|
|
const realThis = this; |
|
|
|
|
/* |
|
|
|
|
const xhr = new realXMLHttpRequest(); |
|
|
|
|
//xhr.onreadystatechange = this.onreadystatechange; |
|
|
|
|
xhr.onreadystatechange = async () => { |
|
|
|
|
if (xhr.readyState === XMLHttpRequest.DONE) { |
|
|
|
|
realThis.status = xhr.status; |
|
|
|
|
realThis.readyState = xhr.readyState; |
|
|
|
|
realThis.responseText = xhr.responseText; |
|
|
|
|
realThis.response = xhr.response; |
|
|
|
|
|
|
|
|
|
//console.log("xhr status: " + realThis.status}`); |
|
|
|
|
|
|
|
|
|
console.log(`xhr status: ${realThis.status}`); |
|
|
|
|
console.log(`xhr readyState: ${realThis.readyState}`); |
|
|
|
|
console.log(`xhr responseText: ${realThis.responseText}`); |
|
|
|
|
console.log(`xhr response: ${realThis.response}`); |
|
|
|
|
|
|
|
|
|
if (realThis.onreadystatechange !== undefined) { |
|
|
|
|
realThis.onreadystatechange(); |
|
|
|
|
} |
|
|
|
|
if (realThis.onload !== undefined) { |
|
|
|
|
realThis.onload(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
console.log(`open(${this._method}, ${this._url}, ${this._async})`); |
|
|
|
|
xhr.open(this._method, this._url, this._async); |
|
|
|
|
if (this._mimeType !== undefined) { |
|
|
|
|
console.log(`overrideMimeType(${this._mimeType})`); |
|
|
|
|
xhr.overrideMimeType(this._mimeType); |
|
|
|
|
} |
|
|
|
|
for (const key in realThis._headers) { |
|
|
|
|
console.log(`setRequestHeader(${key}: ${realThis._headers[key]})`); |
|
|
|
|
xhr.setRequestHeader(key, realThis._headers[key]); |
|
|
|
|
} |
|
|
|
|
console.log(`send(${vData})`); |
|
|
|
|
xhr.send(vData); |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
(async function () { |
|
|
|
|
let response = null; |
|
|
|
|
|
|
|
|
|
converse.plugins.add('converse-desktop-credentials', { |
|
|
|
|
initialize () { |
|
|
|
|
console.log("converse-desktop-credentials - initialize"); |
|
|
|
|
|
|
|
|
|
const { _converse } = this; |
|
|
|
|
const { api } = _converse; |
|
|
|
|
|
|
|
|
|
api.listen.on('afterResourceBinding', () => { |
|
|
|
|
console.log("converse-desktop-credentials - afterResourceBinding"); |
|
|
|
|
if (_converse.connection.pass) { |
|
|
|
|
addCredentials( |
|
|
|
|
_converse.bare_jid, |
|
|
|
|
_converse.connection.pass |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
if (realThis._method == "PUT") { |
|
|
|
|
const filePromise = new Promise((resolve, reject) => { |
|
|
|
|
const reader = new FileReader(); |
|
|
|
|
reader.onload = function (e) { |
|
|
|
|
resolve(reader.result); |
|
|
|
|
}; |
|
|
|
|
reader.readAsArrayBuffer(vData); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
api.listen.on('logout', () => { |
|
|
|
|
console.log("converse-desktop-credentials - logout"); |
|
|
|
|
removeCredentials(); |
|
|
|
|
let buffer = await filePromise; |
|
|
|
|
|
|
|
|
|
const client = await getClient(); |
|
|
|
|
response = await await client.put(realThis._url, Body.bytes(buffer), { |
|
|
|
|
timeout: 30, |
|
|
|
|
responseType: ResponseType.Text, |
|
|
|
|
headers: realThis._headers, |
|
|
|
|
}); |
|
|
|
|
} else if (realThis._method == "GET") { |
|
|
|
|
const client = await getClient(); |
|
|
|
|
response = await await client.get(realThis._url, { |
|
|
|
|
timeout: 30, |
|
|
|
|
responseType: ResponseType.Text, |
|
|
|
|
headers: realThis._headers, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const { login, password } = getCredentials(); |
|
|
|
|
console.log('login: ' + login); |
|
|
|
|
|
|
|
|
|
invoke('proxy_port').then((port) => { |
|
|
|
|
console.log('proxy_port: ' + port); |
|
|
|
|
|
|
|
|
|
converse.initialize({ |
|
|
|
|
auto_login: login && password, |
|
|
|
|
jid: login, |
|
|
|
|
password: password, |
|
|
|
|
authentication: 'login', |
|
|
|
|
auto_away: 300, |
|
|
|
|
auto_reconnect: true, |
|
|
|
|
websocket_url: 'ws://127.0.0.1:' + port + '/xmpp-websocket/', |
|
|
|
|
assets_path: './dist/', |
|
|
|
|
discover_connection_methods: false, |
|
|
|
|
message_archiving: 'always', |
|
|
|
|
play_sounds: false, |
|
|
|
|
view_mode: 'fullscreen', |
|
|
|
|
//loglevel: 'debug', |
|
|
|
|
muc_respect_autojoin: true, |
|
|
|
|
muc_show_logs_before_join: true, |
|
|
|
|
whitelisted_plugins: ['converse-desktop-credentials'] |
|
|
|
|
}).catch((reason) => { |
|
|
|
|
document.body.innerText = "error starting converse: " + reason; |
|
|
|
|
console.log(document.body.innerText); |
|
|
|
|
realThis.status = response.status; |
|
|
|
|
realThis.readyState = XMLHttpRequest.DONE; |
|
|
|
|
realThis.responseText = response.data; |
|
|
|
|
realThis.response = response.data; |
|
|
|
|
|
|
|
|
|
if (realThis.onreadystatechange !== undefined) { |
|
|
|
|
realThis.onreadystatechange(); |
|
|
|
|
} |
|
|
|
|
if (realThis.onload !== undefined) { |
|
|
|
|
realThis.onload(); |
|
|
|
|
} |
|
|
|
|
})(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
window.XMLHttpRequest = cXMLHttpRequest; |
|
|
|
|
|
|
|
|
|
function addCredentials(login, password) { |
|
|
|
|
localStorage.setItem("login", login); |
|
|
|
|
localStorage.setItem("password", password); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function getCredentials() { |
|
|
|
|
const credentials = {}; |
|
|
|
|
credentials.login = localStorage.getItem("login") || ""; |
|
|
|
|
if (credentials.login) { |
|
|
|
|
credentials.password = localStorage.getItem("password"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return credentials; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function removeCredentials() { |
|
|
|
|
localStorage.removeItem("login"); |
|
|
|
|
localStorage.removeItem("password"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
converse.plugins.add("converse-desktop-credentials", { |
|
|
|
|
initialize() { |
|
|
|
|
console.log("converse-desktop-credentials - initialize"); |
|
|
|
|
|
|
|
|
|
const { _converse } = this; |
|
|
|
|
const { api } = _converse; |
|
|
|
|
|
|
|
|
|
api.listen.on("afterResourceBinding", () => { |
|
|
|
|
console.log("converse-desktop-credentials - afterResourceBinding"); |
|
|
|
|
if (_converse.connection.pass) { |
|
|
|
|
addCredentials(_converse.bare_jid, _converse.connection.pass); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
api.listen.on("logout", () => { |
|
|
|
|
console.log("converse-desktop-credentials - logout"); |
|
|
|
|
removeCredentials(); |
|
|
|
|
}); |
|
|
|
|
}).catch((reason) => { |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const { login, password } = getCredentials(); |
|
|
|
|
console.log("login: " + login); |
|
|
|
|
|
|
|
|
|
invoke("proxy_port") |
|
|
|
|
.then((port) => { |
|
|
|
|
console.log("proxy_port: " + port); |
|
|
|
|
|
|
|
|
|
converse |
|
|
|
|
.initialize({ |
|
|
|
|
auto_login: login && password, |
|
|
|
|
jid: login, |
|
|
|
|
password: password, |
|
|
|
|
authentication: "login", |
|
|
|
|
auto_away: 300, |
|
|
|
|
auto_reconnect: true, |
|
|
|
|
//websocket_url: 'ws://127.0.0.1:' + port + '/xmpp-websocket/', |
|
|
|
|
websocket_url: "wss://burtrum.org/xmpp-websocket/", |
|
|
|
|
assets_path: "./dist/", |
|
|
|
|
discover_connection_methods: false, |
|
|
|
|
message_archiving: "always", |
|
|
|
|
play_sounds: false, |
|
|
|
|
view_mode: "fullscreen", |
|
|
|
|
//loglevel: 'debug', |
|
|
|
|
muc_respect_autojoin: true, |
|
|
|
|
muc_show_logs_before_join: true, |
|
|
|
|
whitelisted_plugins: ["converse-desktop-credentials"], |
|
|
|
|
}) |
|
|
|
|
.catch((reason) => { |
|
|
|
|
document.body.innerText = "error starting converse: " + reason; |
|
|
|
|
console.log(document.body.innerText); |
|
|
|
|
}); |
|
|
|
|
}) |
|
|
|
|
.catch((reason) => { |
|
|
|
|
document.body.innerText = "error starting proxy: " + reason; |
|
|
|
|
console.log(document.body.innerText); |
|
|
|
|
}); |
|
|
|
|