diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js
index 6b0f9555..d86e9209 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/add.js
@@ -1,4 +1,8 @@
var minisrv_service_file = true;
+var request_is_async = true;
+
+var max_redirects = 3;
+var redirects = 0;
function hex_to_ascii(POST)
{
@@ -8,38 +12,127 @@ function hex_to_ascii(POST)
str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
}
return str;
- }
+}
+if (request_headers.post_data) {
+ var POST = request_headers.post_data;
+ var image = hex_to_ascii(POST);
+}
-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();
+ });
-var url = request_headers.request;
+ response.on('end', () => {
+ let match = req_data.match(/
([^<]*)<\/title>/) // regular expression to parse contents of the tag
+ if (match && typeof match[1] === 'string') page_title = match[1];
+ resolve(page_title);
+ });
+ });
-var title = url.split('favorite-title=')[1]
-title = title.split('&')[0]
+ request.on('error', (error) => {
+ console.log(' *** Error getting title for wtv-favorite', error);
+ reject();
+ });
+ }
+ });
+}
-var folder = url.split('favorite-category=')[1]
-folder = folder.split('&')[0]
-folder = folder.replaceAll("+", " ")
+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;
-var imagetype = url.split('favorite-thumbnail-type=')[1]
-imagetype = imagetype.split('&')[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 favurl = url.split('favorite-url=')[1]
-favurl = favurl.split('&')[0]
+ var favarray = favstore.listFavorites(folder);
+ favoritenum = Object.keys(favarray).length;
-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 {
+ 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);
+ }
+ }
-var createresult = ssid_sessions[socket.ssid].favstore.createFavorite(title, favurl, folder, image, imagetype);
+ if (!image) {
+ imagetype = "url";
+ image = "canned/favorite_default.gif"
+ }
-headers = `200 OK
+ 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}`
-}
\ No newline at end of file
+ } 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);
\ No newline at end of file
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/canned/favorite_default.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/canned/favorite_default.gif
new file mode 100644
index 00000000..66fa3184
Binary files /dev/null and b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/canned/favorite_default.gif differ
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js
index b4701981..c0d6e030 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/commit-discard-favorites.js
@@ -56,7 +56,6 @@ if (errpage) {
Connection: Keep-Alive
Content-Type: text/html
wtv-expire-all: wtv-favorite:
-wtv-visit: ${confirmAlert}
Location: ${confirmAlert}`
} else {
@@ -72,7 +71,6 @@ Location: ${confirmAlert}`
Connection: Keep-Alive
Content-Type: text/html
wtv-expire-all: wtv-favorite:
-wtv-visit: ${gourl}
Location: ${gourl}`
}
}
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js
index 8314a03d..614ac988 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-add-folder-page.js
@@ -2,7 +2,9 @@ var minisrv_service_file = true;
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-
+wtv-expire-all: wtv-favorite:/favorite`
data = `
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js
index d474618f..64caed6f 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-arrange-favorites.js
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-`
data = `
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js
index c5e26252..05ac1a37 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-browser.js
@@ -17,7 +17,7 @@ favoritenum = Object.keys(favarray).length;
headers = `200 OK
Connection: Keep-Alive
Content-Type: text/html
-wtv-expire-all: wtv-favorite:/serve-browser
+wtv-expire-all: wtv-favorite:/serve-
wtv-expire-all: wtv-favorite:/favorite
`
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js
index f9f26738..ecbca854 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-move-favorites.js
@@ -32,7 +32,8 @@ folderlist += ""
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-`
data = `
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js
index 7f1e2d9d..6980031d 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-organize-favorites.js
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-`
data = `
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js
index 79c5c1f5..b73b7284 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-rename-favorites.js
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-`
data = `
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js
index 45f0f955..5739915d 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-samples-page.js
@@ -2,7 +2,8 @@ var minisrv_service_file = true;
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-`
data = `
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js
index 267ce3ad..579648ae 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-favorite/serve-shortcuts-favorites.js
@@ -17,7 +17,8 @@ favoritenum = Object.keys(favarray).length;
headers = `200 OK
Connection: Keep-Alive
-Content-Type: text/html`
+Content-Type: text/html
+wtv-expire-all: wtv-favorite:/serve-`
data = `
diff --git a/zefie_wtvp_minisrv/WTVFavorites.js b/zefie_wtvp_minisrv/WTVFavorites.js
index 99ed4099..8aa9c9f7 100644
--- a/zefie_wtvp_minisrv/WTVFavorites.js
+++ b/zefie_wtvp_minisrv/WTVFavorites.js
@@ -135,78 +135,78 @@ class WTVFavorites {
}
createFavorite(title, url, folder, image, imagetype) {
- var folderpath = this.getFolderDir(folder);
- var favoriteid = this.createFavoriteID();
- var favoritefile = favoriteid + this.favFileExt;
- var favoritefileout = folderpath + favoritefile;
- if (imagetype != "url")
- image = btoa(image);
-
- title = decodeURIComponent(title).replaceAll("+", " ");
- url = decodeURIComponent(url)
- var favoritedata = {
- "title": title,
- "url": url,
- "folder": folder,
- "image": image,
- "imagetype": imagetype,
- "id": favoriteid
- }
- try {
- if (this.fs.existsSync(favoritefileout)) {
- console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost.");
- return false;
- }
+ var folderpath = this.getFolderDir(folder);
+ var favoriteid = this.createFavoriteID();
+ var favoritefile = favoriteid + this.favFileExt;
+ var favoritefileout = folderpath + favoritefile;
+ if (imagetype != "url")
+ image = btoa(image);
- // encode favorite into json
- var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata));
- if (!result) return false;
+ title = decodeURIComponent(title).replaceAll("+", " ");
+ url = decodeURIComponent(url)
+ var favoritedata = {
+ "title": title,
+ "url": url,
+ "folder": folder,
+ "image": image,
+ "imagetype": imagetype,
+ "id": favoriteid
+ }
+ try {
+ if (this.fs.existsSync(favoritefileout)) {
+ console.log(" * ERROR: Favorite with this UUID (" + favoriteid + ") already exists (should never happen). Favorite lost.");
+ return false;
+ }
- } catch (e) {
- console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite ,"\n");
- }
- return false;
- }
+ // encode favorite into json
+ var result = this.fs.writeFileSync(favoritefileout, JSON.stringify(favoritedata));
+ if (!result) return false;
+
+ } catch (e) {
+ console.error(" # FavErr: Favorite Store failed\n", e, "\n", favoritefileout, "\n", favorite, "\n");
+ }
+ return false;
+ }
listFavorites(folder) {
- var folderpath = this.getFolderDir(folder);
- var self = this;
- self.messageArr = [];
- var files = this.fs.readdirSync(folderpath)
- .map(function (v) {
- var favorite_data_raw = null;
- var favoritepath = folderpath + self.path.sep + v;
- if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath);
- if (favorite_data_raw) {
- var favorite_data = JSON.parse(favorite_data_raw);
- self.messageArr.push(favorite_data);
- }
-
- })
- return self.messageArr;
- }
+ var folderpath = this.getFolderDir(folder);
+ var self = this;
+ self.messageArr = [];
+ this.fs.readdirSync(folderpath)
+ .map(function (v) {
+ var favorite_data_raw = null;
+ var favoritepath = folderpath + self.path.sep + v;
+ if (self.fs.existsSync(favoritepath)) favorite_data_raw = self.fs.readFileSync(favoritepath);
+ if (favorite_data_raw) {
+ var favorite_data = JSON.parse(favorite_data_raw);
+ self.messageArr.push(favorite_data);
+ }
+
+ })
+ return self.messageArr;
+ }
getFavorite(folder, favoriteid) {
- var folder_path = this.getFolderDir(folder);
- var folder_file = favoriteid + this.favFileExt;
- var folder_file_in = folder_path + this.path.sep + folder_file;
- var folder_data_raw = null;
+ var folder_path = this.getFolderDir(folder);
+ var folder_file = favoriteid + this.favFileExt;
+ var folder_file_in = folder_path + this.path.sep + folder_file;
+ var folder_data_raw = null;
- 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);
+ 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);
- if (folder_data_raw) {
- var folder_data = JSON.parse(folder_data_raw);
- folder_data.folder_path = folder_path;
- folder_data.folder_file = folder_file;
- if (folder_data) {
- folder_data.id = favoriteid;
+ if (folder_data_raw) {
+ var folder_data = JSON.parse(folder_data_raw);
+ folder_data.folder_path = folder_path;
+ folder_data.folder_file = folder_file;
+ if (folder_data) {
+ folder_data.id = favoriteid;
- return folder_data;
- }
- else console.error(" # FavErr: could not parse json in ", folder_file_in);
- }
- return false;
+ return folder_data;
+ }
+ else console.error(" # FavErr: could not parse json in ", folder_file_in);
+ }
+ return false;
}
deleteFolder(folder){