github.com/dzsibi/gophish@v0.7.1-0.20190719042945-1f16c7237d0d/static/js/src/app/users.js (about)

     1  let users = []
     2  
     3  // Save attempts to POST or PUT to /users/
     4  const save = (id) => {
     5      // Validate that the passwords match
     6      if ($("#password").val() !== $("#confirm_password").val()) {
     7          modalError("Passwords must match.")
     8          return
     9      }
    10      let user = {
    11          username: $("#username").val(),
    12          password: $("#password").val(),
    13          role: $("#role").val()
    14      }
    15      // Submit the user
    16      if (id != -1) {
    17          // If we're just editing an existing user,
    18          // we need to PUT /user/:id
    19          user.id = id
    20          api.userId.put(user)
    21              .success(function (data) {
    22                  successFlash(`User ${user.username} updated successfully!`)
    23                  load()
    24                  dismiss()
    25                  $("#modal").modal('hide')
    26              })
    27              .error(function (data) {
    28                  modalError(data.responseJSON.message)
    29              })
    30      } else {
    31          // Else, if this is a new user, POST it
    32          // to /user
    33          api.users.post(user)
    34              .success(function (data) {
    35                  successFlash(`User ${user.username} registered successfully!`)
    36                  load()
    37                  dismiss()
    38                  $("#modal").modal('hide')
    39              })
    40              .error(function (data) {
    41                  modalError(data.responseJSON.message)
    42              })
    43      }
    44  }
    45  
    46  const dismiss = () => {
    47      $("#username").val("")
    48      $("#password").val("")
    49      $("#confirm_password").val("")
    50      $("#role").val("")
    51      $("#modal\\.flashes").empty()
    52  }
    53  
    54  const edit = (id) => {
    55      $("#modalSubmit").unbind('click').click(() => {
    56          save(id)
    57      })
    58      $("#role").select2()
    59      if (id == -1) {
    60          $("#role").val("user")
    61          $("#role").trigger("change")
    62      } else {
    63          api.userId.get(id)
    64              .success(function (user) {
    65                  $("#username").val(user.username)
    66                  $("#role").val(user.role.slug)
    67                  $("#role").trigger("change")
    68              })
    69              .error(function () {
    70                  errorFlash("Error fetching user")
    71              })
    72      }
    73  }
    74  
    75  const deleteUser = (id) => {
    76      var user = users.find(x => x.id == id)
    77      if (!user) {
    78          return
    79      }
    80      swal({
    81          title: "Are you sure?",
    82          text: `This will delete the account for ${user.username} as well as all of the objects they have created.\n\nThis can't be undone!`,
    83          type: "warning",
    84          animation: false,
    85          showCancelButton: true,
    86          confirmButtonText: "Delete",
    87          confirmButtonColor: "#428bca",
    88          reverseButtons: true,
    89          allowOutsideClick: false,
    90          preConfirm: function () {
    91              return new Promise((resolve, reject) => {
    92                  api.userId.delete(id)
    93                      .success((msg) => {
    94                          resolve()
    95                      })
    96                      .error((data) => {
    97                          reject(data.responseJSON.message)
    98                      })
    99              })
   100          }
   101      }).then(function () {
   102          swal(
   103              'User Deleted!',
   104              `The user account for ${user.username} and all associated objects have been deleted!`,
   105              'success'
   106          );
   107          $('button:contains("OK")').on('click', function () {
   108              location.reload()
   109          })
   110      })
   111  }
   112  
   113  
   114  const load = () => {
   115      $("#userTable").hide()
   116      $("#loading").show()
   117      api.users.get()
   118          .success((us) => {
   119              users = us
   120              $("#loading").hide()
   121              $("#userTable").show()
   122              let userTable = $("#userTable").DataTable({
   123                  destroy: true,
   124                  columnDefs: [{
   125                      orderable: false,
   126                      targets: "no-sort"
   127                  }]
   128              });
   129              userTable.clear();
   130              $.each(users, (i, user) => {
   131                  userTable.row.add([
   132                      escapeHtml(user.username),
   133                      escapeHtml(user.role.name),
   134                      "<div class='pull-right'><button class='btn btn-primary edit_button' data-toggle='modal' data-backdrop='static' data-target='#modal' data-user-id='" + user.id + "'>\
   135                      <i class='fa fa-pencil'></i>\
   136                      </button>\
   137                      <button class='btn btn-danger delete_button' data-user-id='" + user.id + "'>\
   138                      <i class='fa fa-trash-o'></i>\
   139                      </button></div>"
   140                  ]).draw()
   141              })
   142          })
   143          .error(() => {
   144              errorFlash("Error fetching users")
   145          })
   146  }
   147  
   148  $(document).ready(function () {
   149      load()
   150      // Setup the event listeners
   151      $("#modal").on("hide.bs.modal", function () {
   152          dismiss();
   153      });
   154      // Select2 Defaults
   155      $.fn.select2.defaults.set("width", "100%");
   156      $.fn.select2.defaults.set("dropdownParent", $("#role-select"));
   157      $.fn.select2.defaults.set("theme", "bootstrap");
   158      $.fn.select2.defaults.set("sorter", function (data) {
   159          return data.sort(function (a, b) {
   160              if (a.text.toLowerCase() > b.text.toLowerCase()) {
   161                  return 1;
   162              }
   163              if (a.text.toLowerCase() < b.text.toLowerCase()) {
   164                  return -1;
   165              }
   166              return 0;
   167          });
   168      })
   169      $("#new_button").on("click", function () {
   170          edit(-1)
   171      })
   172      $("#userTable").on('click', '.edit_button', function (e) {
   173          edit($(this).attr('data-user-id'))
   174      })
   175      $("#userTable").on('click', '.delete_button', function (e) {
   176          deleteUser($(this).attr('data-user-id'))
   177      })
   178  });