From c09dca3b8e18a603bde797a67515a1cdfb2b3241 Mon Sep 17 00:00:00 2001 From: prozacx Date: Mon, 22 Feb 2010 07:40:22 +0000 Subject: [PATCH] Initial commit of webmods - still lots of work to be done git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1784 726aef4b-f618-498e-8847-2d620e286838 --- Client.cpp | 23 +- Makefile.in | 4 +- Modules.cpp | 8 + Modules.h | 18 + Template.cpp | 91 +- Template.h | 11 +- User.cpp | 4 + User.h | 28 + WebModules.cpp | 547 +++++++ WebModules.h | 130 ++ main.h | 4 + modules/Makefile.in | 1 + modules/notes.cpp | 194 +++ modules/webadmin.cpp | 1795 +++++++++------------- modules/webchat.cpp | 110 ++ modules/www/notes/files/trash.gif | Bin 0 -> 98 bytes modules/www/notes/index.tmpl | 42 + modules/www/webadmin/add_edit_chan.tmpl | 53 + modules/www/webadmin/add_edit_user.tmpl | 258 ++++ modules/www/webadmin/index.tmpl | 9 + modules/www/webadmin/listusers.tmpl | 35 + modules/www/webadmin/settings.tmpl | 149 ++ modules/www/webchat/chan.tmpl | 31 + modules/www/webchat/index.tmpl | 5 + webskins/_default_/pub/clouds-header.jpg | Bin 0 -> 31029 bytes webskins/_default_/pub/favicon.ico | Bin 0 -> 3638 bytes webskins/_default_/pub/main.css | 221 +++ webskins/_default_/tmpl/BaseHeader.tmpl | 55 + webskins/_default_/tmpl/Error.tmpl | 3 + webskins/_default_/tmpl/Footer.tmpl | 16 + webskins/_default_/tmpl/FooterTag.tmpl | 1 + webskins/_default_/tmpl/Header.tmpl | 18 + webskins/_default_/tmpl/Menu.tmpl | 22 + webskins/_default_/tmpl/help.tmpl | 5 + webskins/_default_/tmpl/index.tmpl | 3 + webskins/forest/pub/forest-header.png | Bin 0 -> 219717 bytes webskins/forest/pub/forest.css | 21 + webskins/forest/tmpl/FooterTag.tmpl | 1 + webskins/forest/tmpl/Header.tmpl | 2 + znc.cpp | 29 + znc.h | 7 +- 41 files changed, 2845 insertions(+), 1109 deletions(-) create mode 100644 WebModules.cpp create mode 100644 WebModules.h create mode 100644 modules/notes.cpp create mode 100644 modules/webchat.cpp create mode 100644 modules/www/notes/files/trash.gif create mode 100644 modules/www/notes/index.tmpl create mode 100644 modules/www/webadmin/add_edit_chan.tmpl create mode 100644 modules/www/webadmin/add_edit_user.tmpl create mode 100644 modules/www/webadmin/index.tmpl create mode 100644 modules/www/webadmin/listusers.tmpl create mode 100644 modules/www/webadmin/settings.tmpl create mode 100644 modules/www/webchat/chan.tmpl create mode 100644 modules/www/webchat/index.tmpl create mode 100644 webskins/_default_/pub/clouds-header.jpg create mode 100644 webskins/_default_/pub/favicon.ico create mode 100644 webskins/_default_/pub/main.css create mode 100644 webskins/_default_/tmpl/BaseHeader.tmpl create mode 100644 webskins/_default_/tmpl/Error.tmpl create mode 100644 webskins/_default_/tmpl/Footer.tmpl create mode 100644 webskins/_default_/tmpl/FooterTag.tmpl create mode 100644 webskins/_default_/tmpl/Header.tmpl create mode 100644 webskins/_default_/tmpl/Menu.tmpl create mode 100644 webskins/_default_/tmpl/help.tmpl create mode 100644 webskins/_default_/tmpl/index.tmpl create mode 100644 webskins/forest/pub/forest-header.png create mode 100644 webskins/forest/pub/forest.css create mode 100644 webskins/forest/tmpl/FooterTag.tmpl create mode 100644 webskins/forest/tmpl/Header.tmpl diff --git a/Client.cpp b/Client.cpp index 6036b3f7..422a4386 100644 --- a/Client.cpp +++ b/Client.cpp @@ -12,6 +12,7 @@ #include "IRCSock.h" #include "User.h" #include "znc.h" +#include "WebModules.h" #define CALLMOD(MOD, CLIENT, USER, FUNC) { \ CModule* pModule = CZNC::Get().GetModules().FindModule(MOD); \ @@ -67,8 +68,28 @@ void CClient::ReadLine(const CString& sData) { if (IsAttached()) { MODULECALL(OnUserRaw(sLine), m_pUser, this, return); } else { - if (CZNC::Get().GetModules().OnUnknownUserRaw(this, sLine)) + // If it's an HTTP Request - Check the webmods + if (sLine.WildCmp("GET * HTTP/1.?") || sLine.WildCmp("POST * HTTP/1.?")) { + CModule* pMod = new CModule(NULL, "", ""); + pMod->SetFake(true); + + CWebSock* pSock = new CWebSock(pMod); + CZNC::Get().GetManager().SwapSockByAddr(pSock, this); + + // And don't forget to give it some sane name / timeout + pSock->SetSockName("WebMod::Client"); + pSock->SetTimeout(120); + + // TODO can we somehow get rid of this? + pSock->ReadLine(sLine); + pSock->PushBuff("", 0, true); + return; + } + + if (CZNC::Get().GetModules().OnUnknownUserRaw(this, sLine)) { + return; + } } #endif diff --git a/Makefile.in b/Makefile.in index 19363acd..673d5ae7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -22,7 +22,7 @@ PKGCONFIGDIR := $(libdir)/pkgconfig LIB_SRCS := ZNCString.cpp Csocket.cpp znc.cpp User.cpp IRCSock.cpp Client.cpp DCCBounce.cpp \ DCCSock.cpp Chan.cpp Nick.cpp Server.cpp Modules.cpp MD5.cpp Buffer.cpp Utils.cpp \ - FileUtils.cpp HTTPSock.cpp Template.cpp ClientCommand.cpp Socket.cpp SHA256.cpp + FileUtils.cpp HTTPSock.cpp Template.cpp ClientCommand.cpp Socket.cpp SHA256.cpp WebModules.cpp BIN_SRCS := main.cpp LIB_OBJS := $(patsubst %cpp,%o,$(LIB_SRCS)) BIN_OBJS := $(patsubst %cpp,%o,$(BIN_SRCS)) @@ -75,6 +75,8 @@ install: znc $(LIBZNC) mkdir -p $(DESTDIR)$(bindir) mkdir -p $(DESTDIR)$(includedir)/znc mkdir -p $(DESTDIR)$(PKGCONFIGDIR) + mkdir -p $(DESTDIR)$(libdir)/znc + cp -Rp webskins $(DESTDIR)$(libdir)/znc install -m 0755 znc $(DESTDIR)$(bindir) install -m 0755 znc-config $(DESTDIR)$(bindir) install -m 0755 znc-buildmod $(DESTDIR)$(bindir) diff --git a/Modules.cpp b/Modules.cpp index 5b127b1e..f0012931 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -12,6 +12,8 @@ #include "User.h" #include "znc.h" #include +#include "WebModules.h" +#include "Template.h" #ifndef RTLD_LOCAL # define RTLD_LOCAL 0 @@ -387,6 +389,10 @@ void CModule::ListSockets() { CString CModule::GetModNick() const { return ((m_pUser) ? m_pUser->GetStatusPrefix() : "*") + m_sModName; } +// Webmods +bool CModule::OnWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) { return false; } +// !Webmods + bool CModule::OnLoad(const CString& sArgs, CString& sMessage) { sMessage = ""; return true; } bool CModule::OnBoot() { return true; } void CModule::OnPreRehash() {} @@ -701,6 +707,8 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p pModule->SetDescription(sDesc); pModule->SetGlobal(bIsGlobal); pModule->SetArgs(sArgs); + DEBUG("********************************* [" + CZNC::Get().GetCurPath() + "] [" + sModPath + "] [" + CDir::ChangeDir(CZNC::Get().GetCurPath(), sModPath) + "]"); + pModule->SetModPath(CDir::ChangeDir(CZNC::Get().GetCurPath(), sModPath)); push_back(pModule); bool bLoaded; diff --git a/Modules.h b/Modules.h index fa61b166..a47d1945 100644 --- a/Modules.h +++ b/Modules.h @@ -11,6 +11,7 @@ #ifndef _MODULES_H #define _MODULES_H +#include "WebModules.h" #include "FileUtils.h" #include "Utils.h" #include @@ -22,6 +23,8 @@ using std::set; class CAuthBase; class CChan; class CClient; +class CWebSock; +class CTemplate; class CIRCSock; // !Forward Declarations @@ -268,6 +271,17 @@ public: * @return false to abort ZNC startup. */ virtual bool OnBoot(); + + // For handling web traffic + virtual bool WebRequiresLogin() { return true; } + virtual bool WebRequiresAdmin() { return false; } + virtual CString GetWebNavTitle() { return ""; } + virtual bool OnWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl); + virtual void AddSubPage(TWebSubPage spSubPage) { m_vSubPages.push_back(spSubPage); } + virtual void ClearSubPages() { m_vSubPages.clear(); } + virtual VWebSubPages& GetSubPages() { return m_vSubPages; } + // !Web + /** Called just before znc.conf is rehashed */ virtual void OnPreRehash(); /** This module hook is called after a successful rehash. */ @@ -680,6 +694,7 @@ public: void SetFake(bool b) { m_bFake = b; } void SetGlobal(bool b) { m_bGlobal = b; } void SetDescription(const CString& s) { m_sDescription = s; } + void SetModPath(const CString& s) { m_sModPath = s; } void SetArgs(const CString& s) { m_sArgs = s; } // !Setters @@ -688,6 +703,7 @@ public: bool IsGlobal() const { return m_bGlobal; } const CString& GetDescription() const { return m_sDescription; } const CString& GetArgs() const { return m_sArgs; } + const CString& GetModPath() const { return m_sModPath; } /** @returns For user modules this returns the user for which this * module was loaded. For global modules this returns NULL, @@ -716,8 +732,10 @@ protected: CString m_sDataDir; CString m_sSavePath; CString m_sArgs; + CString m_sModPath; private: MCString m_mssRegistry; //!< way to save name/value pairs. Note there is no encryption involved in this + VWebSubPages m_vSubPages; }; class CModules : public vector { diff --git a/Template.cpp b/Template.cpp index 2a205b46..15481ef8 100644 --- a/Template.cpp +++ b/Template.cpp @@ -90,26 +90,34 @@ void CTemplate::Init() { } */ - ClearPath(); + ClearPaths(); m_pParent = NULL; } -CString CTemplate::ExpandFile(const CString& sFilename) { - if (sFilename.Left(1) == "/" || sFilename.Left(2) == "./") { +CString CTemplate::ExpandFile(const CString& sFilename, bool bFromInc) { + /*if (sFilename.Left(1) == "/" || sFilename.Left(2) == "./") { return sFilename; - } + }*/ - CString sFile(ResolveLiteral(sFilename)); + CString sFile(ResolveLiteral(sFilename).TrimLeft_n("/")); - for (LCString::iterator it = m_lsPaths.begin(); it != m_lsPaths.end(); ++it) { - CString sRoot = *it; + for (list >::iterator it = m_lsbPaths.begin(); it != m_lsbPaths.end(); ++it) { + CString& sRoot = it->first; CString sFilePath(CDir::ChangeDir(sRoot, sFile)); + // Make sure path ends with a slash because "/foo/pub*" matches "/foo/public_keep_out/" but "/foo/pub/*" doesn't + if (!sRoot.empty() && sRoot.Right(1) != "/") { + sRoot += "/"; + } + + if (it->second && !bFromInc) { + DEBUG("\t\tSkipping path (not from INC) [" + sFilePath + "]"); + continue; + } + if (CFile::Exists(sFilePath)) { - // This only works if sRoot got a trailing slash! The - // code which adds paths makes sure this is true. if (sRoot.empty() || sFilePath.Left(sRoot.length()) == sRoot) { - //DEBUG("\t\tFound [" + sFilePath + "]\n"); + DEBUG("\t\tFound [" + sFilePath + "]\n"); return sFilePath; } else { DEBUG("\t\tOutside of root [" + sFilePath + "] !~ [" + sRoot + "]"); @@ -119,15 +127,15 @@ CString CTemplate::ExpandFile(const CString& sFilename) { } } - switch (m_lsPaths.size()) { + switch (m_lsbPaths.size()) { case 0: DEBUG("Unable to find [" + sFile + "] using the current directory"); break; case 1: - DEBUG("Unable to find [" + sFile + "] in the defined path [" + *m_lsPaths.begin()); + DEBUG("Unable to find [" + sFile + "] in the defined path [" + m_lsbPaths.begin()->first + "]"); break; default: - DEBUG("Unable to find [" + sFile + "] in any of the " + CString(m_lsPaths.size()) + " defined paths"); + DEBUG("Unable to find [" + sFile + "] in any of the " + CString(m_lsbPaths.size()) + " defined paths"); } return ""; @@ -138,31 +146,48 @@ void CTemplate::SetPath(const CString& sPaths) { sPaths.Split(":", vsDirs, false); for (size_t a = 0; a < vsDirs.size(); a++) { - AppendPath(vsDirs[a]); + AppendPath(vsDirs[a], false); } } -void CTemplate::PrependPath(const CString& sPath) { - DEBUG("CTemplate::PrependPath(" + sPath + ") == [" + CDir::ChangeDir("./", sPath + "/") + "]"); - m_lsPaths.push_front(CDir::ChangeDir("./", sPath + "/")); +CString CTemplate::MakePath(const CString& sPath) const { + CString sRet(CDir::ChangeDir("./", sPath + "/")); + + if (!sRet.empty() && sRet.Right(1) != "/") { + sRet += "/"; + } + + return sRet; } -void CTemplate::AppendPath(const CString& sPath) { - DEBUG("CTemplate::AppendPath(" + sPath + ") == [" + CDir::ChangeDir("./", sPath + "/") + "]"); - m_lsPaths.push_back(CDir::ChangeDir("./", sPath + "/")); +void CTemplate::PrependPath(const CString& sPath, bool bIncludesOnly) { + DEBUG("CTemplate::PrependPath(" + sPath + ") == [" + MakePath(sPath) + "]"); + m_lsbPaths.push_front(make_pair(MakePath(sPath), bIncludesOnly)); +} + +void CTemplate::AppendPath(const CString& sPath, bool bIncludesOnly) { + DEBUG("CTemplate::AppendPath(" + sPath + ") == [" + MakePath(sPath) + "]"); + m_lsbPaths.push_back(make_pair(MakePath(sPath), bIncludesOnly)); } void CTemplate::RemovePath(const CString& sPath) { DEBUG("CTemplate::RemovePath(" + sPath + ") == [" + CDir::ChangeDir("./", sPath + "/") + "]"); - m_lsPaths.remove(CDir::ChangeDir("./", sPath + "/")); + + for (list >::iterator it = m_lsbPaths.begin(); it != m_lsbPaths.end(); ++it) { + if (it->first == sPath) { + m_lsbPaths.remove(*it); + RemovePath(sPath); // @todo probably shouldn't use recursion, being lazy + return; + } + } } -void CTemplate::ClearPath() { - m_lsPaths.clear(); +void CTemplate::ClearPaths() { + m_lsbPaths.clear(); } bool CTemplate::SetFile(const CString& sFileName) { - m_sFileName = ExpandFile(sFileName); + m_sFileName = ExpandFile(sFileName, false); PrependPath(sFileName + "/.."); if (sFileName.empty()) { @@ -230,6 +255,7 @@ bool CTemplate::PrintString(CString& sRet) { } bool CTemplate::Print(ostream& oOut) { + DEBUG("== Print(o) m_sFileName = [" + m_sFileName + "]"); return Print(m_sFileName, oOut); } @@ -311,7 +337,8 @@ bool CTemplate::Print(const CString& sFileName, ostream& oOut) { if (!uSkip) { if (sAction.Equals("INC")) { - if (!Print(ExpandFile(sArgs), oOut)) { + if (!Print(ExpandFile(sArgs, true), oOut)) { + DEBUG("Unable to print INC'd file [" + sArgs + "]"); return false; } } else if (sAction.Equals("SETOPTION")) { @@ -365,7 +392,7 @@ bool CTemplate::Print(const CString& sFileName, ostream& oOut) { sSetBlockVar = sArgs; bInSetBlock = true; } else if (sAction.Equals("EXPAND")) { - sOutput += ExpandFile(sArgs); + sOutput += ExpandFile(sArgs, true); } else if (sAction.Equals("VAR")) { sOutput += GetValue(sArgs); } else if (sAction.Equals("LT")) { @@ -643,8 +670,20 @@ bool CTemplate::ValidExpr(const CString& sExpression) { } if (sExpr.find("!=") != CString::npos) { + // GOOD: + // >>>>>>>>>>>>>>>>>>> [PageName] [index] -> [PageName != "index"] + // >>>>>>>>>>>>>>>>>>> [PageName] [help] -> [PageName != "help"] + // + // BAD: + // >>>>>>>>>>>>>>>>>>> [PageName] ["index"] -> [PageName != "index"] + // >>>>>>>>>>>>>>>>>>> [PageName] ["help"] -> [PageName != "help"] + // + +//CString CTemplate::Token(const CString& sStr, unsigned int uPos, bool bRest, const CString& sSep, bool bAllowEmpty, + // const CString& sLeft, const CString& sRight, bool bTrimQuotes) { sName = sExpr.Token(0, false, "!=").Trim_n(); sValue = sExpr.Token(1, true, "!=", false, "\"", "\"", true).Trim_n(); + DEBUG(">>>>>>>>>>>>>>>>>>> [" + sName + "] [" + sValue + "] -> [" + sExpr + "]"); bNegate = !bNegate; } else if (sExpr.find("==") != CString::npos) { sName = sExpr.Token(0, false, "==").Trim_n(); diff --git a/Template.h b/Template.h index 19ae3a48..61b50b8f 100644 --- a/Template.h +++ b/Template.h @@ -145,14 +145,15 @@ public: void Init(); CTemplate* GetParent(bool bRoot); - CString ExpandFile(const CString& sFilename); + CString ExpandFile(const CString& sFilename, bool bFromInc = false); bool SetFile(const CString& sFileName); void SetPath(const CString& sPath); // Sets the dir:dir:dir type path to look at for templates, as of right now no ../../.. protection - void PrependPath(const CString& sPath); - void AppendPath(const CString& sPath); + CString MakePath(const CString& sPath) const; + void PrependPath(const CString& sPath, bool bIncludesOnly = false); + void AppendPath(const CString& sPath, bool bIncludesOnly = false); void RemovePath(const CString& sPath); - void ClearPath(); + void ClearPaths(); CString ResolvePath(const CString& sPath, const CString& sFilename); bool PrintString(CString& sRet); bool Print(ostream& oOut = cout); @@ -175,7 +176,7 @@ public: private: CTemplate* m_pParent; CString m_sFileName; - LCString m_lsPaths; + list > m_lsbPaths; map > m_mvLoops; vector m_vLoopContexts; CSmartPtr m_spOptions; diff --git a/User.cpp b/User.cpp index 9fd0ad5b..ea1f0775 100644 --- a/User.cpp +++ b/User.cpp @@ -358,6 +358,7 @@ bool CUser::Clone(const CUser& User, CString& sErrorRet, bool bCloneChans) { SetVHost(User.GetVHost()); SetDCCVHost(User.GetDCCVHost()); SetQuitMsg(User.GetQuitMsg()); + SetSkinName(User.GetSkinName()); SetDefaultChanModes(User.GetDefaultChanModes()); SetBufferCount(User.GetBufferCount()); SetJoinTries(User.JoinTries()); @@ -645,6 +646,7 @@ bool CUser::WriteConfig(CFile& File) { PrintLine(File, "QuitMsg", GetQuitMsg()); if (CZNC::Get().GetStatusPrefix() != GetStatusPrefix()) PrintLine(File, "StatusPrefix", GetStatusPrefix()); + PrintLine(File, "Skin", GetSkinName()); PrintLine(File, "ChanModes", GetDefaultChanModes()); PrintLine(File, "Buffer", CString(GetBufferCount())); PrintLine(File, "KeepBuffer", CString(KeepBuffer())); @@ -1247,4 +1249,6 @@ CString CUser::GetQuitMsg() const { return (!m_sQuitMsg.Trim_n().empty()) ? m_sQ const MCString& CUser::GetCTCPReplies() const { return m_mssCTCPReplies; } unsigned int CUser::GetBufferCount() const { return m_uBufferCount; } bool CUser::KeepBuffer() const { return m_bKeepBuffer; } +//CString CUser::GetSkinName() const { return (!m_sSkinName.empty()) ? m_sSkinName : CZNC::Get().GetSkinName(); } +CString CUser::GetSkinName() const { return m_sSkinName; } // !Getters diff --git a/User.h b/User.h index aeb6d0b8..825e6242 100644 --- a/User.h +++ b/User.h @@ -138,6 +138,29 @@ public: void AddBytesRead(unsigned long long u) { m_uBytesRead += u; } void AddBytesWritten(unsigned long long u) { m_uBytesWritten += u; } + // Counter for logging out of the web interface + unsigned int GetWebLogoutCounter(const CString& sToken) { + map::iterator it = m_suWebLogoutCounters.find(sToken); + + if (it == m_suWebLogoutCounters.end()) { + m_suWebLogoutCounters[sToken] = 1; + return 1; + } + + return it->second; + } + + unsigned int IncWebLogoutCounter(const CString& sToken) { + map::iterator it = m_suWebLogoutCounters.find(sToken); + + if (it == m_suWebLogoutCounters.end()) { + m_suWebLogoutCounters[sToken] = 2; + return 2; + } + + return ++it->second; + } + // Setters void SetUserName(const CString& s); void SetNick(const CString& s); @@ -169,6 +192,7 @@ public: void SetTimezoneOffset(float b) { m_fTimezoneOffset = b; } void SetJoinTries(unsigned int i) { m_uMaxJoinTries = i; } void SetMaxJoins(unsigned int i) { m_uMaxJoins = i; } + void SetSkinName(const CString& s) { m_sSkinName = s; } void SetIRCConnectEnabled(bool b) { m_bIRCConnectEnabled = b; } void SetIRCAway(bool b) { m_bIRCAway = b; } // !Setters @@ -223,6 +247,7 @@ public: unsigned long long BytesWritten() const { return m_uBytesWritten; } unsigned int JoinTries() const { return m_uMaxJoinTries; } unsigned int MaxJoins() const { return m_uMaxJoins; } + CString GetSkinName() const; // !Getters private: protected: @@ -284,6 +309,9 @@ protected: unsigned long long m_uBytesWritten; unsigned int m_uMaxJoinTries; unsigned int m_uMaxJoins; + CString m_sSkinName; + + map m_suWebLogoutCounters; #ifdef _MODULES CModules* m_pModules; diff --git a/WebModules.cpp b/WebModules.cpp new file mode 100644 index 00000000..3f5f54e9 --- /dev/null +++ b/WebModules.cpp @@ -0,0 +1,547 @@ +#include "WebModules.h" +#include "User.h" +#include "znc.h" +#include + + +CZNCTagHandler::CZNCTagHandler(CWebSock& WebSock) : CTemplateTagHandler(), m_WebSock(WebSock) { +} + +bool CZNCTagHandler::HandleTag(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) { + if (sName.Equals("URLPARAM")) { + //sOutput = CZNC::Get() + std::cerr << "========================= URLPARAM !!!!!!!!!!" << std::endl; + sOutput = m_WebSock.GetParam(sArgs.Token(0)); + return true; + } + + return false; +} + +CWebAuth::CWebAuth(CWebSock* pWebSock, const CString& sUsername, const CString& sPassword) + : CAuthBase(sUsername, sPassword, pWebSock) { + m_pWebSock = pWebSock; +} + +void CWebAuth::AcceptedLogin(CUser& User) { + if (m_pWebSock) { + m_pWebSock->SetSessionUser(&User); + m_pWebSock->SetLoggedIn(true); + m_pWebSock->UnPauseRead(); + } +} + +void CWebAuth::RefusedLogin(const CString& sReason) { + if (m_pWebSock) { + m_pWebSock->SetSessionUser(NULL); + m_pWebSock->SetLoggedIn(false); + m_pWebSock->UnPauseRead(); + } +} + +CWebSock::CWebSock(CModule* pModule) : CHTTPSock(pModule) { + m_pModule = pModule; + m_pSessionUser = NULL; + m_bPathsSet = false; + + m_Template.AddTagHandler(new CZNCTagHandler(*this)); +} + +CWebSock::CWebSock(CModule* pModule, const CString& sHostname, unsigned short uPort, int iTimeout) + : CHTTPSock(pModule, sHostname, uPort, iTimeout) { + m_pModule = pModule; + m_pSessionUser = NULL; + m_bPathsSet = false; + + m_Template.AddTagHandler(new CZNCTagHandler(*this)); +} + +CWebSock::~CWebSock() { + if (!m_spAuth.IsNull()) { + CWebAuth* pAuth = (CWebAuth*) &(*m_spAuth); + pAuth->SetWebSock(NULL); + } + + // If the module IsFake() then it was created as a dummy and needs to be deleted + CModule* pMod = GetModule(); + if (pMod && pMod->IsFake()) { + pMod->UnlinkSocket(this); + delete pMod; + } +} + +void CWebSock::ParsePath() { + // The URI looks like: + // /[user:][module][/page][?arg1=val1&arg2=val2...] + + m_sForceUser.clear(); + + m_sPath = GetPath().TrimLeft_n("/"); + + m_sPath.TrimPrefix("mods/"); + m_sPath.TrimPrefix("modfiles/"); + + m_sModName = m_sPath.Token(0, false, "/"); + m_sPage = m_sPath.Token(1, true, "/"); + + if (m_sModName.find(":") != CString::npos) { + m_sForceUser = m_sModName.Token(0, false, ":"); + m_sModName = m_sModName.Token(1, false, ":"); + } + + if (m_sPage.empty()) { + m_sPage = "index"; + } + + DEBUG("Path [" + m_sPath + "]"); + DEBUG("User [" + m_sForceUser + "]"); + DEBUG("Module [" + m_sModName + "]"); + DEBUG("Page [" + m_sPage + "]"); +} + +CModule* CWebSock::ResolveModule() { + ParsePath(); + CModule* pModRet = NULL; + + // Dot means static file, not module + if (m_sModName.find(".") != CString::npos) { + return NULL; + } + + // First look for forced user-mods + if (!m_sForceUser.empty()) { + CUser* pUser = CZNC::Get().FindUser(m_sForceUser); + + if (pUser) { + pModRet = pUser->GetModules().FindModule(m_sModName); + } else { + DEBUG("User not found while trying to handle web requrest for [" + m_sPage + "]"); + } + } else { + // This could be user level or global level, check both + pModRet = CZNC::Get().GetModules().FindModule(m_sModName); + + if (!pModRet) { + // It's not a loaded global module and it has no forced username so we + // have to force a login to try a module loaded by the current user + if (!ForceLogin()) { + return NULL; + } + + pModRet = m_pSessionUser->GetModules().FindModule(m_sModName); + } + } + + if (!pModRet) { + DEBUG("Module not found"); + } else if (pModRet->IsFake()) { + DEBUG("Fake module found, ignoring"); + pModRet = NULL; + } + + return pModRet; +} + +size_t CWebSock::GetAvailSkins(vector& vRet) { + vRet.clear(); + + CString sRoot(GetSkinPath("_default_")); + + sRoot.TrimRight("/"); + sRoot.TrimRight("_default_"); + sRoot.TrimRight("/"); + + if (!sRoot.empty()) { + sRoot += "/"; + } + + if (!sRoot.empty() && CFile::IsDir(sRoot)) { + CDir Dir(sRoot); + + for (unsigned int d = 0; d < Dir.size(); d++) { + const CFile& SubDir = *Dir[d]; + + if (SubDir.IsDir() && SubDir.GetShortName() == "_default_") { + vRet.push_back(SubDir); + } + } + + for (unsigned int e = 0; e < Dir.size(); e++) { + const CFile& SubDir = *Dir[e]; + + if (SubDir.IsDir() && SubDir.GetShortName() != "_default_" && SubDir.GetShortName() != ".svn") { + vRet.push_back(SubDir); + } + } + } + + return vRet.size(); +} + +void CWebSock::SetPaths(CModule* pModule, bool bIsTemplate) { + m_Template.ClearPaths(); + + CString sHomeSkinsDir(CZNC::Get().GetZNCPath() + "/webskins/"); + CString sSkinName(GetSkinName()); + + DEBUG("---- sHomeSkinsDir=[" + sHomeSkinsDir + "] sSkinName=[" + sSkinName + "]"); + + // Module specific paths + + if (pModule) { + const CString& sModName(pModule->GetModName()); + + // 1. ~/.znc/webskins//mods// + // + if (!sSkinName.empty()) { + m_Template.AppendPath(GetSkinPath(sSkinName) + "/mods/" + sModName + "/"); + } + + // 2. ~/.znc/webskins/_default_/mods// + // + m_Template.AppendPath(GetSkinPath("_default_") + "/mods/" + sModName + "/"); + + // 3. ./modules// + // + m_Template.AppendPath(GetModWebPath(sModName)); + + // 4. ~/.znc/webskins//mods// + // + if (!sSkinName.empty()) { + m_Template.AppendPath(GetSkinPath(sSkinName) + "/mods/" + sModName + "/"); + } + + // 5. ~/.znc/webskins/_default_/mods// + // + m_Template.AppendPath(GetSkinPath("_default_") + "/mods/" + sModName + "/"); + } + + // 6. ~/.znc/webskins// + // + if (!sSkinName.empty()) { + m_Template.AppendPath(GetSkinPath(sSkinName) + CString(bIsTemplate ? "/tmpl/" : "/"), (0 && pModule != NULL)); + } + + // 7. ~/.znc/webskins/_default_/ + // + m_Template.AppendPath(GetSkinPath("_default_") + CString(bIsTemplate ? "/tmpl/" : "/"), (0 && pModule != NULL)); + + m_bPathsSet = true; +} + +void CWebSock::SetVars() { + m_Template["SessionUser"] = GetUser(); + m_Template["SessionIP"] = GetRemoteIP(); + m_Template["Tag"] = CZNC::GetTag(); + m_Template["SkinName"] = GetSkinName(); + + if (IsAdmin()) { + m_Template["IsAdmin"] = "true"; + } + + // Global Mods + CGlobalModules& vgMods = CZNC::Get().GetModules(); + for (unsigned int a = 0; a < vgMods.size(); a++) { + AddModLoop("GlobalModLoop", *vgMods[a]); + } + + // User Mods + if (IsLoggedIn()) { + CModules& vMods = m_pSessionUser->GetModules(); + + for (unsigned int a = 0; a < vMods.size(); a++) { + AddModLoop("UserModLoop", *vMods[a]); + } + } + + if (IsLoggedIn()) { + m_Template["LoggedIn"] = "true"; + } +} + +bool CWebSock::AddModLoop(const CString& sLoopName, CModule& Module) { + CString sTitle(Module.GetWebNavTitle()); + + DEBUG("=== === === === === [" + Module.GetModName() + "] [" + CString(IsLoggedIn()) + "]"); + + if (!sTitle.empty() && (IsLoggedIn() || (!Module.WebRequiresLogin() && !Module.WebRequiresAdmin())) && (IsAdmin() || !Module.WebRequiresAdmin())) { + CTemplate& Row = m_Template.AddRow(sLoopName); + + Row["ModName"] = Module.GetModName(); + Row["Title"] = sTitle; + + if (m_sModName == Module.GetModName()) { + Row["Active"] = "true"; + } + + if (Module.GetUser()) { + Row["Username"] = Module.GetUser()->GetUserName(); + } + + VWebSubPages& vSubPages = Module.GetSubPages(); + + for (unsigned int a = 0; a < vSubPages.size(); a++) { + CTemplate& SubRow = Row.AddRow("SubPageLoop"); + TWebSubPage& SubPage = vSubPages[a]; + + SubRow["ModName"] = Module.GetModName(); + SubRow["PageName"] = SubPage->GetName(); + SubRow["Title"] = SubPage->GetTitle().empty() ? SubPage->GetName() : SubPage->GetTitle(); + + CString& sParams = SubRow["Params"]; + + // bActive is whether or not the current url matches this subpage (including the params below) + bool bActive = (m_sModName == Module.GetModName() && m_sPage == SubPage->GetName()); + + const VPair& vParams = SubPage->GetParams(); + for (size_t b = 0; b < vParams.size(); b++) { + pair ssNV = vParams[b]; + + if (!sParams.empty()) { + sParams += "&"; + } + + if (!ssNV.first.empty()) { + if (!ssNV.second.empty()) { + sParams += ssNV.first.Escape_n(CString::EURL); + sParams += "="; + sParams += ssNV.second.Escape_n(CString::EURL); + } + + if (bActive && GetParam(ssNV.first) != ssNV.second) { + bActive = false; + } + } + } + + if (bActive) { + SubRow["Active"] = "true"; + } + } + + return true; + } + + return false; +} + +bool CWebSock::PrintStaticFile(const CString& sPath, CString& sPageRet, CModule* pModule) { + SetPaths(pModule); + DEBUG("About to print [" + m_Template.ExpandFile(sPath) + "]"); + return PrintFile(m_Template.ExpandFile(sPath.TrimLeft_n("/"))); +} + +bool CWebSock::PrintTemplate(const CString& sPageName, CString& sPageRet, CModule* pModule) { + SetVars(); + m_Template["PageName"] = sPageName; + + if (pModule) { + CUser* pUser = pModule->GetUser(); + m_Template["ModUser"] = pUser ? pUser->GetUserName() : ""; + m_Template["ModName"] = pModule->GetModName(); + + if (m_Template.find("Title") == m_Template.end()) { + m_Template["Title"] = pModule->GetWebNavTitle(); + } + } + + if (!m_bPathsSet) { + SetPaths(pModule, true); + } + + if (m_Template.GetFileName().empty() && !m_Template.SetFile(sPageName + ".tmpl")) { + return false; + } + + return m_Template.PrintString(sPageRet); +} + +CString CWebSock::GetModWebPath(const CString& sModName) const { + CString sRet = CZNC::Get().GetCurPath() + "/modules/www/" + sModName; + + if (!CFile::IsDir(sRet)) { + sRet = CString(_MODDIR_) + "/www/" + sModName; + } + + return sRet + "/"; +} + +CString CWebSock::GetSkinPath(const CString& sSkinName) const { + CString sRet = CZNC::Get().GetZNCPath() + "/webskins/" + sSkinName; + + if (!CFile::IsDir(sRet)) { + sRet = CZNC::Get().GetCurPath() + "/webskins/" + sSkinName; + + if (!CFile::IsDir(sRet)) { + sRet = CString(_SKINDIR_) + "/" + sSkinName; + } + } + + return sRet + "/"; +} + +bool CWebSock::OnPageRequest(const CString& sURI, CString& sPageRet) { + DEBUG("CWebSock::OnPageRequest(" + sURI + ")"); + + // Handle the static pages that don't require a login + if (sURI == "/") { + return PrintTemplate("index", sPageRet); + } else if (sURI == "/favicon.ico") { + return PrintStaticFile("/pub/favicon.ico", sPageRet); + } else if (sURI == "/logout") { + if (!IsLoggedIn()) { + Redirect("/"); + return true; + } + + unsigned int uCurCnt = GetParam("cnt").ToUInt(); + unsigned int uCounter = m_pSessionUser->GetWebLogoutCounter(GetRemoteIP()); + + if (!uCurCnt) { + Redirect("/logout?cnt=" + CString(uCounter)); + return true; + } + + if (uCurCnt >= uCounter) { + m_bLoggedIn = false; + m_pSessionUser->IncWebLogoutCounter(GetRemoteIP()); + ForceLogin(); + } else { + Redirect("/"); + } + + return true; + } else if (sURI.Left(6) == "/login") { + if (ForceLogin()) { + Redirect("/"); + } + + return true; + } else if (sURI.Left(5) == "/pub/") { + return PrintStaticFile(sURI, sPageRet); + } else if (sURI.Left(6) == "/mods/" || sURI.Left(10) == "/modfiles/") { + ParsePath(); + // Make sure modules are treated as directories + if (sURI.Right(1) != "/" && sURI.find(".") == CString::npos && sURI.TrimLeft_n("/mods/").TrimLeft_n("/").find("/") == CString::npos) { + Redirect(sURI + "/"); + return true; + } + + if (m_sModName.empty()) { + return PrintTemplate("modlist", sPageRet); + } + + DEBUG("FindModule(" + m_sModName + ", " + m_sForceUser + ")"); + CModule* pModule = CZNC::Get().FindModule(m_sModName, m_sForceUser); + + if (!pModule && m_sForceUser.empty()) { + if (!ForceLogin()) { + return true; + } + + pModule = CZNC::Get().FindModule(m_sModName, m_pSessionUser); + } + + if (!pModule) { + return false; + } else if (pModule->WebRequiresLogin() && !ForceLogin()) { + return true; + } else if (pModule->WebRequiresAdmin() && !IsAdmin()) { + sPageRet = GetErrorPage(403, "Forbidden", "You need to be an admin to access this module"); + return true; + } else if (pModule && !pModule->IsGlobal() && pModule->GetUser() != m_pSessionUser) { + sPageRet = GetErrorPage(403, "Forbidden", "You must login as " + pModule->GetUser()->GetUserName() + " in order to view this page"); + return true; + } + + if (pModule && !pModule->IsGlobal() && (!IsLoggedIn() || pModule->GetUser() != GetSessionUser())) { + AddModLoop("UserModLoop", *pModule); + } + + if (sURI.Left(10) == "/modfiles/") { + m_Template.AppendPath(GetSkinPath(GetSkinName()) + "/mods/" + m_sModName + "/files/"); + m_Template.AppendPath(GetModWebPath(m_sModName) + "/files/"); + + std::cerr << "===================== fffffffffffffffffffff [" << m_sModName << "] [" << m_sPage << "]" << std::endl; + return PrintFile(m_Template.ExpandFile(m_sPage.TrimLeft_n("/"))); + } else { + SetPaths(pModule, true); + + if (pModule->OnWebRequest(*this, m_sPage, m_Template)) { + return PrintTemplate(m_sPage, sPageRet, pModule); + } + + sPageRet = GetErrorPage(404, "Not Implemented", "The requested module does not acknowledge web requests"); + return false; + } + } else { + CString sPage(sURI.Trim_n("/")); + if (sPage.length() < 32) { + for (unsigned int a = 0; a < sPage.length(); a++) { + unsigned char c = sPage[a]; + + if ((c < '0' || c > '9') && (c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && c != '_') { + return false; + } + } + + return PrintTemplate(sPage, sPageRet); + } + } + + return false; +} + +void CWebSock::PrintErrorPage(const CString& sMessage) { + m_Template.SetFile("Error.tmpl"); + + m_Template["Action"] = "error"; + m_Template["Title"] = "Error"; + m_Template["Error"] = sMessage; +} + +size_t CWebSock::AddError(const CString& sMessage) { + CTemplate& Row = m_Template.AddRow("ErrorLoop"); + + Row["Message"] = sMessage; + return m_Template.GetLoop("ErrorLoop")->size(); +} + +size_t CWebSock::AddSuccess(const CString& sMessage) { + CTemplate& Row = m_Template.AddRow("SuccessLoop"); + + Row["Message"] = sMessage; + return m_Template.GetLoop("SuccessLoop")->size(); +} + +bool CWebSock::OnLogin(const CString& sUser, const CString& sPass) { + DEBUG("=================== CWebSock::OnLogin()"); + m_spAuth = new CWebAuth(this, sUser, sPass); + + // Some authentication module could need some time, block this socket + // until then. CWebAuth will UnPauseRead(). + PauseRead(); + CZNC::Get().AuthUser(m_spAuth); + + // If CWebAuth already set this, don't change it. + return IsLoggedIn(); +} + +Csock* CWebSock::GetSockObj(const CString& sHost, unsigned short uPort) { + CWebSock* pSock = new CWebSock(GetModule(), sHost, uPort); + pSock->SetSockName("Web::Client"); + pSock->SetTimeout(120); + + return pSock; +} + +bool CWebSock::IsAdmin() const { return m_pSessionUser && m_pSessionUser->IsAdmin(); } +CUser* CWebSock::GetSessionUser() const { return m_pSessionUser; } +CString CWebSock::GetSkinName() const { + if (m_pSessionUser && IsLoggedIn() && !m_pSessionUser->GetSkinName().empty()) { + return m_pSessionUser->GetSkinName(); + } + + return CZNC::Get().GetSkinName(); +} + diff --git a/WebModules.h b/WebModules.h new file mode 100644 index 00000000..11e63760 --- /dev/null +++ b/WebModules.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2004-2009 See the AUTHORS file for details. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#ifndef _WEBMODULES_H +#define _WEBMODULES_H + +#include "Client.h" +#include "Template.h" +#include "HTTPSock.h" +#include "FileUtils.h" + +class CWebSock; +class CModule; +class CWebSubPage; + +typedef CSmartPtr TWebSubPage; +typedef vector VWebSubPages; + +class CZNCTagHandler : public CTemplateTagHandler { +public: + CZNCTagHandler(CWebSock& pWebSock); + virtual ~CZNCTagHandler() {} + + virtual bool HandleTag(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput); +private: + CWebSock& m_WebSock; +}; + + +class CWebSubPage { +public: + CWebSubPage(const CString& sName, const CString& sTitle = "") : m_sName(sName), m_sTitle(sTitle) { + } + + CWebSubPage(const CString& sName, const CString& sTitle, const VPair& vParams) : m_sName(sName), m_sTitle(sTitle), m_vParams(vParams) {} + virtual ~CWebSubPage() {} + + void SetName(const CString& s) { m_sName = s; } + void SetTitle(const CString& s) { m_sTitle = s; } + void AddParam(const CString& sName, const CString& sValue) { m_vParams.push_back(make_pair(sName, sValue)); } + + const CString& GetName() const { return m_sName; } + const CString& GetTitle() const { return m_sTitle; } + const VPair& GetParams() const { return m_vParams; } + +private: + CString m_sName; + CString m_sTitle; + VPair m_vParams; +}; + +class CWebAuth : public CAuthBase { +public: + CWebAuth(CWebSock* pWebSock, const CString& sUsername, const CString& sPassword); + virtual ~CWebAuth() {} + + void SetWebSock(CWebSock* pWebSock) { m_pWebSock = pWebSock; } + void AcceptedLogin(CUser& User); + void RefusedLogin(const CString& sReason); +private: +protected: + CWebSock* m_pWebSock; +}; + + +class CWebSock : public CHTTPSock { +public: + CWebSock(CModule* pModule); + CWebSock(CModule* pModule, const CString& sHostname, unsigned short uPort, int iTimeout = 60); + virtual ~CWebSock(); + + virtual bool OnPageRequest(const CString& sURI, CString& sPageRet); + + virtual bool OnLogin(const CString& sUser, const CString& sPass); + + void ParsePath(); // This parses the path portion of the url into some member vars + CModule* ResolveModule(); + + //virtual bool PrintFile(const CString& sFileName, CString sContentType = ""); + bool PrintTemplate(const CString& sPageName, CString& sPageRet, CModule* pModule = NULL); + bool PrintStaticFile(const CString& sPath, CString& sPageRet, CModule* pModule = NULL); + + bool AddModLoop(const CString& sLoopName, CModule& Module); + void SetPaths(CModule* pModule, bool bIsTemplate = false); + void SetVars(); + + void FillErrorPage(CString& sPageRet, const CString& sError) { + m_Template["Action"] = "error"; + m_Template["Title"] = "Error"; + m_Template["Error"] = sError; + + PrintTemplate("error", sPageRet); + } + + void PrintErrorPage(const CString& sMessage); + size_t AddError(const CString& sMessage); + size_t AddSuccess(const CString& sMessage); + + // Setters + void SetSessionUser(CUser* p) { + m_pSessionUser = p; + } + // !Setters + + virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort); + bool IsAdmin() const; + CUser* GetSessionUser() const; + CString GetModWebPath(const CString& sModName) const; + CString GetSkinPath(const CString& sSkinName) const; + CModule* GetModule() const { return (CModule*) m_pModule; } + size_t GetAvailSkins(vector& vRet); + CString GetSkinName() const; + +private: + CUser* m_pSessionUser; + bool m_bPathsSet; + CTemplate m_Template; + CSmartPtr m_spAuth; + CString m_sForceUser; // Gets filled by ResolveModule() + CString m_sModName; // Gets filled by ResolveModule() + CString m_sPath; // Gets filled by ResolveModule() + CString m_sPage; // Gets filled by ResolveModule() +}; + +#endif // !_WEBMODULES_H diff --git a/main.h b/main.h index 47478dd0..e5a21054 100644 --- a/main.h +++ b/main.h @@ -24,6 +24,10 @@ #define _MODDIR_ "/usr/lib/znc" #endif +#ifndef _SKINDIR_ +#define _SKINDIR_ _MODDIR_ "/webskins" +#endif + #ifndef _DATADIR_ #define _DATADIR_ "/usr/share/znc" #endif diff --git a/modules/Makefile.in b/modules/Makefile.in index 19c6c1f8..060f5c54 100644 --- a/modules/Makefile.in +++ b/modules/Makefile.in @@ -87,6 +87,7 @@ create_install_dir: rm -rf $(DESTDIR)$(MODDIR)/*.so install_metadirs: create_install_dir + cp -Rp $(srcdir)/www $(DESTDIR)$(MODDIR) for a in $(srcdir)/*; do \ d=$$(echo $$a | sed -e "s:$(srcdir)/::g"); \ if [ -d $$a ] && [ -f $${d}.so ]; then \ diff --git a/modules/notes.cpp b/modules/notes.cpp new file mode 100644 index 00000000..b9532be3 --- /dev/null +++ b/modules/notes.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2004-2010 See the AUTHORS file for details. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include "Chan.h" +#include "HTTPSock.h" +#include "Server.h" +#include "Template.h" +#include "User.h" +#include "znc.h" +#include "WebModules.h" +#include + +using std::stringstream; + +class CNotesMod : public CModule { +public: + MODCONSTRUCTOR(CNotesMod) { + } + + virtual ~CNotesMod() { + } + + virtual bool OnLoad(const CString& sArgStr, CString& sMessage) { + return true; + } + + virtual bool WebRequiresLogin() { return true; } + virtual bool WebRequiresAdmin() { return false; } + virtual CString GetWebNavTitle() { return "Notes"; } + + virtual void OnClientLogin() { + ListNotes(true); + } + + virtual EModRet OnUserRaw(CString& sLine) { + if (sLine.Left(1) != "#") { + return CONTINUE; + } + + CString sKey; + bool bOverwrite = false; + + if (sLine == "#?") { + ListNotes(true); + } else if (sLine.Left(2) == "#-") { + sKey = sLine.Token(0).LeftChomp_n(2); + if (DelNote(sKey)) { + PutModNotice("Deleted note [" + sKey + "]"); + } else { + PutModNotice("Unable to delete note [" + sKey + "]"); + } + } else if (sLine.Left(2) == "#+") { + sKey = sLine.Token(0).LeftChomp_n(2); + bOverwrite = true; + } else if (sLine.Left(1) == "#") { + sKey = sLine.Token(0).LeftChomp_n(1); + } + + CString sValue(sLine.Token(1, true)); + + if (!sKey.empty()) { + if (!bOverwrite && !GetNV(sKey).empty()) { + PutModNotice("That note already exists. Use /#+ to overwrite."); + } else if (AddNote(sKey, sValue)) { + if (!bOverwrite) { + PutModNotice("Added note [" + sKey + "]"); + } else { + PutModNotice("Set note for [" + sKey + "]"); + } + } else { + PutModNotice("Unable to add note [" + sKey + "]"); + } + } + + return HALT; + } + + bool DelNote(const CString& sKey) { + return DelNV(sKey); + } + + bool AddNote(const CString& sKey, const CString& sNote) { + if (sKey.empty()) { + return false; + } + + return SetNV(sKey, sNote); + } + + void ListNotes(bool bNotice = false) { + CClient* pClient = GetClient(); + + if (pClient) { + CTable Table; + Table.AddColumn("Key"); + Table.AddColumn("Note"); + + for (MCString::iterator it = BeginNV(); it != EndNV(); ++it) { + Table.AddRow(); + Table.SetCell("Key", it->first); + Table.SetCell("Note", it->second); + } + + if (Table.size()) { + unsigned int idx = 0; + CString sLine; + while (Table.GetLine(idx++, sLine)) { + if (bNotice) { + pClient->PutModNotice(GetModName(), sLine); + } else { + pClient->PutModule(GetModName(), sLine); + } + } + } else { + if (bNotice) { + PutModNotice("You have no entries."); + } else { + PutModule("You have no entries."); + } + } + } + } + + virtual void OnModCommand(const CString& sLine) { + CString sCmd(sLine.Token(0)); + + if (sLine.Equals("LIST")) { + ListNotes(); + } else if (sCmd.Equals("ADD")) { + CString sKey(sLine.Token(1)); + CString sValue(sLine.Token(2, true)); + + if (!GetNV(sKey).empty()) { + PutModule("That note already exists. Use MOD to overwrite."); + } else if (AddNote(sKey, sValue)) { + PutModule("Added note [" + sKey + "]"); + } else { + PutModule("Unable to add note [" + sKey + "]"); + } + } else if (sCmd.Equals("MOD")) { + CString sKey(sLine.Token(1)); + CString sValue(sLine.Token(2, true)); + + if (AddNote(sKey, sValue)) { + PutModule("Set note for [" + sKey + "]"); + } else { + PutModule("Unable to add note [" + sKey + "]"); + } + } else if (sCmd.Equals("DEL")) { + CString sKey(sLine.Token(1)); + + if (DelNote(sKey)) { + PutModule("Deleted note [" + sKey + "]"); + } else { + PutModule("Unable to delete note [" + sKey + "]"); + } + } else { + PutModule("Commands are: Help, List, Add , Del , Mod "); + } + } + + virtual bool OnWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) { + if (sPageName.empty() || sPageName == "index") { + for (MCString::iterator it = BeginNV(); it != EndNV(); ++it) { + CTemplate& Row = Tmpl.AddRow("NotesLoop"); + + Row["Key"] = it->first; + Row["Note"] = it->second; + } + + return true; + } else if (sPageName == "delnote") { + DelNote(WebSock.GetParam("key")); + WebSock.Redirect("/mods/notes/"); + return true; + } else if (sPageName == "addnote") { + AddNote(WebSock.GetParam("key"), WebSock.GetParam("note")); + WebSock.Redirect("/mods/notes/"); + return true; + } + + return false; + } + +private: + map m_suSwitchCounters; +}; + +MODULEDEFS(CNotesMod, "Keep and replay notes") diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 30421516..2c109f83 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -12,41 +12,15 @@ #include "Template.h" #include "User.h" #include "znc.h" +#include "WebModules.h" +#include "ZNCString.h" #include +#include using std::stringstream; +using std::make_pair; -class CWebAdminMod; -class CWebAdminSock; - -class CWebAdminAuth : public CAuthBase { -public: - CWebAdminAuth(CWebAdminSock* pWebAdminSock, const CString& sUsername, const CString& sPassword); - - virtual ~CWebAdminAuth() {} - - void Invalidate() { m_pWebAdminSock = NULL; CAuthBase::Invalidate(); } - void AcceptedLogin(CUser& User); - void RefusedLogin(const CString& sReason); -private: -protected: - CWebAdminSock* m_pWebAdminSock; -}; - - -class CWebAdminSock : public CHTTPSock { -public: - CWebAdminSock(CWebAdminMod* pModule); - CWebAdminSock(CWebAdminMod* pModule, const CString& sHostname, unsigned short uPort, int iTimeout = 60); - virtual ~CWebAdminSock(); - - virtual bool OnPageRequest(const CString& sURI, CString& sPageRet); - virtual bool OnLogin(const CString& sUser, const CString& sPass); - - CString GetAvailSkinsDir(); - CString GetSkinDir(); - void PrintPage(CString& sPageRet, const CString& sTmplName); - +/* void GetErrorPage(CString& sPageRet, const CString& sError) { m_Template["Action"] = "error"; m_Template["Title"] = "Error"; @@ -54,20 +28,35 @@ public: PrintPage(sPageRet, "Error.tmpl"); } +*/ - 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); +class CWebAdminMod : public CGlobalModule { +public: + GLOBALMODCONSTRUCTOR(CWebAdminMod) { + AddSubPage(new CWebSubPage("settings", "Global Settings")); - CString GetModArgs(const CString& sModName, bool bGlobal = false) { - if (!bGlobal && !m_pUser) { + VPair vParams; + vParams.push_back(make_pair("user", "")); + AddSubPage(new CWebSubPage("edituser", "Your Settings", vParams)); + AddSubPage(new CWebSubPage("listusers", "List Users")); + AddSubPage(new CWebSubPage("adduser", "Add User")); + } + + virtual ~CWebAdminMod() { + } + + virtual bool OnLoad(const CString& sArgStr, CString& sMessage) { + return true; + } + + CString GetModArgs(CWebSock& WebSock, const CString& sModName, bool bGlobal = false) { + CUser* pUser = CZNC::Get().FindUser(WebSock.GetParam("user")); + + if (!bGlobal && !pUser) { return ""; } - CModules& Modules = (bGlobal) ? CZNC::Get().GetModules() : m_pUser->GetModules(); + CModules& Modules = (bGlobal) ? CZNC::Get().GetModules() : pUser->GetModules(); for (unsigned int a = 0; a < Modules.size(); a++) { CModule* pModule = Modules[a]; @@ -80,1094 +69,750 @@ public: return ""; } - // Setters - void SetSessionUser(CUser* p) { - m_pSessionUser = p; - m_bAdmin = p->IsAdmin(); + CUser* GetNewUser(CWebSock& WebSock, CUser* pUser) { + CString sUsername = WebSock.GetParam("newuser"); - // If m_pUser is not NULL, only that user can be edited. - if (m_bAdmin) { - m_pUser = NULL; - } else { - m_pUser = m_pSessionUser; - } - } - // !Setters - - virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort); - bool IsAdmin() const { return m_bAdmin; } - - CWebAdminMod* GetModule() const { return (CWebAdminMod*) m_pModule; } - -private: -protected: - CUser* m_pUser; - CUser* m_pSessionUser; - bool m_bAdmin; - CTemplate m_Template; - CSmartPtr m_spAuth; -}; - -class CWebAdminMod : public CGlobalModule { -public: - GLOBALMODCONSTRUCTOR(CWebAdminMod) { - m_sSkinName = GetNV("SkinName"); - } - - virtual ~CWebAdminMod() { - } - - virtual bool OnLoad(const CString& sArgStr, CString& sMessage) { - bool bSSL = false; - bool bIPv6 = false; - unsigned short uPort = 8080; - CString sArgs(sArgStr); - CString sPort; - CString sListenHost; - - m_bShareIRCPorts = true; - - while (sArgs.Left(1) == "-") { - CString sOpt = sArgs.Token(0); - sArgs = sArgs.Token(1, true); - - if (sOpt.Equals("-IPV6")) { - bIPv6 = true; - } else if (sOpt.Equals("-IPV4")) { - bIPv6 = false; - } else if (sOpt.Equals("-noircport")) { - m_bShareIRCPorts = false; - } else { - sMessage = "Unknown option [" + sOpt + "] valid options are -ipv4, -ipv6 or -noircport"; - return false; - } + if (sUsername.empty()) { + sUsername = WebSock.GetParam("user"); } - // No arguments left: Only port sharing - if (sArgs.empty() && m_bShareIRCPorts) - return true; - - if (sArgs.find(" ") != CString::npos) { - sListenHost = sArgs.Token(0); - sPort = sArgs.Token(1, true); - } else { - sPort = sArgs; + if (sUsername.empty()) { + WebSock.PrintErrorPage("Invalid Submission [Username is required]"); + return NULL; } - if (sPort.Left(1) == "+") { -#ifdef HAVE_LIBSSL - sPort.TrimLeft("+"); - bSSL = true; -#else - return false; -#endif + if (pUser) { + /* If we are editing a user we must not change the user name */ + sUsername = pUser->GetUserName(); } - if (!sPort.empty()) { - uPort = sPort.ToUShort(); + CString sArg = WebSock.GetParam("password"); + + if (sArg != WebSock.GetParam("password2")) { + WebSock.PrintErrorPage("Invalid Submission [Passwords do not match]"); + return NULL; } - return OpenListener(sMessage, uPort, sListenHost, bSSL, bIPv6); - } + CUser* pNewUser = new CUser(sUsername); - bool OpenListener(CString &sMessage, u_short uPort, const CString& sListenHost, - bool bSSL = false, bool bIPv6 = false) { - CWebAdminSock* pListenSock = new CWebAdminSock(this); -#ifdef HAVE_LIBSSL - if (bSSL) { - pListenSock->SetPemLocation(CZNC::Get().GetPemLocation()); - } -#endif - - errno = 0; - bool b = m_pManager->ListenHost(uPort, "WebAdmin::Listener", sListenHost, bSSL, SOMAXCONN, pListenSock, 0, bIPv6); - if (!b) { - sMessage = "Could not bind to port " + CString(uPort); - if (!sListenHost.empty()) - sMessage += " on vhost [" + sListenHost + "]"; - if (errno != 0) - sMessage += ": " + CString(strerror(errno)); - } - return b; - } - - void SetSkinName(const CString& s) { - m_sSkinName = s; - SetNV("SkinName", m_sSkinName); - } - - CString GetSkinName() const { return (m_sSkinName.empty()) ? CString("default") : m_sSkinName; } - unsigned int GetSwitchCounter(const CString& sToken) { - map::iterator it = m_suSwitchCounters.find(sToken); - - if (it == m_suSwitchCounters.end()) { - m_suSwitchCounters[sToken] = 1; - return 1; + if (!sArg.empty()) { + CString sSalt = CUtils::GetSalt(); + CString sHash = CUser::SaltedHash(sArg, sSalt); + pNewUser->SetPass(sHash, CUser::HASH_DEFAULT, sSalt); } - return it->second; - } + VCString vsArgs; + WebSock.GetRawParam("servers").Split("\n", vsArgs); + unsigned int a = 0; - unsigned int IncSwitchCounter(const CString& sToken) { - map::iterator it = m_suSwitchCounters.find(sToken); - - if (it == m_suSwitchCounters.end()) { - m_suSwitchCounters[sToken] = 2; - return 2; + for (a = 0; a < vsArgs.size(); a++) { + pNewUser->AddServer(vsArgs[a].Trim_n()); } - return ++it->second; - } - - virtual EModRet OnUnknownUserRaw(CClient* pClient, CString& sLine) { - if (!m_bShareIRCPorts) - return CONTINUE; - - // If this is a HTTP request, we should handle it - if (sLine.WildCmp("GET * HTTP/1.?") - || sLine.WildCmp("POST * HTTP/1.?")) { - CWebAdminSock* pSock = new CWebAdminSock(this); - CZNC::Get().GetManager().SwapSockByAddr(pSock, pClient); - - // And don't forget to give it some sane settings again - pSock->SetSockName("WebAdmin::Client"); - pSock->SetTimeout(120); - pSock->SetMaxBufferThreshold(10240); - - // TODO can we somehow get rid of this? - pSock->ReadLine(sLine); - pSock->PushBuff("", 0, true); - - return HALT; - } - return CONTINUE; - } - -private: - CString m_sSkinName; - bool m_bShareIRCPorts; - map m_suSwitchCounters; -}; - -CString CWebAdminSock::GetAvailSkinsDir() { - return m_pModule->GetModDataDir() + "/skins/"; -} - -CString CWebAdminSock::GetSkinDir() { - CString sAvailSkins = GetAvailSkinsDir(); - CString sSkinDir = GetModule()->GetSkinName() + "/"; - CString sDir = CDir::CheckPathPrefix(sAvailSkins, sSkinDir, "/"); - - // Via CheckPrefix() we check if someone tries to use e.g. a skin name - // with embed .. or such evilness. - if (!sDir.empty() && CFile::IsDir(sDir)) { - return sDir + "/"; - } - - return m_pModule->GetModDataDir() + "/skins/default/"; -} - -void CWebAdminSock::PrintPage(CString& sPageRet, const CString& sTmplName) { - sPageRet.clear(); - CString sTmpl; - - if (IsAdmin()) { - sTmpl = GetSkinDir(); - } - - sTmpl += sTmplName; - - if (!m_Template.SetFile(GetSkinDir() + sTmplName)) { - sPageRet = CHTTPSock::GetErrorPage(404, "Not Found", "The template for this page [" + sTmpl + "] (or a template that it includes) was not found."); - return; - } - - stringstream oStr; - if (!m_Template.Print(oStr)) { - sPageRet = CHTTPSock::GetErrorPage(403, "Forbidden", "The template for this page [" + sTmpl + "] (or a template that it includes) can not be opened."); - return; - } - - sPageRet = oStr.str(); -} - -bool CWebAdminSock::OnLogin(const CString& sUser, const CString& sPass) { - m_spAuth = new CWebAdminAuth(this, sUser, sPass); - - // Some authentication module could need some time, block this socket - // until then. CWebAdminAuth will UnPauseRead(). - PauseRead(); - CZNC::Get().AuthUser(m_spAuth); - - // If CWebAdminAuth already set this, don't change it. - return IsLoggedIn(); -} - -void CWebAdminSock::ListUsersPage(CString& sPageRet) { - const map& msUsers = CZNC::Get().GetUserMap(); - m_Template["Title"] = "List Users"; - m_Template["Action"] = "listusers"; - - unsigned int a = 0; - - for (map::const_iterator it = msUsers.begin(); it != msUsers.end(); it++, a++) { - CServer* pServer = it->second->GetCurrentServer(); - CTemplate& l = m_Template.AddRow("UserLoop"); - CUser& User = *it->second; - - l["Username"] = User.GetUserName(); - l["Clients"] = CString(User.GetClients().size()); - l["IRCNick"] = User.GetIRCNick().GetNick(); - - if (&User == m_pSessionUser) { - l["IsSelf"] = "true"; - } - - if (pServer) { - l["Server"] = pServer->GetName(); - } - } - - PrintPage(sPageRet, "ListUsers.tmpl"); -} - -Csock* CWebAdminSock::GetSockObj(const CString& sHost, unsigned short uPort) { - CWebAdminSock* pSock = new CWebAdminSock(GetModule(), sHost, uPort); - pSock->SetSockName("WebAdmin::Client"); - pSock->SetTimeout(120); - - return pSock; -} - -CWebAdminSock::CWebAdminSock(CWebAdminMod* pModule) : CHTTPSock(pModule) { - m_pModule = pModule; - m_pUser = NULL; - m_pSessionUser = NULL; - m_bAdmin = false; - SetDocRoot(GetSkinDir()); -} - -CWebAdminSock::CWebAdminSock(CWebAdminMod* pModule, const CString& sHostname, unsigned short uPort, int iTimeout) - : CHTTPSock(pModule, sHostname, uPort, iTimeout) { - m_pModule = pModule; - m_pUser = NULL; - m_pSessionUser = NULL; - m_bAdmin = false; - SetDocRoot(GetSkinDir()); -} - -CWebAdminSock::~CWebAdminSock() { - if (!m_spAuth.IsNull()) { - CWebAdminAuth* pAuth = (CWebAdminAuth*) &(*m_spAuth); - pAuth->Invalidate(); - } -} - -bool CWebAdminSock::OnPageRequest(const CString& sURI, CString& sPageRet) { - if (!ForceLogin()) { - return false; - } - - const CString& sSkin = GetModule()->GetSkinName(); - CString sTmp = sURI; - - m_Template["SessionUser"] = GetUser(); - m_Template["SessionIP"] = GetRemoteIP(); - m_Template["Tag"] = CZNC::GetTag(); - m_Template["Skin"] = sSkin; - - if (IsAdmin()) { - m_Template["IsAdmin"] = "true"; - } - - if (sURI == "/") { - if (!IsAdmin()) { - Redirect("/edituser"); - return false; - } - - m_Template["Title"] = "Main Page"; - m_Template["Action"] = "home"; - PrintPage(sPageRet, "Main.tmpl"); - } else if (sTmp.TrimPrefix("/" + sSkin + "/")) { - SetDocRoot(GetSkinDir() + "/data"); - PrintFile(sTmp); - return false; - } else if (sURI == "/favicon.ico") { - PrintFile("/data/favicon.ico", "image/x-icon"); - return false; - } else if (sURI == "/home") { - m_Template["Title"] = "Main Page"; - m_Template["Action"] = "home"; - PrintPage(sPageRet, "Main.tmpl"); - } else if (sURI == "/settings") { - if (!IsAdmin()) { - return false; - } - - if (!SettingsPage(sPageRet)) { - return false; - } - } else if (sURI == "/switchuser") { - unsigned int uCurCnt = GetParam("cnt").ToUInt(); - unsigned int uCounter = GetModule()->GetSwitchCounter(GetRemoteIP()); - - if (!uCurCnt) { - Redirect("/switchuser?cnt=" + CString(uCounter)); - return false; - } - - if (uCurCnt >= uCounter) { - m_bLoggedIn = false; - GetModule()->IncSwitchCounter(GetRemoteIP()); - ForceLogin(); - } else { - Redirect("/home"); - } - - return false; - } else if (sURI == "/adduser") { - if (!IsAdmin()) { - return false; - } - - if (!UserPage(sPageRet)) { - return false; - } - } else if (sURI == "/edituser") { - if (!m_pUser) { - m_pUser = CZNC::Get().FindUser(GetParam("user")); - } - - if (m_pUser) { - if (!UserPage(sPageRet, m_pUser)) { - return false; + WebSock.GetRawParam("allowedips").Split("\n", vsArgs); + if (vsArgs.size()) { + for (a = 0; a < vsArgs.size(); a++) { + pNewUser->AddAllowedHost(vsArgs[a].Trim_n()); } } else { - GetErrorPage(sPageRet, "No such username"); - } - } else if (sURI == "/editchan") { - if (!m_pUser) { - m_pUser = CZNC::Get().FindUser(GetParam("user")); + pNewUser->AddAllowedHost("*"); } - if (!m_pUser) { - GetErrorPage(sPageRet, "No such username"); - return true; + WebSock.GetRawParam("ctcpreplies").Split("\n", vsArgs); + for (a = 0; a < vsArgs.size(); a++) { + CString sReply = vsArgs[a].TrimRight_n("\r"); + pNewUser->AddCTCPReply(sReply.Token(0).Trim_n(), sReply.Token(1, true).Trim_n()); } - CChan* pChan = m_pUser->FindChan(GetParam("name")); - if (!pChan) { - GetErrorPage(sPageRet, "No such channel"); - return true; - } + sArg = WebSock.GetParam("nick"); if (!sArg.empty()) { pNewUser->SetNick(sArg); } + sArg = WebSock.GetParam("altnick"); if (!sArg.empty()) { pNewUser->SetAltNick(sArg); } + sArg = WebSock.GetParam("statusprefix"); if (!sArg.empty()) { pNewUser->SetStatusPrefix(sArg); } + sArg = WebSock.GetParam("ident"); if (!sArg.empty()) { pNewUser->SetIdent(sArg); } + sArg = WebSock.GetParam("skin"); if (!sArg.empty()) { pNewUser->SetSkinName(sArg); } + sArg = WebSock.GetParam("realname"); if (!sArg.empty()) { pNewUser->SetRealName(sArg); } + sArg = WebSock.GetParam("quitmsg"); if (!sArg.empty()) { pNewUser->SetQuitMsg(sArg); } + sArg = WebSock.GetParam("chanmodes"); if (!sArg.empty()) { pNewUser->SetDefaultChanModes(sArg); } + sArg = WebSock.GetParam("timestampformat"); if (!sArg.empty()) { pNewUser->SetTimestampFormat(sArg); } - if (!ChanPage(sPageRet, pChan)) { - return false; - } - } else if (sURI == "/addchan") { - if (!m_pUser) { - m_pUser = CZNC::Get().FindUser(GetParam("user")); - } - - if (m_pUser) { - if (!ChanPage(sPageRet)) { - return false; + sArg = WebSock.GetParam("vhost"); + // To change VHosts be admin or don't have DenySetVHost + if (WebSock.IsAdmin() || !WebSock.GetSessionUser()->DenySetVHost()) { + if (!sArg.empty()) { + pNewUser->SetVHost(sArg); } - } else { - GetErrorPage(sPageRet, "No such username"); - } - } else if (sURI == "/delchan") { - if (!m_pUser) { - m_pUser = CZNC::Get().FindUser(GetParam("user")); + } else if (pUser){ + pNewUser->SetVHost(pUser->GetVHost()); } - if (m_pUser) { - if (!DelChan(sPageRet)) { - return false; - } - } else { - GetErrorPage(sPageRet, "No such username"); - } - } else if (sURI == "/listusers") { - if (!IsAdmin()) { - return false; + pNewUser->SetSkinName(WebSock.GetParam("skin")); + pNewUser->SetBufferCount(WebSock.GetParam("bufsize").ToUInt()); + pNewUser->SetKeepBuffer(WebSock.GetParam("keepbuffer").ToBool()); + pNewUser->SetMultiClients(WebSock.GetParam("multiclients").ToBool()); + pNewUser->SetBounceDCCs(WebSock.GetParam("bouncedccs").ToBool()); + pNewUser->SetUseClientIP(WebSock.GetParam("useclientip").ToBool()); + pNewUser->SetTimestampAppend(WebSock.GetParam("appendtimestamp").ToBool()); + pNewUser->SetTimestampPrepend(WebSock.GetParam("prependtimestamp").ToBool()); + pNewUser->SetTimezoneOffset(WebSock.GetParam("timezoneoffset").ToDouble()); + pNewUser->SetJoinTries(WebSock.GetParam("jointries").ToUInt()); + pNewUser->SetMaxJoins(WebSock.GetParam("maxjoins").ToUInt()); + + if (WebSock.IsAdmin()) { + pNewUser->SetDenyLoadMod(WebSock.GetParam("denyloadmod").ToBool()); + pNewUser->SetDenySetVHost(WebSock.GetParam("denysetvhost").ToBool()); + } else if (pUser) { + pNewUser->SetDenyLoadMod(pUser->DenyLoadMod()); + pNewUser->SetDenySetVHost(pUser->DenySetVHost()); } - ListUsersPage(sPageRet); - } else if (sURI == "/deluser") { - if (!IsAdmin()) { - return false; + // If pUser is not NULL, we are editing an existing user. + // Users must not be able to change their own admin flag. + if (pUser != CZNC::Get().FindUser(WebSock.GetUser())) { + pNewUser->SetAdmin(WebSock.GetParam("isadmin").ToBool()); + } else if (pUser) { + pNewUser->SetAdmin(pUser->IsAdmin()); } - CString sUser = GetParam("user"); - CUser* pUser = CZNC::Get().FindUser(sUser); - - if (pUser && pUser == m_pSessionUser) { - GetErrorPage(sPageRet, "You are not allowed to delete yourself"); - } else if (CZNC::Get().DeleteUser(sUser)) { - Redirect("/listusers"); - return false; - } else { - GetErrorPage(sPageRet, "No such username"); - } - } else { - return false; - } - - return true; -} - -bool CWebAdminSock::SettingsPage(CString& sPageRet) { - if (!GetParam("submitted").ToUInt()) { - CString sVHosts, sMotd; - m_Template["Action"] = "settings"; - 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++) { - CTemplate& l = m_Template.AddRow("VHostLoop"); - l["VHost"] = vsVHosts[a]; + WebSock.GetParamValues("channel", vsArgs); + for (a = 0; a < vsArgs.size(); a++) { + const CString& sChan = vsArgs[a]; + pNewUser->AddChan(sChan.TrimRight_n("\r"), WebSock.GetParam("save_" + sChan).ToBool()); } - const VCString& vsMotd = CZNC::Get().GetMotd(); - for (unsigned int b = 0; b < vsMotd.size(); b++) { - CTemplate& l = m_Template.AddRow("MOTDLoop"); - l["Line"] = vsMotd[b]; - } + if (WebSock.IsAdmin() || (pUser && !pUser->DenyLoadMod())) { + WebSock.GetParamValues("loadmod", vsArgs); - const vector& vpListeners = CZNC::Get().GetListeners(); - for (unsigned int c = 0; c < vpListeners.size(); c++) { - CListener* pListener = vpListeners[c]; - CTemplate& l = m_Template.AddRow("ListenLoop"); + for (a = 0; a < vsArgs.size(); a++) { + CString sModRet; + CString sModName = vsArgs[a].TrimRight_n("\r"); - l["Port"] = CString(pListener->GetPort()); - l["BindHost"] = pListener->GetBindHost(); + if (!sModName.empty()) { + CString sArgs = WebSock.GetParam("modargs_" + sModName); -#ifdef HAVE_LIBSSL - if (pListener->IsSSL()) { - l["IsSSL"] = "true"; - } -#endif - -#ifdef HAVE_IPV6 - if (pListener->IsIPV6()) { - l["IsIPV6"] = "true"; - } -#endif - } - - CString sDir(GetAvailSkinsDir()); - - if (CFile::IsDir(sDir)) { - CDir Dir(sDir); - - m_Template.AddRow("SkinLoop")["Name"] = "default"; - - for (unsigned int d = 0; d < Dir.size(); d++) { - const CFile& SubDir = *Dir[d]; - - if (SubDir.IsDir() && - SubDir.GetShortName() != ".svn" && - SubDir.GetShortName() != "default") { - CTemplate& l = m_Template.AddRow("SkinLoop"); - l["Name"] = SubDir.GetShortName(); - - if (SubDir.GetShortName() == GetModule()->GetSkinName()) { - l["Checked"] = "true"; + try { + if (!pNewUser->GetModules().LoadModule(sModName, sArgs, pNewUser, sModRet, (pUser != NULL))) { + DEBUG("Unable to load module [" << sModName << "] [" << sModRet << "]"); + } + } catch (...) { + DEBUG("Unable to load module [" << sModName << "] [" << sArgs << "]"); } } } - } + } else if (pUser) { + CModules& Modules = pUser->GetModules(); - set ssGlobalMods; - CZNC::Get().GetModules().GetAvailableMods(ssGlobalMods, true); - - for (set::iterator it = ssGlobalMods.begin(); it != ssGlobalMods.end(); ++it) { - const CModInfo& Info = *it; - 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); - } - - PrintPage(sPageRet, "Settings.tmpl"); - return true; - } - - CString sArg; - sArg = GetParam("statusprefix"); CZNC::Get().SetStatusPrefix(sArg); - sArg = GetParam("ispooffile"); CZNC::Get().SetISpoofFile(sArg); - sArg = GetParam("ispoofformat"); CZNC::Get().SetISpoofFormat(sArg); - //sArg = GetParam(""); if (!sArg.empty()) { CZNC::Get().Set(sArg); } - - VCString vsArgs; - GetRawParam("motd").Split("\n", vsArgs); - CZNC::Get().ClearMotd(); - - unsigned int a = 0; - for (a = 0; a < vsArgs.size(); a++) { - CZNC::Get().AddMotd(vsArgs[a].TrimRight_n()); - } - - GetRawParam("vhosts").Split("\n", vsArgs); - CZNC::Get().ClearVHosts(); - - for (a = 0; a < vsArgs.size(); a++) { - CZNC::Get().AddVHost(vsArgs[a].Trim_n()); - } - - GetModule()->SetSkinName(GetParam("skin")); - - set ssArgs; - GetParamValues("loadmod", ssArgs); - - for (set::iterator it = ssArgs.begin(); it != ssArgs.end(); ++it) { - CString sModRet; - CString sModName = (*it).TrimRight_n("\r"); - - if (!sModName.empty()) { - CString sArgs = GetParam("modargs_" + sModName); - - CModule *pMod = CZNC::Get().GetModules().FindModule(sModName); - if (!pMod) { - if (!CZNC::Get().GetModules().LoadModule(sModName, sArgs, NULL, sModRet)) { - DEBUG("Unable to load module [" << sModName << "] [" << sModRet << "]"); - } - } else if (pMod->GetArgs() != sArgs) { - if (!CZNC::Get().GetModules().ReloadModule(sModName, sArgs, NULL, sModRet)) { - DEBUG("Unable to reload module [" << sModName << "] [" << sModRet << "]"); - } - } else { - DEBUG("Unable to load module [" << sModName << "] because it is already loaded"); - } - } - } - - const CModules& vCurMods = CZNC::Get().GetModules(); - set ssUnloadMods; - - for (a = 0; a < vCurMods.size(); a++) { - CModule* pCurMod = vCurMods[a]; - - if (ssArgs.find(pCurMod->GetModName()) == ssArgs.end() && pCurMod->GetModName() != m_pModule->GetModName()) { - ssUnloadMods.insert(pCurMod->GetModName()); - } - } - - for (set::iterator it2 = ssUnloadMods.begin(); it2 != ssUnloadMods.end(); ++it2) { - CZNC::Get().GetModules().UnloadModule(*it2); - } - - if (!CZNC::Get().WriteConfig()) { - GetErrorPage(sPageRet, "Settings changed, but config was not written"); - return true; - } - - Redirect("/settings"); - return false; -} - -bool CWebAdminSock::ChanPage(CString& sPageRet, CChan* pChan) { - if (!m_pUser) { - GetErrorPage(sPageRet, "That user doesn't exist"); - return true; - } - - if (!GetParam("submitted").ToUInt()) { - m_Template["User"] = m_pUser->GetUserName(); - - if (pChan) { - m_Template["Action"] = "editchan"; - m_Template["Edit"] = "true"; - m_Template["Title"] = "Edit Channel" + CString(" [" + pChan->GetName() + "]"); - m_Template["ChanName"] = pChan->GetName(); - m_Template["BufferCount"] = CString(pChan->GetBufferCount()); - m_Template["DefModes"] = pChan->GetDefaultModes(); - - if (pChan->InConfig()) { - m_Template["InConfig"] = "true"; - } - } else { - m_Template["Action"] = "addchan"; - m_Template["Title"] = "Add Channel" + CString(" for User [" + m_pUser->GetUserName() + "]"); - m_Template["BufferCount"] = CString(m_pUser->GetBufferCount()); - m_Template["DefModes"] = CString(m_pUser->GetDefaultChanModes()); - m_Template["InConfig"] = "true"; - } - - /* o1 used to be AutoCycle which was removed */ - - CTemplate& o2 = m_Template.AddRow("OptionLoop"); - o2["Name"] = "keepbuffer"; - o2["DisplayName"] = "Keep Buffer"; - if ((pChan && pChan->KeepBuffer()) || (!pChan && m_pUser->KeepBuffer())) { o2["Checked"] = "true"; } - - CTemplate& o3 = m_Template.AddRow("OptionLoop"); - o3["Name"] = "detached"; - o3["DisplayName"] = "Detached"; - if (pChan && pChan->IsDetached()) { o3["Checked"] = "true"; } - - PrintPage(sPageRet, "Channel.tmpl"); - return true; - } - - CString sChanName = GetParam("name").Trim_n(); - - if (!pChan) { - if (sChanName.empty()) { - GetErrorPage(sPageRet, "Channel name is a required argument"); - return true; - } - - if (m_pUser->FindChan(sChanName.Token(0))) { - GetErrorPage(sPageRet, "Channel [" + sChanName.Token(0) + "] already exists"); - 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->SetKeepBuffer(GetParam("keepbuffer").ToBool()); - - bool bDetached = GetParam("detached").ToBool(); - - if (pChan->IsDetached() != bDetached) { - if (bDetached) { - pChan->DetachUser(); - } else { - pChan->AttachUser(); - } - } - - if (!CZNC::Get().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("name"); - - 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); - - if (!CZNC::Get().WriteConfig()) { - GetErrorPage(sPageRet, "Channel deleted, but config was not written"); - return true; - } - - Redirect("/edituser?user=" + m_pUser->GetUserName().Escape_n(CString::EURL)); - return false; -} - -bool CWebAdminSock::UserPage(CString& sPageRet, CUser* pUser) { - if (!GetParam("submitted").ToUInt()) { - CString sAllowedHosts, sServers, sChans, sCTCPReplies; - - if (pUser) { - m_Template["Action"] = "edituser"; - 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["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(pUser->GetBufferCount()); - m_Template["TimestampFormat"] = pUser->GetTimestampFormat(); - m_Template["TimezoneOffset"] = CString(pUser->GetTimezoneOffset()); - m_Template["JoinTries"] = CString(pUser->JoinTries()); - m_Template["MaxJoins"] = CString(pUser->MaxJoins()); - - const set& ssAllowedHosts = pUser->GetAllowedHosts(); - for (set::const_iterator it = ssAllowedHosts.begin(); it != ssAllowedHosts.end(); ++it) { - CTemplate& l = m_Template.AddRow("AllowedHostLoop"); - l["Host"] = *it; - } - - const vector& vServers = pUser->GetServers(); - for (unsigned int a = 0; a < vServers.size(); a++) { - CTemplate& l = m_Template.AddRow("ServerLoop"); - l["Server"] = vServers[a]->GetString(); - } - - const MCString& msCTCPReplies = pUser->GetCTCPReplies(); - for (MCString::const_iterator it2 = msCTCPReplies.begin(); it2 != msCTCPReplies.end(); ++it2) { - CTemplate& l = m_Template.AddRow("CTCPLoop"); - l["CTCP"] = it2->first + " " + it2->second; - } - - const vector& 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(pChan->GetBufferCount()); - l["Options"] = pChan->GetOptions(); - - if (pChan->InConfig()) { - l["InConfig"] = "true"; - } - } - } else { - m_Template["Action"] = "adduser"; - m_Template["Title"] = "Add User"; - m_Template["StatusPrefix"] = "*"; - } - - // To change VHosts be admin or don't have DenySetVHost - const VCString& vsVHosts = CZNC::Get().GetVHosts(); - bool bFoundVHost = false; - if (IsAdmin() || !m_pSessionUser->DenySetVHost()) { - 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"; - bFoundVHost = true; - } - } - - // If our current vhost is not in the global list... - if (pUser && !bFoundVHost && !pUser->GetVHost().empty()) { - CTemplate& l = m_Template.AddRow("VHostLoop"); - - l["VHost"] = pUser->GetVHost(); - l["Checked"] = "true"; - } - } - - set ssUserMods; - CZNC::Get().GetModules().GetAvailableMods(ssUserMods); - - for (set::iterator it = ssUserMods.begin(); it != ssUserMods.end(); ++it) { - const CModInfo& Info = *it; - 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()) { - l["Disabled"] = "true"; - } - } - - CTemplate& o1 = m_Template.AddRow("OptionLoop"); - o1["Name"] = "keepbuffer"; - o1["DisplayName"] = "Keep Buffer"; - if (!pUser || pUser->KeepBuffer()) { o1["Checked"] = "true"; } - - /* o2 used to be auto cycle which was removed */ - - CTemplate& o4 = m_Template.AddRow("OptionLoop"); - o4["Name"] = "multiclients"; - o4["DisplayName"] = "Multi Clients"; - if (!pUser || pUser->MultiClients()) { o4["Checked"] = "true"; } - - CTemplate& o5 = m_Template.AddRow("OptionLoop"); - o5["Name"] = "bouncedccs"; - o5["DisplayName"] = "Bounce DCCs"; - if (!pUser || pUser->BounceDCCs()) { o5["Checked"] = "true"; } - - CTemplate& o6 = m_Template.AddRow("OptionLoop"); - o6["Name"] = "useclientip"; - o6["DisplayName"] = "Use Client IP"; - if (pUser && pUser->UseClientIP()) { o6["Checked"] = "true"; } - - CTemplate& o7 = m_Template.AddRow("OptionLoop"); - o7["Name"] = "appendtimestamp"; - o7["DisplayName"] = "Append Timestamps"; - if (pUser && pUser->GetTimestampAppend()) { o7["Checked"] = "true"; } - - CTemplate& o8 = m_Template.AddRow("OptionLoop"); - o8["Name"] = "prependtimestamp"; - o8["DisplayName"] = "Prepend Timestamps"; - if (pUser && pUser->GetTimestampPrepend()) { o8["Checked"] = "true"; } - - if (IsAdmin()) { - CTemplate& o9 = m_Template.AddRow("OptionLoop"); - o9["Name"] = "denyloadmod"; - o9["DisplayName"] = "Deny LoadMod"; - if (pUser && pUser->DenyLoadMod()) { o9["Checked"] = "true"; } - - CTemplate& o10 = m_Template.AddRow("OptionLoop"); - o10["Name"] = "isadmin"; - o10["DisplayName"] = "Admin"; - if (pUser && pUser->IsAdmin()) { o10["Checked"] = "true"; } - if (pUser && pUser == CZNC::Get().FindUser(GetUser())) { o10["Disabled"] = "true"; } - - CTemplate& o11 = m_Template.AddRow("OptionLoop"); - o11["Name"] = "denysetvhost"; - o11["DisplayName"] = "Deny SetVHost"; - if (pUser && pUser->DenySetVHost()) { o11["Checked"] = "true"; } - } - - PrintPage(sPageRet, "UserPage.tmpl"); - return true; - } - - /* If pUser is NULL, we are adding a user, else we are editing this one */ - - CString sUsername = GetParam("user"); - if (!pUser && CZNC::Get().FindUser(sUsername)) { - GetErrorPage(sPageRet, "Invalid Submission [User " + sUsername + " already exists]"); - return true; - } - - CUser* pNewUser = GetNewUser(sPageRet, pUser); - if (!pNewUser) { - return true; - } - - CString sErr; - - if (!pUser) { - // Add User Submission - if (!CZNC::Get().AddUser(pNewUser, sErr)) { - delete pNewUser; - GetErrorPage(sPageRet, "Invalid submission [" + sErr + "]"); - return true; - } - - if (!CZNC::Get().WriteConfig()) { - GetErrorPage(sPageRet, "User added, but config was not written"); - return true; - } - } else { - // Edit User Submission - if (!pUser->Clone(*pNewUser, sErr, false)) { - delete pNewUser; - GetErrorPage(sPageRet, "Invalid Submission [" + sErr + "]"); - return true; - } - - delete pNewUser; - if (!CZNC::Get().WriteConfig()) { - GetErrorPage(sPageRet, "User edited, but config was not written"); - return true; - } - } - - if (!IsAdmin()) { - Redirect("/edituser"); - } else { - Redirect("/listusers"); - } - - return false; -} - -CUser* CWebAdminSock::GetNewUser(CString& sPageRet, CUser* pUser) { - CString sUsername = GetParam("newuser"); - - if (sUsername.empty()) { - sUsername = GetParam("user"); - } - - if (sUsername.empty()) { - GetErrorPage(sPageRet, "Invalid Submission [Username is required]"); - return NULL; - } - - if (pUser) { - /* If we are editing a user we must not change the user name */ - sUsername = pUser->GetUserName(); - } - - CString sArg = GetParam("password"); - - if (sArg != GetParam("password2")) { - GetErrorPage(sPageRet, "Invalid Submission [Passwords do not match]"); - return NULL; - } - - CUser* pNewUser = new CUser(sUsername); - - if (!sArg.empty()) { - CString sSalt = CUtils::GetSalt(); - CString sHash = CUser::SaltedHash(sArg, sSalt); - pNewUser->SetPass(sHash, CUser::HASH_DEFAULT, sSalt); - } - - VCString vsArgs; - GetRawParam("servers").Split("\n", vsArgs); - unsigned int a = 0; - - for (a = 0; a < vsArgs.size(); a++) { - pNewUser->AddServer(vsArgs[a].Trim_n()); - } - - GetRawParam("allowedips").Split("\n", vsArgs); - if (vsArgs.size()) { - for (a = 0; a < vsArgs.size(); a++) { - pNewUser->AddAllowedHost(vsArgs[a].Trim_n()); - } - } else { - pNewUser->AddAllowedHost("*"); - } - - GetRawParam("ctcpreplies").Split("\n", vsArgs); - for (a = 0; a < vsArgs.size(); a++) { - CString sReply = vsArgs[a].TrimRight_n("\r"); - pNewUser->AddCTCPReply(sReply.Token(0).Trim_n(), sReply.Token(1, true).Trim_n()); - } - - sArg = GetParam("nick"); if (!sArg.empty()) { pNewUser->SetNick(sArg); } - sArg = GetParam("altnick"); if (!sArg.empty()) { pNewUser->SetAltNick(sArg); } - sArg = GetParam("statusprefix"); if (!sArg.empty()) { pNewUser->SetStatusPrefix(sArg); } - sArg = GetParam("ident"); if (!sArg.empty()) { pNewUser->SetIdent(sArg); } - sArg = GetParam("realname"); if (!sArg.empty()) { pNewUser->SetRealName(sArg); } - sArg = GetParam("quitmsg"); if (!sArg.empty()) { pNewUser->SetQuitMsg(sArg); } - sArg = GetParam("chanmodes"); if (!sArg.empty()) { pNewUser->SetDefaultChanModes(sArg); } - sArg = GetParam("timestampformat"); if (!sArg.empty()) { pNewUser->SetTimestampFormat(sArg); } - - sArg = GetParam("vhost"); - // To change VHosts be admin or don't have DenySetVHost - if (IsAdmin() || !m_pSessionUser->DenySetVHost()) { - if (!sArg.empty()) - pNewUser->SetVHost(sArg); - } else if (pUser){ - pNewUser->SetVHost(pUser->GetVHost()); - } - - pNewUser->SetBufferCount(GetParam("bufsize").ToUInt()); - pNewUser->SetKeepBuffer(GetParam("keepbuffer").ToBool()); - pNewUser->SetMultiClients(GetParam("multiclients").ToBool()); - pNewUser->SetBounceDCCs(GetParam("bouncedccs").ToBool()); - pNewUser->SetUseClientIP(GetParam("useclientip").ToBool()); - pNewUser->SetTimestampAppend(GetParam("appendtimestamp").ToBool()); - pNewUser->SetTimestampPrepend(GetParam("prependtimestamp").ToBool()); - pNewUser->SetTimezoneOffset(GetParam("timezoneoffset").ToDouble()); - pNewUser->SetJoinTries(GetParam("jointries").ToUInt()); - pNewUser->SetMaxJoins(GetParam("maxjoins").ToUInt()); - - if (IsAdmin()) { - pNewUser->SetDenyLoadMod(GetParam("denyloadmod").ToBool()); - pNewUser->SetDenySetVHost(GetParam("denysetvhost").ToBool()); - } else if (pUser) { - pNewUser->SetDenyLoadMod(pUser->DenyLoadMod()); - pNewUser->SetDenySetVHost(pUser->DenySetVHost()); - } - - // If pUser is not NULL, we are editing an existing user. - // Users must not be able to change their own admin flag. - if (pUser != CZNC::Get().FindUser(GetUser())) { - pNewUser->SetAdmin(GetParam("isadmin").ToBool()); - } else if (pUser) { - pNewUser->SetAdmin(pUser->IsAdmin()); - } - - GetParamValues("channel", vsArgs); - for (a = 0; a < vsArgs.size(); a++) { - const CString& sChan = vsArgs[a]; - pNewUser->AddChan(sChan.TrimRight_n("\r"), GetParam("save_" + sChan).ToBool()); - } - - if (IsAdmin() || (pUser && !pUser->DenyLoadMod())) { - GetParamValues("loadmod", vsArgs); - - for (a = 0; a < vsArgs.size(); a++) { - CString sModRet; - CString sModName = vsArgs[a].TrimRight_n("\r"); - - if (!sModName.empty()) { - CString sArgs = GetParam("modargs_" + sModName); + for (a = 0; a < Modules.size(); a++) { + CString sModName = Modules[a]->GetModName(); + CString sArgs = Modules[a]->GetArgs(); + CString sModRet; try { if (!pNewUser->GetModules().LoadModule(sModName, sArgs, pNewUser, sModRet, (pUser != NULL))) { DEBUG("Unable to load module [" << sModName << "] [" << sModRet << "]"); } } catch (...) { - DEBUG("Unable to load module [" << sModName << "] [" << sArgs << "]"); + DEBUG("Unable to load module [" << sModName << "]"); } } } - } else if (pUser) { - CModules& Modules = pUser->GetModules(); - for (a = 0; a < Modules.size(); a++) { - CString sModName = Modules[a]->GetModName(); - CString sArgs = Modules[a]->GetArgs(); + return pNewUser; + } + + virtual bool WebRequiresLogin() { return true; } + virtual bool WebRequiresAdmin() { return false; } + virtual CString GetWebNavTitle() { return "webadmin"; } + virtual bool OnWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) { + std::cerr << "=============================== webadmin sPageName=[" << sPageName << "]" << std::endl; + + if (sPageName == "settings") { + return SettingsPage(WebSock, Tmpl); + } else if (sPageName == "adduser") { + return UserPage(WebSock, Tmpl); + } else if (sPageName == "editchan") { + CUser* pUser = CZNC::Get().FindUser(WebSock.GetParam("user")); + + if (!pUser) { + WebSock.PrintErrorPage("No such username"); + return true; + } + + CChan* pChan = pUser->FindChan(WebSock.GetParam("name")); + if (!pChan) { + WebSock.PrintErrorPage("No such channel"); + return true; + } + + return ChanPage(WebSock, Tmpl, pUser, pChan); + } else if (sPageName == "addchan") { + CUser* pUser = CZNC::Get().FindUser(WebSock.GetParam("user")); + + if (pUser) { + return ChanPage(WebSock, Tmpl, pUser); + } + + WebSock.PrintErrorPage("No such username"); + } else if (sPageName == "delchan") { + CUser* pUser = CZNC::Get().FindUser(WebSock.GetParam("user")); + + if (pUser) { + return DelChan(WebSock, pUser); + } + + WebSock.PrintErrorPage("No such username"); + } else if (sPageName == "deluser") { + if (!WebSock.IsAdmin()) { + WebSock.PrintErrorPage("You are not an admin"); + return true; + } + + CString sUser = WebSock.GetParam("user"); + CUser* pUser = CZNC::Get().FindUser(sUser); + + if (pUser && pUser == WebSock.GetSessionUser()) { + WebSock.PrintErrorPage("You are not allowed to delete yourself"); + return true; + } else if (CZNC::Get().DeleteUser(sUser)) { + WebSock.Redirect("listusers"); + return true; + } + + WebSock.PrintErrorPage("No such username"); + return true; + } else if (sPageName == "edituser") { + CUser* pUser = WebSock.HasParam("user") ? CZNC::Get().FindUser(WebSock.GetParam("user")) : WebSock.GetSessionUser(); + + if (pUser) { + return UserPage(WebSock, Tmpl, pUser); + } + + WebSock.PrintErrorPage("No such username"); + } else if (sPageName == "listusers") { + return ListUsersPage(WebSock, Tmpl); + } else if (sPageName.empty() || sPageName == "index") { + return true; + } + + return false; + } + + bool ChanPage(CWebSock& WebSock, CTemplate& Tmpl, CUser* pUser, CChan* pChan = NULL) { + Tmpl.SetFile("add_edit_chan.tmpl"); + + if (!pUser) { + WebSock.PrintErrorPage("That user doesn't exist"); + return true; + } + + if (!WebSock.GetParam("submitted").ToUInt()) { + Tmpl["User"] = pUser->GetUserName(); + + if (pChan) { + Tmpl["Action"] = "editchan"; + Tmpl["Edit"] = "true"; + Tmpl["Title"] = "Edit Channel" + CString(" [" + pChan->GetName() + "]"); + Tmpl["ChanName"] = pChan->GetName(); + Tmpl["BufferCount"] = CString(pChan->GetBufferCount()); + Tmpl["DefModes"] = pChan->GetDefaultModes(); + + if (pChan->InConfig()) { + Tmpl["InConfig"] = "true"; + } + } else { + Tmpl["Action"] = "addchan"; + Tmpl["Title"] = "Add Channel" + CString(" for User [" + pUser->GetUserName() + "]"); + Tmpl["BufferCount"] = CString(pUser->GetBufferCount()); + Tmpl["DefModes"] = CString(pUser->GetDefaultChanModes()); + Tmpl["InConfig"] = "true"; + } + + // o1 used to be AutoCycle which was removed + + CTemplate& o2 = Tmpl.AddRow("OptionLoop"); + o2["Name"] = "keepbuffer"; + o2["DisplayName"] = "Keep Buffer"; + if ((pChan && pChan->KeepBuffer()) || (!pChan && pUser->KeepBuffer())) { o2["Checked"] = "true"; } + + CTemplate& o3 = Tmpl.AddRow("OptionLoop"); + o3["Name"] = "detached"; + o3["DisplayName"] = "Detached"; + if (pChan && pChan->IsDetached()) { o3["Checked"] = "true"; } + + return true; + } + + CString sChanName = WebSock.GetParam("name").Trim_n(); + + if (!pChan) { + if (sChanName.empty()) { + WebSock.PrintErrorPage("Channel name is a required argument"); + return true; + } + + if (pUser->FindChan(sChanName.Token(0))) { + WebSock.PrintErrorPage("Channel [" + sChanName.Token(0) + "] already exists"); + return true; + } + + pChan = new CChan(sChanName, pUser, true); + pUser->AddChan(pChan); + } + + pChan->SetDefaultModes(WebSock.GetParam("defmodes")); + pChan->SetBufferCount(WebSock.GetParam("buffercount").ToUInt()); + pChan->SetInConfig(WebSock.GetParam("save").ToBool()); + pChan->SetKeepBuffer(WebSock.GetParam("keepbuffer").ToBool()); + + bool bDetached = WebSock.GetParam("detached").ToBool(); + + if (pChan->IsDetached() != bDetached) { + if (bDetached) { + pChan->DetachUser(); + } else { + pChan->AttachUser(); + } + } + + if (!CZNC::Get().WriteConfig()) { + WebSock.PrintErrorPage("Channel added/modified, but config was not written"); + return true; + } + + WebSock.Redirect("edituser?user=" + pUser->GetUserName().Escape_n(CString::EURL)); + return true; + } + + bool DelChan(CWebSock& WebSock, CUser* pUser) { + CString sChan = WebSock.GetParam("name"); + + if (!pUser) { + WebSock.PrintErrorPage("That user doesn't exist"); + return true; + } + + if (sChan.empty()) { + WebSock.PrintErrorPage("That channel doesn't exist for this user"); + return true; + } + + pUser->DelChan(sChan); + pUser->PutIRC("PART " + sChan); + + if (!CZNC::Get().WriteConfig()) { + WebSock.PrintErrorPage("Channel deleted, but config was not written"); + return true; + } + + WebSock.Redirect("edituser?user=" + pUser->GetUserName().Escape_n(CString::EURL)); + return false; + } + + bool UserPage(CWebSock& WebSock, CTemplate& Tmpl, CUser* pUser = NULL) { + Tmpl.SetFile("add_edit_user.tmpl"); + + if (!WebSock.GetParam("submitted").ToUInt()) { + CString sAllowedHosts, sServers, sChans, sCTCPReplies; + + if (pUser) { + Tmpl["Action"] = "edituser"; + Tmpl["Title"] = "Edit User [" + pUser->GetUserName() + "]"; + Tmpl["Edit"] = "true"; + Tmpl["Username"] = pUser->GetUserName(); + Tmpl["Nick"] = pUser->GetNick(); + Tmpl["AltNick"] = pUser->GetAltNick(); + Tmpl["StatusPrefix"] = pUser->GetStatusPrefix(); + Tmpl["Ident"] = pUser->GetIdent(); + Tmpl["RealName"] = pUser->GetRealName(); + Tmpl["QuitMsg"] = pUser->GetQuitMsg(); + Tmpl["DefaultChanModes"] = pUser->GetDefaultChanModes(); + Tmpl["BufferCount"] = CString(pUser->GetBufferCount()); + Tmpl["TimestampFormat"] = pUser->GetTimestampFormat(); + Tmpl["TimezoneOffset"] = CString(pUser->GetTimezoneOffset()); + Tmpl["JoinTries"] = CString(pUser->JoinTries()); + Tmpl["MaxJoins"] = CString(pUser->MaxJoins()); + + const set& ssAllowedHosts = pUser->GetAllowedHosts(); + for (set::const_iterator it = ssAllowedHosts.begin(); it != ssAllowedHosts.end(); ++it) { + CTemplate& l = Tmpl.AddRow("AllowedHostLoop"); + l["Host"] = *it; + } + + const vector& vServers = pUser->GetServers(); + for (unsigned int a = 0; a < vServers.size(); a++) { + CTemplate& l = Tmpl.AddRow("ServerLoop"); + l["Server"] = vServers[a]->GetString(); + } + + const MCString& msCTCPReplies = pUser->GetCTCPReplies(); + for (MCString::const_iterator it2 = msCTCPReplies.begin(); it2 != msCTCPReplies.end(); it2++) { + CTemplate& l = Tmpl.AddRow("CTCPLoop"); + l["CTCP"] = it2->first + " " + it2->second; + } + + const vector& Channels = pUser->GetChans(); + for (unsigned int c = 0; c < Channels.size(); c++) { + CChan* pChan = Channels[c]; + CTemplate& l = Tmpl.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(pChan->GetBufferCount()); + l["Options"] = pChan->GetOptions(); + + if (pChan->InConfig()) { + l["InConfig"] = "true"; + } + } + } else { + Tmpl["Action"] = "adduser"; + Tmpl["Title"] = "Add User"; + Tmpl["StatusPrefix"] = "*"; + } + + // To change VHosts be admin or don't have DenySetVHost + const VCString& vsVHosts = CZNC::Get().GetVHosts(); + bool bFoundVHost = false; + if (WebSock.IsAdmin() || !WebSock.GetSessionUser()->DenySetVHost()) { + for (unsigned int b = 0; b < vsVHosts.size(); b++) { + const CString& sVHost = vsVHosts[b]; + CTemplate& l = Tmpl.AddRow("VHostLoop"); + + l["VHost"] = sVHost; + + if (pUser && pUser->GetVHost() == sVHost) { + l["Checked"] = "true"; + bFoundVHost = true; + } + } + + // If our current vhost is not in the global list... + if (pUser && !bFoundVHost && !pUser->GetVHost().empty()) { + CTemplate& l = Tmpl.AddRow("VHostLoop"); + + l["VHost"] = pUser->GetVHost(); + l["Checked"] = "true"; + } + } + + vector vDirs; + WebSock.GetAvailSkins(vDirs); + + for (unsigned int d = 0; d < vDirs.size(); d++) { + const CFile& SubDir = vDirs[d]; + CTemplate& l = Tmpl.AddRow("SkinLoop"); + l["Name"] = SubDir.GetShortName(); + + if (SubDir.GetShortName() == (WebSock.IsLoggedIn() ? WebSock.GetSessionUser()->GetSkinName() : CZNC::Get().GetSkinName())) { + l["Checked"] = "true"; + } + } + + set ssUserMods; + CZNC::Get().GetModules().GetAvailableMods(ssUserMods); + + for (set::iterator it = ssUserMods.begin(); it != ssUserMods.end(); ++it) { + const CModInfo& Info = *it; + CTemplate& l = Tmpl.AddRow("ModuleLoop"); + + l["Name"] = Info.GetName(); + l["Description"] = Info.GetDescription(); + l["Args"] = GetModArgs(WebSock, Info.GetName()); + + if (pUser && pUser->GetModules().FindModule(Info.GetName())) { + l["Checked"] = "true"; + } + + if (!WebSock.IsAdmin() && pUser && pUser->DenyLoadMod()) { + l["Disabled"] = "true"; + } + } + + CTemplate& o1 = Tmpl.AddRow("OptionLoop"); + o1["Name"] = "keepbuffer"; + o1["DisplayName"] = "Keep Buffer"; + if (!pUser || pUser->KeepBuffer()) { o1["Checked"] = "true"; } + + /* o2 used to be auto cycle which was removed */ + + CTemplate& o4 = Tmpl.AddRow("OptionLoop"); + o4["Name"] = "multiclients"; + o4["DisplayName"] = "Multi Clients"; + if (!pUser || pUser->MultiClients()) { o4["Checked"] = "true"; } + + CTemplate& o5 = Tmpl.AddRow("OptionLoop"); + o5["Name"] = "bouncedccs"; + o5["DisplayName"] = "Bounce DCCs"; + if (!pUser || pUser->BounceDCCs()) { o5["Checked"] = "true"; } + + CTemplate& o6 = Tmpl.AddRow("OptionLoop"); + o6["Name"] = "useclientip"; + o6["DisplayName"] = "Use Client IP"; + if (pUser && pUser->UseClientIP()) { o6["Checked"] = "true"; } + + CTemplate& o7 = Tmpl.AddRow("OptionLoop"); + o7["Name"] = "appendtimestamp"; + o7["DisplayName"] = "Append Timestamps"; + if (pUser && pUser->GetTimestampAppend()) { o7["Checked"] = "true"; } + + CTemplate& o8 = Tmpl.AddRow("OptionLoop"); + o8["Name"] = "prependtimestamp"; + o8["DisplayName"] = "Prepend Timestamps"; + if (pUser && pUser->GetTimestampPrepend()) { o8["Checked"] = "true"; } + + if (WebSock.IsAdmin()) { + CTemplate& o9 = Tmpl.AddRow("OptionLoop"); + o9["Name"] = "denyloadmod"; + o9["DisplayName"] = "Deny LoadMod"; + if (pUser && pUser->DenyLoadMod()) { o9["Checked"] = "true"; } + + CTemplate& o10 = Tmpl.AddRow("OptionLoop"); + o10["Name"] = "isadmin"; + o10["DisplayName"] = "Admin"; + if (pUser && pUser->IsAdmin()) { o10["Checked"] = "true"; } + if (pUser && pUser == CZNC::Get().FindUser(WebSock.GetUser())) { o10["Disabled"] = "true"; } + + CTemplate& o11 = Tmpl.AddRow("OptionLoop"); + o11["Name"] = "denysetvhost"; + o11["DisplayName"] = "Deny SetVHost"; + if (pUser && pUser->DenySetVHost()) { o11["Checked"] = "true"; } + } + + return true; + } + + /* If pUser is NULL, we are adding a user, else we are editing this one */ + + CString sUsername = WebSock.GetParam("user"); + if (!pUser && CZNC::Get().FindUser(sUsername)) { + WebSock.PrintErrorPage("Invalid Submission [User " + sUsername + " already exists]"); + return true; + } + + CUser* pNewUser = GetNewUser(WebSock, pUser); + if (!pNewUser) { + return true; + } + + CString sErr; + + if (!pUser) { + // Add User Submission + if (!CZNC::Get().AddUser(pNewUser, sErr)) { + delete pNewUser; + WebSock.PrintErrorPage("Invalid submission [" + sErr + "]"); + return true; + } + + if (!CZNC::Get().WriteConfig()) { + WebSock.PrintErrorPage("User added, but config was not written"); + return true; + } + } else { + // Edit User Submission + if (!pUser->Clone(*pNewUser, sErr, false)) { + delete pNewUser; + WebSock.PrintErrorPage("Invalid Submission [" + sErr + "]"); + return true; + } + + delete pNewUser; + if (!CZNC::Get().WriteConfig()) { + WebSock.PrintErrorPage("User edited, but config was not written"); + return true; + } + } + + if (!WebSock.IsAdmin()) { + WebSock.Redirect("edituser"); + } else { + WebSock.Redirect("listusers"); + } + + return true; + } + + bool ListUsersPage(CWebSock& WebSock, CTemplate& Tmpl) { + const map& msUsers = CZNC::Get().GetUserMap(); + Tmpl["Title"] = "List Users"; + Tmpl["Action"] = "listusers"; + + unsigned int a = 0; + + for (map::const_iterator it = msUsers.begin(); it != msUsers.end(); ++it, a++) { + CServer* pServer = it->second->GetCurrentServer(); + CTemplate& l = Tmpl.AddRow("UserLoop"); + CUser& User = *it->second; + + l["Username"] = User.GetUserName(); + l["Clients"] = CString(User.GetClients().size()); + l["IRCNick"] = User.GetIRCNick().GetNick(); + + if (&User == WebSock.GetSessionUser()) { + l["IsSelf"] = "true"; + } + + if (pServer) { + l["Server"] = pServer->GetName(); + } + } + + return true; + } + + bool SettingsPage(CWebSock& WebSock, CTemplate& Tmpl) { + if (!WebSock.GetParam("submitted").ToUInt()) { + CString sVHosts, sMotd; + Tmpl["Action"] = "settings"; + Tmpl["Title"] = "Settings"; + Tmpl["StatusPrefix"] = CZNC::Get().GetStatusPrefix(); + Tmpl["ISpoofFile"] = CZNC::Get().GetISpoofFile(); + Tmpl["ISpoofFormat"] = CZNC::Get().GetISpoofFormat(); + + const VCString& vsVHosts = CZNC::Get().GetVHosts(); + for (unsigned int a = 0; a < vsVHosts.size(); a++) { + CTemplate& l = Tmpl.AddRow("VHostLoop"); + l["VHost"] = vsVHosts[a]; + } + + const VCString& vsMotd = CZNC::Get().GetMotd(); + for (unsigned int b = 0; b < vsMotd.size(); b++) { + CTemplate& l = Tmpl.AddRow("MOTDLoop"); + l["Line"] = vsMotd[b]; + } + + const vector& vpListeners = CZNC::Get().GetListeners(); + for (unsigned int c = 0; c < vpListeners.size(); c++) { + CListener* pListener = vpListeners[c]; + CTemplate& l = Tmpl.AddRow("ListenLoop"); + + l["Port"] = CString(pListener->GetPort()); + l["BindHost"] = pListener->GetBindHost(); + +#ifdef HAVE_LIBSSL + if (pListener->IsSSL()) { + l["IsSSL"] = "true"; + } +#endif + +#ifdef HAVE_IPV6 + if (pListener->IsIPV6()) { + l["IsIPV6"] = "true"; + } +#endif + } + + vector vDirs; + WebSock.GetAvailSkins(vDirs); + + for (unsigned int d = 0; d < vDirs.size(); d++) { + const CFile& SubDir = vDirs[d]; + CTemplate& l = Tmpl.AddRow("SkinLoop"); + l["Name"] = SubDir.GetShortName(); + + if (SubDir.GetShortName() == CZNC::Get().GetSkinName()) { + l["Checked"] = "true"; + } + } + + set ssGlobalMods; + CZNC::Get().GetModules().GetAvailableMods(ssGlobalMods, true); + + for (set::iterator it = ssGlobalMods.begin(); it != ssGlobalMods.end(); ++it) { + const CModInfo& Info = *it; + CTemplate& l = Tmpl.AddRow("ModuleLoop"); + + if (CZNC::Get().GetModules().FindModule(Info.GetName())) { + l["Checked"] = "true"; + } + + if (Info.GetName() == GetModName()) { + l["Disabled"] = "true"; + } + + l["Name"] = Info.GetName(); + l["Description"] = Info.GetDescription(); + l["Args"] = GetModArgs(WebSock, Info.GetName(), true); + } + + return true; + } + + CString sArg; + sArg = WebSock.GetParam("statusprefix"); CZNC::Get().SetStatusPrefix(sArg); + sArg = WebSock.GetParam("ispooffile"); CZNC::Get().SetISpoofFile(sArg); + sArg = WebSock.GetParam("ispoofformat"); CZNC::Get().SetISpoofFormat(sArg); + //sArg = GetParam(""); if (!sArg.empty()) { CZNC::Get().Set(sArg); } + + VCString vsArgs; + WebSock.GetRawParam("motd").Split("\n", vsArgs); + CZNC::Get().ClearMotd(); + + unsigned int a = 0; + for (a = 0; a < vsArgs.size(); a++) { + CZNC::Get().AddMotd(vsArgs[a].TrimRight_n()); + } + + WebSock.GetRawParam("vhosts").Split("\n", vsArgs); + CZNC::Get().ClearVHosts(); + + for (a = 0; a < vsArgs.size(); a++) { + CZNC::Get().AddVHost(vsArgs[a].Trim_n()); + } + + CZNC::Get().SetSkinName(WebSock.GetParam("skin")); + + set ssArgs; + WebSock.GetParamValues("loadmod", ssArgs); + + for (set::iterator it = ssArgs.begin(); it != ssArgs.end(); ++it) { CString sModRet; + CString sModName = (*it).TrimRight_n("\r"); - try { - if (!pNewUser->GetModules().LoadModule(sModName, sArgs, pNewUser, sModRet, (pUser != NULL))) { - DEBUG("Unable to load module [" << sModName << "] [" << sModRet << "]"); + if (!sModName.empty()) { + CString sArgs = WebSock.GetParam("modargs_" + sModName); + + CModule *pMod = CZNC::Get().GetModules().FindModule(sModName); + if (!pMod) { + if (!CZNC::Get().GetModules().LoadModule(sModName, sArgs, NULL, sModRet)) { + DEBUG("Unable to load module [" << sModName << "] [" << sModRet << "]"); + } + } else if (pMod->GetArgs() != sArgs) { + if (!CZNC::Get().GetModules().ReloadModule(sModName, sArgs, NULL, sModRet)) { + DEBUG("Unable to reload module [" << sModName << "] [" << sModRet << "]"); + } + } else { + DEBUG("Unable to load module [" << sModName << "] because it is already loaded"); } - } catch (...) { - DEBUG("Unable to load module [" << sModName << "]"); } } + + const CModules& vCurMods = CZNC::Get().GetModules(); + set ssUnloadMods; + + for (a = 0; a < vCurMods.size(); a++) { + CModule* pCurMod = vCurMods[a]; + + if (ssArgs.find(pCurMod->GetModName()) == ssArgs.end() && pCurMod->GetModName() != GetModName()) { + ssUnloadMods.insert(pCurMod->GetModName()); + } + } + + for (set::iterator it2 = ssUnloadMods.begin(); it2 != ssUnloadMods.end(); it2++) { + CZNC::Get().GetModules().UnloadModule(*it2); + } + + if (!CZNC::Get().WriteConfig()) { + //WebSock.SetError("Settings changed, but config was not written"); + } + + WebSock.Redirect("settings"); + return true; } - return pNewUser; -} +private: + map m_suSwitchCounters; +}; -CWebAdminAuth::CWebAdminAuth(CWebAdminSock* pWebAdminSock, const CString& sUsername, - const CString& sPassword) - : CAuthBase(sUsername, sPassword, pWebAdminSock) { - m_pWebAdminSock = pWebAdminSock; -} - -void CWebAdminAuth::AcceptedLogin(CUser& User) { - if (m_pWebAdminSock) { - m_pWebAdminSock->SetSessionUser(&User); - m_pWebAdminSock->SetLoggedIn(true); - m_pWebAdminSock->UnPauseRead(); - } -} - -void CWebAdminAuth::RefusedLogin(const CString& sReason) { - if (m_pWebAdminSock) { - m_pWebAdminSock->SetLoggedIn(false); - m_pWebAdminSock->UnPauseRead(); - } -} - -GLOBALMODULEDEFS(CWebAdminMod, "Dynamic configuration of users/settings through a web browser") +GLOBALMODULEDEFS(CWebAdminMod, "Web based administration module") diff --git a/modules/webchat.cpp b/modules/webchat.cpp new file mode 100644 index 00000000..2dcbdf4d --- /dev/null +++ b/modules/webchat.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2004-2010 See the AUTHORS file for details. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include "Chan.h" +#include "HTTPSock.h" +#include "Server.h" +#include "Template.h" +#include "User.h" +#include "znc.h" +#include "WebModules.h" +#include + +using std::stringstream; + +class CWebChatMod : public CModule { +public: + MODCONSTRUCTOR(CWebChatMod) { + } + + virtual ~CWebChatMod() { + } + + virtual bool OnLoad(const CString& sArgStr, CString& sMessage) { + return true; + } + + virtual bool WebRequiresLogin() { return true; } + virtual bool WebRequiresAdmin() { return false; } + virtual CString GetWebNavTitle() { return "webchat"; } + + virtual VWebSubPages& GetSubPages() { + ClearSubPages(); + + // @todo Note: I don't actually suggest we use "sub pages" for the channel nav bar + // The channel tabs should be in the main window and updated via jscript + // Examples of good sub pages would be like Status, Chat, Settings, etc. + // Under the Chat subpage we'd have the jscript client with its own chan tabs + const vector& vChans = m_pUser->GetChans(); + + for (size_t a = 0; a < vChans.size(); a++) { + CString sName(vChans[a]->GetName()); + VPair vParams; + + vParams.push_back(make_pair("c", sName)); + AddSubPage(new CWebSubPage("chan", sName, vParams)); + } + + return CModule::GetSubPages(); + } + + virtual bool OnWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) { + std::cerr << "=============================== webchat sPageName=[" << sPageName << "]" << std::endl; + + if (sPageName.empty() || sPageName == "index") { + return true; + } else if (sPageName == "chan") { + return ChannelPage(WebSock, Tmpl); + } + + return false; + } + + bool ChannelPage(CWebSock& WebSock, CTemplate& Tmpl) { + CChan* pChan = m_pUser->FindChan(WebSock.GetParam("c")); + + if (pChan) { + Tmpl["Title"] = pChan->GetName(); + + const VCString& vLines = pChan->GetBuffer(); + + for (size_t a = 0; a < vLines.size(); a++) { + const CString& sLine(vLines[a]); + CNick Nick(sLine.Token(0).LeftChomp_n()); + CTemplate& Row = Tmpl.AddRow("BufferLoop"); + + if (sLine.Token(1).Equals("PRIVMSG")) { + Row["Type"] = "PRIVMSG"; + Row["Nick"] = Nick.GetNick(); + Row["Message"] = sLine.Token(3, true).TrimLeft_n(":"); + } + } + + const map& msNicks = pChan->GetNicks(); + + for (map::const_iterator it = msNicks.begin(); it != msNicks.end(); it++) { + CTemplate& Row = Tmpl.AddRow("NickLoop"); + CNick& Nick = *it->second; + + Row["Nick"] = Nick.GetNick(); + Row["Ident"] = Nick.GetIdent(); + Row["Host"] = Nick.GetHost(); + Row["ModePrefix"] = CString(Nick.GetPermChar()); + } + + return true; + } + + return false; + } + +private: + map m_suSwitchCounters; +}; + +MODULEDEFS(CWebChatMod, "Web based chat") diff --git a/modules/www/notes/files/trash.gif b/modules/www/notes/files/trash.gif new file mode 100644 index 0000000000000000000000000000000000000000..16a664f73a6df396fd25eb9e209b1d79dc8483e2 GIT binary patch literal 98 zcmZ?wbhEHb6lV};XkcVWOG{&5U{L(Y!pOkD$e;sc1I5J|9GEP7`d3O{c(3HVXt>S3Scb7b71ZCS|4GQ{0 + +
+ + + + + + + + + + + +
Key:Note: 
+
+ + +You have no notes to display + + + + + + + + + + + + + + + + + + + +
 KeyNote
