implement remove-user functionality

This commit is contained in:
zefie
2022-03-18 21:36:09 -04:00
parent ebfc081efa
commit 0fa54babfb
5 changed files with 260 additions and 6 deletions

View File

@@ -8,6 +8,7 @@ if (ssid_sessions[socket.ssid].user_id != 0) {
} else { } else {
headers = `200 OK headers = `200 OK
Connection: Keep-Alive Connection: Keep-Alive
wtv-expire-all: wtv-setup:/accounts
Content-Type: text/html` Content-Type: text/html`
data = `<HTML> data = `<HTML>
@@ -112,14 +113,14 @@ Subscriber:
<TD COLSPAN=3 VALIGN=top ALIGN=right> <TD COLSPAN=3 VALIGN=top ALIGN=right>
<FONT COLOR="#E7CE4A" SIZE=-1><SHADOW> <FONT COLOR="#E7CE4A" SIZE=-1><SHADOW>
<INPUT action="/remove-users?user-count=x" <INPUT action="/remove-users?user-count=x"
name="RemoveUser" value="Remove User" WIDTH=140 ${(num_accounts >= 1) ? 'USESTYLE' : 'disabled="disabled" text=gray' } name="RemoveUser" value="Remove User" WIDTH=140 ${(num_accounts > 1) ? 'USESTYLE' : 'disabled="disabled" text=gray' }
TYPE=SUBMIT BORDERIMAGE="file://ROM/Borders/ButtonBorder2.bif" NAME="Button1" WIDTH=103> TYPE=SUBMIT BORDERIMAGE="file://ROM/Borders/ButtonBorder2.bif" NAME="Button1" WIDTH=103>
<IMG SRC="ROMCache/Spacer.gif" WIDTH=4 HEIGHT=1> <IMG SRC="ROMCache/Spacer.gif" WIDTH=4 HEIGHT=1>
<INPUT action="/add-user?user_count=${num_accounts}" <INPUT action="/add-user?user_count=${num_accounts}"
name="AddUser" value="Add User" WIDTH=120 ${(num_accounts >= minisrv_config.config.user_accounts.max_users_per_account) ? 'disabled="disabled" text=gray' : 'USESTYLE'} name="AddUser" value="Add User" WIDTH=120 ${(num_accounts >= minisrv_config.config.user_accounts.max_users_per_account) ? 'disabled="disabled" text=gray' : 'USESTYLE'}
TYPE=SUBMIT BORDERIMAGE="file://ROM/Borders/ButtonBorder2.bif" NAME="Button2" WIDTH=103> TYPE=SUBMIT BORDERIMAGE="file://ROM/Borders/ButtonBorder2.bif" NAME="Button2" WIDTH=103>
<IMG SRC="ROMCache/Spacer.gif" WIDTH=4 HEIGHT=1> <IMG SRC="ROMCache/Spacer.gif" WIDTH=4 HEIGHT=1>
<INPUT action="client:goback" <INPUT action="wtv-setup:/serve-billing-overview?"
name="Done" name="Done"
value="Done" value="Done"
WIDTH=120 WIDTH=120

View File

@@ -0,0 +1,164 @@
var minisrv_service_file = true;
if (Object.keys(ssid_sessions[socket.ssid].listPrimaryAccountUsers()).length == 1) {
errpage = wtvshared.doErrorPage(400, "There are no more users to remove.");
}
else if (ssid_sessions[socket.ssid].user_id != 0) errpage = wtvshared.doErrorPage(400, "You are not authorized to add users to this account.");
if (errpage) {
headers = errpage[0];
data = errpage[1];
} else {
headers = `200 OK
Connection: Keep-Alive
wtv-expire-all: wtv-setup:/remove-users
wtv-expire-all: wtv-setup:/validate-remove-users
Content-Type: text/html`
data = `<HTML>
<HTML>
<HEAD>
<TITLE>
Remove users
</TITLE>
<DISPLAY nosave
noscroll>
</HEAD>
<sidebar width=110> <table cellspacing=0 cellpadding=0 BGCOLOR=30364D>
<tr>
<td colspan=3 abswidth=104 absheight=4>
<td rowspan=99 width=6 absheight=420 valign=top align=left>
<img src="wtv-home:/ROMCache/Shadow.gif" width=6 height=420>
<tr>
<td abswidth=6>
<td abswidth=92 absheight=76>
<table href="wtv-home:/home" absheight=76 cellspacing=0 cellpadding=0>
<tr>
<td align=right>
<img src="${minisrv_config.config.service_logo}" width=87 height=67>
</table>
<td abswidth=6>
<tr><td absheight=5 colspan=3>
<table cellspacing=0 cellpadding=0>
<tr><td abswidth=104 absheight=2 valign=middle align=center bgcolor=1C1E28>
<img src="wtv-home:/ROMCache/Spacer.gif" width=1 height=1>
<tr><td abswidth=104 absheight=1 valign=top align=left>
<tr><td abswidth=104 absheight=2 valign=top align=left bgcolor=4D5573>
<img src="wtv-home:/ROMCache/Spacer.gif" width=1 height=1>
</table>
<tr><td absheight=37>
<tr><td absheight=263 align=right colspan=3>
<img src="ROMCache/AccountBanner.gif" width=53 height=263>
<tr><td absheight=41>
</table>
</sidebar>
<BODY NOHTILEBG BGCOLOR="#191919" TEXT="#42CC55" LINK="36d5ff" VLINK="36d5ff" HSPACE=0 VSPACE=0 FONTSIZE="large"
>
<TABLE cellspacing=0 cellpadding=0>
<TR><TD width=20><img src="wtv-home:/ROMCache/Spacer.gif" width=20 height=1>
<TD colspan=3 height=16 valign=top align=left>
<TR>
<TD width=20>
<TD colspan=3 height=39 valign=top>
<FONT size=+2 color="42CC55"> <blackface><shadow>
Remove users </shadow></blackface>
</FONT>
<TR><TD width=10>
<TD colspan=5 height=56 valign=top>
<TABLE cellspacing=0 cellpadding=0>
<TD width=400>
<FONT color="42CC55">
Mark users to remove permanently from your account,
then choose <b>Remove</b>.
</FONT>
<TD align=right>
</TABLE>
<td abswidth=20>
<TR>
<td>
<td WIDTH=198 HEIGHT=214 VALIGN=top ALIGN=left>
<FONT COLOR="44cc55"><B>
<TABLE CELLSPACING=0 CELLPADDING=0>
<TR><TD COLSPAN=3 HEIGHT=2 VALIGN=MIDDLE ALIGN=CENTER BGCOLOR="2B2B2B"><IMG SRC="ROMCache/spacer.gif" WIDTH=10 HEIGHT=1>
<TR><TD COLSPAN=3 HEIGHT=1 VALIGN=TOP ALIGN=LEFT>
<TR><TD COLSPAN=3 HEIGHT=2 VALIGN=TOP ALIGN=LEFT BGCOLOR="0D0D0D"><IMG SRC="ROMCache/spacer.gif" WIDTH=10 HEIGHT=1>
<TR><TD abswidth=54 absheight=25 valign=middle align=left>
<TD abswidth=230 valign=left align=left>
<font><blackface>Name</blackface></font>
<TD abswidth=150 valign=left align=right>
<font size="-1"><blackface>New Messages</blackface></font>
<TR><TD COLSPAN=3 HEIGHT=2 VALIGN=MIDDLE ALIGN=CENTER BGCOLOR="2B2B2B"><IMG SRC="ROMCache/spacer.gif" WIDTH=1 HEIGHT=1>
<TR><TD COLSPAN=3 HEIGHT=1 VALIGN=TOP ALIGN=LEFT>
<TR><TD COLSPAN=3 HEIGHT=2 VALIGN=TOP ALIGN=LEFT BGCOLOR="0D0D0D"><IMG SRC="ROMCache/spacer.gif" WIDTH=1 HEIGHT=1>
<TR><TD COLSPAN=3 HEIGHT=0>
<P><FORM ACTION="wtv-setup:/validate-remove-users" METHOD="POST">
`;
var accounts = ssid_sessions[socket.ssid].listPrimaryAccountUsers();
var num_accounts = ssid_sessions[socket.ssid].getNumberOfUserAccounts();
if (num_accounts > 1) {
delete accounts.subscriber;
for (const [key, value] of Object.entries(accounts)) {
var userSession = new WTVClientSessionData(minisrv_config, socket.ssid);
userSession.user_id = parseInt(key.replace("user", ''));
var mailcount = 0;
if (userSession.mailstore.mailstoreExists()) {
if (userSession.mailstore.mailboxExists(0)) {
mailcount = userSession.mailstore.countUnreadMessages(0);
}
}
data += `<FONT COLOR="42CC55"><B>
<TR><TD COLSPAN=3 HEIGHT=5>
<tr>
<td colspan=2><input type=checkbox name="${key}"><font size=+1> <b>${value.subscriber_username}</b>
<td align=right>${mailcount}
</tr>
</B></FONT>
`;
}
}
data += `
</table>
<TR>
<TD>
<TD COLSPAN=4 HEIGHT=4 VALIGN=top ALIGN=left>
<tr>
<TD>
<td colspan=4 height=2 valign=middle align=center bgcolor="2B2B2B">
<img src="wtv-home:/ROMCache/Spacer.gif" width=436 height=1>
<tr>
<TD>
<td colspan=4 height=1 valign=top align=left>
<tr>
<TD>
<td colspan=4 height=2 valign=top align=left bgcolor="0D0D0D">
<img src="wtv-home:/ROMCache/Spacer.gif" width=436 height=1>
<TR>
<TD>
<TD COLSPAN=4 HEIGHT=4 VALIGN=top ALIGN=left>
<TR>
<TD>
<TD COLSPAN=3 VALIGN=top ALIGN=right>
<FONT COLOR="#E7CE4A" SIZE=-1><SHADOW>
<INPUT type="submit"
name="Remove" value="Remove" WIDTH=103 USESTYLE
TYPE=SUBMIT BORDERIMAGE="file://ROM/Borders/ButtonBorder2.bif" NAME="Button1" WIDTH=103>
<IMG SRC="wtv-home:/ROMCache/Spacer.gif" WIDTH=4 HEIGHT=1>
<INPUT action="wtv-setup:/accounts?"
name="Done"
value="Done"
WIDTH=103
selected
TYPE=SUBMIT BORDERIMAGE="file://ROM/Borders/ButtonBorder2.bif" NAME="Button3" USESTYLE WIDTH=103>
</SHADOW></FONT></FORM>
<TD>
</TABLE>
</BODY>
</HTML>
`;
}

View File

@@ -0,0 +1,74 @@
var minisrv_service_file = true;
if (Object.keys(ssid_sessions[socket.ssid].listPrimaryAccountUsers()).length == 1) {
errpage = wtvshared.doErrorPage(400, "There are no more users to remove.");
}
else if (ssid_sessions[socket.ssid].user_id != 0) errpage = wtvshared.doErrorPage(400, "You are not authorized to remove users from this account.");
var usersToRemove = [];
Object.keys(request_headers.query).forEach(function (k) {
if (k.substr(0, 4) === "user" && request_headers.query[k] === "on") {
usersToRemove.push(parseInt(k.replace("user", "")));
}
});
if (usersToRemove.length === 0) errpage = wtvshared.doErrorPage(400, "No users were specified for removal.");
if (errpage) {
headers = errpage[0];
data = errpage[1];
} else {
if (!request_headers.query.confirm_remove) {
var message = '';
if (usersToRemove.length == 1) {
var userSession = new WTVClientSessionData(minisrv_config, socket.ssid);
userSession.switchUserID(usersToRemove[0]);
var userName = userSession.getSessionData("subscriber_username");
message = `Removing <b>${userName}</b> will permanently remove all of <b>${userName}</b>'s e-mail and favorites as well. You will not be able to restore <b>${userName}</b>.`;
} else {
message = "Removing the selected users will permanently remove their e-mail and favorites as well. You will not be able to restore the users.";
}
var removeurl = request_headers.request_url;
if (removeurl.indexOf('?') >= 0) {
removeurl = removeurl.substring(0, removeurl.indexOf('?'));
}
removeurl += "?";
Object.keys(usersToRemove).forEach(function (k) {
removeurl += "user" + usersToRemove[k] + "=on&";
});
removeurl += "confirm_remove=true";
var confirmAlert = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': message,
'buttonlabel1': "Don't Remove",
'buttonaction1': "client:donothing",
'buttonlabel2': "Remove",
'buttonaction2': removeurl,
'noback': true,
}).getURL();
headers = `300 OK
Connection: Keep-Alive
Content-Type: text/html
wtv-expire-all: wtv-setup:/remove-users
wtv-expire-all: wtv-setup:/accounts
wtv-visit: ${confirmAlert}
Location: ${confirmAlert}`
} else {
Object.keys(usersToRemove).forEach(function (k) {
ssid_sessions[socket.ssid].removeUser(usersToRemove[k]);
})
var num_accounts = ssid_sessions[socket.ssid].getNumberOfUserAccounts();
var gourl = "wtv-setup:/remove-users?";
if (num_accounts == 1) gourl = "wtv-setup:/accounts?";
headers = `300 OK
Connection: Keep-Alive
Content-Type: text/html
wtv-expire-all: wtv-setup:/remove-users
wtv-expire-all: wtv-setup:/accounts
wtv-visit: ${gourl}
Location: ${gourl}`
}
}

