github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/clib/auth.go (about)

     1  // Package clib - Content managed by Project Forge, see [projectforge.md] for details.
     2  package clib
     3  
     4  import (
     5  	"fmt"
     6  	"net/http"
     7  
     8  	"github.com/pkg/errors"
     9  
    10  	"github.com/kyleu/dbaudit/app"
    11  	"github.com/kyleu/dbaudit/app/controller"
    12  	"github.com/kyleu/dbaudit/app/controller/cutil"
    13  	"github.com/kyleu/dbaudit/app/lib/auth"
    14  	"github.com/kyleu/dbaudit/app/util"
    15  )
    16  
    17  const signinMsg = "signed in using %s as [%s]"
    18  
    19  func AuthDetail(w http.ResponseWriter, r *http.Request) {
    20  	controller.Act("auth.detail", w, r, func(as *app.State, ps *cutil.PageState) (string, error) {
    21  		prv, err := getProvider(as, r, ps.Logger)
    22  		if err != nil {
    23  			return "", err
    24  		}
    25  		u, _, err := auth.CompleteUserAuth(prv, w, r, ps.Session, ps.Logger)
    26  		if err == nil {
    27  			msg := fmt.Sprintf(signinMsg, auth.AvailableProviderNames[prv.ID], u.Email)
    28  			return controller.ReturnToReferrer(msg, cutil.DefaultProfilePath, w, ps)
    29  		}
    30  		return auth.BeginAuthHandler(prv, w, r, ps.Session, ps.Logger)
    31  	})
    32  }
    33  
    34  func AuthCallback(w http.ResponseWriter, r *http.Request) {
    35  	controller.Act("auth.callback", w, r, func(as *app.State, ps *cutil.PageState) (string, error) {
    36  		prv, err := getProvider(as, r, ps.Logger)
    37  		if err != nil {
    38  			return "", err
    39  		}
    40  		u, _, err := auth.CompleteUserAuth(prv, w, r, ps.Session, ps.Logger)
    41  		if err != nil {
    42  			return "", err
    43  		}
    44  		msg := fmt.Sprintf(signinMsg, auth.AvailableProviderNames[prv.ID], u.Email)
    45  		return controller.ReturnToReferrer(msg, cutil.DefaultProfilePath, w, ps)
    46  	})
    47  }
    48  
    49  func AuthLogout(w http.ResponseWriter, r *http.Request) {
    50  	controller.Act("auth.logout", w, r, func(as *app.State, ps *cutil.PageState) (string, error) {
    51  		key, err := cutil.RCRequiredString(r, "key", false)
    52  		if err != nil {
    53  			return "", err
    54  		}
    55  		err = auth.Logout(w, r, ps.Session, ps.Logger, key)
    56  		if err != nil {
    57  			return "", err
    58  		}
    59  
    60  		return ps.ProfilePath, nil
    61  	})
    62  }
    63  
    64  func getProvider(as *app.State, r *http.Request, logger util.Logger) (*auth.Provider, error) {
    65  	key, err := cutil.RCRequiredString(r, "key", false)
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  	prvs, err := as.Auth.Providers(logger)
    70  	if err != nil {
    71  		return nil, errors.Wrap(err, "can't load providers")
    72  	}
    73  	prv := prvs.Get(key)
    74  	if prv == nil {
    75  		return nil, errors.Errorf("no provider available with id [%s]", key)
    76  	}
    77  	return prv, nil
    78  }