Implement deleting waygates

This commit is contained in:
Anders Pitman 2022-03-13 18:03:30 -06:00
parent c91b322a23
commit 967099e3a1
5 changed files with 102 additions and 14 deletions

19
api.go
View File

@ -764,3 +764,22 @@ func (a *Api) GetWaygates(tokenData TokenData) map[string]waygate.Waygate {
return 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
}

View File

@ -13,6 +13,11 @@ import (
var DBFolderPath string var DBFolderPath string
type Waygate struct {
OwnerId string `json:"owner_id"`
Waygate waygate.Waygate `json:"waygate"`
}
type Database struct { type Database struct {
AdminDomain string `json:"admin_domain"` AdminDomain string `json:"admin_domain"`
Tokens map[string]TokenData `json:"tokens"` Tokens map[string]TokenData `json:"tokens"`
@ -20,7 +25,7 @@ type Database struct {
Users map[string]User `json:"users"` Users map[string]User `json:"users"`
Domains map[string]Domain `json:"domains"` Domains map[string]Domain `json:"domains"`
dnsRequests map[string]namedrop.DNSRequest `json:"dns_requests"` 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"` WaygateTokens map[string]waygate.TokenData `json:"waygate_tokens"`
waygateCodes map[string]string `json:"waygate_codes"` waygateCodes map[string]string `json:"waygate_codes"`
mutex *sync.Mutex mutex *sync.Mutex
@ -110,7 +115,7 @@ func NewDatabase(path string) (*Database, error) {
} }
if db.Waygates == nil { if db.Waygates == nil {
db.Waygates = make(map[string]waygate.Waygate) db.Waygates = make(map[string]Waygate)
} }
if db.WaygateTokens == nil { if db.WaygateTokens == nil {
db.WaygateTokens = make(map[string]waygate.TokenData) db.WaygateTokens = make(map[string]waygate.TokenData)
@ -390,7 +395,7 @@ func (d *Database) DeleteDomain(domain string) {
d.persist() 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() d.mutex.Lock()
defer d.mutex.Unlock() defer d.mutex.Unlock()
@ -401,7 +406,7 @@ func (d *Database) AddWaygate(wg waygate.Waygate) (string, error) {
for _, domainName := range wg.Domains { for _, domainName := range wg.Domains {
for _, waygate := range d.Waygates { for _, waygate := range d.Waygates {
for _, waygateDomainName := range waygate.Domains { for _, waygateDomainName := range waygate.Waygate.Domains {
if domainName == waygateDomainName { if domainName == waygateDomainName {
return "", errors.New("Domain already used by another waygate") 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() d.persist()
@ -419,12 +427,12 @@ func (d *Database) GetWaygate(id string) (waygate.Waygate, error) {
d.mutex.Lock() d.mutex.Lock()
defer d.mutex.Unlock() defer d.mutex.Unlock()
tun, exists := d.Waygates[id] wg, exists := d.Waygates[id]
if !exists { if !exists {
return waygate.Waygate{}, errors.New("No such waygate") return waygate.Waygate{}, errors.New("No such waygate")
} }
return tun, nil return wg.Waygate, nil
} }
func (d *Database) GetWaygates() map[string]waygate.Waygate { func (d *Database) GetWaygates() map[string]waygate.Waygate {
d.mutex.Lock() d.mutex.Lock()
@ -433,12 +441,32 @@ func (d *Database) GetWaygates() map[string]waygate.Waygate {
wgs := make(map[string]waygate.Waygate) wgs := make(map[string]waygate.Waygate)
for id, wg := range d.Waygates { for id, wg := range d.Waygates {
wgs[id] = wg wgs[id] = wg.Waygate
} }
return wgs 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) { func (d *Database) AddWaygateToken(waygateId string) (string, error) {
d.mutex.Lock() d.mutex.Lock()
defer d.mutex.Unlock() defer d.mutex.Unlock()

View File

@ -29,7 +29,7 @@
<td class='tn-waygate-table__cell'> <td class='tn-waygate-table__cell'>
<div class='button-row'> <div class='button-row'>
<a class='button' href="/waygates/{{$waygateId}}">Edit</a> <a class='button' href="/waygates/{{$waygateId}}">Edit</a>
<a class='button' href="/confirm-delete-waygate?id={{$waygateId}}">Delete</a> <a class='button' href="/waygate-confirm-delete?waygate-id={{$waygateId}}">Delete</a>
</div> </div>
</td> </td>
</tr> </tr>

View File

@ -301,11 +301,15 @@ func (h *WebUiHandler) handleWebUiRequest(w http.ResponseWriter, r *http.Request
case "/waygate-add-wildcard-domain": case "/waygate-add-wildcard-domain":
h.handleWaygateAddWildcardDomain(w, r) h.handleWaygateAddWildcardDomain(w, r)
case "/waygate-delete-selected": case "/waygate-delete-selected":
h.handleWaygateDeleteSelected(w, r) h.handleWaygateDeleteSelectedDomain(w, r)
case "/waygate-create": case "/waygate-create":
h.handleWaygateCreate(w, r) h.handleWaygateCreate(w, r, tokenData)
case "/waygate-connect-existing": case "/waygate-connect-existing":
h.handleWaygateConnectExisting(w, r) h.handleWaygateConnectExisting(w, r)
case "/waygate-confirm-delete":
h.confirmDeleteWaygate(w, r)
case "/waygate-delete":
h.deleteWaygate(w, r, tokenData)
default: default:
if strings.HasPrefix(r.URL.Path, "/tunnels/") { if strings.HasPrefix(r.URL.Path, "/tunnels/") {

View File

@ -176,7 +176,7 @@ func (h *WebUiHandler) handleWaygateAddDomain(w http.ResponseWriter, r *http.Req
h.handleWaygateEdit(w, r) 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" { if r.Method != "POST" {
w.WriteHeader(405) w.WriteHeader(405)
io.WriteString(w, "Invalid method") 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" { if r.Method != "POST" {
w.WriteHeader(405) w.WriteHeader(405)
io.WriteString(w, "Invalid method") io.WriteString(w, "Invalid method")
@ -295,7 +295,8 @@ func (h *WebUiHandler) handleWaygateCreate(w http.ResponseWriter, r *http.Reques
Domains: selectedDomains, Domains: selectedDomains,
Description: description, Description: description,
} }
_, err = h.db.AddWaygate(wg)
_, err = h.db.AddWaygate(tokenData.Owner, wg)
if err != nil { if err != nil {
w.WriteHeader(500) w.WriteHeader(500)
fmt.Fprintf(w, err.Error()) 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) 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)
}