fixes to wtv-favorites
This commit is contained in:
@@ -1,4 +1,8 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
var request_is_async = true;
|
||||||
|
|
||||||
|
var max_redirects = 3;
|
||||||
|
var redirects = 0;
|
||||||
|
|
||||||
function hex_to_ascii(POST)
|
function hex_to_ascii(POST)
|
||||||
{
|
{
|
||||||
@@ -8,38 +12,127 @@ function hex_to_ascii(POST)
|
|||||||
str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
|
str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
|
||||||
|
|
||||||
var POST = request_headers.post_data;
|
|
||||||
var image = hex_to_ascii(POST);
|
|
||||||
|
|
||||||
var url = request_headers.request;
|
|
||||||
|
|
||||||
var title = url.split('favorite-title=')[1]
|
|
||||||
title = title.split('&')[0]
|
|
||||||
|
|
||||||
var folder = url.split('favorite-category=')[1]
|
|
||||||
folder = folder.split('&')[0]
|
|
||||||
folder = folder.replaceAll("+", " ")
|
|
||||||
|
|
||||||
var imagetype = url.split('favorite-thumbnail-type=')[1]
|
|
||||||
imagetype = imagetype.split('&')[0]
|
|
||||||
|
|
||||||
var favurl = url.split('favorite-url=')[1]
|
|
||||||
favurl = favurl.split('&')[0]
|
|
||||||
|
|
||||||
var favoritenum = 0;
|
|
||||||
var favstore_exists = ssid_sessions[socket.ssid].favstore.favstoreExists();
|
|
||||||
var favarray = ssid_sessions[socket.ssid].favstore.listFavorites(folder);
|
|
||||||
favoritenum = Object.keys(favarray).length;
|
|
||||||
|
|
||||||
if (favoritenum == minisrv_config.services[service_name].max_favorites_per_folder)
|
|
||||||
{
|
|
||||||
headers = `400 You can only have ${minisrv_config.services[service_name].max_favorites_per_folder} favorites in a folder. Discard some favorites or choose a different folder, then try again.`
|
|
||||||
} else {
|
|
||||||
|
|
||||||
var createresult = ssid_sessions[socket.ssid].favstore.createFavorite(title, favurl, folder, image, imagetype);
|
|
||||||
|
|
||||||
headers = `200 OK
|
|
||||||
wtv-expire: wtv-favorite:/serve-browser?favorite_folder_name=${folder}`
|
|
||||||
}
|
}
|
||||||
|
if (request_headers.post_data) {
|
||||||
|
var POST = request_headers.post_data;
|
||||||
|
var image = hex_to_ascii(POST);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTitle(url) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
var page_title = "Web Page";
|
||||||
|
var request_type = (url.substring(0, 5) == "https") ? "https" : "http";
|
||||||
|
var proxy_agent = null;
|
||||||
|
switch (request_type) {
|
||||||
|
case "https":
|
||||||
|
var proxy_agent = require('https');
|
||||||
|
break;
|
||||||
|
case "http":
|
||||||
|
var proxy_agent = require('http');;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (proxy_agent) {
|
||||||
|
var options = {
|
||||||
|
method: 'GET'
|
||||||
|
}
|
||||||
|
const request = proxy_agent.get(url, options, (response) => {
|
||||||
|
let req_data = '';
|
||||||
|
if (response.statusCode == 301 || response.statusCode == 302) {
|
||||||
|
redirects++;
|
||||||
|
if (redirects < max_redirects) resolve(getTitle(response.headers.location));
|
||||||
|
else reject(`Too many redirects. Max: ${max_redirects}, Current: ${redirects}`);
|
||||||
|
}
|
||||||
|
response.on('data', (chunk) => {
|
||||||
|
req_data += chunk.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
response.on('end', () => {
|
||||||
|
let match = req_data.match(/<title>([^<]*)<\/title>/) // regular expression to parse contents of the <title> tag
|
||||||
|
if (match && typeof match[1] === 'string') page_title = match[1];
|
||||||
|
resolve(page_title);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
request.on('error', (error) => {
|
||||||
|
console.log(' *** Error getting title for wtv-favorite', error);
|
||||||
|
reject();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveFavorite(favstore, title, folder, imagetype, favurl) {
|
||||||
|
var headers, data = '';
|
||||||
|
if (!favstore.favstoreExists()) {
|
||||||
|
// create favstore if the user hasn't already navigated to favorites
|
||||||
|
favstore.createFavstore();
|
||||||
|
}
|
||||||
|
if (favstore.favstoreExists()) {
|
||||||
|
var default_folder = "Personal"; // default to "Personal"
|
||||||
|
var favoritenum = 0;
|
||||||
|
|
||||||
|
if (!folder) folder = default_folder;
|
||||||
|
if (!favstore.folderExists(folder)) {
|
||||||
|
// user did not define a folder, and the default folder does not exist
|
||||||
|
// so choose the user's first available folder
|
||||||
|
var favfolders = favstore.listFolders();
|
||||||
|
if (favfolders.length > 0) folder = favfolders[0];
|
||||||
|
}
|
||||||
|
if (!folder) {
|
||||||
|
// user has no folders, forcefully recreate "Personal"
|
||||||
|
folder = default_folder;
|
||||||
|
favstore.createTemplateFolder(folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
var favarray = favstore.listFavorites(folder);
|
||||||
|
favoritenum = Object.keys(favarray).length;
|
||||||
|
|
||||||
|
|
||||||
|
if (!title) {
|
||||||
|
try {
|
||||||
|
await getTitle(favurl).then(function (res) {
|
||||||
|
title = res;
|
||||||
|
if (!minisrv_config.config.debug_flags.quiet) console.log(" * Client sent favorite-url without title, got title:", title);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(" * Error: Client sent favorite-url without title, and we could not get the title from the server:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!image) {
|
||||||
|
imagetype = "url";
|
||||||
|
image = "canned/favorite_default.gif"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (favoritenum == minisrv_config.services[service_name].max_favorites_per_folder) {
|
||||||
|
headers = `400 You can only have ${minisrv_config.services[service_name].max_favorites_per_folder} favorites in a folder. Discard some favorites or choose a different folder, then try again.`
|
||||||
|
} else {
|
||||||
|
|
||||||
|
var createresult = favstore.createFavorite(title, favurl, folder, image, imagetype);
|
||||||
|
if (!createresult) { // true if fail
|
||||||
|
headers = `200 OK
|
||||||
|
wtv-expire: wtv-favorite:/serve-browser?favorite_folder_name=${folder}`
|
||||||
|
} else {
|
||||||
|
var err = wtvshared.doErrorPage(500);
|
||||||
|
headers = err[0];
|
||||||
|
data = err[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
sendToClient(socket, headers, data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var err = wtvshared.doErrorPage(500);
|
||||||
|
headers = err[0];
|
||||||
|
data = err[1];
|
||||||
|
sendToClient(socket, headers, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var title = request_headers.query['favorite-title'];
|
||||||
|
var folder = request_headers.query['favorite-category'];
|
||||||
|
if (folder) folder = folder.replaceAll("+", " ")
|
||||||
|
var imagetype = request_headers.query['favorite-thumbnail-type']
|
||||||
|
var favurl = request_headers.query['favorite-url'];
|
||||||
|
|
||||||
|
saveFavorite(ssid_sessions[socket.ssid].favstore, title, folder, imagetype, favurl);
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 770 B |
@@ -56,7 +56,6 @@ if (errpage) {
|
|||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html
|
Content-Type: text/html
|
||||||
wtv-expire-all: wtv-favorite:
|
wtv-expire-all: wtv-favorite:
|
||||||
wtv-visit: ${confirmAlert}
|
|
||||||
Location: ${confirmAlert}`
|
Location: ${confirmAlert}`
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@@ -72,7 +71,6 @@ Location: ${confirmAlert}`
|
|||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html
|
Content-Type: text/html
|
||||||
wtv-expire-all: wtv-favorite:
|
wtv-expire-all: wtv-favorite:
|
||||||
wtv-visit: ${gourl}
|
|
||||||
Location: ${gourl}`
|
Location: ${gourl}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ var minisrv_service_file = true;
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-
|
||||||
|
wtv-expire-all: wtv-favorite:/favorite`
|
||||||
|
|
||||||
|
|
||||||
data = `<HTML>
|
data = `<HTML>
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-`
|
||||||
|
|
||||||
|
|
||||||
data = `<html><head>
|
data = `<html><head>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ favoritenum = Object.keys(favarray).length;
|
|||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html
|
Content-Type: text/html
|
||||||
wtv-expire-all: wtv-favorite:/serve-browser
|
wtv-expire-all: wtv-favorite:/serve-
|
||||||
wtv-expire-all: wtv-favorite:/favorite
|
wtv-expire-all: wtv-favorite:/favorite
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ folderlist += "</select>"
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-`
|
||||||
|
|
||||||
|
|
||||||
data = `<html><head>
|
data = `<html><head>
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-`
|
||||||
|
|
||||||
|
|
||||||
data = `<html><head>
|
data = `<html><head>
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-`
|
||||||
|
|
||||||
|
|
||||||
data = `<html><head>
|
data = `<html><head>
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ var minisrv_service_file = true;
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-`
|
||||||
|
|
||||||
|
|
||||||
data = `<HTML>
|
data = `<HTML>
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
|
|||||||
|
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html`
|
Content-Type: text/html
|
||||||
|
wtv-expire-all: wtv-favorite:/serve-`
|
||||||
|
|
||||||
|
|
||||||
data = `<html>
|
data = `<html>
|
||||||
|
|||||||
@@ -135,78 +135,78 @@ class WTVFavorites {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createFavorite(title, url, folder, image, imagetype) {
|
createFavorite(title, url, folder, image, imagetype) {
|
||||||
var folderpath = this.getFolderDir(folder);
|
var folderpath = this.getFolderDir(folder);
|
||||||
var favoriteid = this.createFavoriteID();
|
var favoriteid = this.createFavoriteID();
|
||||||
var favoritefile = favoriteid + this.favFileExt;
|
var favoritefile = favoriteid + this.favFileExt;
|
||||||
var favoritefileout = folderpath + favoritefile;
|
var favoritefileout = folderpath + favoritefile;
|
||||||
if (imagetype != "url")
|
if (imagetype != "url")
|
||||||
image = btoa(image);
|
image = btoa(image);
|
||||||
|
|
||||||
title = decodeURIComponent(title).replaceAll("+", " ");
|
title = decodeURIComponent(title).replaceAll("+", " ");
|
||||||
url = decodeURIComponent(url)
|
url = decodeURIComponent(url)
|
||||||
var favoritedata = {
|
var favoritedata = {
|
||||||
"title": title,
|
"title": title,
|
||||||
"url": url,
|
"url": url,
|
||||||
"folder": folder,
|
"folder": folder,
|
||||||
"image": image,
|
"image": image,
|
||||||
"imagetype": imagetype,
|
"imagetype": imagetype,
|
||||||
"id": favoriteid
|
"id": favoriteid
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (this.fs.existsSync(favoritefileout)) {
|
if (this.fs.existsSync(favoritefileout)) {
|
||||||
console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost.");
|
console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode favorite into json
|
// encode favorite into json
|
||||||
var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata));
|
var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata));
|
||||||
if (!result) return false;
|
if (!result) return false;
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite ,"\n");
|
console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite, "\n");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
listFavorites(folder) {
|
listFavorites(folder) {
|
||||||
var folderpath = this.getFolderDir(folder);
|
var folderpath = this.getFolderDir(folder);
|
||||||
var self = this;
|
var self = this;
|
||||||
self.messageArr = [];
|
self.messageArr = [];
|
||||||
var files = this.fs.readdirSync(folderpath)
|
this.fs.readdirSync(folderpath)
|
||||||
.map(function (v) {
|
.map(function (v) {
|
||||||
var favorite_data_raw = null;
|
var favorite_data_raw = null;
|
||||||
var favoritepath = folderpath + self.path.sep + v;
|
var favoritepath = folderpath + self.path.sep + v;
|
||||||
if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath);
|
if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath);
|
||||||
if (favorite_data_raw) {
|
if (favorite_data_raw) {
|
||||||
var favorite_data = JSON.parse(favorite_data_raw);
|
var favorite_data = JSON.parse(favorite_data_raw);
|
||||||
self.messageArr.push(favorite_data);
|
self.messageArr.push(favorite_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
return self.messageArr;
|
return self.messageArr;
|
||||||
}
|
}
|
||||||
|
|
||||||
getFavorite(folder, favoriteid) {
|
getFavorite(folder, favoriteid) {
|
||||||
var folder_path = this.getFolderDir(folder);
|
var folder_path = this.getFolderDir(folder);
|
||||||
var folder_file = favoriteid + this.favFileExt;
|
var folder_file = favoriteid + this.favFileExt;
|
||||||
var folder_file_in = folder_path + this.path.sep + folder_file;
|
var folder_file_in = folder_path + this.path.sep + folder_file;
|
||||||
var folder_data_raw = null;
|
var folder_data_raw = null;
|
||||||
|
|
||||||
if (this.fs.existsSync(folder_file_in)) folder_data_raw = this.fs.readFileSync(folder_file_in);
|
if (this.fs.existsSync(folder_file_in)) folder_data_raw = this.fs.readFileSync(folder_file_in);
|
||||||
else console.error(" # FavErr: could not find ", folder_file_in);
|
else console.error(" # FavErr: could not find ", folder_file_in);
|
||||||
|
|
||||||
if (folder_data_raw) {
|
if (folder_data_raw) {
|
||||||
var folder_data = JSON.parse(folder_data_raw);
|
var folder_data = JSON.parse(folder_data_raw);
|
||||||
folder_data.folder_path = folder_path;
|
folder_data.folder_path = folder_path;
|
||||||
folder_data.folder_file = folder_file;
|
folder_data.folder_file = folder_file;
|
||||||
if (folder_data) {
|
if (folder_data) {
|
||||||
folder_data.id = favoriteid;
|
folder_data.id = favoriteid;
|
||||||
|
|
||||||
return folder_data;
|
return folder_data;
|
||||||
}
|
}
|
||||||
else console.error(" # FavErr: could not parse json in ", folder_file_in);
|
else console.error(" # FavErr: could not parse json in ", folder_file_in);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteFolder(folder){
|
deleteFolder(folder){
|
||||||
|
|||||||
Reference in New Issue
Block a user