@@ -0,0 +1,108 @@
9+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
10+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
11+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/requests"
14+type SourceHutProvider struct {
18+var _ Provider = (*SourceHutProvider)(nil)
21+ SourceHutProviderName = "SourceHut"
22+ SourceHutDefaultScope = "meta.sr.ht/PROFILE:RO"
26+ // Default Login URL for SourceHut.
27+ // Pre-parsed URL of https://meta.sr.ht/oauth2/authorize.
28+ SourceHutDefaultLoginURL = &url.URL{
31+ Path: "/oauth2/authorize",
34+ // Default Redeem URL for SourceHut.
35+ // Pre-parsed URL of https://meta.sr.ht/oauth2/access-token.
36+ SourceHutDefaultRedeemURL = &url.URL{
39+ Path: "/oauth2/access-token",
42+ // Default Profile URL for SourceHut.
43+ // Pre-parsed URL of https://meta.sr.ht/query.
44+ SourceHutDefaultProfileURL = &url.URL{
50+ // Default Validation URL for SourceHut.
51+ // Pre-parsed URL of https://meta.sr.ht/profile.
52+ SourceHutDefaultValidateURL = &url.URL{
59+// NewSourceHutProvider creates a SourceHutProvider using the passed ProviderData
60+func NewSourceHutProvider(p *ProviderData) *SourceHutProvider {
61+ p.setProviderDefaults(providerDefaults{
62+ name: SourceHutProviderName,
63+ loginURL: SourceHutDefaultLoginURL,
64+ redeemURL: SourceHutDefaultRedeemURL,
65+ profileURL: SourceHutDefaultProfileURL,
66+ validateURL: SourceHutDefaultValidateURL,
67+ scope: SourceHutDefaultScope,
70+ return &SourceHutProvider{ProviderData: p}
73+// EnrichSession uses the SourceHut userinfo endpoint to populate the session's
74+// email and username.
75+func (p *SourceHutProvider) EnrichSession(ctx context.Context, s *sessions.SessionState) error {
76+ json, err := requests.New(p.ProfileURL.String()).
79+ SetHeader("Content-Type", "application/json").
80+ SetHeader("Authorization", "Bearer "+s.AccessToken).
81+ WithBody(bytes.NewBufferString(`{"query": "{ me { username, email } }"}`)).
83+ UnmarshalSimpleJSON()
85+ logger.Errorf("failed making request %v", err)
89+ email, err := json.GetPath("data", "me", "email").String()
91+ return fmt.Errorf("unable to extract email from userinfo endpoint: %v", err)
95+ username, err := json.GetPath("data", "me", "username").String()
97+ return fmt.Errorf("unable to extract username from userinfo endpoint: %v", err)
99+ s.PreferredUsername = username
105+// ValidateSession validates the AccessToken
106+func (p *SourceHutProvider) ValidateSession(ctx context.Context, s *sessions.SessionState) bool {
107+ return validateToken(ctx, p, s.AccessToken, makeOIDCHeader(s.AccessToken))