[del]   
+ + + diff --git a/modules/www/webadmin/add_edit_chan.tmpl b/modules/www/webadmin/add_edit_chan.tmpl new file mode 100644 index 00000000..a46c1722 --- /dev/null +++ b/modules/www/webadmin/add_edit_chan.tmpl @@ -0,0 +1,53 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Channel Info
Channel Name: + + + + +
+ +
Buffer Count:
Default Modes:
Save: checked="checked" />
Options: + + checked="checked" disabled="disabled" />
+ +
+ + +
+ + diff --git a/modules/www/webadmin/add_edit_user.tmpl b/modules/www/webadmin/add_edit_user.tmpl new file mode 100644 index 00000000..9df51ae9 --- /dev/null +++ b/modules/www/webadmin/add_edit_user.tmpl @@ -0,0 +1,258 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Authentication
+ Username: + + + + + + + +
Password:
Confirm password:
Allowed IPs: +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IRC Information
Nickname:
Alt. Nickname:
Status Prefix:
Ident:
Realname:
VHost: +
Quit-MSG:
Servers: +
+ + + + + + + + + +
Module(s)
+ + + + + + + + + + + + + + + + + + +
NameArgumentsDescription
+ checked="checked" disabled="disabled" /> + + +
+
+ + + + + + + + + + + + + + + + + + +
Channel(s)
Default Modes:
+ +
- There are no channels defined -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[Add]SaveNameCurModesDefModesBufferCountOptions- Add a channel (opens in same page)
+ + [Edit] [Del] + checked="checked" />
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ZNC Behavior
Skin: + 1 ?> + + + No other skins found + +
Playback Buffer Size:
Timestamp Format:
Timezone offset:
Join Tries:
Max Joins:
Options: + + checked="checked" disabled="disabled" />
+ +
CTCP Replies: +
+ + +
+ + diff --git a/modules/www/webadmin/index.tmpl b/modules/www/webadmin/index.tmpl new file mode 100644 index 00000000..7ffb7416 --- /dev/null +++ b/modules/www/webadmin/index.tmpl @@ -0,0 +1,9 @@ + + +Settings +
+List Users +
+Add User + + diff --git a/modules/www/webadmin/listusers.tmpl b/modules/www/webadmin/listusers.tmpl new file mode 100644 index 00000000..8fece188 --- /dev/null +++ b/modules/www/webadmin/listusers.tmpl @@ -0,0 +1,35 @@ + + + + There are no users defined.
+ Click here, if you would like to add one. + + + + + + + + + + + + + + + + + + + + + +
ActionUsernameClientsCurrent ServerIRC Nick
+ + [Edit] + [Delete] + +
+ + + diff --git a/modules/www/webadmin/settings.tmpl b/modules/www/webadmin/settings.tmpl new file mode 100644 index 00000000..a026e754 --- /dev/null +++ b/modules/www/webadmin/settings.tmpl @@ -0,0 +1,149 @@ + + +
+ + + + + + + + + +
Listen Port(s)
+ + + + + + + + + + + + + + + + + + + + +
PortBindHostSSLIPv6
TrueFalseTrueFalse
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Settings
+ Skin: + + 1 ?> + + + No other skins found + +
+ Status prefix: + + +
+ ISpoofFile: + + +
+ ISpoofFormat: + + +
+ MOTD: + + +
+ VHosts: + + +
+ + + + + + + + + +
Global Module(s)
+ + + + + + + + + + + + + + + + + + +
NameArgumentsDescription
checked="checked" disabled="disabled" />
+
+ +

