restapi_auth_local.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package httpservers
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/google/uuid"
  6. "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
  7. log "github.com/sirupsen/logrus"
  8. acl "github.com/OliveTin/OliveTin/internal/acl"
  9. "google.golang.org/protobuf/reflect/protoreflect"
  10. )
  11. var (
  12. localUserSessions = make(map[string]string) // sid -> username, used for local user sessions
  13. )
  14. func parseLocalUserCookie(req *http.Request) (string, string) {
  15. cookie, err := req.Cookie("olivetin_local_user_sid")
  16. if err != nil {
  17. return "", ""
  18. }
  19. cookieValue := cookie.Value
  20. username, ok := localUserSessions[cookieValue]
  21. if !ok {
  22. log.Warnf("Could not find local user session: %v", cookieValue)
  23. return "", ""
  24. }
  25. return username, ""
  26. }
  27. func forwardResponseHandlerLoginLocalUser(ctx context.Context, w http.ResponseWriter, msg protoreflect.ProtoMessage) error {
  28. md, ok := runtime.ServerMetadataFromContext(ctx)
  29. if !ok {
  30. log.Warn("Could not get ServerMetadata from context")
  31. return nil
  32. }
  33. setUser := acl.SetUserFromMetadata(md.HeaderMD)
  34. sid := uuid.NewString()
  35. localUserSessions[sid] = setUser
  36. if setUser != "" {
  37. http.SetCookie(
  38. w,
  39. &http.Cookie{
  40. Name: "olivetin_local_user_sid",
  41. Value: sid,
  42. },
  43. )
  44. }
  45. return nil
  46. }