From 967099e3a1082399f0a2b3ca8c17a76bfe90b1fd Mon Sep 17 00:00:00 2001 From: Anders Pitman Date: Sun, 13 Mar 2022 18:03:30 -0600 Subject: [PATCH] Implement deleting waygates --- api.go | 19 ++++++++++++++++++ database.go | 44 +++++++++++++++++++++++++++++++++-------- templates/waygates.tmpl | 2 +- ui_handler.go | 8 ++++++-- waygate.go | 43 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 102 insertions(+), 14 deletions(-) diff --git a/api.go b/api.go index e538b61..059c7bb 100644 --- a/api.go +++ b/api.go @@ -764,3 +764,22 @@ func (a *Api) GetWaygates(tokenData TokenData) map[string]waygate.Waygate { return map[string]waygate.Waygate{} } } + +func (a *Api) DeleteWaygate(tokenData TokenData, waygateId string) error { + + waygate, err := a.db.GetBoringProxyWaygate(waygateId) + if err != nil { + return err + } + + if tokenData.Owner != waygate.OwnerId { + user, _ := a.db.GetUser(tokenData.Owner) + if !user.IsAdmin { + return errors.New("Unauthorized") + } + } + + a.db.DeleteWaygate(waygateId) + + return nil +} diff --git a/database.go b/database.go index cdea1f0..a2256f0 100644 --- a/database.go +++ b/database.go @@ -13,6 +13,11 @@ import ( var DBFolderPath string +type Waygate struct { + OwnerId string `json:"owner_id"` + Waygate waygate.Waygate `json:"waygate"` +} + type Database struct { AdminDomain string `json:"admin_domain"` Tokens map[string]TokenData `json:"tokens"` @@ -20,7 +25,7 @@ type Database struct { Users map[string]User `json:"users"` Domains map[string]Domain `json:"domains"` dnsRequests map[string]namedrop.DNSRequest `json:"dns_requests"` - Waygates map[string]waygate.Waygate `json:"waygates"` + Waygates map[string]Waygate `json:"waygates"` WaygateTokens map[string]waygate.TokenData `json:"waygate_tokens"` waygateCodes map[string]string `json:"waygate_codes"` mutex *sync.Mutex @@ -110,7 +115,7 @@ func NewDatabase(path string) (*Database, error) { } if db.Waygates == nil { - db.Waygates = make(map[string]waygate.Waygate) + db.Waygates = make(map[string]Waygate) } if db.WaygateTokens == nil { db.WaygateTokens = make(map[string]waygate.TokenData) @@ -390,7 +395,7 @@ func (d *Database) DeleteDomain(domain string) { d.persist() } -func (d *Database) AddWaygate(wg waygate.Waygate) (string, error) { +func (d *Database) AddWaygate(ownerId string, wg waygate.Waygate) (string, error) { d.mutex.Lock() defer d.mutex.Unlock() @@ -401,7 +406,7 @@ func (d *Database) AddWaygate(wg waygate.Waygate) (string, error) { for _, domainName := range wg.Domains { for _, waygate := range d.Waygates { - for _, waygateDomainName := range waygate.Domains { + for _, waygateDomainName := range waygate.Waygate.Domains { if domainName == waygateDomainName { return "", errors.New("Domain already used by another waygate") } @@ -409,7 +414,10 @@ func (d *Database) AddWaygate(wg waygate.Waygate) (string, error) { } } - d.Waygates[id] = wg + d.Waygates[id] = Waygate{ + OwnerId: ownerId, + Waygate: wg, + } d.persist() @@ -419,12 +427,12 @@ func (d *Database) GetWaygate(id string) (waygate.Waygate, error) { d.mutex.Lock() defer d.mutex.Unlock() - tun, exists := d.Waygates[id] + wg, exists := d.Waygates[id] if !exists { return waygate.Waygate{}, errors.New("No such waygate") } - return tun, nil + return wg.Waygate, nil } func (d *Database) GetWaygates() map[string]waygate.Waygate { d.mutex.Lock() @@ -433,12 +441,32 @@ func (d *Database) GetWaygates() map[string]waygate.Waygate { wgs := make(map[string]waygate.Waygate) for id, wg := range d.Waygates { - wgs[id] = wg + wgs[id] = wg.Waygate } return wgs } +func (d *Database) GetBoringProxyWaygate(id string) (Waygate, error) { + d.mutex.Lock() + defer d.mutex.Unlock() + + wg, exists := d.Waygates[id] + if !exists { + return Waygate{}, errors.New("No such waygate") + } + + return wg, nil + +} + +func (d *Database) DeleteWaygate(id string) { + d.mutex.Lock() + defer d.mutex.Unlock() + + delete(d.Waygates, id) + +} func (d *Database) AddWaygateToken(waygateId string) (string, error) { d.mutex.Lock() defer d.mutex.Unlock() diff --git a/templates/waygates.tmpl b/templates/waygates.tmpl index 6bd280a..80e5ce0 100644 --- a/templates/waygates.tmpl +++ b/templates/waygates.tmpl @@ -29,7 +29,7 @@
Edit - Delete + Delete
diff --git a/ui_handler.go b/ui_handler.go index ad2c2a9..0b1b4ce 100644 --- a/ui_handler.go +++ b/ui_handler.go @@ -301,11 +301,15 @@ func (h *WebUiHandler) handleWebUiRequest(w http.ResponseWriter, r *http.Request case "/waygate-add-wildcard-domain": h.handleWaygateAddWildcardDomain(w, r) case "/waygate-delete-selected": - h.handleWaygateDeleteSelected(w, r) + h.handleWaygateDeleteSelectedDomain(w, r) case "/waygate-create": - h.handleWaygateCreate(w, r) + h.handleWaygateCreate(w, r, tokenData) case "/waygate-connect-existing": h.handleWaygateConnectExisting(w, r) + case "/waygate-confirm-delete": + h.confirmDeleteWaygate(w, r) + case "/waygate-delete": + h.deleteWaygate(w, r, tokenData) default: if strings.HasPrefix(r.URL.Path, "/tunnels/") { diff --git a/waygate.go b/waygate.go index bc92cf1..e6feb98 100644 --- a/waygate.go +++ b/waygate.go @@ -176,7 +176,7 @@ func (h *WebUiHandler) handleWaygateAddDomain(w http.ResponseWriter, r *http.Req h.handleWaygateEdit(w, r) } -func (h *WebUiHandler) handleWaygateDeleteSelected(w http.ResponseWriter, r *http.Request) { +func (h *WebUiHandler) handleWaygateDeleteSelectedDomain(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { w.WriteHeader(405) io.WriteString(w, "Invalid method") @@ -249,7 +249,7 @@ func (h *WebUiHandler) handleWaygateEdit(w http.ResponseWriter, r *http.Request) } } -func (h *WebUiHandler) handleWaygateCreate(w http.ResponseWriter, r *http.Request) { +func (h *WebUiHandler) handleWaygateCreate(w http.ResponseWriter, r *http.Request, tokenData TokenData) { if r.Method != "POST" { w.WriteHeader(405) io.WriteString(w, "Invalid method") @@ -295,7 +295,8 @@ func (h *WebUiHandler) handleWaygateCreate(w http.ResponseWriter, r *http.Reques Domains: selectedDomains, Description: description, } - _, err = h.db.AddWaygate(wg) + + _, err = h.db.AddWaygate(tokenData.Owner, wg) if err != nil { w.WriteHeader(500) fmt.Fprintf(w, err.Error()) @@ -360,3 +361,39 @@ func (h *WebUiHandler) completeAuth(w http.ResponseWriter, r *http.Request, wayg http.Redirect(w, r, url, 303) } } + +func (h *WebUiHandler) confirmDeleteWaygate(w http.ResponseWriter, r *http.Request) { + + r.ParseForm() + + waygateId := r.Form.Get("waygate-id") + + data := &ConfirmData{ + Head: h.headHtml, + Message: "Are you sure you want to delete Waygate?", + ConfirmUrl: fmt.Sprintf("/waygate-delete?waygate-id=%s", waygateId), + CancelUrl: "/waygates", + } + + err := h.tmpl.ExecuteTemplate(w, "confirm.tmpl", data) + if err != nil { + w.WriteHeader(500) + h.alertDialog(w, r, err.Error(), "/waygates") + return + } +} +func (h *WebUiHandler) deleteWaygate(w http.ResponseWriter, r *http.Request, tokenData TokenData) { + + r.ParseForm() + + waygateId := r.Form.Get("waygate-id") + + err := h.api.DeleteWaygate(tokenData, waygateId) + if err != nil { + w.WriteHeader(500) + h.alertDialog(w, r, err.Error(), "/waygates") + return + } + + http.Redirect(w, r, "/waygates", 303) +}