diff --git a/.gitignore b/.gitignore index 55d4dcd..6c6cf0d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ bundles/* # IGNORE OSX FINDER FILES **.DS_Store + +# IGNORE GOLAND IDE DIRECTORY +.idea/ diff --git a/pkg/api/bundle/create.go b/pkg/api/bundle/create.go index 59d7f0c..e22df98 100644 --- a/pkg/api/bundle/create.go +++ b/pkg/api/bundle/create.go @@ -104,8 +104,9 @@ func Create(res http.ResponseWriter, req *http.Request, logger *log.Logger, bund } var defaultBundleUser database.Struct_Users + var tempPass = encryption.RandomString(16) - defaultBundleUser.Pass, err = encryption.HashPassword("root") + defaultBundleUser.Pass, err = encryption.HashPassword(tempPass) if err != nil { logger.Println(req.URL.Path + "::" + err.Error()) http.Error(res, err.Error(), http.StatusInternalServerError) @@ -135,6 +136,7 @@ func Create(res http.ResponseWriter, req *http.Request, logger *log.Logger, bund defer ds.Close() var smtpSettings database.Struct_SMTP + var adminSettings database.Struct_Admin err = ds.Get(database.BUCKET_GENERAL, []byte("smtp"), &smtpSettings) if err != nil { @@ -143,6 +145,13 @@ func Create(res http.ResponseWriter, req *http.Request, logger *log.Logger, bund return false } + err = ds.Get(database.BUCKET_GENERAL, []byte("admin"), &adminSettings) + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + mail, err := emailer.New(smtpSettings.Type, emailer.Credentials{ Username: smtpSettings.Username, Password: smtpSettings.Password, @@ -159,7 +168,9 @@ func Create(res http.ResponseWriter, req *http.Request, logger *log.Logger, bund "Account Port: " + strconv.Itoa(createBundleRequestData.AccPort) + "\r\n" + "Public Port: " + strconv.Itoa(createBundleRequestData.PubPort) + "\r\n\n" + "Default account username: root\r\n" + - "Default account password: root") + "Default account password: " + tempPass + "\r\n\n" + + "Any questions, comments, or concerns can be directed toward your server administrator " + adminSettings.Name + + " at " + adminSettings.Email) err = mail.SendSimple(createBundleRequestData.Email, "New gPanel Bundle - "+createBundleRequestData.Name, msg) if err != nil { @@ -168,6 +179,13 @@ func Create(res http.ResponseWriter, req *http.Request, logger *log.Logger, bund return false } + err = mail.SendSimple(adminSettings.Email, "New gPanel Bundle - "+createBundleRequestData.Name, msg) + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + res.WriteHeader(http.StatusOK) res.Write([]byte(createBundleRequestData.Name)) diff --git a/pkg/api/settings/get_admin.go b/pkg/api/settings/get_admin.go new file mode 100644 index 0000000..5d78ff1 --- /dev/null +++ b/pkg/api/settings/get_admin.go @@ -0,0 +1,45 @@ +package settings + +import ( + "net/http" + "strconv" + "log" + "github.com/Ennovar/gPanel/pkg/database" + "encoding/json" +) + +func GetAdmin(res http.ResponseWriter, req *http.Request, logger *log.Logger, dir string) bool { + if req.Method != "GET" { + logger.Println(req.URL.Path + "::" + req.Method + "::" + strconv.Itoa(http.StatusMethodNotAllowed) + "::" + http.StatusText(http.StatusMethodNotAllowed)) + http.Error(res, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return false + } + + ds, err := database.Open(dir + database.DB_SETTINGS) + if err != nil || ds == nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + defer ds.Close() + + var adminSettings database.Struct_Admin + + err = ds.Get(database.BUCKET_GENERAL, []byte("admin"), &adminSettings) + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + + b, err := json.Marshal(adminSettings) + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + + res.WriteHeader(http.StatusOK) + res.Write(b) + return true +} diff --git a/pkg/api/email/get_smtp.go b/pkg/api/settings/get_smtp.go similarity index 98% rename from pkg/api/email/get_smtp.go rename to pkg/api/settings/get_smtp.go index 8944ca6..6748498 100644 --- a/pkg/api/email/get_smtp.go +++ b/pkg/api/settings/get_smtp.go @@ -1,11 +1,10 @@ -package email +package settings import ( - "encoding/json" - "log" "net/http" + "log" "strconv" - + "encoding/json" "github.com/Ennovar/gPanel/pkg/database" ) diff --git a/pkg/api/settings/set_admin.go b/pkg/api/settings/set_admin.go new file mode 100644 index 0000000..4afbc5c --- /dev/null +++ b/pkg/api/settings/set_admin.go @@ -0,0 +1,44 @@ +package settings + +import ( + "net/http" + "log" + "strconv" + "github.com/Ennovar/gPanel/pkg/database" + "encoding/json" +) + +func SetAdmin(res http.ResponseWriter, req *http.Request, logger *log.Logger, dir string) bool { + if req.Method != "POST" { + logger.Println(req.URL.Path + "::" + req.Method + "::" + strconv.Itoa(http.StatusMethodNotAllowed) + "::" + http.StatusText(http.StatusMethodNotAllowed)) + http.Error(res, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return false + } + + var adminSettingsRequestData database.Struct_Admin + + err := json.NewDecoder(req.Body).Decode(&adminSettingsRequestData) + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusBadRequest) + return false + } + + ds, err := database.Open(dir + database.DB_SETTINGS) + if err != nil || ds == nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + defer ds.Close() + + err = ds.Put(database.BUCKET_GENERAL, []byte("admin"), adminSettingsRequestData) + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + + res.WriteHeader(http.StatusNoContent) + return true +} \ No newline at end of file diff --git a/pkg/api/email/set_smtp.go b/pkg/api/settings/set_smtp.go similarity index 99% rename from pkg/api/email/set_smtp.go rename to pkg/api/settings/set_smtp.go index 31e877a..2456af0 100644 --- a/pkg/api/email/set_smtp.go +++ b/pkg/api/settings/set_smtp.go @@ -1,13 +1,12 @@ -package email +package settings import ( - "encoding/json" - "log" "net/http" + "log" "strconv" - - "github.com/Ennovar/gPanel/pkg/database" + "encoding/json" "github.com/Ennovar/gPanel/pkg/emailer" + "github.com/Ennovar/gPanel/pkg/database" ) func SetSMTP(res http.ResponseWriter, req *http.Request, logger *log.Logger, dir string) bool { diff --git a/pkg/database/settings.go b/pkg/database/settings.go index f77d8b3..355a6da 100644 --- a/pkg/database/settings.go +++ b/pkg/database/settings.go @@ -7,3 +7,8 @@ type Struct_SMTP struct { Server string `json:"server"` Port int `json:"port"` } + +type Struct_Admin struct { + Name string `json:"name"` + Email string `json:"email"` +} \ No newline at end of file diff --git a/pkg/gpserver/apihandler.go b/pkg/gpserver/apihandler.go index 4b6b965..78cd8b6 100644 --- a/pkg/gpserver/apihandler.go +++ b/pkg/gpserver/apihandler.go @@ -9,10 +9,10 @@ import ( "strings" "github.com/Ennovar/gPanel/pkg/api/bundle" - "github.com/Ennovar/gPanel/pkg/api/email" logapi "github.com/Ennovar/gPanel/pkg/api/log" "github.com/Ennovar/gPanel/pkg/api/server" "github.com/Ennovar/gPanel/pkg/api/user" + "github.com/Ennovar/gPanel/pkg/api/settings" ) func (con *Controller) apiHandler(res http.ResponseWriter, req *http.Request) (bool, bool) { @@ -89,10 +89,14 @@ func (con *Controller) apiHandler(res http.ResponseWriter, req *http.Request) (b return true, logapi.Read(res, req, con.APILogger, con.Directory) case "/log/delete": return true, logapi.Truncate(res, req, con.APILogger, con.Directory) - case "/email/set_smtp": - return true, email.SetSMTP(res, req, con.APILogger, con.Directory) - case "/email/get_smtp": - return true, email.GetSMTP(res, req, con.APILogger, con.Directory) + case "/settings/set_smtp": + return true, settings.SetSMTP(res, req, con.APILogger, con.Directory) + case "/settings/get_smtp": + return true, settings.GetSMTP(res, req, con.APILogger, con.Directory) + case "/settings/set_admin": + return true, settings.SetAdmin(res, req, con.APILogger, con.Directory) + case "/settings/get_admin": + return true, settings.GetAdmin(res, req, con.APILogger, con.Directory) default: return false, false } diff --git a/server/document_root/assets/js/panelHandlers/settings/admin.js b/server/document_root/assets/js/panelHandlers/settings/admin.js new file mode 100644 index 0000000..2a58295 --- /dev/null +++ b/server/document_root/assets/js/panelHandlers/settings/admin.js @@ -0,0 +1,60 @@ +var adminSettingsModal = jQuery('.admin-settings-modal'); + +jQuery('._js_admin-settings').on('click', function(e){ + e.preventDefault(); + + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'api/settings/get_admin', true); + xhr.send(); + + xhr.onloadend = function() { + if(xhr.status == 200) { + var resp = JSON.parse(xhr.response); + + jQuery('#adminName').val(resp["name"]); + jQuery('#adminEmail').val(resp["email"]); + } + adminSettingsModal.modal('show'); + } +}); + +jQuery('._js_admin-settings-form').on('submit', function(e){ + e.preventDefault(); + + var flag = false; + jQuery(this).find('input').each(function(i){ + if(jQuery(this) && jQuery(this).val()) return true; + else { + flag = true; + return false; + } + }); + + if(flag) { + alert('All inputs need to be filled out.'); + return; + } + + var requestData = {}; + requestData["name"] = jQuery(this).find('#adminName').val(); + requestData["email"] = jQuery(this).find('#adminEmail').val(); + + var xhr = new XMLHttpRequest(); + xhr.open(jQuery(this).attr('method'), jQuery(this).attr('action'), true); + xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); + xhr.send(JSON.stringify(requestData)); + + xhr.onloadend = function() { + if(xhr.status == 204) { + alert('Administrator settings successfully set.'); + } + else { + if(xhr.response != undefined && xhr.response.length != 0) { + alert('Error: ' + xhr.response); + } + else { + alert('An error has occurred, refresh and try again. If problem persists please contact your administrator.'); + } + } + } +}); \ No newline at end of file diff --git a/server/document_root/assets/js/panelHandlers/settings/smtp.js b/server/document_root/assets/js/panelHandlers/settings/smtp.js index 9405d5a..66dc66e 100644 --- a/server/document_root/assets/js/panelHandlers/settings/smtp.js +++ b/server/document_root/assets/js/panelHandlers/settings/smtp.js @@ -4,7 +4,7 @@ jQuery('._js_smtp-credentials').on('click', function(e){ e.preventDefault(); var xhr = new XMLHttpRequest(); - xhr.open('GET', 'api/email/get_smtp', true); + xhr.open('GET', 'api/settings/get_smtp', true); xhr.send(); xhr.onloadend = function() { diff --git a/server/document_root/gPanel.html b/server/document_root/gPanel.html index 2335967..dc3c9ac 100644 --- a/server/document_root/gPanel.html +++ b/server/document_root/gPanel.html @@ -295,7 +295,7 @@ + + + + +
@@ -383,6 +417,7 @@
Set or update various settings, such as smtp credentials, that the server uses
+
@@ -436,6 +471,7 @@ +