View File

@@ -173,13 +173,26 @@ class WTVClientSessionData {
* @param subscriber {boolean} Returns the parent subscriber directory instead of the user's directory * @param subscriber {boolean} Returns the parent subscriber directory instead of the user's directory
* @returns {string|boolean} Absolute path to the user's file store, or false if unregistered * @returns {string|boolean} Absolute path to the user's file store, or false if unregistered
*/ */
getUserStoreDirectory(subscriber = false) { getUserStoreDirectory(subscriber = false, user_id = null) {
//if (!this.isRegistered()) return false; if (user_id == null) user_id = this.user_id;
var userstore = this.minisrv_config.config.SessionStore + this.path.sep + this.ssid + this.path.sep; var userstore = this.minisrv_config.config.SessionStore + this.path.sep + this.ssid + this.path.sep;
if (!subscriber) userstore += "user" + this.user_id + this.path.sep; if (!subscriber) userstore += "user" + user_id + this.path.sep;
return userstore; return userstore;
} }
removeUser(user_id) {
if (!this.isRegistered()) return false; // not registered
if (parseInt(this.user_id) !== 0) return false; // not primary account
if (user_id === 0) return false; // cannot delete primary account in this fashion
var userstore = this.getUserStoreDirectory(false, user_id);
if (this.fs.existsSync(userstore)) {
this.fs.rmSync(userstore, { recursive: true });
return true;
}
return false;
}
/** /**
* Store a file in the user's file store * Store a file in the user's file store
* @param {string} path Relative path to User's file store * @param {string} path Relative path to User's file store
@@ -496,7 +509,7 @@ class WTVClientSessionData {
this.session_store = {}; this.session_store = {};
} }
if (this.fs.existsSync(user_store_base)) { if (this.fs.existsSync(user_store_base)) {
this.fs.rmdirSync(user_store_base, { recursive: true }); this.fs.rmSync(user_store_base, { recursive: true });
} }
return true; return true;
} catch (e) { } catch (e) {

View File

@@ -282,6 +282,8 @@
<Content Include="ServiceVault\wtv-setup\phone-call-waiting.js" /> <Content Include="ServiceVault\wtv-setup\phone-call-waiting.js" />
<Content Include="ServiceVault\wtv-setup\phone-reset.js" /> <Content Include="ServiceVault\wtv-setup\phone-reset.js" />
<Content Include="ServiceVault\wtv-setup\phone.js" /> <Content Include="ServiceVault\wtv-setup\phone.js" />
<Content Include="ServiceVault\wtv-setup\validate-remove-users.js" />
<Content Include="ServiceVault\wtv-setup\remove-users.js" />
<Content Include="ServiceVault\wtv-setup\reset-musicobj.js"> <Content Include="ServiceVault\wtv-setup\reset-musicobj.js">
<SubType>Code</SubType> <SubType>Code</SubType>
</Content> </Content>