diff options
Diffstat (limited to 'backend/general/records.go')
| -rw-r--r-- | backend/general/records.go | 67 |
1 files changed, 63 insertions, 4 deletions
diff --git a/backend/general/records.go b/backend/general/records.go index d623862..ff37785 100644 --- a/backend/general/records.go +++ b/backend/general/records.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io" + "llostre/backend/auth" "log/slog" "net/http" ) @@ -13,12 +14,27 @@ type RawRecord struct { Value json.RawMessage `json:"value"` } -func FetchRawRecordCollection(logger *slog.Logger, did, collection, baseURL string) ([]RawRecord, error) { +func FetchRawRecordCollection(logger *slog.Logger, did, collection, baseURL string, session *auth.OAuthState) ([]RawRecord, error) { url := fmt.Sprintf("%s/xrpc/com.atproto.repo.listRecords?repo=%s&collection=%s", baseURL, did, collection) logger.Debug("fetching raw record collection", "did", did, "endpoint", baseURL, "collection", collection) - resp, err := http.Get(url) + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + + // only add auth if provided + if session != nil { + dpopProof, err := session.KeyPair.GenerateDPoPProof("GET", url, "") + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+session.AccessToken) + req.Header.Set("DPoP", dpopProof) + } + + resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } @@ -39,7 +55,7 @@ func FetchRawRecordCollection(logger *slog.Logger, did, collection, baseURL stri return result.Records, nil } -func FetchRawRecordByURI(logger *slog.Logger, uri, baseURL string) (*RawRecord, error) { +func FetchRawRecordByURI(logger *slog.Logger, uri, baseURL string, session *auth.OAuthState) (*RawRecord, error) { repo, collection, rkey, err := ParseURI(uri) if err != nil { return nil, err @@ -50,7 +66,22 @@ func FetchRawRecordByURI(logger *slog.Logger, uri, baseURL string) (*RawRecord, logger.Debug("fetching raw record by URI", "uri", uri, "endpoint", baseURL) - resp, err := http.Get(url) + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + + // only add auth if provided + if session != nil { + dpopProof, err := session.KeyPair.GenerateDPoPProof("GET", url, "") + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+session.AccessToken) + req.Header.Set("DPoP", dpopProof) + } + + resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } @@ -68,3 +99,31 @@ func FetchRawRecordByURI(logger *slog.Logger, uri, baseURL string) (*RawRecord, return &result, nil } + +func IsValidSession(session *auth.OAuthState) bool { + if session == nil { + return false + } + + url := fmt.Sprintf("%s/xrpc/com.atproto.server.getSession", session.PDS) + + dpopProof, err := session.KeyPair.GenerateDPoPProof("GET", url, "") + if err != nil { + return false + } + + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return false + } + req.Header.Set("Authorization", "Bearer "+session.AccessToken) + req.Header.Set("DPoP", dpopProof) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return false + } + defer resp.Body.Close() + + return resp.StatusCode == 200 +} |
