diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 80940960..5275c1a7 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -35,6 +35,8 @@ public: void ListUsersPage(CString& sPageRet); bool SettingsPage(CString& sPageRet); + bool ChanPage(CString& sPageRet, CChan* = NULL); + bool DelChan(CString& sPageRet); bool UserPage(CString& sPageRet, CUser* pUser = NULL); CUser* GetNewUser(CString& sPageRet, CUser* pUser); @@ -294,6 +296,53 @@ bool CWebAdminSock::OnPageRequest(const CString& sURI, CString& sPageRet) { } else { GetErrorPage(sPageRet, "No such username"); } + } else if (sURI == "/editchan") { + if (!m_pUser) { + m_pUser = m_pModule->GetZNC()->FindUser(GetParam("user")); + } + + if (!m_pUser) { + GetErrorPage(sPageRet, "No such username"); + return true; + } + + CChan* pChan = m_pUser->FindChan(GetParam("chan")); + if (!pChan) { + GetErrorPage(sPageRet, "No such channel"); + cerr << "==== [" << GetParam("chan") << "] == [" << (int) pChan << "]" << endl; + return true; + } + + if (!ChanPage(sPageRet, pChan)) { + DEBUG_ONLY(cout << "- 302 Redirect" << endl); + return false; + } + } else if (sURI == "/addchan") { + if (!m_pUser) { + m_pUser = m_pModule->GetZNC()->FindUser(GetParam("user")); + } + + if (m_pUser) { + if (!ChanPage(sPageRet)) { + DEBUG_ONLY(cout << "- 302 Redirect" << endl); + return false; + } + } else { + GetErrorPage(sPageRet, "No such username"); + } + } else if (sURI == "/delchan") { + if (!m_pUser) { + m_pUser = m_pModule->GetZNC()->FindUser(GetParam("user")); + } + + if (m_pUser) { + if (!DelChan(sPageRet)) { + DEBUG_ONLY(cout << "- 302 Redirect" << endl); + return false; + } + } else { + GetErrorPage(sPageRet, "No such username"); + } } else if (sURI == "/listusers") { if (!IsAdmin()) { return false; @@ -439,6 +488,116 @@ bool CWebAdminSock::SettingsPage(CString& sPageRet) { return false; } +bool CWebAdminSock::ChanPage(CString& sPageRet, CChan* pChan) { + if (!m_pUser) { + GetErrorPage(sPageRet, "That user doesn't exist"); + } + + if (!GetParam("submitted").ToUInt()) { + sPageRet = Header(CString((pChan) ? "Edit" : "Add") + " Channel" + CString((pChan) ? (" [" + pChan->GetName() + "]") : "") + " for User [" + m_pUser->GetUserName() + "]"); + sPageRet += "
\r\n" + "\r\n" + "\r\n"; + if (pChan) { + sPageRet += "\r\n"; + } + + sPageRet += "
Channel Info
\r\n" + "\r\n" + "\r\n" + "\r\n"; + } else { + sPageRet += "\r\n"; + } + + sPageRet += "\r\n" + + "\r\n" + "\r\n" + + "\r\n" + "\r\n" + + "\r\n" + "\r\n" + "
Channel Name:
\r\n"; + + if (pChan) { + sPageRet += "" + pChan->GetName().Escape_n(CString::EHTML) + "
Buffer Count:
\r\n" + "
Default Modes:
\r\n" + "
Save:
\r\n" + "
Options:
\r\n" + "\r\n" + "\r\n" + "\r\n" + "
\r\n" + "


\r\n" + + "\r\n" + "
\r\n"; + + sPageRet += Footer(); + return true; + } + + CString sChanName = GetParam("name"); + + if (!pChan) { + if (sChanName.empty()) { + GetErrorPage(sPageRet, "Channel name is a required argument"); + return true; + } + + pChan = new CChan(sChanName, m_pUser, true); + m_pUser->AddChan(pChan); + } + + pChan->SetDefaultModes(GetParam("defmodes")); + pChan->SetBufferCount(GetParam("buffercount").ToUInt()); + pChan->SetInConfig(GetParam("save").ToBool()); + pChan->SetAutoCycle(GetParam("autocycle").ToBool()); + pChan->SetKeepBuffer(GetParam("keepbuffer").ToBool()); + + bool bDetached = GetParam("detached").ToBool(); + + if (pChan->IsDetached() != bDetached) { + if (bDetached) { + pChan->DetachUser(); + } else { + pChan->AttachUser(); + } + } + + if (!m_pModule->GetZNC()->WriteConfig()) { + GetErrorPage(sPageRet, "Channel added/modified, but config was not written"); + return true; + } + + Redirect("/edituser?user=" + m_pUser->GetUserName().Escape_n(CString::EURL)); + return false; +} + +bool CWebAdminSock::DelChan(CString& sPageRet) { + CString sChan = GetParam("chan"); + + if (!m_pUser) { + GetErrorPage(sPageRet, "That user doesn't exist"); + return true; + } + + if (sChan.empty()) { + GetErrorPage(sPageRet, "That channel doesn't exist for this user"); + return true; + } + + m_pUser->DelChan(sChan); + m_pUser->PutIRC("PART " + sChan); + + Redirect("/edituser?user=" + m_pUser->GetUserName().Escape_n(CString::EURL)); + + return false; +} + bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) { if (!GetParam("submitted").ToUInt()) { sPageRet = Header((pUser) ? CString("Edit User [" + pUser->GetUserName() + "]") : CString("Add User")); @@ -490,17 +649,17 @@ bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) { "
IRC Information
\r\n" "
Nick:
\r\n" - "
\r\n" + "
\r\n" "
AltNick:
\r\n" - "
\r\n" + "
\r\n" "
AwaySuffix:
\r\n" - "
\r\n" + "\r\n" "
StatusPrefix:
\r\n" - "

\r\n" + "
\r\n" "
Ident:
\r\n" - "
\r\n" + "\r\n" "
RealName:
\r\n" - "

\r\n"; + "
\r\n"; const VCString& vsVHosts = m_pModule->GetZNC()->GetVHosts(); @@ -516,7 +675,7 @@ bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) { } sPageRet += "QuitMsg:
\r\n" - "

\r\n" + "

\r\n" "
Servers:
\r\n" "
\r\n" "


\r\n" @@ -532,7 +691,7 @@ bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) { for (set::iterator it = ssUserMods.begin(); it != ssUserMods.end(); it++) { const CModInfo& Info = *it; - sPageRet += ""; + sPageRet += ""; if (!IsAdmin() && pUser && pUser->DenyLoadMod()) { CString sArgs = GetModArgs(Info.GetName()).Escape_n(CString::EHTML); @@ -549,26 +708,61 @@ bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) { sPageRet += "" + Info.GetDescription().Escape_n(CString::EHTML) + ""; } + CString sURL = "/addchan?user=" + pUser->GetUserName().Escape_n(CString::EURL); + sPageRet += "


\r\n" "
Channels
\r\n" "Default Modes:
\r\n" "

\r\n" - "
Channels:
\r\n" - "
\r\n" - "


\r\n" + "\r\n" + "\r\n" + "\r\n"; + const vector& Channels = pUser->GetChans(); + + if (!Channels.size()) { + sPageRet += "\r\n"; + } else { + sPageRet += "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n"; + } + + sPageRet += "\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 += "" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n" + "\r\n"; + } + + sPageRet += "
[Add  <- Add a channel (opens in same page)  SaveNameCurModesDefModesBufferCountOptions
" + "\r\n" + "[Edit] [DelInConfig()) ? " CHECKED" : "") + "> " + CString(pChan->GetPermStr() + pChan->GetName()).Escape_n(CString::EHTML) + " " + pChan->GetModeString().Escape_n(CString::EHTML) + " " + pChan->GetDefaultModes().Escape_n(CString::EHTML) + " " + CString::ToString(pChan->GetBufferCount()) + " " + pChan->GetOptions().Escape_n(CString::EHTML) + " 



\r\n" "
ZNC Behavior
\r\n" "Playback Buffer Size:
\r\n" "

\r\n" "Options:
\r\n" - "  \r\n" - "  \r\n" - "  \r\n" - "  \r\n" - "  \r\n"; + "  \r\n" + "  \r\n" + "  \r\n" + "  \r\n" + "  \r\n"; if (IsAdmin()) { - sPageRet += "  \r\n"; + sPageRet += "  \r\n"; } sPageRet += "

" @@ -737,10 +931,10 @@ CUser* CWebAdminSock::GetNewUser(CString& sPageRet, CUser* pUser) { pNewUser->SetDenyLoadMod(pUser->DenyLoadMod()); } - GetParam("channels").Split("\n", vsArgs); - + GetParamValues("channel", vsArgs); for (a = 0; a < vsArgs.size(); a++) { - pNewUser->AddChan(vsArgs[a].TrimRight_n("\r"), true); + const CString& sChan = vsArgs[a]; + pNewUser->AddChan(sChan.TrimRight_n("\r"), GetParam("save_" + sChan).ToBool()); } return pNewUser;