From bc397002d4b06657881c3ddeee2ef64ecfac188a Mon Sep 17 00:00:00 2001 From: Jochen Munz Date: Sat, 26 Dec 2020 14:58:59 +0100 Subject: [PATCH] Feature: Clone existing user via web admin (#259) UI based cloning of an existing user. The "add user" screen is prepopulated with existing user data. Resolves drakkan/sftpgo#225 --- httpd/web.go | 21 ++++++++++++++++++++- templates/users.html | 13 ++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/httpd/web.go b/httpd/web.go index 0cbf37c6..97722c01 100644 --- a/httpd/web.go +++ b/httpd/web.go @@ -678,7 +678,26 @@ func handleGetWebUsers(w http.ResponseWriter, r *http.Request) { } func handleWebAddUserGet(w http.ResponseWriter, r *http.Request) { - renderAddUserPage(w, dataprovider.User{Status: 1}, "") + if r.URL.Query().Get("cloneFromId") != "" { + id, err := strconv.ParseInt(r.URL.Query().Get("cloneFromId"), 10, 64) + if err != nil { + renderBadRequestPage(w, err) + return + } + user, err := dataprovider.GetUserByID(id) + if err == nil { + user.ID = 0 + user.Username = "" + renderAddUserPage(w, user, "") + } else if _, ok := err.(*dataprovider.RecordNotFoundError); ok { + renderNotFoundPage(w, err) + } else { + renderInternalServerErrorPage(w, err) + } + } else { + user := dataprovider.User{Status: 1} + renderAddUserPage(w, user, "") + } } func handleWebUpdateUserGet(w http.ResponseWriter, r *http.Request) { diff --git a/templates/users.html b/templates/users.html index f990d39a..120723c8 100644 --- a/templates/users.html +++ b/templates/users.html @@ -147,6 +147,16 @@ enabled: false }; + $.fn.dataTable.ext.buttons.clone = { + text: 'Clone', + action: function (e, dt, node, config) { + var userID = dt.row({ selected: true }).data()[0]; + var path = '{{.UserURL}}' + "?cloneFromId=" + userID; + window.location.href = path; + }, + enabled: false + }; + $.fn.dataTable.ext.buttons.delete = { text: 'Delete', action: function (e, dt, node, config) { @@ -212,7 +222,7 @@ "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", select: true, buttons: [ - 'add', 'edit', 'delete', 'quota_scan' + 'add', 'edit', 'clone', 'delete', 'quota_scan' ], "columnDefs": [ { @@ -230,6 +240,7 @@ table.button(1).enable(selectedRows == 1); table.button(2).enable(selectedRows == 1); table.button(3).enable(selectedRows == 1); + table.button(4).enable(selectedRows == 1); }); });