2020-11-22 11:42:34 +13:00
|
|
|
package members
|
2020-11-22 11:39:24 +13:00
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"demodesk/neko/internal/utils"
|
2020-11-26 10:39:54 +13:00
|
|
|
"demodesk/neko/internal/types"
|
2020-11-22 11:39:24 +13:00
|
|
|
)
|
|
|
|
|
2020-11-22 12:06:55 +13:00
|
|
|
type MemberCreatePayload struct {
|
2020-11-26 10:39:54 +13:00
|
|
|
ID string `json:"id"`
|
2020-11-22 12:06:55 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
type MemberDataPayload struct {
|
2020-12-07 09:10:45 +13:00
|
|
|
ID *string `json:"id"`
|
|
|
|
Secret *string `json:"secret,omitempty"`
|
|
|
|
Name *string `json:"name"`
|
|
|
|
IsAdmin *bool `json:"is_admin"`
|
|
|
|
CanLogin *bool `json:"can_login"`
|
|
|
|
CanConnect *bool `json:"can_connect"`
|
|
|
|
CanWatch *bool `json:"can_watch"`
|
|
|
|
CanHost *bool `json:"can_host"`
|
|
|
|
CanAccessClipboard *bool `json:"can_access_clipboard"`
|
2020-11-22 12:06:55 +13:00
|
|
|
}
|
|
|
|
|
2020-11-22 11:42:34 +13:00
|
|
|
func (h *MembersHandler) membersCreate(w http.ResponseWriter, r *http.Request) {
|
2020-11-22 12:06:55 +13:00
|
|
|
data := &MemberDataPayload{}
|
|
|
|
if !utils.HttpJsonRequest(w, r, data) {
|
|
|
|
return
|
|
|
|
}
|
2020-11-22 11:39:24 +13:00
|
|
|
|
2020-12-07 09:10:45 +13:00
|
|
|
if data.Secret == nil || *data.Secret == "" {
|
|
|
|
utils.HttpBadRequest(w, "Secret cannot be empty.")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if data.Name == nil || *data.Name == "" {
|
|
|
|
utils.HttpBadRequest(w, "Name cannot be empty.")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var ID string
|
|
|
|
if data.ID == nil || *data.ID == "" {
|
2020-12-03 04:50:30 +13:00
|
|
|
var err error
|
2020-12-07 09:10:45 +13:00
|
|
|
if ID, err = utils.NewUID(32); err != nil {
|
2020-12-03 04:50:30 +13:00
|
|
|
utils.HttpInternalServerError(w, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else {
|
2020-12-07 09:10:45 +13:00
|
|
|
ID = *data.ID
|
|
|
|
if _, ok := h.sessions.Get(ID); ok {
|
2020-12-03 04:50:30 +13:00
|
|
|
utils.HttpBadRequest(w, "Member ID already exists.")
|
|
|
|
return
|
|
|
|
}
|
2020-11-26 10:39:54 +13:00
|
|
|
}
|
|
|
|
|
2020-12-07 09:10:45 +13:00
|
|
|
session, err := h.sessions.Create(ID, types.MemberProfile{
|
|
|
|
Secret: *data.Secret,
|
|
|
|
Name: *data.Name,
|
|
|
|
IsAdmin: defaultBool(data.IsAdmin, false),
|
|
|
|
CanLogin: defaultBool(data.CanLogin, true),
|
|
|
|
CanConnect: defaultBool(data.CanConnect, true),
|
|
|
|
CanWatch: defaultBool(data.CanWatch, true),
|
|
|
|
CanHost: defaultBool(data.CanHost, true),
|
|
|
|
CanAccessClipboard: defaultBool(data.CanAccessClipboard, true),
|
2020-11-28 08:00:14 +13:00
|
|
|
})
|
|
|
|
|
2020-12-06 11:05:46 +13:00
|
|
|
if err != nil {
|
|
|
|
utils.HttpInternalServerError(w, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-11-22 12:06:55 +13:00
|
|
|
utils.HttpSuccess(w, MemberCreatePayload{
|
2020-11-26 10:39:54 +13:00
|
|
|
ID: session.ID(),
|
2020-11-22 12:06:55 +13:00
|
|
|
})
|
2020-11-22 11:39:24 +13:00
|
|
|
}
|
|
|
|
|
2020-11-22 11:42:34 +13:00
|
|
|
func (h *MembersHandler) membersRead(w http.ResponseWriter, r *http.Request) {
|
2020-11-22 11:39:24 +13:00
|
|
|
member := GetMember(r)
|
|
|
|
|
2020-12-03 05:43:34 +13:00
|
|
|
// TODO: Join structs?
|
2020-12-07 09:10:45 +13:00
|
|
|
// TODO: Ugly.
|
2020-11-22 12:06:55 +13:00
|
|
|
utils.HttpSuccess(w, MemberDataPayload{
|
2020-12-07 09:10:45 +13:00
|
|
|
Name: func(v string) *string { return &v }(member.Name()),
|
|
|
|
IsAdmin: func(v bool) *bool { return &v }(member.IsAdmin()),
|
|
|
|
CanLogin: func(v bool) *bool { return &v }(member.CanLogin()),
|
|
|
|
CanConnect: func(v bool) *bool { return &v }(member.CanConnect()),
|
|
|
|
CanWatch: func(v bool) *bool { return &v }(member.CanWatch()),
|
|
|
|
CanHost: func(v bool) *bool { return &v }(member.CanHost()),
|
|
|
|
CanAccessClipboard: func(v bool) *bool { return &v }(member.CanAccessClipboard()),
|
2020-11-22 12:06:55 +13:00
|
|
|
})
|
2020-11-22 11:39:24 +13:00
|
|
|
}
|
|
|
|
|
2020-11-22 11:42:34 +13:00
|
|
|
func (h *MembersHandler) membersUpdate(w http.ResponseWriter, r *http.Request) {
|
2020-11-22 12:06:55 +13:00
|
|
|
data := &MemberDataPayload{}
|
|
|
|
if !utils.HttpJsonRequest(w, r, data) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-11-22 11:39:24 +13:00
|
|
|
member := GetMember(r)
|
|
|
|
|
2020-12-07 09:10:45 +13:00
|
|
|
secret := ""
|
|
|
|
if data.Secret != nil && *data.Secret != "" {
|
|
|
|
secret = *data.Secret
|
|
|
|
}
|
|
|
|
|
|
|
|
name := member.Name()
|
|
|
|
if data.Name != nil && *data.Name != "" {
|
|
|
|
name = *data.Name
|
|
|
|
}
|
|
|
|
|
2020-12-03 05:43:34 +13:00
|
|
|
// TODO: Join structs?
|
2020-12-07 09:10:45 +13:00
|
|
|
err := h.sessions.Update(member.ID(), types.MemberProfile{
|
|
|
|
Secret: secret,
|
|
|
|
Name: name,
|
|
|
|
IsAdmin: defaultBool(data.IsAdmin, member.IsAdmin()),
|
|
|
|
CanLogin: defaultBool(data.CanLogin, member.CanLogin()),
|
|
|
|
CanConnect: defaultBool(data.CanConnect, member.CanConnect()),
|
|
|
|
CanWatch: defaultBool(data.CanWatch, member.CanWatch()),
|
|
|
|
CanHost: defaultBool(data.CanHost, member.CanHost()),
|
|
|
|
CanAccessClipboard: defaultBool(data.CanAccessClipboard, member.CanAccessClipboard()),
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
2020-12-06 10:18:45 +13:00
|
|
|
utils.HttpInternalServerError(w, err)
|
|
|
|
return
|
|
|
|
}
|
2020-12-03 05:43:34 +13:00
|
|
|
|
|
|
|
utils.HttpSuccess(w)
|
2020-11-22 11:39:24 +13:00
|
|
|
}
|
|
|
|
|
2020-11-22 11:42:34 +13:00
|
|
|
func (h *MembersHandler) membersDelete(w http.ResponseWriter, r *http.Request) {
|
2020-11-22 11:39:24 +13:00
|
|
|
member := GetMember(r)
|
|
|
|
|
2020-11-26 10:39:54 +13:00
|
|
|
if err := h.sessions.Delete(member.ID()); err != nil {
|
2020-11-29 03:00:21 +13:00
|
|
|
utils.HttpInternalServerError(w, err)
|
2020-11-26 10:39:54 +13:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
utils.HttpSuccess(w)
|
2020-11-22 11:39:24 +13:00
|
|
|
}
|
2020-12-07 09:10:45 +13:00
|
|
|
|
|
|
|
func defaultBool(val *bool, def bool) bool {
|
|
|
|
if val != nil {
|
|
|
|
return *val
|
|
|
|
}
|
|
|
|
return def
|
|
|
|
}
|