+ +
+ + diff --git a/modules/www/webchat/chan.tmpl b/modules/www/webchat/chan.tmpl new file mode 100644 index 00000000..2b4c7c4a --- /dev/null +++ b/modules/www/webchat/chan.tmpl @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/modules/www/webchat/index.tmpl b/modules/www/webchat/index.tmpl new file mode 100644 index 00000000..b2fe71e5 --- /dev/null +++ b/modules/www/webchat/index.tmpl @@ -0,0 +1,5 @@ + + +Welcome to the webchat module. It's currently more like a buffer reply module since there isn't any real-time back and forth communication (yet). + + diff --git a/webskins/_default_/pub/clouds-header.jpg b/webskins/_default_/pub/clouds-header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f796ad13b42d4e1fbd6b3c9ade5ce64f92e99983 GIT binary patch literal 31029 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∋!Ye(6cr=8n_qHJkB}K1k1n%5V2l|;fYm0M^ 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 E*)TGKTL1t6 literal 0 HcmV?d00001 diff --git a/webskins/_default_/pub/favicon.ico b/webskins/_default_/pub/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5e28bcf0c6a8b2cb9d9d3bf051e784be5f30f4bf GIT binary patch literal 3638 zcmeH}F-u%Q5XZ;lLgWxm8!L;8MTqrOcEMh-v9??C4Qx_eWgQ3z+gT(bDbn}}u1XPy zGzZ#52v`Ip5bcB%li$vJ_k3PXgct}UuI_tp|2sSL+u6PMR%Ax*Nxv^q-p-0V=4pPu zYCn4*@(Jw;%|7)hbw&_M=~TD4&TuU?%0PsF84Ri$R~}_J9Ln(XP|iNSkxr*0v$L}@ zH#a8>3k$NixF}0YOR~JYEGsK3vbnh_>+9>Xwzej#tE)12?y|Ar@=^}PznOeE{4R%I zzsieu?+K*TM9oyInu?}qil#;L$|RvD^n{+!6M7kz(KC9ckSm60=9)&b2HfIWXcGYzBuBFP64&kOPCm3I`L5 z2Ha4whrwZR7#s#%Q_*2?7#s!%z=>}-a|Sv_2_K1eg2Tgiu}ShsUdz_jmTYft z%g)Y@?C$Q$!NGy-@9)de(UBYDC6_(bVC{VQ^h{w>G$KzhCE|j_;QSSEn)NZyU5{(#-#g zK}&5tHVjSBR%dzquMOH+9dDLaq9*oNZQU3&scXC8xi+}2du(vq{>!DC9>1*Z)Y95t z6Cck2PQn_jmOszA6IThLdP2?4_@=qN^4p28BL?y5)L h%+s5k&%}Ir6aG>LC`0O(p2*ol9_~}y?@pTI@)NZzeZl|$ literal 0 HcmV?d00001 diff --git a/webskins/_default_/pub/main.css b/webskins/_default_/pub/main.css new file mode 100644 index 00000000..05113aab --- /dev/null +++ b/webskins/_default_/pub/main.css @@ -0,0 +1,221 @@ +html, +body { + background: #555; + padding: 0; + margin: 10px 0; + background: #444; + font-family: verdana; + font-size: 12px; + color: white; +} + +img { + border: 0; + padding: 0; + margin: 0; +} + +/* TABLES */ + +table { + border-collapse: collapse; + font-size: 12px; +} + +table.section, +table.data { + width: 100%; + margin-bottom: 15px; + border: 1px solid #f00; +} + +table.section td, +table.data td { + height: 20px; + border: 1px solid #000; + padding: 2px 3px; +} + +table.section thead td, +table.data thead td { + background-color: #D49712; + color: #000; + font-weight: bold; +} + +table.data thead td { + background-color: #EC8E00; +} + +table.data tbody .altrow td { + background-color: #777; +} + +table.section table.data { + width: 95%; + margin: 10 auto; +} + +/* !TABLES */ + +/* FORMS */ + +input, select, textarea { + font-family: verdana; + font-size: 12px; + color: #000000; + border: 1px solid #000000; + background-color: #999; +} + +table.section textarea, +table.section select, +table.section input { + width: 100%; +} + +/* !FORMS */ + +.nowrap { + white-space: nowrap; +} + +/* LINKS */ + +a:link, +a:active, +a:visited, +a:hover { + font-family: verdana; + font-size: 12px; + color: #000; + text-decoration: none; +} + +a:hover { + color: #fff; + text-decoration: underline; +} + +/* !LINKS */ + +#wrapper { + width: 800px; + border: 1px solid #000; + margin-left: auto; + margin-right: auto; +} + +#banner { + background-image: url('clouds-header.jpg'); + padding: 0; + border-bottom: 1px solid #000000; + height: 100px; + width: 800px; + text-align: right; + font-weight: bold; + font-size: 13px; + position: relative; +} + +#banner p { + position: absolute; + bottom: 0; + right: 20px; +} + +#infobar { + width: 800px; + height: 20px; + border-bottom: 1px solid #000; + border-right: 1px solid #000; +} + +#infobar span { + float: left; + padding-left: 5px; +} + +#infobar span.switchuser { + text-align: center; + border-left: 1px solid #000000; + height: 100%; + width: 150px; + float: right; +} + +#subpage { + padding: 10px; +} + +#content { + float: right; + width: 640px; + padding: 0; + background-color: #444; +} + +/* MENU */ + +#menu { + float: left; + background-color: #333; + width: 160px; + margin: 0; + margin-bottom: 20px; + left: 0; +} + +#menu .title, +#menu .item, +#menu .subitem { + vertical-align: middle; + text-align: center; + padding: 8px 5px; + background-color: #777; + border-bottom: 1px solid #000; + border-right: 1px solid #000; +} + +#menu .title { + text-align: left; + padding-left: 3px; + background-color: #333; + font-weight: bold; +} + +#menu .item.active { + background-color: #D49712; + font-weight: bold; +} + +#menu .subitem { + text-align: left; + padding: 3px 5px 3px 10px; + background-color: #999; +} + +#menu .subitem.active { + font-weight: bold; +} + +#menu .subitem.active a:hover { + color: #000; + text-decoration: none; +} + +/* !MENU */ + +#footerbar { + clear: both; + background-color: #D49712; + border-top: 1px solid #000000; + height: 20px; + text-align: right; + padding-right: 5px; +} + +#breadcrumb { + padding: 5px 10px; + border-bottom: 1px solid #000; +} diff --git a/webskins/_default_/tmpl/BaseHeader.tmpl b/webskins/_default_/tmpl/BaseHeader.tmpl new file mode 100644 index 00000000..819a635a --- /dev/null +++ b/webskins/_default_/tmpl/BaseHeader.tmpl @@ -0,0 +1,55 @@ + + + + + + ZNC - <? VAR Title DEFAULT="Web Frontend" ?> + + + + + + + + + + + + + +
+ + + + + +
+ Logged in as: (from: ) + + Logout + + Login + +
+ + + +
+ + + + + +
+ + + +
+ + Called from subpage then finished in Footer.tmpl diff --git a/webskins/_default_/tmpl/Error.tmpl b/webskins/_default_/tmpl/Error.tmpl new file mode 100644 index 00000000..aa3bb68b --- /dev/null +++ b/webskins/_default_/tmpl/Error.tmpl @@ -0,0 +1,3 @@ + +

