Added CTemplate support which included upgrading String.cpp/h and FileUtils.cpp/h and fixing some issues

git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@603 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
prozacx
2006-02-05 05:01:53 +00:00
parent 2cd52ad39a
commit ecf431f246
10 changed files with 992 additions and 390 deletions

View File

@@ -6,6 +6,7 @@
#include "znc.h"
#include "HTTPSock.h"
#include "Server.h"
#include "Template.h"
class CWebAdminMod;
@@ -18,19 +19,13 @@ public:
virtual bool OnPageRequest(const CString& sURI, CString& sPageRet);
virtual bool OnLogin(const CString& sUser, const CString& sPass);
CString Header(const CString& sTitle);
CString Footer();
void PrintMainPage(CString& sPageRet) {
sPageRet = Header("Main Page");
sPageRet += "Welcome to the ZNC webadmin module.\r\n";
sPageRet += Footer();
}
void PrintPage(CString& sPageRet, const CString& sTmplName);
void GetErrorPage(CString& sPageRet, const CString& sError) {
sPageRet = Header("Error");
sPageRet += "<h2>" + sError.Escape_n(CString::EHTML) + "</h2>\r\n";
sPageRet += Footer();
m_Template["Title"] = "Error";
m_Template["Error"] = sError;
PrintPage(sPageRet, "Error.tmpl");
}
void ListUsersPage(CString& sPageRet);
@@ -40,32 +35,6 @@ public:
bool UserPage(CString& sPageRet, CUser* pUser = NULL);
CUser* GetNewUser(CString& sPageRet, CUser* pUser);
void ListPage(CString& sPageRet) {
VCString vsParams;
const map<CString, VCString>& msvsParams = GetParams();
sPageRet = Header("fooooooo");
if (msvsParams.empty()) {
sPageRet += "You passed in no params.\r\n";
} else {
sPageRet += "foo [" + GetParamString().Escape_n(CString::EHTML) + "]<br><br>";
for (map<CString, VCString>::const_iterator it = msvsParams.begin(); it != msvsParams.end(); it++) {
sPageRet += "<h2>" + it->first + "</h2>\r\n<ul>\r\n";
const VCString vsParams = it->second;
for (unsigned int a = 0; a < vsParams.size(); a++) {
sPageRet += "<li>[" + vsParams[a] + "]</li>\r\n";
}
sPageRet += "</ul>\r\n";
}
}
sPageRet += Footer();
}
CString GetModArgs(const CString& sModName, bool bGlobal = false) {
if (!bGlobal && !m_pUser) {
return "";
@@ -92,6 +61,7 @@ protected:
CWebAdminMod* m_pModule;
CUser* m_pUser;
bool m_bAdmin;
CTemplate m_Template;
};
class CWebAdminMod : public CGlobalModule {
@@ -151,35 +121,22 @@ private:
set<CWebAdminSock*> m_sSocks;
};
CString CWebAdminSock::Header(const CString& sTitle) {
CString sRet = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n"
"<html>\r\n<head><title>ZNC - " + sTitle.Escape_n(CString::EHTML) + "</title></head>\r\n"
"<body bgcolor='#FFFFFF' text='#000000' link='#000000' alink='#000000' vlink='#000000'>\r\n"
"<table border='0' cellpadding='10' cellspacing='0' height='100%' width='100%'>\r\n"
"<tr><td style='border-bottom: 2px solid #000;' colspan='2' valign='top'>"
"<table border='0' cellpadding='0' cellspacing='0' width='100%'><tr>"
"<td width='200'>&nbsp;</td>"
"<td align='center'><h2 style='white-space: nowrap;'>" + sTitle.Escape_n(CString::EHTML) + "</h2></td>"
"<td align='right' width='200'><b>" + GetUser().Escape_n(CString::EHTML) + "@" + GetRemoteIP().Escape_n(CString::EHTML) + "</b></td>"
"</tr></table>"
"</td></tr>\r\n"
"<tr><td style='white-space: nowrap; border-right: 1px solid #000;' valign='top'>\r\n";
void CWebAdminSock::PrintPage(CString& sPageRet, const CString& sTmplName) {
sPageRet.clear();
CString sModPath = CZNC::Get().FindModPath(m_pModule->GetModName());
if (IsAdmin()) {
sRet += "[<a href='/'>Home</a>]<br>\r\n"
"[<a href='/settings'>Settings</a>]<br>\r\n"
"[<a href='/adduser'>Add User</a>]<br>\r\n"
"[<a href='/listusers'>List Users</a>]<br>\r\n";
while (!sModPath.empty() && sModPath.Right(1) != "/") {
sModPath.RightChomp();
}
sRet += "</td><td height='100%' width='100%' valign='top'>\r\n";
if (!m_Template.SetFile(sModPath + "/webadmin/" + sTmplName)) {
return;
}
return sRet;
}
stringstream oStr;
m_Template.Print(oStr);
CString CWebAdminSock::Footer() {
return "</td></tr><tr><td colspan='2' align='right' valign='bottom'>" + CZNC::Get().GetTag().Escape_n(CString::EHTML) + "</td></tr>\r\n"
"</table></body>\r\n</html>\r\n";
sPageRet = oStr.str();
}
bool CWebAdminSock::OnLogin(const CString& sUser, const CString& sPass) {
@@ -204,28 +161,22 @@ bool CWebAdminSock::OnLogin(const CString& sUser, const CString& sPass) {
void CWebAdminSock::ListUsersPage(CString& sPageRet) {
const map<CString,CUser*>& msUsers = CZNC::Get().GetUserMap();
sPageRet = Header("List Users");
m_Template["Title"] = "List Users";
if (!msUsers.size()) {
sPageRet += "There are no users defined. Click <a href=\"/adduser\">here</a> if you would like to add one.\r\n";
} else {
sPageRet += "<table style='border: 1px solid #000;' cellspacing='0' cellpadding='4'>\r\n"
"\t<thead><tr bgcolor='#FFFF99'><td style='border: 1px solid #000;'><b>Action</b></td><td style='border: 1px solid #000;'><b>Username</b></td><td style='border: 1px solid #000;'><b>Current Server</b></td></tr></thead>\r\n";
unsigned int a = 0;
unsigned int a = 0;
for (map<CString,CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); it++, a++) {
CServer* pServer = it->second->GetCurrentServer();
sPageRet += "\t<tr bgcolor='" + CString((a %2) ? "#FFFFCC" : "#CCCC99") + "'>\r\n\t\t<td style='border: 1px solid #000;'>[<a href=\"/edituser?user=" + it->second->GetUserName().Escape_n(CString::EURL) + "\">Edit</a>] [<a href=\"/deluser?user=" + it->second->GetUserName().Escape_n(CString::EURL) + "\">Delete</a>]</td>\r\n"
"\t\t<td style='border: 1px solid #000;'>" + it->second->GetUserName().Escape_n(CString::EHTML) + "</td>\r\n"
"\t\t<td style='border: 1px solid #000;'>" + CString((pServer) ? pServer->GetName().Escape_n(CString::EHTML) : "-N/A-") + "</td>\r\n"
"\t</tr>";
for (map<CString,CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); it++, a++) {
CServer* pServer = it->second->GetCurrentServer();
CTemplate& l = m_Template.AddRow("UserLoop");
l["User"] = it->second->GetUserName();
if (pServer) {
l["Server"] = pServer->GetName();
}
sPageRet +="\r\n</table>\r\n";
}
sPageRet += Footer();
PrintPage(sPageRet, "ListUsers.tmpl");
}
Csock* CWebAdminSock::GetSockObj(const CString& sHost, unsigned short uPort) {
@@ -258,13 +209,21 @@ bool CWebAdminSock::OnPageRequest(const CString& sURI, CString& sPageRet) {
return false;
}
m_Template["User"] = GetUser();
m_Template["UserIP"] = GetRemoteIP();
if (IsAdmin()) {
m_Template["IsAdmin"] = "true";
}
if (sURI == "/") {
if (!IsAdmin()) {
Redirect("/edituser");
return false;
}
PrintMainPage(sPageRet);
m_Template["Title"] = "Main Page";
PrintPage(sPageRet, "Main.tmpl");
} else if (sURI == "/settings") {
if (!IsAdmin()) {
return false;
@@ -392,8 +351,6 @@ bool CWebAdminSock::OnPageRequest(const CString& sURI, CString& sPageRet) {
} else {
GetErrorPage(sPageRet, "No such username");
}
//} else if (sURI == "/list") {
// ListPage(sPageRet);
} else {
return false;
}
@@ -403,61 +360,45 @@ bool CWebAdminSock::OnPageRequest(const CString& sURI, CString& sPageRet) {
bool CWebAdminSock::SettingsPage(CString& sPageRet) {
if (!GetParam("submitted").ToUInt()) {
sPageRet = Header("Settings");
CString sVHosts, sMotd;
m_Template["Title"] = "Settings";
m_Template["StatusPrefix"] = CZNC::Get().GetStatusPrefix();
m_Template["ISpoofFile"] = CZNC::Get().GetISpoofFile();
m_Template["ISpoofFormat"] = CZNC::Get().GetISpoofFormat();
const VCString& vsVHosts = CZNC::Get().GetVHosts();
for (unsigned int a = 0; a < vsVHosts.size(); a++) {
sVHosts += vsVHosts[a] + "\r\n";
CTemplate& l = m_Template.AddRow("VHostLoop");
l["VHost"] = vsVHosts[a];
}
const VCString& vsMotd = CZNC::Get().GetMotd();
for (unsigned int b = 0; b < vsMotd.size(); b++) {
sMotd += vsMotd[b] + "\r\n";
CTemplate& l = m_Template.AddRow("MOTDLoop");
l["Line"] = vsMotd[b];
}
sPageRet += "<br><form action='/settings' method='POST'>\r\n"
"<input type='hidden' name='submitted' value='1'>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>Global Settings</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<div><small><b>Status Prefix:</b></small><br>\r\n"
"<input type='text' name='statusprefix' value='" + CZNC::Get().GetStatusPrefix().Escape_n(CString::EHTML) + "' size='32' maxlength='128'></div><br>\r\n"
"<div style='float: left; margin-right: 10px;'><small><b>ISpoofFile:</b></small><br>\r\n"
"<input type='text' name='ispooffile' value='" + CZNC::Get().GetISpoofFile().Escape_n(CString::EHTML) + "' size='32' maxlength='128'></div>\r\n"
"<div><small><b>ISpoofFormat:</b></small><br>\r\n"
"<input type='text' name='ispoofformat' value='" + CZNC::Get().GetISpoofFormat().Escape_n(CString::EHTML) + "' size='32' maxlength='128'></div>\r\n"
"<br><div><small><b>MOTD:</b></small><br>\r\n"
"<textarea name='motd' cols='80' rows='5'>" + sMotd.Escape_n(CString::EHTML) + "</textarea></div>\r\n"
"<br><div><small><b>VHosts:</b></small><br>\r\n"
"<textarea name='vhosts' cols='40' rows='5'>" + sVHosts.Escape_n(CString::EHTML) + "</textarea></div>\r\n"
"<br></div></div><br><br>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>Global Modules</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<table cellspacing='0' cellpadding='3' style='border: 1px solid #000;'>\r\n"
"<tr style='font-weight: bold; background: #ff9;'><td style='border: 1px solid #000;'>Name</td><td style='border: 1px solid #000;'>Arguments</td><td style='border: 1px solid #000;'>Description</td></tr>\r\n";
set<CModInfo> ssGlobalMods;
CZNC::Get().GetModules().GetAvailableMods(ssGlobalMods, true);
unsigned int uIdx = 0;
for (set<CModInfo>::iterator it = ssGlobalMods.begin(); it != ssGlobalMods.end(); it++) {
const CModInfo& Info = *it;
sPageRet += "<tr style='background: " + CString((uIdx++ %2) ? "#ffc" : "#cc9") + "'><td style='border: 1px solid #000;'><input type='checkbox' name='loadmod' id='lm_" + Info.GetName().Escape_n(CString::EHTML) + "' value='" + Info.GetName().Escape_n(CString::EHTML) + "'" + CString((CZNC::Get().GetModules().FindModule(Info.GetName())) ? " CHECKED" : "") + CString((Info.GetName() == m_pModule->GetModName()) ? " DISABLED" : "") + "><label for='lm_" + Info.GetName().Escape_n(CString::EHTML) + "'> " + Info.GetName().Escape_n(CString::EHTML) + "</label></td>"
"<td style='border: 1px solid #000;'><input type='text' name='modargs_" + Info.GetName().Escape_n(CString::EHTML) + "' value='" + GetModArgs(Info.GetName(), true) + "'" + CString((Info.GetName() == m_pModule->GetModName()) ? " DISABLED" : "") + "></td>"
"<td style='border: 1px solid #000;'>" + Info.GetDescription().Escape_n(CString::EHTML) + "</td></tr>";
CTemplate& l = m_Template.AddRow("ModuleLoop");
if (CZNC::Get().GetModules().FindModule(Info.GetName())) {
l["Checked"] = "true";
}
if (Info.GetName() == m_pModule->GetModName()) {
l["Disabled"] = "true";
}
l["Name"] = Info.GetName();
l["Description"] = Info.GetDescription();
l["Args"] = GetModArgs(Info.GetName(), true);
}
sPageRet += "</table><br></div></div><br><br>\r\n"
"<input type='submit' value='Submit'>\r\n"
"</form>\r\n";
sPageRet += Footer();
PrintPage(sPageRet, "Settings.tmpl");
return true;
}
@@ -467,7 +408,8 @@ bool CWebAdminSock::SettingsPage(CString& sPageRet) {
sArg = GetParam("ispoofformat"); CZNC::Get().SetISpoofFormat(sArg);
//sArg = GetParam(""); if (!sArg.empty()) { CZNC::Get().Set(sArg); }
VCString vsArgs = GetParam("motd").Split("\n");
VCString vsArgs;
GetParam("motd").Split("\n", vsArgs);
CZNC::Get().ClearMotd();
unsigned int a = 0;
@@ -475,7 +417,7 @@ bool CWebAdminSock::SettingsPage(CString& sPageRet) {
CZNC::Get().AddMotd(vsArgs[a].TrimRight_n());
}
vsArgs = GetParam("vhosts").Split("\n");
GetParam("vhosts").Split("\n", vsArgs);
CZNC::Get().ClearVHosts();
for (a = 0; a < vsArgs.size(); a++) {
@@ -536,49 +478,39 @@ bool CWebAdminSock::ChanPage(CString& sPageRet, CChan* pChan) {
}
if (!GetParam("submitted").ToUInt()) {
sPageRet = Header(CString((pChan) ? "Edit" : "Add") + " Channel" + CString((pChan) ? (" [" + pChan->GetName() + "]") : "") + " for User [" + m_pUser->GetUserName() + "]");
sPageRet += "<br><form action='" + CString((pChan) ? "/editchan" : "/addchan") + "' method='POST'>\r\n"
"<input type='hidden' name='submitted' value='1'>\r\n"
"<input type='hidden' name='user' value='" + m_pUser->GetUserName().Escape_n(CString::EHTML) + "'>\r\n";
if (pChan) {
sPageRet += "<input type='hidden' name='chan' value='" + pChan->GetName().Escape_n(CString::EHTML) + "'>\r\n";
}
m_Template["Edit"] = "true";
m_Template["Title"] = "Edit Channel" + CString(" [" + pChan->GetName() + "]");
m_Template["ChanName"] = pChan->GetName();
m_Template["BufferCount"] = CString::ToString(pChan->GetBufferCount());
m_Template["DefModes"] = pChan->GetDefaultModes();
sPageRet += "<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>Channel Info</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<table border='0' cellpadding='12' cellspacing='0'>\r\n"
"<tr>\r\n"
"<td><small><b>Channel Name:</b></small><br>\r\n";
if (pChan) {
sPageRet += "<input type='hidden' name='name' value='" + pChan->GetName().Escape_n(CString::EHTML) + "'>" + pChan->GetName().Escape_n(CString::EHTML) + "</td>\r\n";
if (pChan->InConfig()) {
m_Template["InConfig"] = "true";
}
} else {
sPageRet += "<input type='text' name='name' value='' size='32'></td>\r\n";
m_Template["Title"] = "Add Channel" + CString(" for User [" + m_pUser->GetUserName() + "]");
m_Template["BufferCount"] = "50";
m_Template["DefModes"] = "+stn";
m_Template["InConfig"] = "true";
}
sPageRet += "<td><small><b>Buffer Count:</b></small><br>\r\n"
"<input type='text' name='buffercount' value='" + CString((pChan) ? CString::ToString(pChan->GetBufferCount()) : "50") + "' size='8'></td>\r\n"
CTemplate& o1 = m_Template.AddRow("OptionLoop");
o1["Name"] = "autocycle";
o1["DisplayName"] = "Auto Cycle";
if (!pChan || pChan->AutoCycle()) { o1["Checked"] = "true"; }
"<td><small><b>Default Modes:</b></small><br>\r\n"
"<input type='text' name='defmodes' value='" + CString((pChan) ? pChan->GetDefaultModes().Escape_n(CString::EHTML) : "+stn") + "' size='16'></td>\r\n"
"</tr>\r\n"
CTemplate& o2 = m_Template.AddRow("OptionLoop");
o2["Name"] = "keepbuffer";
o2["DisplayName"] = "Keep Buffer";
if (!pChan || pChan->KeepBuffer()) { o2["Checked"] = "true"; }
"<tr>\r\n"
"<td><small><b>Save:</b></small><br>\r\n"
"<input type='checkbox' name='save' id='save' value='true'" + CString((!pChan || pChan->InConfig()) ? " CHECKED" : "") + "><label for='save'> Save to config</label></td>\r\n"
CTemplate& o3 = m_Template.AddRow("OptionLoop");
o3["Name"] = "detached";
o3["DisplayName"] = "Detached";
if (pChan && pChan->IsDetached()) { o3["Checked"] = "true"; }
"<td colspan='2'><small><b>Options:</b></small><br>\r\n"
"<input type='checkbox' name='autocycle' id='autocycle' value='true'" + CString((!pChan || pChan->AutoCycle()) ? " CHECKED" : "") + "><label for='autocycle'> AutoCycle</label>\r\n"
"<input type='checkbox' name='keepbuffer' id='keepbuffer' value='true'" + CString((!pChan || pChan->KeepBuffer()) ? " CHECKED" : "") + "><label for='keepbuffer'> KeepBuffer</label>\r\n"
"<input type='checkbox' name='detached' id='detached' value='true'" + CString((pChan && pChan->IsDetached()) ? " CHECKED" : "") + "><label for='detached'> Detached</label>\r\n"
"</td>\r\n"
"</tr>\r\n"
"</table>\r\n"
"</div></div><br><br>\r\n"
"<input type='submit' value='" + CString((pChan) ? "Save" : "Add Channel") + "'>\r\n"
"</form>\r\n";
sPageRet += Footer();
PrintPage(sPageRet, "Channel.tmpl");
return true;
}
@@ -653,199 +585,146 @@ bool CWebAdminSock::DelChan(CString& sPageRet) {
bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) {
if (!GetParam("submitted").ToUInt()) {
sPageRet = Header((pUser) ? CString("Edit User [" + pUser->GetUserName() + "]") : CString("Add User"));
CString sAllowedHosts, sServers, sChans, sCTCPReplies;
if (pUser) {
m_Template["Title"] = "Edit User [" + pUser->GetUserName() + "]";
m_Template["Edit"] = "true";
m_Template["Username"] = pUser->GetUserName();
m_Template["Nick"] = pUser->GetNick();
m_Template["AltNick"] = pUser->GetAltNick();
m_Template["AwaySuffix"] = pUser->GetAwaySuffix();
m_Template["StatusPrefix"] = pUser->GetStatusPrefix();
m_Template["Ident"] = pUser->GetIdent();
m_Template["RealName"] = pUser->GetRealName();
m_Template["QuitMsg"] = pUser->GetQuitMsg();
m_Template["DefaultChanModes"] = pUser->GetDefaultChanModes();
m_Template["BufferCount"] = CString::ToString(pUser->GetBufferCount());
const set<CString>& ssAllowedHosts = pUser->GetAllowedHosts();
for (set<CString>::const_iterator it = ssAllowedHosts.begin(); it != ssAllowedHosts.end(); it++) {
sAllowedHosts += *it + "\r\n";
CTemplate& l = m_Template.AddRow("AllowedHostLoop");
l["Host"] = *it;
}
const vector<CServer*>& vServers = pUser->GetServers();
for (unsigned int a = 0; a < vServers.size(); a++) {
sServers += vServers[a]->GetString() + "\r\n";
CTemplate& l = m_Template.AddRow("ServerLoop");
l["Server"] = vServers[a]->GetString();
}
const vector<CChan*>& vChans = pUser->GetChans();
for (unsigned int b = 0; b < vChans.size(); b++) {
CChan* pChan = vChans[b];
if (pChan->InConfig()) {
sChans += vChans[b]->GetName() + "\r\n";
}
}
const MCString& msCTCPReplies = pUser->GetCTCPReplies();
for (MCString::const_iterator it2 = msCTCPReplies.begin(); it2 != msCTCPReplies.end(); it2++) {
sCTCPReplies += it2->first + " " + it2->second + "\r\n";
CTemplate& l = m_Template.AddRow("CTCPLoop");
l["CTCP"] = it2->first + " " + it2->second;
}
}
sPageRet += "<br><form action='/" + CString((pUser) ? "edituser" : "adduser") + "' method='POST'>\r\n";
if (pUser == CZNC::Get().FindUser(GetUser())) {
CString sIP = GetRemoteIP();
sPageRet += "<input type='hidden' name='submitted' value='1'>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>Authentication</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<div style='float: left; margin-right: 20px;'><small><b>Username:</b></small><br>\r\n";
if (!sIP.empty()) {
m_Template["OwnIP"] = sIP.Token(0, false, ".") + "." + sIP.Token(1, false, ".") + "." + sIP.Token(2, false, ".") + ".*";
}
}
if (pUser) {
sPageRet += "<input type='hidden' name='user' value='" + pUser->GetUserName().Escape_n(CString::EHTML) + "'>\r\n"
"<input type='text' name='newuser' value='" + pUser->GetUserName().Escape_n(CString::EHTML) + "' size='32' maxlength='12' DISABLED><br>\r\n";
const VCString& vsVHosts = CZNC::Get().GetVHosts();
for (unsigned int b = 0; b < vsVHosts.size(); b++) {
const CString& sVHost = vsVHosts[b];
CTemplate& l = m_Template.AddRow("VHostLoop");
l["VHost"] = sVHost;
if (pUser && pUser->GetVHost() == sVHost) {
l["Checked"] = "true";
}
}
const vector<CChan*>& Channels = pUser->GetChans();
for (unsigned int c = 0; c < Channels.size(); c++) {
CChan* pChan = Channels[c];
CTemplate& l = m_Template.AddRow("ChannelLoop");
l["Username"] = pUser->GetUserName();
l["Name"] = pChan->GetName();
l["Perms"] = pChan->GetPermStr();
l["CurModes"] = pChan->GetModeString();
l["DefModes"] = pChan->GetDefaultModes();
l["BufferCount"] = CString::ToString(pChan->GetBufferCount());
l["Options"] = pChan->GetOptions();
if (pChan->InConfig()) {
l["InConfig"] = "true";
}
}
} else {
sPageRet += "<input type='text' name='user' value='' size='32' maxlength='12'><br>\r\n";
m_Template["Title"] = "Add User";
m_Template["AwaySuffix"] = "*";
}
CString sIP = GetRemoteIP();
sIP = sIP.Token(0, false, ".") + "." + sIP.Token(1, false, ".") + "." + sIP.Token(2, false, ".") + ".*";
sPageRet += "<small><b>Password:</b></small><br><input type='password' name='password' size='32' maxlength='16'><br>\r\n"
"<small><b>Confirm Password:</b></small><br><input type='password' name='password2' size='32' maxlength='16'><br><br></div>\r\n"
"<div><small><b>Allowed IPs:</b></small><br><textarea name='allowedips' cols='40' rows='5'>" + sAllowedHosts.Escape_n(CString::EHTML) + "</textarea><br>\r\n";
if (pUser && pUser == CZNC::Get().FindUser(GetUser())) {
sPageRet += "<span style='white-space: nowrap;'><input type='checkbox' name='ownip' id='ownip' value='" + sIP.Escape_n(CString::EHTML) + "' CHECKED><label for='ownip'> " + sIP.Escape_n(CString::EHTML) + " (your current ip)</label></span>&nbsp;&nbsp;\r\n";
}
sPageRet += "</div><br></div></div><br><br>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>IRC Information</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<div style='float: left; margin-right: 10px;'><small><b>Nick:</b></small><br>\r\n"
"<input type='text' name='nick' value='" + CString((pUser) ? pUser->GetNick().Escape_n(CString::EHTML) : "") + "' size='22' maxlength='128'></div>\r\n"
"<div style='float: left; margin-right: 10px;'><small><b>AltNick:</b></small><br>\r\n"
"<input type='text' name='altnick' value='" + CString((pUser) ? pUser->GetAltNick().Escape_n(CString::EHTML) : "") + "' size='22' maxlength='128'></div>\r\n"
"<div style='float: left; margin-right: 10px;'><small><b>AwaySuffix:</b></small><br>\r\n"
"<input type='text' name='awaysuffix' value='" + CString((pUser) ? pUser->GetAwaySuffix().Escape_n(CString::EHTML) : "") + "' size='18' maxlength='128'></div>\r\n"
"<div><small><b>StatusPrefix:</b></small><br>\r\n"
"<input type='text' name='statusprefix' value='" + CString((pUser) ? pUser->GetStatusPrefix().Escape_n(CString::EHTML) : "*") + "' size='16' maxlength='5'></div><br>\r\n"
"<div style='float: left; margin-right: 10px;'><small><b>Ident:</b></small><br>\r\n"
"<input type='text' name='ident' value='" + CString((pUser) ? pUser->GetIdent().Escape_n(CString::EHTML) : "") + "' size='22' maxlength='128'></div>\r\n"
"<div><small><b>RealName:</b></small><br>\r\n"
"<input type='text' name='realname' value='" + CString((pUser) ? pUser->GetRealName().Escape_n(CString::EHTML) : "") + "' size='68' maxlength='256'></div><br>\r\n";
const VCString& vsVHosts = CZNC::Get().GetVHosts();
if (vsVHosts.size()) {
sPageRet += "<small><b>VHost:</b></small><br>\r\n"
"<select name='vhost'>\r\n<option value=''>- None -</option>\r\n";
for (unsigned int a = 0; a < vsVHosts.size(); a++) {
sPageRet += "<option value='" + vsVHosts[a].Escape_n(CString::EHTML) + "'" + CString((pUser && pUser->GetVHost() == vsVHosts[a]) ? " SELECTED" : "") + ">" + vsVHosts[a].Escape_n(CString::EHTML) + "</option>\r\n";
}
sPageRet += "</select><br><br>\r\n";
}
sPageRet += "<small><b>QuitMsg:</b></small><br>\r\n"
"<input type='text' name='quitmsg' value='" + CString((pUser) ? pUser->GetQuitMsg().Escape_n(CString::EHTML) : "") + "' size='96' maxlength='256'><br><br>\r\n"
"<div><small><b>Servers:</b></small><br>\r\n"
"<textarea name='servers' cols='40' rows='5'>" + sServers.Escape_n(CString::EHTML) + "</textarea></div>\r\n"
"<br></div></div><br><br>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>Modules</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<table cellspacing='0' cellpadding='3' style='border: 1px solid #000;'>\r\n"
"<tr style='font-weight: bold; background: #ff9;'><td style='border: 1px solid #000;'>Name</td><td style='border: 1px solid #000;'>Arguments</td><td style='border: 1px solid #000;'>Description</td></tr>\r\n";
set<CModInfo> ssUserMods;
CZNC::Get().GetModules().GetAvailableMods(ssUserMods);
unsigned int uIdx = 0;
for (set<CModInfo>::iterator it = ssUserMods.begin(); it != ssUserMods.end(); it++) {
const CModInfo& Info = *it;
sPageRet += "<tr style='background: " + CString((uIdx++ %2) ? "#ffc" : "#cc9") + ";'><td style='border: 1px solid #000;'><input type='checkbox' name='loadmod' id='lm_" + Info.GetName().Escape_n(CString::EHTML) + "' value='" + Info.GetName().Escape_n(CString::EHTML) + "'" + CString((pUser && pUser->GetModules().FindModule(Info.GetName())) ? " CHECKED" : "") + CString((!IsAdmin() && pUser && pUser->DenyLoadMod()) ? " DISABLED" : "") + "><label for='lm_" + Info.GetName().Escape_n(CString::EHTML) + "'> " + Info.GetName().Escape_n(CString::EHTML) + "</label></td>";
CTemplate& l = m_Template.AddRow("ModuleLoop");
l["Name"] = Info.GetName();
l["Description"] = Info.GetDescription();
l["Args"] = GetModArgs(Info.GetName());
if (pUser && pUser->GetModules().FindModule(Info.GetName())) {
l["Checked"] = "true";
}
if (!IsAdmin() && pUser && pUser->DenyLoadMod()) {
CString sArgs = GetModArgs(Info.GetName()).Escape_n(CString::EHTML);
if (sArgs.empty()) {
sArgs = "&nbsp;";
}
sPageRet += "<td style='border: 1px solid #000;'>" + sArgs + "</td>";
} else {
sPageRet += "<td style='border: 1px solid #000;'><input type='text' name='modargs_" + Info.GetName().Escape_n(CString::EHTML) + "' value='" + GetModArgs(Info.GetName()).Escape_n(CString::EHTML) + "'></td>";
l["Disabled"] = "true";
}
sPageRet += "<td style='border: 1px solid #000;'>" + Info.GetDescription().Escape_n(CString::EHTML) + "</td></tr>";
}
sPageRet += "</table><br></div></div><br><br>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>Channels</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<small><b>Default Modes:</b></small><br>\r\n"
"<input type='text' name='chanmodes' value='" + CString((pUser) ? pUser->GetDefaultChanModes().Escape_n(CString::EHTML) : "") + "' size='32' maxlength='32'><br><br>\r\n";
CTemplate& o1 = m_Template.AddRow("OptionLoop");
o1["Name"] = "keepbuffer";
o1["DisplayName"] = "Keep Buffer";
if (!pUser || pUser->KeepBuffer()) { o1["Checked"] = "true"; }
if (pUser) {
CString sURL = "/addchan?user=" + pUser->GetUserName().Escape_n(CString::EURL);
CTemplate& o2 = m_Template.AddRow("OptionLoop");
o2["Name"] = "autocycle";
o2["DisplayName"] = "Auto Cycle";
if (!pUser || pUser->AutoCycle()) { o2["Checked"] = "true"; }
sPageRet += "<table cellspacing='0' cellpadding='3' style='border: 1px solid #000;'>\r\n"
"<tr style='font-weight: bold; background: #ff9;'>\r\n"
"<td style='border: 1px solid #000;'>[<a href='" + sURL.Escape_n(CString::EHTML) + "'>Add</a>]&nbsp;</td>\r\n";
CTemplate& o3 = m_Template.AddRow("OptionLoop");
o3["Name"] = "keepnick";
o3["DisplayName"] = "Keep Nick";
if (!pUser || pUser->GetKeepNick()) { o3["Checked"] = "true"; }
const vector<CChan*>& Channels = pUser->GetChans();
CTemplate& o4 = m_Template.AddRow("OptionLoop");
o4["Name"] = "multiclients";
o4["DisplayName"] = "Multi Clients";
if (!pUser || pUser->MultiClients()) { o4["Checked"] = "true"; }
if (!Channels.size()) {
sPageRet += "<td style='border: 1px solid #000;'>&nbsp;&nbsp;&lt;- Add a channel (opens in same page)&nbsp;&nbsp;</td>\r\n";
} else {
sPageRet += "<td style='border: 1px solid #000;'>Save</td>\r\n"
"<td style='border: 1px solid #000;'>Name</td>\r\n"
"<td style='border: 1px solid #000;'>CurModes</td>\r\n"
"<td style='border: 1px solid #000;'>DefModes</td>\r\n"
"<td style='border: 1px solid #000;'>BufferCount</td>\r\n"
"<td style='border: 1px solid #000;'>Options</td>\r\n";
}
CTemplate& o5 = m_Template.AddRow("OptionLoop");
o5["Name"] = "bouncedccs";
o5["DisplayName"] = "Bounce DCCs";
if (!pUser || pUser->BounceDCCs()) { o5["Checked"] = "true"; }
sPageRet += "</tr>\r\n";
for (unsigned int a = 0; a < Channels.size(); a++) {
CChan* pChan = Channels[a];
CString sURL = "user=" + pUser->GetUserName().Escape_n(CString::EURL) + "&chan=" + pChan->GetName().Escape_n(CString::EURL);
sPageRet += "<tr style='background: " + CString((a %2) ? "#ffc" : "#cc9") + ";'>"
"<td style='border: 1px solid #000;'>"
"<input type='hidden' name='channel' value='" + pChan->GetName().Escape_n(CString::EHTML) + "'>\r\n"
"[<a href='/editchan?" + sURL.Escape_n(CString::EHTML) + "'>Edit</a>]&nbsp;[<a href='/delchan?" + sURL.Escape_n(CString::EHTML) + "'>Del</a>]&nbsp;</td>\r\n"
"<td style='border: 1px solid #000;'><input type='checkbox' name='save_" + pChan->GetName().Escape_n(CString::EHTML) + "'" + CString((pChan->InConfig()) ? " CHECKED" : "") + ">&nbsp;</td>\r\n"
"<td style='border: 1px solid #000;'>" + CString(pChan->GetPermStr() + pChan->GetName()).Escape_n(CString::EHTML) + "&nbsp;</td>\r\n"
"<td style='border: 1px solid #000;'>" + pChan->GetModeString().Escape_n(CString::EHTML) + "&nbsp;</td>\r\n"
"<td style='border: 1px solid #000;'>" + pChan->GetDefaultModes().Escape_n(CString::EHTML) + "&nbsp;</td>\r\n"
"<td style='border: 1px solid #000;'>" + CString::ToString(pChan->GetBufferCount()) + "&nbsp;</td>\r\n"
"<td style='border: 1px solid #000;'>" + pChan->GetOptions().Escape_n(CString::EHTML) + "&nbsp;</td>\r\n"
"</tr>\r\n";
}
sPageRet += "</table>";
}
sPageRet += "<br></div></div><br><br>\r\n"
"<div style='white-space: nowrap; margin-top: -8px; margin-right: 8px; margin-left: 8px; padding: 1px 5px 1px 5px; float: left; border: 1px solid #000; font-size: 16px; font-weight: bold; background: #ff9;'>ZNC Behavior</div><div style='padding: 25px 5px 5px 15px; border: 2px solid #000; background: #cc9;'><div style='clear: both;'>\r\n"
"<small><b>Playback Buffer Size:</b></small><br>\r\n"
"<input type='text' name='bufsize' value='" + CString((pUser) ? CString::ToString(pUser->GetBufferCount()) : "") + "' size='32' maxlength='9'><br><br>\r\n"
"<small><b>Options:</b></small><br>\r\n"
"<span style='white-space: nowrap;'><input type='checkbox' name='keepbuffer' id='keepbuffer' value='1'" + CString((!pUser || pUser->KeepBuffer()) ? " CHECKED" : "") + "><label for='keepbuffer'>Keep Buffer</label></span>&nbsp;&nbsp;\r\n"
"<span style='white-space: nowrap;'><input type='checkbox' name='autocycle' id='autocycle' value='1'" + CString((!pUser || pUser->AutoCycle()) ? " CHECKED" : "") + "><label for='autocycle'>Auto Cycle</label></span>&nbsp;&nbsp;\r\n"
"<span style='white-space: nowrap;'><input type='checkbox' name='keepnick' id='keepnick' value='1'" + CString((!pUser || pUser->GetKeepNick()) ? " CHECKED" : "") + "><label for='keepnick'>Keep Nick</label></span>&nbsp;&nbsp;\r\n"
"<span style='white-space: nowrap;'><input type='checkbox' name='multiclients' id='multiclients' value='1'" + CString((!pUser || pUser->MultiClients()) ? " CHECKED" : "") + "><label for='multiclients'>Multi Clients</label></span>&nbsp;&nbsp;\r\n"
"<span style='white-space: nowrap;'><input type='checkbox' name='bouncedccs' id='bouncedccs' value='1'" + CString((!pUser || pUser->BounceDCCs()) ? " CHECKED" : "") + "><label for='bouncedccs'>Bounce DCCs</label></span>&nbsp;&nbsp;\r\n"
"<span style='white-space: nowrap;'><input type='checkbox' name='useclientip' id='useclientip' value='1'" + CString((pUser && pUser->UseClientIP()) ? " CHECKED" : "") + "><label for='useclientip'>Use Client IP</label></span>&nbsp;&nbsp;\r\n";
CTemplate& o6 = m_Template.AddRow("OptionLoop");
o6["Name"] = "useclientip";
o6["DisplayName"] = "Use Client IP";
if (pUser && pUser->UseClientIP()) { o6["Checked"] = "true"; }
if (IsAdmin()) {
sPageRet += "<span style='white-space: nowrap;'><input type='checkbox' name='denyloadmod' id='denyloadmod' value='1'" + CString((pUser && pUser->DenyLoadMod()) ? " CHECKED" : "") + "><label for='denyloadmod'>Deny LoadMod</label></span>&nbsp;&nbsp;\r\n";
CTemplate& o7 = m_Template.AddRow("OptionLoop");
o7["Name"] = "denyloadmod";
o7["DisplayName"] = "Deny LoadMod";
if (pUser && pUser->DenyLoadMod()) { o7["Checked"] = "true"; }
CTemplate& o8 = m_Template.AddRow("OptionLoop");
o8["Name"] = "isadmin";
o8["DisplayName"] = "Admin";
if (pUser && pUser->IsAdmin()) { o8["Checked"] = "true"; }
if (pUser && pUser == CZNC::Get().FindUser(GetUser())) { o8["Disabled"] = "true"; }
}
if (IsAdmin()) {
sPageRet += "<span style='white-space: nowrap;'><input type='checkbox' name='isadmin' id='isadmin' value='1'" + CString((pUser && pUser->IsAdmin()) ? " CHECKED" : "") + CString((pUser && pUser == CZNC::Get().FindUser(GetUser())) ? " DISABLED" : "") + "><label for='isadmin'>Admin</label></span>&nbsp;&nbsp;\r\n";
}
sPageRet += "<br><br>"
"<div><small><b>CTCP Replies:</b></small><br>"
"<textarea name='ctcpreplies' cols='40' rows='5'>" + sCTCPReplies.Escape_n(CString::EHTML) + "</textarea></div>\r\n"
"<br></div></div><br><br>\r\n"
"<input type='submit' value='Submit'>\r\n"
"</form>\r\n";
sPageRet += Footer();
PrintPage(sPageRet, "UserPage.tmpl");
return true;
}