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 @@
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)) {