+ diff --git a/webskins/_default_/tmpl/Footer.tmpl b/webskins/_default_/tmpl/Footer.tmpl new file mode 100644 index 00000000..75f4e925 --- /dev/null +++ b/webskins/_default_/tmpl/Footer.tmpl @@ -0,0 +1,16 @@ +
+ +
+ +
+ + + +
+ +
+ +
+ + + diff --git a/webskins/_default_/tmpl/FooterTag.tmpl b/webskins/_default_/tmpl/FooterTag.tmpl new file mode 100644 index 00000000..66218685 --- /dev/null +++ b/webskins/_default_/tmpl/FooterTag.tmpl @@ -0,0 +1 @@ + ZNC Web Skin "dark-clouds" by David Precious diff --git a/webskins/_default_/tmpl/Header.tmpl b/webskins/_default_/tmpl/Header.tmpl new file mode 100644 index 00000000..3bdc7a6a --- /dev/null +++ b/webskins/_default_/tmpl/Header.tmpl @@ -0,0 +1,18 @@ + + + +This is a wrapper file which simply includes BaseHeader.tmpl so that new skins can make +a Header.tmpl similar to... + + + + +...this way a skin can base itself off of the same html as the default skin but still add +custom css/js + +@todo In the future I'd like to support something like or even + just do a current file vs inc'd file comparison to make sure they aren't the same. + This way we can from the "derived" Header.tmpl and not cause + an recursive loop. + + diff --git a/webskins/_default_/tmpl/Menu.tmpl b/webskins/_default_/tmpl/Menu.tmpl new file mode 100644 index 00000000..ec1a92f3 --- /dev/null +++ b/webskins/_default_/tmpl/Menu.tmpl @@ -0,0 +1,22 @@ +
active">Home
+
active">Help
+ + +
Global Modules:
+ +
+ + + + + + + +
User Modules:
+ +
+ + + + + diff --git a/webskins/_default_/tmpl/help.tmpl b/webskins/_default_/tmpl/help.tmpl new file mode 100644 index 00000000..d5603fd2 --- /dev/null +++ b/webskins/_default_/tmpl/help.tmpl @@ -0,0 +1,5 @@ + + +This is the help section. A quick tutorial with links to the wiki should go here before we release. + + diff --git a/webskins/_default_/tmpl/index.tmpl b/webskins/_default_/tmpl/index.tmpl new file mode 100644 index 00000000..058b8744 --- /dev/null +++ b/webskins/_default_/tmpl/index.tmpl @@ -0,0 +1,3 @@ + + Welcome to ZNC's web interface! + diff --git a/webskins/forest/pub/forest-header.png b/webskins/forest/pub/forest-header.png new file mode 100644 index 0000000000000000000000000000000000000000..c52d0731f30743b831cbe6d75f4fc4274a0cf036 GIT binary patch literal 219717 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⪚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

