first working version
This commit is contained in:
parent
398ff981d1
commit
39cae64854
8 changed files with 23 additions and 16 deletions
|
|
@ -168,10 +168,10 @@ func (c *Client) FollowRedirect(r *http.Request, v any, delay time.Duration) (re
|
|||
rr := r
|
||||
for {
|
||||
resp, err = c.Do(rr, v)
|
||||
if !errors.Is(ErrRedirect, err) {
|
||||
rdr, ok := err.(Redirect)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
rdr := err.(Redirect)
|
||||
rr, err = c.NewRequest(r.Context(), "GET", rdr.Location, nil)
|
||||
if err != nil {
|
||||
return
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ func (s *Server) Start(db *db.DB) {
|
|||
s.Data.DB = db
|
||||
go func() {
|
||||
err := s.srv.Serve(s.listen)
|
||||
if err != nil {
|
||||
if err != nil && err != http.ErrServerClosed {
|
||||
s.log.Error(err, "")
|
||||
}
|
||||
}()
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ func NewApprover() *Approver {
|
|||
}
|
||||
}
|
||||
|
||||
func (a *Approver) New(id, name string) (aid string, err error) {
|
||||
func (a *Approver) New(id, name, ip string) (aid string, err error) {
|
||||
a.mu.Lock()
|
||||
defer a.mu.Unlock()
|
||||
size := len(a.m)
|
||||
|
|
@ -41,6 +41,7 @@ func (a *Approver) New(id, name string) (aid string, err error) {
|
|||
a.m[aid] = Approval{
|
||||
ID: id,
|
||||
Name: name,
|
||||
IP: ip,
|
||||
Created: time.Now().Unix(),
|
||||
}
|
||||
return
|
||||
|
|
@ -52,13 +53,13 @@ func (a *Approver) List() (m ApprovalMap) {
|
|||
a.mu.RUnlock()
|
||||
return
|
||||
}
|
||||
func (a *Approver) Status(id, aid string) (s Status) {
|
||||
func (a *Approver) Status(id, aid, ip string) (s Status) {
|
||||
a.mu.RLock()
|
||||
if app, ok := a.m[aid]; ok && app.ID == id {
|
||||
if app, ok := a.m[aid]; ok && app.ID == id && app.IP == ip {
|
||||
s = app.Status
|
||||
}
|
||||
a.mu.RUnlock()
|
||||
if s == Rejected {
|
||||
if s == Approved || s == Rejected {
|
||||
a.mu.Lock()
|
||||
delete(a.m, aid)
|
||||
a.mu.Unlock()
|
||||
|
|
@ -78,6 +79,7 @@ func (a *Approver) Update(aid string, s Status) {
|
|||
type Approval struct {
|
||||
ID string
|
||||
Name string
|
||||
IP string
|
||||
Created int64
|
||||
Status Status
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ var (
|
|||
ErrKeyNotFound = newError("key not found", http.StatusNotFound)
|
||||
ErrReqNotFound = newError("key request not found", http.StatusNotFound)
|
||||
ErrTooManyApprovals = newError("too many approvals pending", http.StatusConflict)
|
||||
ErrKeyRequestRejected = newError("key request rejected", http.StatusConflict)
|
||||
ErrKeyRequestRejected = newError("key request rejected", http.StatusForbidden)
|
||||
ErrMNA = newError("method not allowed", http.StatusMethodNotAllowed)
|
||||
ErrISE = newError("internal server error", http.StatusInternalServerError)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ type Approval struct {
|
|||
ID string `json:"id"`
|
||||
AID string `json:"aid"`
|
||||
Name string `json:"name"`
|
||||
IP string `json:"ip"`
|
||||
Created int64 `json:"created"`
|
||||
Status types.Status `json:"status"`
|
||||
}
|
||||
|
|
@ -93,6 +94,7 @@ func NewApprovals(m types.ApprovalMap) (a Approvals) {
|
|||
ID: v.ID,
|
||||
AID: k,
|
||||
Name: v.Name,
|
||||
IP: v.IP,
|
||||
Created: v.Created,
|
||||
Status: v.Status,
|
||||
})
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ func newHandler(ctx *types.Context) {
|
|||
|
||||
func keyHandler(ctx *types.Context) {
|
||||
id := ctx.Var("id")
|
||||
ip := ctx.ClientIP()
|
||||
k, err := ctx.Data.DB.GetKey(id)
|
||||
if err != nil {
|
||||
ctx.Log.Error(err, "error reading key", "id", id)
|
||||
|
|
@ -78,7 +79,7 @@ func keyHandler(ctx *types.Context) {
|
|||
case "GET":
|
||||
aid := ctx.Var("aid")
|
||||
if aid == "" {
|
||||
aid, err = ctx.Data.Approver.New(id, k.Name)
|
||||
aid, err = ctx.Data.Approver.New(id, k.Name, ip)
|
||||
if err != nil {
|
||||
ctx.Log.Error(err, "error creating approval", "id", id, "name", k.Name)
|
||||
ctx.Err(types.ErrISE)
|
||||
|
|
@ -87,7 +88,7 @@ func keyHandler(ctx *types.Context) {
|
|||
ctx.Redirect(schema.ApproveURL(id, aid), http.StatusFound)
|
||||
return
|
||||
}
|
||||
s := ctx.Data.Approver.Status(id, aid)
|
||||
s := ctx.Data.Approver.Status(id, aid, ip)
|
||||
switch s {
|
||||
case types.Pending:
|
||||
ctx.Redirect(schema.ApproveURL(id, aid), http.StatusFound)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue