fix: don't allow to remove root user
This commit is contained in:
parent
8cea2f75b3
commit
019ce80fc5
|
@ -17,4 +17,5 @@ var (
|
||||||
ErrPermissionDenied = errors.New("permission denied")
|
ErrPermissionDenied = errors.New("permission denied")
|
||||||
ErrInvalidRequestParams = errors.New("invalid request params")
|
ErrInvalidRequestParams = errors.New("invalid request params")
|
||||||
ErrSourceIsParent = errors.New("source is parent")
|
ErrSourceIsParent = errors.New("source is parent")
|
||||||
|
ErrRootUserDeletion = errors.New("user with id 1 can't be deleted")
|
||||||
)
|
)
|
||||||
|
|
|
@ -26,14 +26,14 @@ Vue.prototype.$showSuccess = (message) => {
|
||||||
})).show()
|
})).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
Vue.prototype.$showError = (error) => {
|
Vue.prototype.$showError = (error, displayReport = true) => {
|
||||||
let btns = [
|
let btns = [
|
||||||
Noty.button(i18n.t('buttons.close'), '', function () {
|
Noty.button(i18n.t('buttons.close'), '', function () {
|
||||||
n.close()
|
n.close()
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
|
|
||||||
if (!disableExternal) {
|
if (!disableExternal && displayReport) {
|
||||||
btns.unshift(Noty.button(i18n.t('buttons.reportIssue'), '', function () {
|
btns.unshift(Noty.button(i18n.t('buttons.reportIssue'), '', function () {
|
||||||
window.open('https://github.com/filebrowser/filebrowser/issues/new/choose')
|
window.open('https://github.com/filebrowser/filebrowser/issues/new/choose')
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -115,7 +115,7 @@ export default {
|
||||||
this.$router.push({ path: '/settings/users' })
|
this.$router.push({ path: '/settings/users' })
|
||||||
this.$showSuccess(this.$t('settings.userDeleted'))
|
this.$showSuccess(this.$t('settings.userDeleted'))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.$showError(e)
|
(e.message === "403") ? this.$showError(this.$t("errors.forbidden"), false) : this.$showError(e)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async save (event) {
|
async save (event) {
|
||||||
|
|
|
@ -99,8 +99,8 @@ var userGetHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request
|
||||||
|
|
||||||
var userDeleteHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
|
var userDeleteHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
|
||||||
err := d.store.Users.Delete(d.raw.(uint))
|
err := d.store.Users.Delete(d.raw.(uint))
|
||||||
if err == errors.ErrNotExist {
|
if err != nil {
|
||||||
return http.StatusNotFound, err
|
return errToStatus(err), err
|
||||||
}
|
}
|
||||||
|
|
||||||
return http.StatusOK, nil
|
return http.StatusOK, nil
|
||||||
|
|
|
@ -40,6 +40,8 @@ func errToStatus(err error) int {
|
||||||
return http.StatusForbidden
|
return http.StatusForbidden
|
||||||
case errors.Is(err, libErrors.ErrInvalidRequestParams):
|
case errors.Is(err, libErrors.ErrInvalidRequestParams):
|
||||||
return http.StatusBadRequest
|
return http.StatusBadRequest
|
||||||
|
case errors.Is(err, libErrors.ErrRootUserDeletion):
|
||||||
|
return http.StatusForbidden
|
||||||
default:
|
default:
|
||||||
return http.StatusInternalServerError
|
return http.StatusInternalServerError
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,17 +92,25 @@ func (s *Storage) Save(user *User) error {
|
||||||
// Delete allows you to delete a user by its name or username. The provided
|
// Delete allows you to delete a user by its name or username. The provided
|
||||||
// id must be a string for username lookup or a uint for id lookup. If id
|
// id must be a string for username lookup or a uint for id lookup. If id
|
||||||
// is neither, a ErrInvalidDataType will be returned.
|
// is neither, a ErrInvalidDataType will be returned.
|
||||||
func (s *Storage) Delete(id interface{}) (err error) {
|
func (s *Storage) Delete(id interface{}) error {
|
||||||
switch id := id.(type) {
|
switch id := id.(type) {
|
||||||
case string:
|
case string:
|
||||||
err = s.back.DeleteByUsername(id)
|
user, err := s.back.GetBy(id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if user.ID == 1 {
|
||||||
|
return errors.ErrRootUserDeletion
|
||||||
|
}
|
||||||
|
return s.back.DeleteByUsername(id)
|
||||||
case uint:
|
case uint:
|
||||||
err = s.back.DeleteByID(id)
|
if id == 1 {
|
||||||
|
return errors.ErrRootUserDeletion
|
||||||
|
}
|
||||||
|
return s.back.DeleteByID(id)
|
||||||
default:
|
default:
|
||||||
err = errors.ErrInvalidDataType
|
return errors.ErrInvalidDataType
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// LastUpdate gets the timestamp for the last update of an user.
|
// LastUpdate gets the timestamp for the last update of an user.
|
||||||
|
|
Loading…
Reference in New Issue