UM>Rw8IlW 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 $|VEf``6$A5DGB5u*t*B@4$9Q6&Y-a%eP6>g5_! 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 z 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≷KtU>yIB~^3WkJwN-}fI_u3MYqkn5{I?bZY~mOH>uz2& zk|Lj#WX{>jPyOSJsvkYD7aBbtBO+sN^QGc;1eWL9mY6zI711$sL=DfC;s_tKkr<@QT( zY@4gr?BHK^|D1>Kc|3XO2|>G=jBaS8EE7AOVx`ie(W>#XSKh$d4Xg1&pMl{K?%Vwf z`i4iDDeXbgBUW1Q^r1=WL6fh2<`c9|9>hIyirhJyS-WXHSMJ=!{GLN-vsKb70kZ6H z{}1jbHyLnf=_KXKY3i{cf8JJlZn~89n>TUfOJ8TazL^6Lo#g0jm1AKI*66(T1HZ?$ zR}FCE&MunsX(mscBG9u`TP{t{p(C5Yj!m+PO{L{vnKqs2G(oGuRhR7Koo{{%niufY zefJUASsc$pMj@J}k+N-cT}@aBzDr6?C5O+ptl&(iKau+=1g@mvgqWS3*ttAH*U?fL zqA((iB|?o5LLv!K60t76?-7O(mZ2e{1Q;62#OkZ+8bZd1D8|qQBQZWky5krYreMr|j(gi(91jgz7-mdRum5;<4Crw8U18QVNg z?=6?I;MWj~KK((K*ve9A*3dK!$8pYnuD1$XjU3k*J#!%q%tXVT}4I#cFLr_QbuTkd^(F)s}p%Xx~AZVKCYDb zGQyO~S?N`H1|-(b_}5ewS4JoZEKNs|5I6~#PBnBg*(|6!vj293%re{=u$`S-v62^}?$MJ2<^?&I9I_c4}_7vZw=v4+MNasz6o zm$7{nOC<6|M+hp0#;H~V(bQPAZX+vRfFDL|=pSNN|7zZQ<;^_v)$j4cfBYPu{JT#P zt?K55l^R1MTRHLg1P4x5`HzR6=kCY*sXsMG;kkWeuDXFsKJ{b%;o&L|?>@+-eO;_M zcN6KSCisijzlGy@c(ArOH(kW~tv$p&8IF`(4o+1GW1BEk zXhtiXo;^hvdR% znpHY--4F|+C^4QZs)Avuq*5lfZQz7Sv8X8t>*Gv;5=8-xMjg)!sn?T8X(=P3z{Ri( z3`3*Ytm9P!h~oDB1*i(9ZIJEEk?-!L;W><~8E0&Kn2><^!W@-G8T1%EYhuJX48ue> zbW~MKyuTs|vJgU`#|kQ<{fvP~O1v<@^IROKMM|@hX0Vb-LY?Xgjvt_ENt$LWjIc}- zCveCPbTPVh4GphB7`Zsr5^CDy=%bG?bM!cV98)b72;-34zyRHL7KxE_2?wTPZCq@q@d6#IYkYJi7aNe*B~RkWrqGedKG@15opw zxO&LPKm9>svq|~LX@o6lbeIfYekmuKO=hb##9kNRoe%{tO8hXI5DF@8Br2bIYW19Y_?Gmx}00jN%6bjTRsLllT2r@Ac__{WexQjb>WNg)bLzUH6$>R0ibE}rkV?Zq%nYSjvH41wKTP=|-O=z=_PZGwY`=h<^qaANitnQSKlje6a| zZ_707d=AqzsGAM6lQVc~6Qy6_`b}$?I(>+VpuqZ`L2~2U$ewzV!TsOojoV=Lx)cxY z-p9e+OML6jdpPyP6Ksq(p;g!O%L$LWo*{m*t5L$_P=DuSQq~BDSA`uxbNr!Gp#8;`<|P*^Ih-ali&Y2x>IMaSY=ri z*u80ts7g<@LhrE(&QG3a{&W*%q?`W0;^OYLtlqGOxdW4oR3x)*4OGz8G$}ies%p4y zg>q?`(c#rp=8J54>w8$W`F!RVOUOW=+Zp`oJe8?u(8?3Yazypi0@+2E$De+RyFPUn z=S)?2c=wa+o|&R{%1I6sx=ASGHnlkf84<@Jnch`2{U)&yv3}DUPMn%V&1MMi9pc(xAhu%VT`Y|5-%D<3lW@y~|Bqx9L2>X9v9}vdTZ)|S-niN9_f#NF&RYg%XP}H^| zTC|a=VC&l135PsGYgPoRX<%9wUcHI$dC8{RhG#`#c(y2s742;CkrW_F6me2OflTSN z`fZwCoq>fGb|Jv;>SW1vh>Z+EtASyfL{Wrkniz&b)RtQ%W()l{3J_xOJP+Ca_w~Xu z3NcaW(P&f=LeSmchn>yPa$IcNLs2gMqggG2YLQE&@fvkx;A0vp zVH_hh1xy3Y4GCjOAb;hB(R3ZtG|^3ij;=03KftLskbam@&kda@mbjjWAH{@iK%eL%n^J zmWv2AM(Qexp%JPvgDs1iC}A1k_=2M|%LtL>^*eX5Wm6y5e)>K9@X=@SA1_c$XIVYE zmhyNf`2|6LEzPnhQJ$S6o9{uDI<<0xd{-}0sEAZDT`Dz`==rQ}aO&t$CZ>+?jR)`H zuwUd>YcEGup5&2*UvjuQ#XtS?KXUo?*Ko30q+rJw(&PErLp)PF#Twh}r=kURU6qlEI!}XUFgaP0F?%hmI zFEM?5fz{(1SSc){DFK?6!t(;cGii245^95p2tyBa3n5fA-2jT zMRQp?yYg7JNj8^8RRzUjk-X7K6oz=dM;JvYsz5VzPy}8W($Sr#yQ>4&X)-;164$9S zG%~>O*f6QAO?^30J;*4TILbBWaKm3oev+6yR6|FzOcdKBYPiIaY&Sd=LX`IR zH>O#yp{+P%V@ZED%k0zy+cvJ}lJmDwJ$;(xg9qro@LakF1|g6%n=MkK1H`t8Tc}_+ z0-{_BH;Bn(I%u^5V$H<$eWYQaq%*9_cjCKErcWNDSXiW4ZxKfti&F)x+#sPl!o=Yj zI{S3`)@S(q*FQ@kD)G55eT{M@zFEeJV&^eEmyhRMUz zXpu#wTE~xleAmH@1RYq!Mue5lAXOcNie=g8sDw@nujL|58;uyJT0zJF6_Esx#DXA< zQA00z)@y2edMwT`2b1Sx%>SeKIMZBG6a_`qlK>7Cgcc*NdiRIoYOO-CRHA=qkhqG>bJ-c7|3MVs++|eD!9FjHU7SfB8P%_{y9AkFNQ)*WJd!6H}NoD+s?u$9ZF@ zOEt_=K)8B{nNpFlDarKOG9z!gj7!rO^3)gZA=e#H&^!V!kC8Vi70cLm8r!xh7Agdu zM>?BBRdhT(kJp%B-0tJ#z6zuj&W}%X|7Sly-zzWYg7U+E9B2RW6P&+xE5{$$Lyy(PV&D-ChDVuPS?2ez+rfJ-T+RHUJ>34;C)oDZ%jle#iechbqo@;d{7}WVlKb#B~%*o*g2b{QzsE3 zLsl7J`jKbJ=5r`s4LLkYeR&x>)j=*)h*laD3-f&V3!mnT-~9%EJ~+UZ551oo|MruN z?|2ET>LEKft)lr7#dXT0SbHUY@aP>7;@W{RQlJ!D1^bhgRpZNj<{X_V^&-nN_EAqfVkyh zo7P!r)R_XrFbwkfJPVQg8woFG43f@RwfN2Cmc;>;YDVWD<*p~ezLNW5kP z*LAV8IV?Lvt>utc92zYLx9MW#I}kz;1}ZRE%V5T#Knu_lQV5Z6E@(@D3QYTUx5JeD1 zAOxmiVrY7DAGt0W-$Bb{(K0i2V>6E!5R{Dn>w9Zqeb`3<#6ig(JN7j#u&Z z2Y$hO-gPZIE?>iFU~|Q)HB4JRpWpv;8V{D~$Pe+UPka$X4(iKXyw2dMpMHVDTc zg6d@>yzN7OL+a@kZ~Lpi;*m!lMq4Q2TsTfwU9k1)3wivpy%@5Cr+&VN>Zvkoa=p}M z=eYEO3t4^ZMcjMuk61mthGP@Q>FpX~>gW{34d(lazjrxJ7M z-~luNtA+-Md=Js~b1g2+p=lZF^*V-OkV>Vn?KGa}(QGyu=pSUExP*#G{G6Ib=m&T$ z2USt94UB^u|#SLdOl6FQN_|b68L8-gRUF6j-Nuh+HP2-bWFNE72qbty-R4S|#3#fvmyBxYKEiaR?`_Oe2-*fPqHBzQRHe=&7>MSkJ z6IdC_%O$!qU5H4h@XYc-8;s>)mo( zR$YHJTe2e@$obSuOLRPan!XD+bNuuXI9Z16V{mRiw_Lr2&%FN6dH)AL4KmC3zVY{r zZa9Zh$;M9mlu9K`(TDmtV7qhdz532j@cwYK+b; z@uE-NN!qD#>&55NZ^8qQKE$^lf0E|#IH#s(V5!OP-SRp_OX4{J4?M7&{=s1)S5hxm zX>_KOu2A6O%uTWDC71Auo31CDGdXeMIQPyT;P_)tg4qEjA46ogY|BLyk4~fek{{gl zHa`BJPxJkw4ax@(^0GHw&&>WuIB;l!KmNb|md}0aF3jEyTzT1zlqUAD??+!Dqquze z`#<4>pZO~Ob|213dgcKgFu8JGk`|A0>U!W`6M9Zy+a+a^cR+%o$A@Q(3NDo94DxzJ^bK_d%X3 z&CxLu^6=k%g`U|FivB4~JDtRx#!7OSR<*MQ$Z%ERaPcrhS8e9aAN@0)JA4c=y~6U3 zAH|-Uqu|CYRtq!FezqyMy|KaP{H!;cLlEcWx zUK;h2tXZ9>w$$M6f89;9nqu9$ZPc4Jo8z~O2>pn(WrB!kHS5G`a%j~w z4YLgh4T6BU-RX@~2fx(&%6bQP;h(eDzbRiB=)kOXjlXy~mSxY*v zs*Z{v4q{{=i6bDA*tx`z9QYw&7$PMIR8&<@3Ig$~cw6NRi{jTb$!FI3jDJPZRANP( z<*itjMYCK6A;|ajVObW{Y89ul0=|!y&i_V7?|)Bu@hU4|o9HR4E%7oS*6>_O=tUUa zIl8-sS(siT-JQiuE0h=JNOuomXdOhMLn@PIv9yG47ziY3)1+QnA)n3?rqU1w5Qn&p zI{?$I< z1!ZzQJy@27l%T3Qfgj-Q5HCn`|Sh`JZxyVpQC#A&&f@+EWRm1p7OvP)_Gc-h_(Lhl&##fJV zs!%}DRPsIDM6sl+tBX@7rf?cfLdPS_+KhE}p%zxiq&r#kLt3GaQ<|Y8a`?z6uHcT_ zK1$Wja_2{1!S5Sm4CXH8uHtj-X*`N*?&23u9zn+2&L;n`c{sGo*Sx4H^*mU)!9NKe`epO{|p-iA;m|3V$cLH?7pt4e=yDLX;e}-en zjxpG`3fJ*jUM$kv(@(43!t;DaM_|?Jailb;)B^$^iVH=GC#Okwb>pnlx%`sLc=Trv zLAeD^1ir#K8@I4sD6kb;`{e-Gf88zDKK2pfo>^oz2kO-9x>) zLJ)Y^mPxDCBAZK;7f}?Uh+l;~1VKQ(UMC`^GuP3M)NLSQ$fYyHQc|r}iG`2vhZwd6 zv4W}_v>X@BXv_5GW>C9(P@))(B)KmZ(9zvRK!|8I2}3ZgG+`vDEi8kflkU#pwH#tY z!!it_C?JYLbnRCG3Z|vgG$n?nK_qY*E^9{D(5gGsDs>u-2CCvBEQ`U_Bg`x!tEPKcW89=XK4mCzCC%8 z)SM(-aL6=6uGzMUp_gpq?!pA89EZWmFbhXcK;5O=%3!D(i{&ClE{&c^5j7L_iEXDb z3=`M!iQ{Ba;krIX)JVcb+Iv(K{p#MdEDJ4)2x3WW8fYmC(JoNpb|PZzIjDvXx=yTW zNrGTRvPYnz1XUVU$=Y@2P^!(M4xW3_hikPOny!+`W>_v3Kqio>zzYbY2vyS)n3QRv zl_^*Kozw%W?+>XX<8>svsAPO8(nuZp~gbf#@#IOt$ zMc_FusZ^@1%?vnn^f+Jo*7vA3T5MUrmfZgffW-g(XJL7nPyOQ;dEFnshn3<2GkXp& zmg{AkHo&A?r@rq5(s3EP<0`(m{d!*Zo>5lsd5G;ng}Id_9y;+0Uh#&jaAb|yIKp;C zl0z;;0!dR8bj?T(Z&8F>uFzOoT;RkY$v*E zP*_=Ht~o=21?qO0b#J?gZCAXQt;1`{HWbqJh>2$p;45&dR^);I{0{wnIsWcr??PWC z*mGhpM<$-;10Q}jufOSBw!QHhgx6qk;t0<@{V4DJ%eQgcAHRXW`SeH8ycYXD^L8$| zVF#_z9`5|)=Qwt-hOVsTKYx0NAMQTE?7qW%<%?ftaBz_Eb!(WOJv(aEp&jFF+O>(Nzwr=P z{lV+lb>&X}_FZpB_)BcMVFMSPKfsPgl}29UuU~ot_kQi04D_sFo#jqXv2HCmo zat=Onf1-2O^#tCgs;F9`=M_Rwm32l_DK1yKc(t{O<6nD}`RC?%=FkaBU3nI^sRXaS zhV5^973bf09o?%(xnTPaY$xQcCaP-%M`#^)w(r$r{9}fiMho+eS4F6jdYER1`x+iIX_eP)5l?OjQ#gR2U(> z0Jl9hSNsU+_{4tle26p!Ul*9Bg>ED=pEG&=flT6Z0~ukcZBjLfFO+#(R z*2W?+D9b2rGXj)$ba03t1jI5abQC~FLBfFud@`K_#Gyy%I>f$vcKRX|4MnIRJv5T! zBx0p)?k4e!C}5ddaxGF4$B9wf&`m5WdBvfh9C+JnDn*;&(e`+R4JSDiD+%OJsEOG* z`9H^`yYjeB3sM$c!-MpWu3~7z8uYFXs`Uy+Ge(JG)b>l0{KoIO-rfYNsi{Oki0gP5 zhDB$-8!MF|K$6XL;bXM)DnTeILd562m=7hc$|l;?-<(Spvf(uCL%nF0m>}XHsPH9Vn?39ld=-#Y!Ue zYaa~bC?XC*q~jC$0fw#<1|hx|;5#mX>l23(C5}-Q0cTPR!=ylrVwrpfngW`FVWm)2 zgO=kE1R=IkVWO zV(134FHIo9b9};v2caaYu3&a%saHz$4UJQ7w$Ln#R5nN9#3W`aLsurlu|tPR_4VS* z2+#8<6^lfkPib&LKH+Z2jbCib47G*tvglJD)LVzjvF4_?mg@3@h4T4Cbo3yf`CN8j)W z{iCZn^vrV@gG1Pw!sysI3zJjK&o8iP^JZ+@qSb1!W_*Ooa*4*u3Skf?p%8I|DpZ6b z@H~%JAgLBhw3;pYhgabSK84e#&@wiLZDJ@%V7!sl& zKv4y%q9owt7*s>UjY4vYN>Fo=Zh&8Fp^~t0(sl|>(GvME(39_>JUfr6nS|{S9Wo|D zMwqsRZkh<b*$zA(>G>#%O3JeFY#k|*roAo&YAA_=5I+iuh|$`f-o)3HB;E;mrUL}6S{2LA z(Q-Y8hgYHIH=O(7Kn7%TX;6}GoN4Ijszw-{F$pJ{T1C;QdoG2-5>Bg$oi;En1C*Ga z-fp&R+rrrDRh&LGg9rt2D0ttSU;Df10r|}5(4@c+20_C``jU=x9vORNQdv}CaOZp9 z{o8RsKKBK>Iy>nZ>__Md>(-8QYI>T;4@ui;>h%Qj)oS?&Ga()mC)xTkl*}zGaqG*j z`!8MpM?U`r{2(#S$HXYALL?*fC?sp!^yE8PDHgF)X(B1f_2)K#nkB^8)d^CH#6~_ z`#I^n`QXSHFq_U1iF<=lRhOp5Vh@evpSJHRg}HWLtR-{KrwwOI?Ly zt)Qs}x@NRfR@6jiE+b?l5lSB&odx2j9;0&5h?VbU%h)>p__epOy}O&4Qq0kP6Fm9&)0~_>jTA`=go=itn?$R-s1oA{jdZ$$ zwIi!pIDUxVzwRa6a_J@P*uBUV_9`B{_W_FVsEQLP{qpK~wT%FVxbBj3C0Ue3>V zF_6`0jOy&X@?zGP0(SKb^UTa)?!5kX-u?bN`QpK6aaIj7`RpO?{<|;pvaOd;pE$|H zi9?u{jizgD99>M@#<@jNM7`UfESu~<{0!fC{61bNO*6AP&x_xAD?Jyl=Zf9|ddd|B zh&X56AS=N#VZWf%(_%WkOuXx21~1&gMdxhit=HYc?C$57dTKvAF1eCF{-ZzT(EcY_ zpY6vexHyvq`emBKkNuK^yMM_!!(&8fG-@rDmP;HvaDYao#oSDpxFy*8_&$~kKF>Wp z!^{auv)N0%njsWj7pM1hlhnyP{# zRN`0?$&gqE#KZu=KtI1^vUwukOQIiTkO1ja4beXITCr^NCE~N|g94hVVcI4^%WX^8 zw6i2}Ra1aCc?S4FqD3ZI&qyR7$FQBaq=oWV2(9)M1VtnVg!aZ7D=JnxjUNV}Dy-YM zf$qLuPA)H@t~iNtS|s4x`0Sq~4W?RN!F3bKNb-4l1Yt}VL9^aMwGC2s4uOWE2_ylE zs$i$Ggn>XY6`HLUp^V6-GT4@xNSN9_5kCeQCX*wrJ%Ld)4H<*mYGElFaV(H1*r_zC zs)0!2;G;04XJ`b+ZJ`T^9!F>bqA;RaZzjOGY9lGwXd8v&qySO?H5SMy!uNv2d*_G9 zF!6XOia=4@QJg{~o*zX)=qie?qv#rnrjas}xM3MdeBVu)VbaGiR60Aem>n5hFQitf zQLi*;tkh}Mnus96G;Ay*jSNGgAV{vo^^*HTQAnjybgv#{`Pd0YhsKEN9x0(=S{6;G zf!&$I2^6ecmg;hmkeF;|7a7}TaekiOo*qh-0(vTi=ecxu=BX4*=(f%H=qR_n_BGVX z6-q_}cV&{2rP5dQIlp1@zuxe6KKI@~=h@LL*IslE-~QqEc>d%f+i$v>8{hv@;x#D_ zJvGhtt4GML8Nkh1Gz=Zbuvu({)U^~#LgC^29zbuJq<6iD%3_I7l~hv-|M53p#_As; zH8M!a@hHwOQm-}W?dW8~z#x|AQ9C)qz(7C8Cyt^J)7RTcZ+|CNN^r$hmr!pMIX-!a z$Ws{TA0w6SVgB@K%B=#uqaAG8I?CdMdssX)$(vsFMg%%XXHPR-UqP%L#?1)2B9%-g zLo77>Af(x-lgp(U86Kq3sNlB(9M1)@l$L2VD)_1-g^urgN#dMk z5dx z>rE6z!}on$-@`HuY|8=>Bf|jC^+}r+LJBgO9OacJ!pKr{042+FPd|e<+Q*gKcXIuv zZ49sNqc8ATi^;z~^)RPgi?N|0CMS*%IU!*XVOc3mGfk`MV_N#zX}h8*L^4F6koeF8 zG?_FGej~k#B)QMFZR%D##n6k;f(Q|WgrQF;B(WyY+X;w*Go7Ef?F~ti9d%8ke_)7a zqlu;&h&3;NeVpmY(AC>Rt=T|CVImD^k7V4yM^}=IO*%>;LP@|xGWPMD7JlGinmXBZ z;x|~DT_UTcaVr6unx@wDu{(Q7WwXr9ml^EuqggLetCZ;I>Oi+_T7H0TTG)1X!iA6_ z&03Ale2z+`LN=Qvm&-9da{^6Ku{D7zC4uMQ`+lNf z&&AH>Xf~>Jq*c61orTl$&^wlZdD@4TFibu#&CqdO7t?deX0xmw8RO|+K0|Nc5R1hU zBje)~N<~y*w5Klud1fDOkIIQ7!dNApN^!x~jcnVnhOO(z86O^ERevv?9a(JC#58nT zu1Brjpx$h* z55v&T#&DkbUPe(uK(3S}+3pg#Y8|U{3%wVg!|BJq%RhenPpR+N#E%|4#(m%U3Bh!e z=D}&Qmd&EMJZG=HtM^4} zZLP(!CCjqB1I9Mkn3&xT9+m(B5=el+%rJqx36M;ZcQTnblWj;K2>}vtfCLg8956PP z@xIBDtbJGSUEQ_U+0XOLhf@;C`=LJQx^(F(Rd=1|x$pn-d-7=p+#(l_pJe!a5v8vZ z$_0ci7#iEc#rc3MuD*qX&mVviVA-GqQeu-aRcNd4vW&ZG~ zuW{SdRlNB9XF1Vo@u^?=BzNDsi@*NnxB0|({*I2NbKgC0=EC^}zVxC0hkNh2k8pi~ zAO5eu!m=EMk+o{1N@iYOJ>xy30fbr;Sq}JxFMN_MH|*odpFY99P3t-N)Dz4fT*8o$ zw7QtFq`OjM)6^7&yp#F$w^X1TFlOXgIX}zaJ@5mrzI7KDqb_&9>t61^^{ssED}T=e zU;Q5Oa)si)skc|Ctu8V!I8LM2g0KU{BE`W`I%_SABqdp1q%g6GZZ`zY0>=Uw zf);^eW`}NYg15Z+ZEV}QlS8kZ@(`mOn%1(tijERwsAQi+EmWpBM0p(xff-5CFv|M(au#XMA~gkCGx!hu1zpcT zZ>a8L87u@B-Q#YV0{LN5*m6hLJ1Aav1xZZpi(yP-bJZW=H){N zv3lu$sG0o#*G=Y9fh0wkI#PfiCZw8y>y~kx0-ZEqpfZ8LB_+a-+Xw-QB+4-daV=Ti^^bJUqnO@(PZvgGv!f z(djhVx@{ZR-g!HR4!q1OPd>%q^fc=yr?3o@7himlq}Su4pZzs%{qURlw=>W3gCG6~ z{d~aklO5thk@D>lJcLiflL=fgGDPiiv!G^ zpTlc+7%Z3YdTq+(GWkM*sp(1Dy*8RI862%}=#`f#lwFii?Af%Np>>;RE1Q$EOEj8m z`1K{WO_U&LQG2<3=zogV@j#4HA!Wxn#SS+X1UDXy?Z%+{CH;DibMA7xrUXM6!Il z?NZ2RS&dS8fKIPVstKgm!>SHt3yv_Q;O1C6d!C_*Nra)(lOaCYJ(0yG?%*J4niBaQ zxm*s*vWS8(JO5|LI?;RL9Y!Nvj=T=S$db4#QFeLB@pA4J`|V_n)V}?~_XtygroNFtR%A zBuUV9J+q@$a>$O4==s>GL|2kT*N~P#vrP!&eixQN)AT+)U1UnA(r|=96a@?q57TaT z(JNbbe!fzzQm7R0L!Y!4WHqTtjMOxQZe~?o!a`^Uu1J{Ku%5w6nfl5K-FAygu|Upt zXx8goTv}snWCBgvr(GE|p3dAvD^p7IBggN()U% z9789GLrR4l8VbkFp&J%{r-`m9j6NG!$uv7S>>RdRq}6L;<_l<67J^YaBr-(P6}D?2 z*L-|G$UKLB7q7WWWJ)4a;k6ba3GsB3pwT8bJdChRR*xT{6SNqZ9>)#DcY*`L^ zu}pcONjv|E6SYE7Q8d*>>3L{K2yYMSrp(PSs149?+LPHZEbb(=;7`BNpTvi)B zq?4l;Yn(ZAk@=M_y-?BY`WU8#k|~a5VcKRUpP4$E20;`+l!C5PD3zI8s$muibUJP9 zQW-Cb$>|m#vOaILKDkoI(se9DM=612S}fPG&O-vO}TbBJ`BwhYq4EoqV~< z!9&NGJMjv`qZJ0e{!vPHjP{*}`O}xa$H*;L&>XUP!>cwhJ_IlP%{Te%U2ny+PEois zW#%=*{NQU}BxvNbO3*|Shar|>Vp%#G3eymbmK1fb!m9MR;S2Zk@%P=!J3jtt{`S#t z@{!S$%FSZWyI|W`XKzz{v0*dv3a(QG0-u^DSB{4IHJ@IeMITy#42~14(nf#&x^)F~6j! zdu_(1CdlOm2t1QcC#6;{MC%?;{y?4@le2GJc&oDPV!n@!2Rwk!*@Q&gp-m`5B|NQI^SV?sZyTB_f;U75H z-^yxPXjrMthNWi@J45Bj_k70ufZx6U{p6O`c=_RnsOD0t6^;GRcNrL;q1KWdIzCUR z7ddociRX`;Vj)mmd)tj1nw{f;zx^5q)|RklHbP{v^4vM(!BxI>;t^gvew-kPF*j}| z8YofI6TIFk12BnQYs4HRaI>G_yok>d3W4Hox(;*cFZGtG3`f5usCO&u#13 zw6{v5H%nB%h}F}`**RLRHfPSAWpTAeq$EL_BD-CJPDIkbKv|ZBZQIzkeR+^}G0{>; z!WbDRn1+R8Tc98aJTxQQXkWU3$4QcTaQmBZp@FGo)*?w}JraGcf+iI<8QEM)br~3k zQlx#$gDI@c4u`mW!4yJ6$&@6HFfF@ptwoM5cWUuYqA? z?aG$H8X&RK2AP|6ks_y;xJ=jBvF_#LUbL=cF+uiysn6om@vxt3sR=UQGiBF&~74A z1HaWkPa{+mU;?h~pb)rj9+}430NB?hFAc`BKd`E7IziI}x-QTSfo7R#mOz;TO=_2i z4+R~bnm zBxzy9wJmyHhkU`IQmqiBF=jcBma|w| znC0yGSr+Ez7^n^rc0B^m=j7>A7_Ln!G}b+Sl!@6@-Z-_HSMR=>t+!lMlDC+)d8{_{uP31`k?uKApoDYNq(HlHc*qL|~r+-X{t}iHyJbwI2%TAayF+=o*@V#h6hKe)t2eZFQ7RVffr&} z2DX_2Bn=~5ETl4{WP4o?lp+qZTu8Axz{J!f)qyhgwN-j856iO94TB&Eh|&Z*=i;~y zsZ1Ffn;=aku5I^Q>JoyL8Y%r6@hCz9i>oWNnrj3}fR(c-S4#*RhPH0y;;BLK+E-4G`+NgCsYKElvR$P`bR z#tfamNOPshvLA6O?yzhq5=}BxSkFy6Z|9MpJW9LPpu5&U)2z(eYMEF$7e5NIEsHo# z`mJHv|51pn7$u4#42|sWuT-|2(FKXj+89$Mv2z8qq|Z?j0?pJw2i?#xbwM0wz+5d= z2$dY1bD~BFWDEv0ZyVZ|5wOt`WomRl9(07-)tGh9Cu^Fvbr;;vk~k zY#@Y%*YjChZK4U2@$vNx4^QB_1y;L06C;x>&MwhfYmsvt(o{0FejWAJD#9J2Tq)7( zwefo$%EbamNvqY&`skes`CN{iV-a{AT-)mR)jPyeqNRS;SRiB4I3S2(;zXh87P{>c z1_461u}mkE!NZ6&^dRy{dL8O(9ipI1lDEK2!G*Ewu3+=^JE*&od^OML)F`c9i=nAe z)^AzQn&ETBExUQ|hu_7%efwCqV+Z#5BpoU6J6$ksOv9wp?&9iJW?i^Mfm9NyWF}L| z5D_K_6hh1NZK+8xKv)9J(pif}k;=f666qAND&x4732>`;eu9cReW;j@(iA}yX0?z= zg1`rY}+ACq6{=_>cnw~u0wDBG@JKciCeOm7#kw>0%A{c?C2SSxn;ITlHWc3Z+!BK zy&U`7zok1|MD>&`o^-}mVP&z-%@wU@csc}^}g=vGHa)~_SKd78DA1^(uvFl)gg=T5)C$wn6~XRy3HhvrIZYqO|vhbwn&W@KuJ6E8f+fKb>=Yv^&z z^03Qt(PDN!X5;DzM;o&!G&ZkW&)si&8+t7H!M{An)~#3Ys5>L*a;UjOmkGra6mLGeGJ=bmG55MynZhGBboOqPl@h0zk z&FlEl_kWNL8+!Iw*ZRP^O8}z;Xm#djR1!vR-^-)(Cs`AcYNbL!Gtf8f=7|@dW4YU9 zaQ%9!o7S_mJj?o5@8kZDe~8nkYCQ61UuWj#dssKMn;{^CB>Hl%8=9qA0*mBSIA+k(g%YkCsZI`ZcslXlSN^ZW)Lm&V~;|5bGfIjFu-7 zi3noyb`D(=SR$)EHFO;*GbJ?*BP=Jg;%1jeiJ=Kh-N@Rc(io+i8M~-|d)GzQ#w87% zR0GTR`nB3Ru~eW7Oxw&ZnNdXIduS+xo-JQeP0Q%mhJmnbv@k*wI+`IaGel&XW?6(J zMWy;>4#%ZukK;Jx3pw)nJVBad9rb-mpp-JpB}kbKT$VxFw-~8Q!FvTHS!0;x*hFap zn%3V=W|;$(WR|EXPBNR(C3{jI7^!QSLM7uQ%j)D@wqJcUuesw6jADu9dJ|zg*tSI+ zDJ(NbsuDb}h0q1IlgBh%q@jrXfShF$^gQAyBu-+A6%bm^k(@1Vph%ac~^N(#W|6aT1WEG13(Df{-9dFioAbpDocY5s&-4 z2E(=pgSd}jkr{hI7bpXyDNrV8QqO99(+nh;BuVzOlQIK9YL_lN64NxWEHit*ag3(v zO+HDcAzt$+$UgF^^%H#4^ROOiI-ON&^+FoJ;rO5@9N-HR}Wg8J@+z?J@haQHt=8G^>#M8e_RK3Z!WMz1=tUtxoD#IVv}qZ~VOnz`8} z=4u_zojXf+ZIKbzByH3<{^9|eO^-eMZf5)IwlOqO;&Z?I8$9qAe@ZF@m0XFLjWg_j z@Q3`D|NU8>cAjY%GQb2Z_QA!dx0Cx_WpZFm6z3bgKG#%$GPUFE7|v|-Bic&eCvUKLgaExZP`v?a2V`7<74Ag3MD%2Hr-~6O1Vt4)gknI z=$1(s1tcnKRYxseThAdL((`T zj%3zQq-hx|KxW{wBuVIaJ%q~qf{x>$WCEJPGM| zj4|vIuC7pxQpU9$!QujbV~JjS8DVQI*Op21C7yr&0B55$avNq4o(Z*p`k9OD*tVG; zzwij(ec?yQotx-XDr~srcJ8?K2J($pSXYU-=*QgrtG~tS!W!OulP&owqty}8YL)Sc zb!;~WxHig@zV@vw9$7)Pd~zk5&dHNp>sF9%#6j&8=I}IIcV9`aT;!3TJi;rdj-%!B zq~$!@uD_1c^;I@*+rYxPGvo^u;$BF-zKrFDq@qEx=Hpr>tF!Y&Ny5-@iP_@^=oKYz z`^9(g-S0e2bp9e&4VWyaJ};*!+Q>M&cW%X0U5v>F-}%W8c|tpiv%bZ<2Db9$|Nd>B zw_T1KZPuQCIa5^oA@s~oFMurcI%M0lqBhsR{${q{cnue84P;lN&;@fj;OK>ym^=Ie zZ@=Y6)>|4EpM0ET=^}5qVuqs+J;?sAewFc=34Y`Ef1QV3{1HyoV#|1inM##AC#Tu? zx^cq5r<5x)vwns{&ppR@rHJ&J1oajC$`H-&0^?PO#{4`bk)z-^gmI0F^G6V|WXHCv z*f6!8u)D_E{6*?#o2;FXX!TJR;~1wjNU=N!(je?4;Axnlh43}RfQ{?A2$2Ei!Z6H& zi2W_RvTa7DCK;U?N6*>x;sCT1yIN*&Vhj=gEH9#)SwPcrGDd@LnWW7Qny!R7>1r@Q^ciBeGIk*qJN2rGgw^`#iV^jNpsB0>PH68(lQHblG)z^T_N=> zFxw0K%XY3LiV4FIQ)J*q(FYV7XqO>{23a+)R4HNLF+RPX-FvUaj}vB>S142la4d@; zNO9~uQY8dl8(|u_xgw5TMCzG6w^}Y|Vc6`$raVx=k3-TFq9DM~1vw{!_UWbtnjnZG zRL~+$V^XQGY%4o+(wKbCK+_cMP!c5ph!j8QkZLJbAxCWJVA+_^XV3JrJ%*9d?wyR2 zqU(K5iJqMUsiufENkWQLDXvqz{P|1S52yDBUQ0JHY=d0R#dgeo16+jfWuNoFK$Y6; z9BCY(BT-32ECW&@kwOw{2|>rl=x@j+3eC_lEek)&LgRyGjz(>nft}m9_Rd=w*|nXk zuG_=h;vDa|?;YgwHY>FyFiplLC$LI+j$JrMVSJRWdv?(}c9uAZ=(e(RJV{e-xaDS? za*_FkIgEC~=jC?d9*Do!DneHwvBr{1EvWh)bt)AYQElSj|c z?L`R9Mhy*tO4+kvigM`l)W1GN-YwEm24~kg+_KB$m)>_D7tf#I*z5%crzRQSwu2LE zYb^U7<1+))SL<}T38wCX)bTx^uGb@MwA zJ$c6>^nENVk2DQ#yX*CQ^1poww_vgV``^Q@7WuW0f0PG)@MF$A_87ZvxRIdi<9i;B zrFot|@H|oIgOQ_9$`%cY7l0;6!kEa<+!m&;k+U2UFQBowgp6XAF3u5kJ%&mZdL19l zGI_^)@8{WrFOnM`q?#+xSzN-36`gjrJeZrkNbI#4-!#qm^dyl?@skjIhkU+-5;~<) znQo_>0YG~_G@zF&PzdsLQ$c0R7KU0e#cGLUYykiK5@VwyG#gC@1_nV049lYJ`(R$O zNM(bD5CX%{K~tB%%SnsU)Ulk}u>jIti&#NJ|6PL>UmrA<7R> zL4fLmT(wl8BeF%K5TshhVbUZ>t;giLF=o$SK%cqsj?ZJ*c(G1-a2#bugfgaFDiC(N zObrf`wtMteo8%3X#Eo#A0!j%qEg+>vc_3wYG*7jfXV=aRoIib%G*K94fgk`hi^=f` z>Psu+hsS8w*DzE{6!@5yi=7*w=_?A=DG*&uOGD^j*%omWWi2W}59N0W(|}k(J4_kf zFoRneq}}RLDdi}-22Ee1GBk*jcj)w*w7n*=iV5S0!1FPT5L<8X^)G&wr9=P7?|$f3 z?%PqI^W+1(Yf}Yv^m{z}onxFi7!mpnwhy{oTbd@nw8))T1OIaQRk9cMy;U z5st7BsfOt{R6=#TV{O}o$ojb{$ckks`=RETzi_*v_qMGv5lMkVH z7Fa&`JYu!Rj;RsOpM8ewuAgM+idS*-y>CNJ3~=f- za(WT3BgqYIAV@9Puoc<`%C}Ux+#`F{1O}1jq}8T2T+3xY@*UTszv|WO*fzrS z=^yaxH%#%92Y<}|(=iun0T+&(=i1VCjvNd*G_`|o2dh*zOz?rXy`M+_=5p-9 zSz4;g#FkO^-FO3DASv4kMZL(Wa{O-%S$t*I94FA0*sQ2Q*>$cS{SxY67&#;AZ#|UER%3$ zfs*4gP#hraBsf~0!Q2qkeXMRu&+H*wn-D?V>=HJ5gt0=#io^@hayAJNHd_cy$50ta zDpx9E6!XNn%&#j&W?$7)iIXbw2uhkkC=yH~YbVn*4W$`KC5TduMC#Xjt?h+O(Ovj;HZ($`+P$p5Wg=`1lMd;;-@@SsnqCxB233A;ApZ?%`IQH!0 zoILO>H+}To{PdAWs8+^UI((j1C*?z*{1kV-|DBY!t>^JCe}~dlI}wxPbmr$Np&b(YBXH+B29y8#q1(7;=VoRbYsiB&=EH<(Yl!I^uHx8B&$8q8t>hh@*Y3NH z^4KT`&m3XoRr?s4UdQ~gQv`t^@p~-B5iMy_YYA3r9--eOS~$(-c!vG|_!uW&IKoZW z+`y5;CuoLEoFRoZnPAsjn2E{k`6bdcp*(03s5U7nsczF-ZQ&Nm*)~I}jBzGoBCkW< zv4{zgBBdF$sf-TM4m?sJh@+HJd60Cqg(aX=a4>`-@Vba7q++`axkc&@G}|>&8G!4c z2FK8H6;_s3NV_e1qC>UlGHtnh{yo3MdtZMKe$(TxzWQ}$TMhpDFaHlh>P%NF+<3>e zB6ME=4pI8B29Z>+N3InDZ9j>pDCinGHE0UI{`8R*UXUy z4Yo{;QXpdf^l{#F`)wS2`4EX_pcTsuY#yc~BI3A5ae9iy<0qIqbso1Jv!yUX6CW?` z5yd@vaTf|UDrZ5?ArgQL=!qVd9zmmqN0<#5oq&9$NSww9-6D=sY&(Z(IOzQ<@LaBd z*RJEZ7M|B7mv=D?gI24J^w zi3OU8FmwzuHJE-rEYVVwu23cn+9rl((OB!@xGs8mX4mHp+ag~o5(GZ0?KR4SBh>0` zET=%T)urtPRE9>8!l2PvWqfoB-;b!(YD{lfhY$vZd=<;CaOU(8E?k&JlV&EDr(|-Q zZQ^?#h2beo!$8I%Nu1y~E($>yrwCmqPJEP9q)9^H1%zRgH7V!YMe4`hN+iWCFW5}7^AYoiNErQlL1I9Rqt&2Kza%{b1QBOl z`2W7?;6D&6HF=3^nY9!t`WB5e^O|cZGRdmrvKEp6rDVoZNfL6DdF0?TJbdT?<%xCN zu>A%;cJKWZwJrxv?&sz;#og0CCjX8d{N^9O$nxA8w-yR~;KQHgM}Pk(?0M6VdC#YR zk&kaF^Cxfo5byZVXSne-uVG;0M*ilxACb(SU~poP``_^vv|Ns$=X3Gg9PNfj!5yGm z(rLtGTddV(p8xS9EFQhcOOGCAW@tNSe(z~sKG)$JhmLX99me+ZT>SPUG#=bf?#L-> zW1}<{=eYOh?#3$QIDX(D?WGmAUAc#5vrT1W5TWTfriCOWj5@@s&CpbyH^1d(PVVt| zyIJJkyI;>ScLi&8o`q9KSh>m||GIUYJ8*#WOD!7nT@F8bh@E3I#D2o~A>1}EM?W9cxj+L>ceMYL88mJcqYmvh+KB5rvo z<`36Av$N!&TcTBp3MBKl~k!9_#X4YY=a29N((ZH3vA+Y_t20 zS0h^&c;|Y9`}1|)H=c0cHkaS~oBc=ycAoSnPnURq}UU}g;%IIh- z9rjFa=f<0Mu(q0D8zX4sY1dn{R~mFyIt;p1uC^z6;h|@UR=eE$);DtC#54TD$L{0K zdvE91(h**HYxrR@@_m}7%I?uD;co0XoSd2X8We5C#La{)vR-;g^fY4Ysy&f+L zX?HsWy)F~$)?u0^?N$pC$<}S#$mI)kI~~duo3%!bh53uLy%uroQD2$I@6{=mUF?EG zquxR&o#|~?u<42`aC3PAuS*n#=tjn;NR*;bDBw6wzn}qny(Iz6NxVPjHX zze-2e@p@fKR)KOZPgnEk7^}2%OK5Q(G#yl?@+eJ!rXwXJQjzrYBpL$CvhX~=AE*?4 z`&96=@OeK&a*4<;gg~YVx@nUtMZq?4jO^K}yJZ406#~sb(+$!fA`N@!x`FN%z|5h- z7BUVHnxxxlktPXIlAsBlPR~OaTBbVb#^u+gKWm0bsuE-nAPlQdP|pTa-LkXFcE5>? zQe>E50!iS}Tx}3}5xIO3w~)hcwkVg%n6^zP>=FAum0}qc#zRDZcvKe^0{=nW&DiGGlY<>4zA5!;bqjy< zVB*SHHd;dFm=;?zT zYcx1@VTp5d9oFW2mR?!m)mv|3?&-4(xdmpAE@KCIgb%}Rna;v0WBDQ6$fm1&3i&)n zUscu7NaHvQS*H?H3Bpc~>8WWNYYj*w!BUNCb(nUoPEa!GCLTT4fO4LWkVK>ewoYj2 zRLTQ%mRFdXT*vk+catc^+T0w(A)6*Ax&HRoP{`%j|JZ(h`?o)jufwnX)@Rs#<37Il zmtP{^NiaJx&GXCn%?`E28iY_)E^aSkeq|QF9e}VXS{4o|I^bwF1_qth0?zO-g-V%L z;L(dCDq|zKl`^$X6D30$?Is5fyoBFqvfAs>Xm_wohvAVi=2z#rV%Jst_8uAm zmT6$@J%XEDY!*W?`wlFM;=}Xo2F1H62v~mN|_56R+zt7r;tlfsbFMi z43v&avl96@jxbD(M9*Ovf?lVMhKB9rGHb5mkV-I2b@>B|)67$5m=?C1$Ij*Px;;{< zQ7To@`T#*qNT>S18*heC1`~rZfc< zLhIKT_7AYs@MzXo@j4+qHyIDwb~kEiB0|BD>#J=}fMjntRtY1Ec^?wRNC zJ3fVc8B^qN>>~B=`2q+7CDwT`R>INOnq>O*S_HfcI2k`wfjDS zv*}7sZQY3XhTD14>oQYta7f81$&QU1Id${|wp*at=rB;K;&qyI+g%VD0M5#3pjElI>>YFd-b(;FVjaeqtO&qt5~*V%a-LLcN>gp zHV`0mP9PzLkQ_)T`A!<)Bwt7f!6$I&5E}4)0vz1RD`&vW0LK7NuThtG2A_&nKkC$*&|&b)Du{_WearVsP+{g=_D8)UlH z^48JgB(g~wQ)7t946bEiH=AVBDO}gWc3ND!|2n3pCzw4{qHV3tvOUh|?yFh9^L-pV z)uPm_BWo45=J3 z(YtO%-q=UdsBrYHH`%m)9oO!?99q*nWU(R@i^Z2HJu;gHp)V1B0k;AKN!><45=Xf|m~*hzLTiM_V#W zvsi)R60wd>yfDNvtqWZZ*Z1+mkp9tOiiH9zb91!i+v)A;CGdSJ6^eC6hD6(|HiKDH)*3ZYhyk-+c zPpnodr3f&hXvnG#ii)79ID&(!sF7bJ1c?wa2nbyp-?TuAXjFnA5J1F__kDanKv5I~ zSw@y+5TfBG41*}rMPw?MHT8nPPh6D*hD0Uv5b(-PbTx?`qC|*@7ea`LD9Qwa zh>w7*iV&_YQ(_6MY86pYaV!(twxWURJOyi&79|L)$XP+ab)tuV&-IXn5W#ox{g6;k z;R+g|?;xo<2nw!a6S{U}p;vVRNg-@46ZkfQ7~(kQD(+WCR&<)S6M0x91xY*)3J_NR zND=lpz{PicR87P8LqtKucO&81sPnB0)b>qqhd9Q)bbvtYof>F zC@}-U@u)8q2@EB27>Huzom%Z-sCra74hV>+lBBbFjCdSDk_bid0&qZ3A{v$;%cQdz zlz0pW&=N6X$s|%&mZ@`RsMsy0W@o_nahgp!dwVHPP7#Iyp&#N{k*(Qv99+jiOT>{B znRUCja`MPg@&jwhbaavK@2Baytkjzi`jaC z_rCuoUVP~Q|MJh@q%+e=N34VS=>qv|4;O8|3^(4%*vV%IWrywgt@Nzj!i+qJI+|ti z_$0fwU&_+rJhRm3-8_hUY69!E)9ioS?d<={&tcU&S(vU+a0LGCTi=JJX`XxXKAt`E z3e)F`=-MWn#?+xECzp%-__1HpH9W+?tyfW-o@CR` zwY+WDHh%E`{xyH{<-fwLH<+E6VE-*Qkx9o$sS-VgL5Hr9n#%tMZ-+U3>U0qabC91U*WDnfBNvT$*R4nt!-~SAEef*=m z{MMVi_XF=|W@e6W|HW6RdJcpF3xySuZCyyQG>KFi0+V8Cir%d|@In=*W@8phG?o@{ z>$O$jQGlB^@PrU09!E{YFg=G>;NnXHzVEQ6znAvjZfdrPmQCX#V3(?RVMx7c5;jc| zf(mt;=O29%93Qh!N4d@k|#ngg}&Nc`kSk zo-g2e0YVr#L87Q>c!7{7g{y8RWmPVGVTB#N!3%(}+KHBxNR(SDtso8T-uD$%Q*k|$ zMx)H&x(-w+q^GlubEi+y)t2SzeOGe!)Cm#^gN+-rl*pf!(=Q=y=vk*9*V5cXjCx_9orQ!G>v+_5oJnM4c80M4TEaELc-9ZeuU@YI1aua zM11zuJZfOugh5C;lc8l=IJSeXs@TmYhN|ET0t7z3YvS7`Vdx+UAwl3^S~h;Oh38B3 zk8B4$Pr7rExnhko)AKCXEL!6NZha1|(I8*Xa{SQ){N7!+Q(vs}>_cNLy9qkgB%Qv- z8xOt2Bmeax_db1;LsbQ7%Pv0k&V3ZhE6g7`iWbYDgffN^qg*TD1uk}A;``C{K@>oi zWMoAEy+A_0LOGAZG$dRP`Uf_W@9am>lX#NAN~3}hQ;>#+h-cCe1XPv_SoJ2cWP(&C zjjTxY5BITQ{V4Tno#OHeF)fKI8;D5gs*bAuCi8tBrFgysdp-!h`aOj#sTY1N%3RAR zij41h5tl@Y92~N;ituzDywGIl-YpCbcOkhJPNmA>BL^86?dOJDZ>G31!nQ$^<;e%w zs22G2oqx>O){k<3xto(u{e-WI?Y#HOO$=SRi4T4B!~D&@_wb$X-oxSL*ZHX4;NBOD zJp90~ID6_Gtx7EtWGW)Le2Q2?rdQ6A@C4LmgRKJtoI8AiTq?_BPdveO*X`qN>qnTH zukq(!{2Nx94i~rO=xHv{CMemYgWMPTN|HAZo#EWs zNqVljlBxu@WuaR(AG+}t@||mV?y<+|$>-QKILJU(FO@=>jq7)yV=y()!E|96bGbxE z%|cx$BG()EVZfEQ-h!6u!DvtL#My%^WmJkuncmSsy5kyWpL>D$P6f$!S(z-cG&jpv z{`#}LHTF6upLmIU?qX_A31QVWkW3_^E0=52-`~gKH{M`m5Qc8s%yZ=#uGoJE!gLGa z%p$F&C3f!K!;{aS!<#ur_1IY!iU!K1cQM_!h4{rAXsA9fzfh)JDkCWhf*|2K4thL} zs%f~6L$W=E?YXq2Q{42i4|CwmX=YE4Gtia8j5%ye$W%|CCpw70jj(x~y~*)!xvM>%lnB#YDY2yz}Th@)x=5{WoMD3FS` zkxh27zIP4Psb%7VhAx9EnJhMn%v&wKd;c$yk2(D4r$1wA>Kvq#s2%NOj5v*AiIk#Y zCN+jfM(FA7VQylAw%#6=SBkWCcY~r(Tq&Z+N>pyPY^p0I$}1&&-zSwyaq7$|Ow*;f zTp(z+@Xjv@M45V{j#+6TAYrzeEKW}|IXTW!VVO#`gx9E%NTnk@>FQ?s{FYkRBTACv z1bA*VF!+9e>j&7L7k#-dq8!PpAQH-jo{!*r;JO5EWXqNnWfiXoq9_sgel%PtGNKyg zihbY54f*Dh_2hRq7V;zsJ22Hg)*+?;2UWqC5>;YSXGfw zw@IgxWV^Zre3Y@4QJQCGpQJG5zi*yABVPDK=D1R)wi z5G9agkYqwpLX|}v$00CnjARnaG>In@c)mv%_|e7Yw+0X{6tx9GKqNp^6g@mvW)Kt|-*u5f4?z?nDxo0Z)aD68A59fjBTg!MED=FiyZ}v+5ykV= zIO)Qb+Vi6S(@^m6Jr7Nb5d;B>tl;@xbiHvM2z=t{1di|0sMnE{7`hR|bjvjAbA;78 z>8?%`QJ`6=U<*D@qlw*Yv8KHfN0Tm?tk1ht&R@@ES;qD}G{ZoT#}LG*(0;z}=y)!& zDq*e^@qlKjh-tP6bsg8X(Bd)VY?54eH@hysoNP8nI+><8HA6a{!gqXpQN;Irf@Tv> zh~jUkGVxRrH}GkA7P1~=$F_@Em|sE&qXdB>X)Mhyk~9@o=9hW!-uqdcoZ|4CuMuCr z7B8dWrZgtco@HWk4pG!uvu2QNTRVCp!I2kVVti(f;hr`=@wXq~`0_DMzc$NAyqnMc zkN0xL{$0E}Q)J_s^~^O&#BHCBuLyqEP?U(ZBgj2B;hhL3#ceO$GB6E8jU7;e!)DoNb`#bBp}#-~1JSdgljOX$ou^-o)b43hRbO*tYc|YNavFNctih{OhdE_0aP5%7x_pikZye;==bz-EpFB)BqQROR1w&-9 z93G#1n`KqL0C>o_&orY~uX*Q74 zX+%XK04miQEz71)kC6~Ha%z&WVp5)5z;K~InWJ4cD3}cb(*?(4a`G&G*g%jxBws{w z6&fom$fAsqOmhDN57KCvJn{GwJpA+f8C|UEy=j!?z$VD%S#~^HazL04QF{a| zAxW)a5?BG6AfU?uvL@h3(6TJjZEaY!2C-P2Y_1K{vhaMLw)Qr19qlX^7g;+zMBQvr zFBIwM?Z*y7^6ecoRtnH^C{N6AEwV>MdfMg1yY773Newu*%M5u@t-W&h>@Ieq2(?e0XaCHd@ zkk(zX|0|7V1;yNN?b z-=JZxu1j(02*_fJSMFrG+AuQk~LD70Yyq$77gg15tud(9v}bf3*}Xh*5c3 zQe+B+0-7pgTNYN!#I;R)&xsoLp@-nPsDeNc`jObrGznY>UDpUak61iGty)4_Wjuxc z>W6@5W7{oEvqdg#P??$}wQe26VoVkmQ4=w;ZCPrqI?1gUBd-;>@3~*GR2P|>S)vdV z`PGqAoT|rZPOOm1_www?DGoJVCJ?yljvKk^s*T*Rr;n>ghUm&9c;@LBNGDU6jt#m% z!7SkD9&uTVq)n@GFLCwn6RetJ^>~JKrjy>mVG3rGrP3m1T86lUsY9r#;5zt@jf6xt zo1?R%4PDnFzH&#NxNa~%IZLhDB$LeHdEk2is-ofg4nYt(NNn4V&ho3nhv#`nVnoFe z1?j?|;`t8Ys%%OYL_F7BCD15@LS(@8g8<96*s`aC%Qp=Wub272d+*@ob4O_;6y^$L zo_pj)hBt3#L&p}#uEEOH7&!ef*FE<#fBNB@S-P#k*S`K;zW-N0C3xXQ?zpj=hh96t zw|@2#C*D}*!T&nMlW!KVY93uZYuS7C)pT^VQ*A8KKiGj5^I0}68e)T{wZc9B`y1T% zulKMimFLU<#~(bv>tkmLgOIll9pWe7 z{1(af4qV4YmShxBq*R%~^#eR#qFHTW)*UR%V{&YogRdXsg~wlH*V7s76N~)E)6bA9 z4ek z+7mCZczT+icpJKqVD}}vS*Vwp_ZukfInEqCL2I#zx?tlku5kO6SKzcNsA-M#K%VLH z6t6w@pJ>DFeEv&+z)J^T;OM!xP&J$Gw85i4dw}A+g_!HZ7c642II1jTJ2s*i0s*yh znT6?bK798EKKSXkV^W5?!}Iq&MR&5DGh@e?T^ysnA%!Y##t`>2+tBH`EJ<>p$k^c% ztQ<>FsWmB;E2yf9C`h=zPb?Ngl4Km$MGj5e!aSR{4AZk~BW_=s{tat6@XKHD_Dx%P z{2#u@E0d=f9o@(s-}zsB`sTa%k7pm`i&x!B-gJ5NiF5S#j`Gw~FA__p8JnEO^&yc? zbItYF^1zSoCpR#Pi$eE654p}Pg_RO1*~H3Tavah$?MeJ!I2)Ow+;hMe-dzWK;R*wJ1p>l5uih?4`tMsvGV|AWV6yis8OV`J9oG5M?28cqW zjSNH;MOCARZz9Q<9|WtCDJ9AV`yRd@8Q%p-1Tl&nNs2<~t`ckfAVT0u(uFOa9|Rx- zn0^VNS7mhXMmmPuST0TzHcF)WItZL5LEtjHejV#J4RUVr91Xib=OshLHg(f*)Aa1> zBY$a(i|-s}`z;$Ns1{0RKPwAml$eMtMMz+T2!SrG{#zgjgub_Wu>o08a9kHvRf)xP zIyyUOHCn&9APc`)^@Xd{Lq#Iu_WK^PD4-C4q@ZUzK~Le-%A|7bNJILzmC`a~kO^+c6GOp{RDe{HiUs06kbtH-x9wc1fA@qDyEsEYrq7)gWWf8mC zz>_4zxJ1LQf@$MQ8kXB6q=?=Tvf+|znV*`XwNxO{mW>=Lflo|}5m$ABxQ^{O_`Z*# zMD82cvZAggtP;3<>Wv1~Y6Z)-5F`OrQ;}o|-*fS8i@}R7A}};EU0sZ9+{ohMB2M5F zHw-dHoL8TH0W}b)EG&~U63ibviRXB%9ao=?!IL=+cs^&=-@0}Q7f?xjR zc@7<1eQA$e-c&>%k*+$cD;aetwA|vQ3G^(_0mrAY9QlX6F zcq9^WOtZ!KnUe&D3JsTPp@L&qxMa^JET_TZ#3FIMgSBlPj2}Nmv0P<&xrlGO7=lb+ zt_!E!r1#>j80i>I---r%Um>N(SksqgXhRoeSHbl{#4tjKhjM_Z3!o`DqJYr!5JQnn zJcVz&G^#Z^@;OEZ2T8CMK{dHU98Rf5B%y`&piN>M53wA7#_!mtm~yqqNMx|N?WRRo?wxP=S zvWP2qfKMofc&eD3;FCs@4f@7tPR6 z;s#pWz)%!~0Q^=h>IaIE+v5Vo@w^vl6+j`Z#;%0b>$VU?aV;gGVc8DxM1o{0jnudM z>aR2!W!iHouHCl>t2swLlV)yWio((&*;JNeM~+}NTe!Bx&WqZZ9G{?nV1T!d9ptL3 zFGrCgiimGIOr1N!%5sTXxdA9Ru16}B1QATTg%GL`3P_5Mq8T7b#Nr7wRmEyGh{sZ^ z*)k7B6wzeRL?0O&6$imF2|b4pkHGgqj;1kDR#0`F+R74=2$B#I;z8&}f<52E^ITLz zB|gy0LS>osnk=5=(%z9Inb48M5I1A6P@m)CJ-b-Hc?a_qlS2oOa@&VKf*Vs~-oI`E4m^^ftL?%hl7NaJMSS=;B%WLa2V zCR8M9jVklYv*6vlFFhQwNq-$*lo40M@KkxqqJNNEp|GW0`>f`~wcH%Lfc=<5( zX$KL5-hG#ne%tlDVYIRSeSgGt8wNRjdJIjEvF)-eDHc}neUF~*E~ZZ&M^44bWZTeW z9a+_oRF$2(cVSB+r>7UF4X)$4dYM<|$1w(nkW(p81ZuMtZoA}Wo_O+JmR*myE5lM1 zXK5M35b3#i7_&oVd8NUWwM5u1a_!wWa{nujvvlqRomcN-Y;ls@sY%9;9U@Rg#C(<& z$0D_6fOJ03$pE69>UI&|2URkOK}fdY zQfV%b9L(^?zxzRsoH~ltm7vXt^Xgy!2S>~peLFVu7k~Ic-hcUKMiV;A6LZ}2^G7Ia z9lUhn5V_HH#Pd1E&Q76vG8qh-GmC8N8Nf^?5k-Z!4!=pWRl&5&OwUdssxe}TJl$9I zFjX#Lq;t4V!1&3t80ds0D2>-?l@@60?&QquIZWTg(*)Yqba2C6cQUem9dEtz2CAYk zKRb_+N@KbXT0Dv62WYVv`FsXhl#o{uu3h&yL#^7tax6l86ip-%kD(@Ggp!15nRup+BuT4SQ{h5n$?0r9odV8XR zAWIhpkkZ0Dj_nW<4J`8N2Gns~Y{$VaAL8y$-oj09+s=IPb(YIV*|m2)yKlOb_JKH! zl8YPK*iMzB$6jZpKF8ZXcsn2Y)LmS(W0;y;=BDe1xN%#YyRIDM;=VYiPrXUJFV8Gx z#N_}<5Rrw*1~05GgH|Uj1V6wqV#u;etJOph1e|&mB#DmBcB9((llGdj5wvj3XU2@ZAD2$Q6s#v7ewwANs%EG zktG>Xh#pE*Es6>YLWpBqQNdr+*sy66THGMl-cEN{Hw*I%1dc~-c8QpzQk|Klx?IGp zH)vL>q%t{f*nd66Vv%aKisw40nG|YF$4JC65^-wvDt^m~2z4Q}mW%j7NN4{bq3bg< zK0~dt%=Vja;P1Zvw`|+Gg&+R#2Q1bqIH@>=n8a0A-psBm_HpFsQH)HC%kQ{>Gm|H& zkDunUD|Yd~^AFM1tZ`lUMt1GoOUFPj|MUHys#=03ZNKL_t*k2(P{NCb#d|Lq}hRvrA=8yfnj4 zU;8ebHtu5Urj1;F)mmPD^#D&i^cK~r75>+sf0TE<=bilJcmAGuvC3cm@SChRV@x_8 zvoD;ZfAcOfuFp)Rz?tF#OZ5`60#m1tp`;Wx?c9VN8zj^qGy-znS%xr*jw?C()**Zm)J%$8PdAD7Jf5szc^;l9pc)F>FW-%)E0m5MB|EeZDW>DP4#`Z4 zN@<2QmtVr@WxH^b2^x(mEw_%-mY{d*C{D|vw`%}HQfZh)c3-^(({C_0wuoiNSz4SW z+u22_T%xP9hkCh2dnS+X1&E@|#KAGj^AqG#GFee!jgY4^jFZAcaB6f6j-bj0gbJ2p zQ*TzV0tX}sABnt@z_T1&+s3u+NGH)Uv8)!&dW~YCz*T#%#tS8umx{dj@+&kNHB4Ec zv$un*Km8$EnHX|Uj-t~b&_&ASWx%81*;EgXF@5AD3#ZQEm1;;0o7Q5H>hvO3wM9>7 zFRG>?u3j<_qhUf(6=Ja%iMSDo94#ABmLU+ZT^Cu^$mesoZgdfsWf|L!_Vs5 z^9Aaq625JrC^BdwhynOMo@EiV8c|e#m5LayMrl_^4Ww|@AGErd3C<58=YL)m(R2;7 z6MHGBG@+mTDgX#GxjvPI~^z0&o>o(GIU}k=Ww$3%gk~wa^Vm*)k>KTSc zwlFz8OKD}9TBSm1eub5VGM;S`2H?3OxlB9NY6DHzh{ZJ;jXH)LMJy8OEH2>rA?b9A zFz|3}lXR{PArw%=5JLt{@(|q?SXBbMj#;lj=wjK?iCocjEXP68bUXwwYmvM)a0vnj zVRb_<2vPp5Suz>9WG9y5(B7YCaHN-dxj?H_B^OJxr@x;K9m6b-&yWmErrtV6SP8lP znqAy>eJ_$Y&PCk{@4xm6CXT+v?blzAo^40zUdyxx2Ol}e+)|yUDI*CP!a&6{ZA9P3 zs#TEC2?GDO29St%A4a)qU&3|E?AYGT?|teHuD@y%DaEDJ(8+`%*Y4Sc;Mf%BmZ;A! zQ7V?HR%%#oR0gNzBZm^c6Oc6GXhw`s1T~=}$|8XuqG{TNo(*teix$Pgr0C&cbvqdZ zek9ZiBiybS2zai0p{MS;&T7sZT;FGSaFp4FDl?@jhfkkm|20=Jb^Hu7XBX({+rY~$ zfdltF!S)Y+m&8~9g}=RH1aILu^>Ttwf8@hRR*EkVw)2&nKFmKpc$EIn{V{_#e3-pE zuVCWMZxPE55z8eBCGZhe;RPBoBTE=)^iPN=wI==997kS!lksB{#C45yr_BA2exDuP z?;x{&4@0-#L^|)&UpvX~U);}4L+zY;?Qu#?jc^rk@UC~ihXXIZNO57FQh9|f~?BCxkAqwpDX_M-HaFK7#1`(zIOy;OFK(%PUAFZNsg?; zH*JP``lu9^5oLiOE|BO=;c7lwvJ*Kg)4j2Swvik?8+utu$=r7LdoTvN*!d5)ai2*r7ak;`5?!J|+ zd6|{PC8~Okd;jZ6DvMS6x_W7N5`qxfqJuCxvnp~F5!7UrH(xo)gFk$hQS7(`oMNlZ7y%UT4R2;i;0qt+^thQei+-dkpvOn@gjVw zDB)NRhNjU<=joMH4719b-6PCR&oT3}13Y`reKfXjK)Lc7)<^3 zy?0_3mwEZIUz2U`Mp0#IwHo~cgZP0Er7kxa+w?d?U;3@Vi>QV?yj zEGv4={&&DcqtU>&nwVx2%W6f1>hqXe-$Mv|G$R!`l!R5^h8TT$g!qAvBI?m5JB-MA zvZh784L|C$X_}0;+6@pT2~kl%h=^K(B;!;oQC?Y$VppOR4FX=^M`XURLbF^Ttq0t8 z{gqt5?+R?&W^!(UKvfCV40>EfReY+;)9k-&D}VIyyXnw;8q;U-R>s+pPtrJgmX$Xr zX-qUYcYKod>xUViK0$L*h{S{9YWpMz&VND@1_6o~mAWCsZZ;TMKSH$;k#9WT$9IGO zUj$1O#S0~L-)bSLI-VCG3n78$;DrKWEQcq@2peVcoxQjyG|eWOEFgvvQe4(`L@AD{ z>d` zX7OzoRhCK1I+fxIax8`?z`p(0u~MsIWK*1*o2FST(`+`t(8zVRgDN9xD)B^|YO{eK zIF##EZn))U+WXgFdmhzhlhWig-NQrZs)S!CVV<7gv3q_%UQbdILwau9%TjlOGe5qM zE$fHK#5BfE9%W`_5#RUe$aWDFO}x=G$6uM_SKoe^SMR-#zyGtZbLswlv~BI-OaJ(3 z`u1lS5CzOL3;5|arURSre&-&lQ)BFH@8zPA0ouhT-~7RMxZ>KI*)_VJ6X#xKY;lIl zSdmYC;j`GS1$t8&&;IIZ9{J_d{Q2kpgxSM~`KK>@jemRNS;k6Byztm#eEbhT!`)Zi z%s0OCAJoTIC|Mp_+G1X)p|8u)zoC!gZ@ff%TIHX=@infw`cmHa&JPoK3-k>n*t&fL z)2WkhPx9!~zhwKa&9ran=3RGvkVhYVnga)(;+ku=F*R|NsWX%K%@9>hGCHz_o}PYA zojA_)^f=QK)0p*;M}PJ(zUVSAvW}jiwdn16GCe)S^I1YwK{5o3_sDji4FWwMDhNi~gKGpWp-Vqj|r zf$ULhDd1&r6`y!V9!b$C6$%Uw4>LJ2K}!g!1ulA3!x8JO-_gh9*l9}RMOw>E>Wvx; z#d&P2j@xuG)D(IwPAK?@AxIw3^vR}kn6^#BY~hKZ#&kTU4XVWgrNu>- zCZ;KjPb1VVdSYoLQ6+3SgtklQ`v{(o90VAlL`)P}vu-VdDByb0dzEe57vzi(z32MA zk6{=%PK4u)#bP*4WQ(^P7q?nR4nh=N!U=3_$HudwOO@c*s~2N&6+|Me0+piFm+Jbz z>Gg@fS=5~0(Ad6>s%qG^I)NY{_3YaF6-5RSn=>bm(ls>1>nh-aSm}3I`955r!%3mP$fR<25ZZs!CiG@g?=b^*|KPTZkhHRwQi#MXuA9vDvsz zM{^6f%L^pUfTiPSQBw)LriItC@w|{kB1vaw7mA`#tyXbs7BUj9<>I&=wMK)6)gqKc zYGxfx(l1ERoYmj+Ji)}a?T9wwN3tkYRU%np;3KWlPw=D5iL@F)h@>_lq8yP=bhm@q zQ{yBr*~vv)H?uyS#hP5;)X8z$MmFF-^8oL-=K;R{$#<~5`4bL&@7sLgjY)oa&jXA| zF`hX$#_Z2N%L6?LD(`(akH34ATX$$YV;UU)@e`DU2C^Zc#|>=9B?u&RHBF(=pi=gj z>&sK=i!=!X29jSnrm}+2?5Qs*-Alpz879Ki!AD zb}OPNlT2qw#FM=C+AEQ-CJ|$4VII-wBW}d;S|tp_#SB(>{~vsSb-ULS8*Jm;@(ROa zuk*h@{W)Gbbbz;SG#Juic!NV2m+G{iv^aD8BthC>p;;ilv7g)SyoJ8D3~|e0;ekV3 zzkUPzh6j1>r$6F%Z@dL_Y>taEeb{4j{Qd2__{7`p8e*Mc|VHi2;uE?@uQydz&)XU3?cup^-9!KAdhWRGHXeTENfuR; z+pf5orKM$-mkLO-N+y%T^gKdIVtHkS(RFJ%{Q4VAy!r-?<1sKWK)F)E4Sn+MZCrls z6%>o}5VmO6i>w{(XTzou&WxYN4IKK1w$f}hsg?_bfrIC|EESe0mdYTAw54;Xs)}iv z7nTd>zf9A_h-nDt!@0g6^*3A(-*ND4o0b(_IBn0x^Fsn5M35pWZ76~sL>CP&3mB1I<>Dt(jW1A%8kS;@H&!!>#r5S$y&3~kP<~W1vhKLy*{Pf{B`Q=M< zXakqBZpW3}c*`vudi4McM;og-WC0-z@xvgBmW4rd;R&Tx$B=_hz)d&ZND%r|>vfv7 z3bLgA)&O$;f)d51L{vFI(POx-7ty~w2Sk}zz8fW(!znJ2?d-t{1RBjcniL|1QEW+% z$MAg(SyK^2fn*|%>A2)lX$Ts@NJNxW zRTax_q4)_BdVp_N@tZa{VAd8%CQ6J9E8P2|!)Ut3^7K423-gG&j?vjgs}fy)JXK+2 zWQ6YSZY;~9(P$vAX8p}t4Iz{u2(fLGMzxCBYDK1cNkS3@oR&>G8}&E4)()V@;xrbQ zNu@KmwgZkwv(-Y08*~n=L5OJ->J?luq){m$wmbw$BHPhMTTd63@8O3*lzyny>FMvp z7Xn(2&BAhlxy1$CYK6Y-+o?3_$h8`#XK{G^G*!{TlHl$;?&9~}{z1Z%MT(2ZD9ujM z7LVhKA)B^uCvIe!KQ=?2H2t$7$7dWC@=3;L&#-UXFhBgoubHn*v3WS)hC!L*VwE2s zIY?Mmi7$lw?nge#wrHjXfR%;bfK&#*G7;l&vhi>#m_BH#oCc;Mn9OvCbSV!9&gE&~x2P zFI31UMfU8wiZ$y;@HLfKTaI)-kDw?>n#O2%53fJ`2o2BW&p!XB{Nm^TNo8)1wL>G^ zblr6-A@8Oa?yGV89Sgw{?-?^5f&%Z#+ z2gmj4?(L;vH%Mg?EEVSQpF2mppmWtFyO};a&WS^Z(JY_Jxfu-8XI^cg40O@8d6e8> zA9^~4C`vdji^@s~x7?y$u3$DA1dfB?xP+z+rb*DUnJ6vMsMQGl5J{Fv#1h0)X;j^a zU{9-yf_OZR<2V;CAFWo4Fbt6;8C;jRrl1=-cIe`|7NPGWdI5s#B8d`6Vl>pOcHjh} zMThD}%k^NDN_T$v2v?tVjdYA=D>^h-rj0aw&FxT<@d?_~N#eRjp|C{0Ezi=}X_C5tELpU7q!^!>z^u3M)dX^; z7eSV3SvH6Ysw5!!E}~-+wyGp$fw|%m$<8(!D+Rg}ah!UMzz@lG_7WON)J-Wq`o8P9 zaji;z<_+GzYZRw8Pelt^FkmU$Lo+F1$pNptdW4OewsGY3=g4=i<*A3JDeH@T>hccq z9R^oz9K!pTuW-rMAu5`}55MsTeB;N*SU0elLZOVFG^p8CLe)n}8B|*)N=#Wb4GV;U z2%!|k($JC6X||sxlQysx1WvwGVd`9rfBn`&9Fmh*n@5?PJi&NziNUQG(GYwrSt8k< zV`g!lY-c+yyMe4gK9^*vw1lk&_<~D1nIayF7^;is)v(PH1T7>fKo&)0K|xmx>`;t0 zow5i)fMYpGvW5}Q;Gu%;V>%w8rl7_(Bq2n0ee`AvrP@RiwjyzYigkz`JJ--PJVLCm zoywU4N1q=jTa_3tEbyLpzKzfS&u{bf2VdsN|F5d^j*|1P@AdQc>2-V6Y9+0jC0Uka zTav4aZCo%0OveNp2q9buC6o(+BoIPkk_$Nr0doli8!#>y+~nTWds}H&+xza!?DY2b z`^UR7xqr;rbLO1=W9FRso%j3weLm0g*dv_l|2=v45>1s3{w8PAbL};J&L@+s+4NWP ztXLN1^=Doo7+Ha%yI7`$B7-PdUY=A{NW{Vf9i8If2-h#`<1cU7&1;W6%I80I6L;Nq z4L;H3;p3xh?^wkrfA>8OhjreqZa^5Wa=cll?Y3>)yTMOa(xRa!LQXX)&ZQ_E8^kY) z6e9v5u|h>p5owI$S|Ms9S#~t2{N1fFKD2Iv8MTw2|Ko4ThihEXc`d_l46tlVn3=(S z_$TX}9L%EIT_jo?Y3yv|?pr=ic4maeSb?$ran6s7vTS=FYJ*6ky@BH|A7%fOZ_>SH zEhBP~)h7pd;>SPdT{myTCk*n9ukS{dCOCKIEZ1zmo&J=LG?PJ6YYcwxNA#6koOpsy z-2DK;)~gs7vRtf`zWTS zaQrbOpGM6z5oHN2;P*NMu7%^+q|Fi?oiWlUW_bA5XSwB@pXGgjyOZ@dHS+jl&$30G zpPuC>hLHki@DDl;s9qf1{tFV?(U=#ksky zhwH36$0yF{+qvYyuDa-M&F3bU+3B91N!XyFi<#XM+1EI}ez z$}lrD%H(W{nyzD&@=&iLi+(I8fD#aqG#Npba6A9PJne$ZV7g*QROLJ=ni|IU~=tGG&p-01nIy=c-7$#}TtW-39`{RG* z^syIF@-CuTWid6*2X4Qe;-y*UP7h&~bJU$Im&{Rq`0X$7;a~lh-_PWkd+vGq)p=LP^IMnx}8ib^PbVL4Ntq2id;m{p{}EMrP~+j~{s& zAr|AFcf5z==MVGr(?dLa=rp0GIG?-kF1~s1yO}tCkyzt8PGoW{+_0YO+By-}HSxx= zGaPvEX}#stq4}0uxG@~!rkmH%Ge5(Q#yF?VS+n`&LCs_(iV1 z;tG;cADQALId_rR>K?LMfNEhi$Num-5y2$9Ji+e0d%5t^VQjrbK91V1P0b089(aR^3m0e&#wpL{D9bWoIY_7} z$lUBa>*YRv_rw8M*T>Eqw;^V0OplHci3aIivx@ntajaMrEC;!%4SQ~Y9oMz7x*^8F zCkL^!QDTD4S~b8G^=^h5H0EUJF@Z-FBTAUF=LWg)m;(x_tS*h}dc*#XgZ5p5UA@x-sSasf?HsO8EyRUN5s+jZYI zN(DONVQ#u+Gc$!MJ~fQ0`MEGMMAbDZ>UA&6i;JVqAxb*^7tb-XkfCgdgp*w)n|kqS zjkxtZv2dJdFhR9sU|QaoWZ4eMWFw_=jdDH@u0yF*Bp#202o+t&76cqqN6|DE(hHQU zHB8$f+|Y^^h~lCm$|ANP<2VAA13q7XU@(MfnxxYinpQ5SS}0IoOcRL&$rW?d3pt2| zxN_?jBqlg<_z=URX^x*?;Dy5j95^?KX}z5yn2Cuc<2S%H*F)?&_pJaM^@A&I*Hd; zsa4CUer*Yz=pwk@mGW;?OeBV zGbdj@Kx;6GTeV3~&Cr-guyylQj7^N7iW2oom1JWh;bekRHjmFAB0VvU7WUyRnQjHi z;}_Vri>{m0YIS0bF~9=X#x`~8^(qJwlA?MOG!8a4f-K;=4u(+&%f>Yy_f#N zJZDZE=AKV}f_1&?dE<|7vU$x)KKaMr@ZEbq&7G4O_DvkX*|CZ10&VOR>%_+k)bnLp z%mCY*X3m^E&-qJ-2y9$S_pHvcNRsk=ntW!FU^qrybUAYI2*bHyR&QC$?G0Nv+uFiw z|MDW0M3v*)mF77B02p0KL_t)^3TGZ3;`oab^fok6?})HaDpU2P*>TqvUO99aF|2d- z?hU+t@EpRz2%r1%XF2`)3Eq745Y1a|puf$>iT(q;H{QqtBd55OXyi<;#_xajA{9+z z?=2tUu}9t@*145si6R$Hy~UQlynz#4Z5**%Se!FB`Q%Tz@7)sr{H4F)`tN*l5x9UEwltV0-pG6j@C1j_=w?hpxu@oNsQo8qabenHu(GI-$(j^mI>G!gWN zx!6C%=+G3lsnPAru~3xw?dwCFxG;gNr>UjJ$dqidY8Q(WQ^=BxDtQ<|Mf7m50-&iX zs}dnD9e9~_tHPwF&Tz+#%kVpMy!qS_j=wm8+}DfqOo{4n7jxxy=Jt)y8tvwRAO9O$ zKYu?T-}`5Lv7?i_Z@Gb2es_WA4j*UPN88xGCc=LmJj{(NHgV@W_EIWjXlsno)6vGz z@E|3t%4BYib*p+v<;&QPid}WcOs84Q<_I=4uyMyVq^3qW|Kfgv&7H{938_Uy!RC$E z254&C$XsfIk%NZ__N<_zqm!1lR`S(69X;*nR*k7kldRvlldjHgUf%Zt?cF^zH#V~{ zJBMKy)LolpE7uT6HqfwQjYnIPR8pxdlBAJO&Ewb}*u#|-ni`r2hk^tH8n#`W{U5RhcgSZ)}mXJEHI2u6Iq zg1(Svc6^-4*-_-UOW(E2u^UXDJNp8^eQJ`@rdug=^if;Z$d3DOW7REd@b$<%@HY>T zbA6ngnr5z8MDAIE+tkeYbcWN@)67~9qU=Ky#J6L)-Wlw^jn_3y3mlKo<=7qu)2Qnh zx_4WwES11n>X3LKFM*|mGxd7K>(!_lnxatGO$ zT^&)xv}?$=f+oo%8e$~7n+QdGEY8hw`sgV#GY*R8qq!mJVeJJOQB+vjyP7p?H!yr` zKiBNNjjh+;Oub%bF*QRt7{nJ0Q!bPcIMzUQL2hdGwg%Tk} z!>ZIM74n#p05UkTM8&d56$|JHM3M>W#R4_GhU=OH13{=%Id|p^lj#LQ&5ca^{lq)l z7(I8M{fAC5o2g&~LR@q2?aZh;>o@OZa$O^LXAbhY+m_LJ&u94T9bY4{yq*40KeNSt zUOYLqVX!J<1;rzQSKV@M$);_A)mzNyVsh z)dy~*{o2+1=ExEL^VwH8aBh(O7f&NeMZWp@5Ag8r`&oU{Mt*(hWp-@b%C#SVFNJEJ z$G-6(!+jleB$km+WjOu%0erH8^v)fe9Js_?zCPsME^>8^=Z_p?|Issy45p||iBtwn z_N=&`L`LK%Pd|#D1gXtOOKXgi=Z;{t1^LKdeS&i*k8<6rb!_chOo)bFH<+w#=%G3}PkwL=Ay>w=OzQas3Sozy_wFI4G_hz^=x%IAFI3n+be=oj_db?4 zwo?RVvS|w03~R1f&!vk4tX{hjzbLbE)f!~Sg`qh<_rD+D`BMiO8_uCN_E4%WFrFFa zV$4T-$v`UWY~Okfkx-cN*=b6mO|Y|>g<1hol+l(f;Vw|FSIL!%l=K=k%b;*^2+bcL z9u8qv>nu#op&+rMvzJ&Pf=`mjWf#%)I+7+M`X%ry)FcPfHMshQZ9MSN`x!kyz=^kx zqStL&T058?o?!dtt!QC^UAy-3&O7eJFkohS7R&M|gu!r#nps1ZrMJ&tQSva|wrwwA zaus}<25-BYmI~#L<53M&+3WZsATEK4SR%ICj)UV^O8}+Iu`Bog`ztJUhb2k!>IIkS zs!LHVO_2y`0Tc%u-SP$y%@*irjM3NG%wVoYsaU2|E+A+EZM|Joj4I)fN-UxvsTqP% zA0yK<5Qt+bF_059HTDn-BrxiWD2kt2#UwSC#qSH_4}=j!6-n`XQBEPtZDS+VE z_*4bU&@n8X_BDM3l3@agD6?lzapk71^lsRU+|-B@4zq6KCazf7NB^Odtguu@-a1bH z;yCU?fzr?{N>wCvc7)qD?cj4Cii5A4@#*s<8iTA_`%zwe;t)^ldy(b0e-&TQM3Piy zX6KP*)r);OUZ(<4K$b+$&E>iXm+@swgc$@E%MK82ZoyF%TH9M#m5g&uG{NgX_&>b* z;17BA!YCtyBOEz$oKPf=A-K$BGqkQ)hNZadx^5@O4jrMTv4y$$42~qTY}IO}hR2A< zlhlklmTlqSyp2v&R24;0QB{p_GJs>(5d|Aja6D9+;>ipx+XlOgiwS~*Wg9rQjbG6a z9g%9K##h2keDm+W#~+$5amCaW+j_Tf^yY1>&I#OCtnu`8387S_JU`D>@7>JW5 z&b>ric!50$gVfPuj2=G?!}Dy6wo$O^eC4&rc%xQebUuw{$=H?wf`y3dp+t4lLpD1O z3n3G5*mdoVq%TZRD%H6EFaCm`J@-eRI)93NM=V-yyMof$QOxRcHh=WXw8>?b7X)6f zhWXaK#2fK;zCS!pY0Y{@P7hN(KSzt}Flf&)o}H(X2oPv*1W~|;OahH=e+%Jig!>-; z0SCXokLSimiI(bIDYbJjWe~14(02V!niDk!&R*c%@88Ml)d`O6KS41&&6<^6xb-Oa zuG_+{6>AwvPx3;3fX#Q`!EFuesSM6AD4QswGwj;1kx$?MAx85T`Pc7%hvm&p?0e!5 zM1i%^Y}KC{%UI%Nt0U zIdW2gj4+O3Cs4G2cRQi^P(%TNDutN|9{BTjQM8H_@>#qcfZ3w-5d!7e~f8G;0&td>48x&Azn3xpR}e2_- z`^Uc~p-(U;I6U;mt33L(ui%sy*l^$bN!0ypDCz9pbvIA{;rFC7^TfhIW~U};Xi6Z3 zG!pF%EX*uYsaa%mWhO37qDg+%U3nF;j&>?Q>QX#0_UXm8P|<^7~nK_+H% z%ue(U_x%}fy!96OVjd-+Fg7!S;pns{mt&d^r%#`zT&?0$RWkDn6!UpPem}m3 zR(jT~W3f^p6pNEu%u%h>u?(A#KTOQ$l3tj{tXo7vQ6k|mGt*<#YdNA(k+o}A(bm`m zj!kARg{jv`HZ~Cm1j%J{_yc}aO(EITfU0U_b44u6#n3&xw1tg>izq2*njb~=A&4@r zD=ZBkmj!szl83@wdU=I))gQ!hTrYMbOWuRE<9I?tQ9!UP98pA6Jok%bIZNFE5!YHKA77w}WTXYZ8pAPEL@`7>(zFy;@&sw(T?Z?|+*@D2k#-6I_A? z_yfVW`*@de%A)AS9lXKE#4v3X)rZd?K)^+GLByd}Eu#e@Sf-BPdL&5GG?y^;UfJKS z7$}a2COW7-0av!sYX79ijJjQq-W<5T$6ZHJ5}2yy_m+( zt2mZH-LP@h0FvNICSAt?*Y!;8isF4HyvUp15ePaWMy`x1%hW83ja#>o&gRI?FA$AJ z35Uak8X7R_I_0TJ)JOzbQE+PpiYpKcgeYh8gf&0aY~I_l+Ac;wAs7u4YfPerLR5@8 zX4P|Vl`RvgQbv+os<}LxAR)R?(hbx^jI!&}8Ck~YvBNapxSg#Zd@qGah-`L|>A4w_ zib7AKm#x=r<8S}sBfNLhI{v$ViouyhRun-}z1*a>bKi$P%<50v z&fdTIGuCWaPAI*IX=OR~;+rhwOMK(Q56~M{dH(PVeC+Gr;^B#TI!=tSbL%y{*{5>w z%o#q}xsz%jNLp2S*Qy=-U}S>hscA-PSr!TM@FTA?S`2bzV3^;$@D%UgyNz8Rx{ZbM z9O<)XxO4Z7Ty@(H{_w=3+}yg1J=b2(ZytJxC;#hLIOQ7Y`4o%gBHddzv;KzdR8otG zwoPx(a>~U53-c*(1nO0T&aP!75;Z0l^UN1quHE@g644GWo;!nXr|IsEa_;mPnW<@l zwn%1jlDb)?Z})X{-nfO>s!o*t9Gl;LD{iSyHIt+B9oI89Ho+CKE{;qNV}%sjdwPfm zBa9q9MRq>ThQ77fwK|su`ibtjl9|*X7ml1ojjh5+Hqf-)N@cNtWVpoCAce6>Dy0g7 z&t>3jKSvLpV0?5Oy>1YRC8$;^h?+v(^hAM*svt@tw&P;ij@Q=^B}@T)s_MmVO%GBb zO43psRzOl^48!z>4pH)`fUdU~F>M>swciFzc)#-{7l^xr+;x`Rc9%gNmz@qv=T|kI z#&Ja?S3q__T7K=GZ%aNO7Ij7@FEKHbCMY=sRg+|6h>q?yhDZ8Y-P24dGs4__id>;i zw&v2d@(QAjZ8(ldDZ7YMs~{;Z0e_fkvCjO|0-GK*CjpewPG;F{(9>%+h2+;bxwJ28s7^%|PiUQazYhHhA- z7E<_C72C9NT?@x`@%jA-wkPltT$VOo9tU3#y<%jgK0vNGfi6@iOFF|dmuUUqt+=;t z;ivga%nnQuUe-b9rVSh&9b)Z{t0~Gh(+g9SWrsc6wjsL$iwilT@g%4|a)lDjjV&0} z8U|oG9`e_6ED!_~S;nV%cw|ecV_Q0k3_eXpmPHg*MO?z9DncDW5s($xGg%5E{(v6@ zfm)@^zJV0q*t3fFMG8DPdzgGv3lClW9_9}m6e+cNBE_36E7}6y!~n}9-m>-7RYtBv18j_&i(pT7P47yo4O=JtJSL1>UCT} zK=o=>>X15|;+fG2TCf=!;TtRibs5h@=vbR8pg()C7SW?!FtTZ5iMG zhkvK#$}6#rStgDg<>f;o%pAVNr$4rbWuMx`_|ZHEe)Ti%d*{7u?rr4WTW?@f+a}Jw zzMq|IH!^i>k^bME;7h;!7na?#f*sqIvpJUJcaJ{9>45^Z#TcoP)7-Ur8+SIX;N%Z~ z$-t8@@ZUfF89i5B!9aDM<%8$BZFLuS_FhHHC%?q^AHKj_pL-Z-{1`7h{=X=$*~4G$ zf0DL$u0}lE zj8BbF%-1Mp3k0Jv;>kv4%5|J_g)6(4lg(Sab}2(47^PmEN1Q#!;KeGza0FSDsMl&( zmgPy0mN25>@LCG#GFE#B7d3c%=n`YPpYE<}m^n8~mn%`o*c9Sv-tqnbU%%%juKD5z z_@|flF@5MDyPLB-?boqUxiGq)wT(%>cGs7A>clzjS-**wPM_oWnNwW7b2}?~S8?$5 zw-7BDA0H(nzvGvb~*5rOM#=IDul0Tld^Y|G-5ei30cDa|eHX z>?}h=b>yIrT5*E!{M~nu6(5HVA0ye)$hPgDdXL~z- zO(UC5A%?>E{odjt=<^}D4tBLlEtjQUEKtnPW1AKY4NXXbM6sBsoSkO?$S+| zh+{kGQk6<6N7>a;RFPV-M0$FTxv@EBhG%JAe zQzRMNad8b1(YCRT3gyZoxniD5RY!3nMATMt#YHR}ECDLz3Q{0|Aj!D4OD>g0l5D0j zIc7#DC>wRcAsVydYyW`MqAloer^UkjXm~ zv~UQ)^?FRzauvsgrq(vvx;lvlgVb^vL1o@5(X)>~o6gYl2l&eEA7*)XFaJJx7(<6!+)f@net@x8N4b5&I)3!&uhG}p$K#Lg=Y|{Z zpksAAtG2XrLsJ9Y&CS@^A|KduCk;xFkrU^TrWf(g7I^T{hw1HEL9J{sH9pI(y|=S^ z;})zyh~pP8F*iIzwPrCfIfrgQ&4PTzAlcG^BdE|8pq8rRrt0)`bz{b5hUYJl8XjTp zt<&hOEx3wAA)iKy2l@N&eTR3w^G=Sx{syIyDV&1KRXeZcu}2=E@9J%A-Fq{G=LgBp zWhfMjbg%4TZe*PNOq$ipS2Hs@hU(Wicm4zo%i0Jgf{e&%?*0BZx$T3WB3QJUKXn8l zs8H`-hSuUkZEvD%=~TzYsMJgvWItl2M7KZALZyf*$*78oYdh4dRm#O8mTn*+P%D+F zR4RZ#C=x*w74pRr#Zn1JlBm^-gyK;e8j|>ZDmD(urY8DU_TmfpS>4*fspDq|Xg=DS z+i`6dU9Z#H)kUdPqHB2?ovfp+*T|OTj o;ZHXpk)}ps$posVQ8#P+KkgZ6{K_-`2mk;807*qoM6N<$g56I(ZU6uP literal 0 HcmV?d00001 diff --git a/webskins/forest/pub/forest.css b/webskins/forest/pub/forest.css new file mode 100644 index 00000000..552d6ae2 --- /dev/null +++ b/webskins/forest/pub/forest.css @@ -0,0 +1,21 @@ +table.section thead td, +table.data thead td { + background-color: #049712; +} + +table.data thead td { + background-color: #007700; +} + +#banner { + background-image: url('forest-header.png'); +} + +#menu .item.active { + background-color: #049712; + font-weight: bold; +} + +#footerbar { + background-color: #049712; +} diff --git a/webskins/forest/tmpl/FooterTag.tmpl b/webskins/forest/tmpl/FooterTag.tmpl new file mode 100644 index 00000000..38cd1c09 --- /dev/null +++ b/webskins/forest/tmpl/FooterTag.tmpl @@ -0,0 +1 @@ + ZNC "forest" Web Skin - based on "dark-clouds" by David Precious diff --git a/webskins/forest/tmpl/Header.tmpl b/webskins/forest/tmpl/Header.tmpl new file mode 100644 index 00000000..94e4975e --- /dev/null +++ b/webskins/forest/tmpl/Header.tmpl @@ -0,0 +1,2 @@ + + diff --git a/znc.cpp b/znc.cpp index b046dafc..fd5b5cbf 100644 --- a/znc.cpp +++ b/znc.cpp @@ -575,6 +575,11 @@ bool CZNC::WriteConfig() { if (!m_sPidFile.empty()) { m_LockFile.Write("PidFile = " + m_sPidFile.FirstLine() + "\n"); } + + if (!m_sSkinName.empty()) { + m_LockFile.Write("Skin = " + m_sSkinName.FirstLine() + "\n"); + } + if (!m_sStatusPrefix.empty()) { m_LockFile.Write("StatusPrefix = " + m_sStatusPrefix.FirstLine() + "\n"); } @@ -1418,6 +1423,9 @@ bool CZNC::DoRehash(CString& sError) } else if (sName.Equals("MaxJoins")) { pUser->SetMaxJoins(sValue.ToUInt()); continue; + } else if (sName.Equals("Skin")) { + pUser->SetSkinName(sValue); + continue; } else if (sName.Equals("LoadModule")) { CString sModName = sValue.Token(0); CUtils::PrintAction("Loading Module [" + sModName + "]"); @@ -1570,6 +1578,9 @@ bool CZNC::DoRehash(CString& sError) } else if (sName.Equals("PidFile")) { m_sPidFile = sValue; continue; + } else if (sName.Equals("Skin")) { + SetSkinName(sValue); + continue; } else if (sName.Equals("StatusPrefix")) { m_sStatusPrefix = sValue; continue; @@ -1751,6 +1762,24 @@ void CZNC::Broadcast(const CString& sMessage, bool bAdminOnly, } } +CModule* CZNC::FindModule(const CString& sModName, const CString& sUsername) { + if (sUsername.empty()) { + return CZNC::Get().GetModules().FindModule(sModName); + } + + CUser* pUser = FindUser(sUsername); + + return (!pUser) ? NULL : pUser->GetModules().FindModule(sModName); +} + +CModule* CZNC::FindModule(const CString& sModName, CUser* pUser) { + if (pUser) { + return pUser->GetModules().FindModule(sModName); + } + + return CZNC::Get().GetModules().FindModule(sModName); +} + CUser* CZNC::FindUser(const CString& sUsername) { map::iterator it = m_msUsers.find(sUsername); diff --git a/znc.h b/znc.h index c5bd934f..ef4f81c7 100644 --- a/znc.h +++ b/znc.h @@ -82,6 +82,7 @@ public: // Setters void SetConfigState(enum ConfigState e) { m_eConfigState = e; } + void SetSkinName(const CString& s) { m_sSkinName = s; } void SetStatusPrefix(const CString& s) { m_sStatusPrefix = (s.empty()) ? "*" : s; } void SetISpoofFile(const CString& s) { m_sISpoofFile = s; } void SetISpoofFormat(const CString& s) { m_sISpoofFormat = (s.empty()) ? "global { reply \"%\" }" : s; } @@ -95,6 +96,7 @@ public: CGlobalModules& GetModules() { return *m_pModules; } size_t FilterUncommonModules(set& ssModules); #endif + CString GetSkinName() const { return m_sSkinName; } const CString& GetStatusPrefix() const { return m_sStatusPrefix; } const CString& GetCurPath() const { if (!CFile::Exists(m_sCurPath)) { CDir::MakeDir(m_sCurPath); } return m_sCurPath; } const CString& GetHomePath() const { if (!CFile::Exists(m_sHomePath)) { CDir::MakeDir(m_sHomePath); } return m_sHomePath; } @@ -115,6 +117,8 @@ public: // Static allocator static CZNC& Get(); CUser* FindUser(const CString& sUsername); + CModule* FindModule(const CString& sModName, const CString& sUsername); + CModule* FindModule(const CString& sModName, CUser* pUser); bool DeleteUser(const CString& sUsername); bool AddUser(CUser* pUser, CString& sErrorRet); const map & GetUserMap() const { return(m_msUsers); } @@ -154,6 +158,7 @@ protected: CString m_sZNCPath; CString m_sConfigFile; + CString m_sSkinName; CString m_sStatusPrefix; CString m_sISpoofFile; CString m_sOrigISpoof; @@ -263,7 +268,7 @@ protected: bool m_bIPV6; unsigned short m_uPort; CString m_sBindHost; - CRealListener* m_pListener; + CRealListener* m_pListener; }; #endif // !_ZNC_H