diff --git a/include/znc/Utils.h b/include/znc/Utils.h index bda9f480..4d467205 100644 --- a/include/znc/Utils.h +++ b/include/znc/Utils.h @@ -75,6 +75,7 @@ public: static CString CTime(time_t t, const CString& sTZ); static CString FormatTime(time_t t, const CString& sFormat, const CString& sTZ); + static SCString GetTimezones(); private: protected: diff --git a/modules/data/webadmin/tmpl/add_edit_user.tmpl b/modules/data/webadmin/tmpl/add_edit_user.tmpl index c5920a64..115f9f82 100644 --- a/modules/data/webadmin/tmpl/add_edit_user.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_user.tmpl @@ -213,11 +213,18 @@
Timestamp Format:
-
+
Timezone:
-
+
+ + + + +
Join Tries:
diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 814eb783..ab7e2959 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -945,6 +945,12 @@ public: Tmpl["StatusPrefix"] = "*"; } + SCString ssTimezones = CUtils::GetTimezones(); + for (SCString::iterator i = ssTimezones.begin(); i != ssTimezones.end(); ++i) { + CTemplate& l = Tmpl.AddRow("TZLoop"); + l["TZ"] = *i; + } + // To change BindHosts be admin or don't have DenySetBindHost if (spSession->IsAdmin() || !spSession->GetUser()->DenySetBindHost()) { const VCString& vsBindHosts = CZNC::Get().GetBindHosts(); diff --git a/src/Utils.cpp b/src/Utils.cpp index 4e39774b..d6441490 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #ifdef HAVE_LIBSSL #include @@ -397,6 +398,35 @@ CString CUtils::FormatTime(time_t t, const CString& sFormat, const CString& sTZ) return s; } +namespace { + void FillTimezones(const CString& sPath, SCString& result, const CString& sPrefix) { + CDir Dir; + Dir.Fill(sPath); + for (unsigned int a = 0; a < Dir.size(); ++a) { + CFile& File = *Dir[a]; + CString sName = File.GetShortName(); + CString sFile = File.GetLongName(); + if (sName == "posix" || sName == "right") continue; // these 2 dirs contain the same filenames + if (sName.Right(4) == ".tab" || sName == "posixrules" || sName == "localtime") continue; + if (File.IsDir()) { + if (sName == "Etc") { + FillTimezones(sFile, result, sPrefix); + } else { + FillTimezones(sFile, result, sPrefix + sName + "/"); + } + } else { + result.insert(sPrefix + sName); + } + } + } +} + +SCString CUtils::GetTimezones() { + SCString result; + FillTimezones("/usr/share/zoneinfo", result, ""); + return result; +} + bool CTable::AddColumn(const CString& sName) { for (unsigned int a = 0; a < m_vsHeaders.size(); a++) { if (m_vsHeaders[a].Equals(sName)) {