package server import ( "time" "github.com/keys-pub/keys" "github.com/keys-pub/keys/http" "github.com/keys-pub/keys/user" "github.com/labstack/echo/v4" "github.com/pkg/errors" ) func (s *Server) adminCheck(c echo.Context) error { s.logger.Infof("Server %s %s", c.Request().Method, c.Request().URL.String()) request := c.Request() ctx := request.Context() auth, err := s.auth(c, newAuth("Authorization", "", nil)) if err != nil { return s.ErrForbidden(c, err) } if !s.isAdmin(auth.KID) { return s.ErrForbidden(c, errors.Errorf("not authorized")) } switch c.Param("kid") { case "all": kids, err := s.users.KIDs(ctx) if err != nil { return s.ErrInternalServer(c, err) } s.logger.Infof("Queue all (%d)", len(kids)) if err := s.queueKeyChecks(ctx, kids); err != nil { return s.ErrInternalServer(c, err) } case "content-not-found": if err := s.queueByUserStatus(ctx, user.StatusContentNotFound); err != nil { return s.ErrInternalServer(c, err) } case "connection-fail": if err := s.queueByUserStatus(ctx, user.StatusConnFailure); err != nil { return s.ErrInternalServer(c, err) } case "expired": if err := s.queueByExpired(ctx, time.Hour*6, time.Hour*24*7); err != nil { return s.ErrInternalServer(c, err) } default: kid, err := keys.ParseID(c.Param("kid")) if err != nil { return s.ErrNotFound(c, errors.Errorf("invalid kid")) } s.logger.Infof("Queueing %s", kid) if err := s.checkKID(ctx, kid, HighPriority); err != nil { return s.ErrInternalServer(c, err) } } var resp struct{} return JSON(c, http.StatusOK, resp) } func (s *Server) isAdmin(kid keys.ID) bool { for _, admin := range s.admins { if admin == kid { return true } } return false }