summaryrefslogtreecommitdiff
path: root/internal/handlers/handler_register_duo_device.go
diff options
context:
space:
mode:
authorJames Elliott <james-d-elliott@users.noreply.github.com>2023-01-25 20:36:40 +1100
committerGitHub <noreply@github.com>2023-01-25 20:36:40 +1100
commit65705a646dfd31e4477af3ffb35c584eb49346a4 (patch)
tree882b5df73348c5fc6471e57ef6787c4b04cb68f4 /internal/handlers/handler_register_duo_device.go
parent78064dec2e9b48308b71ff8862b27e6f8ded5d56 (diff)
feat(server): customizable authz endpoints (#4296)
This allows users to customize the authz endpoints. Closes #2753, Fixes #3716 Co-authored-by: Amir Zarrinkafsh <nightah@me.com>
Diffstat (limited to 'internal/handlers/handler_register_duo_device.go')
-rw-r--r--internal/handlers/handler_register_duo_device.go62
1 files changed, 44 insertions, 18 deletions
diff --git a/internal/handlers/handler_register_duo_device.go b/internal/handlers/handler_register_duo_device.go
index 8182cbdce..ca93950e6 100644
--- a/internal/handlers/handler_register_duo_device.go
+++ b/internal/handlers/handler_register_duo_device.go
@@ -8,21 +8,31 @@ import (
"github.com/authelia/authelia/v4/internal/duo"
"github.com/authelia/authelia/v4/internal/middlewares"
"github.com/authelia/authelia/v4/internal/model"
+ "github.com/authelia/authelia/v4/internal/session"
"github.com/authelia/authelia/v4/internal/utils"
)
// DuoDevicesGET handler for retrieving available devices and capabilities from duo api.
func DuoDevicesGET(duoAPI duo.API) middlewares.RequestHandler {
return func(ctx *middlewares.AutheliaCtx) {
- userSession := ctx.GetSession()
+ var (
+ userSession session.UserSession
+ err error
+ )
+
+ if userSession, err = ctx.GetSession(); err != nil {
+ ctx.Error(fmt.Errorf("failed to get session data: %w", err), messageMFAValidationFailed)
+ return
+ }
+
values := url.Values{}
values.Set("username", userSession.Username)
ctx.Logger.Debugf("Starting Duo PreAuth for %s", userSession.Username)
- result, message, devices, enrollURL, err := DuoPreAuth(ctx, duoAPI)
+ result, message, devices, enrollURL, err := DuoPreAuth(ctx, &userSession, duoAPI)
if err != nil {
- ctx.Error(fmt.Errorf("duo PreAuth API errored: %s", err), messageMFAValidationFailed)
+ ctx.Error(fmt.Errorf("duo PreAuth API errored: %w", err), messageMFAValidationFailed)
return
}
@@ -80,39 +90,55 @@ func DuoDevicesGET(duoAPI duo.API) middlewares.RequestHandler {
// DuoDevicePOST update the user preferences regarding Duo device and method.
func DuoDevicePOST(ctx *middlewares.AutheliaCtx) {
- device := DuoDeviceBody{}
+ bodyJSON := DuoDeviceBody{}
- err := ctx.ParseBody(&device)
- if err != nil {
+ var (
+ userSession session.UserSession
+ err error
+ )
+
+ if err = ctx.ParseBody(&bodyJSON); err != nil {
ctx.Error(err, messageMFAValidationFailed)
return
}
- if !utils.IsStringInSlice(device.Method, duo.PossibleMethods) {
- ctx.Error(fmt.Errorf("unknown method '%s', it should be one of %s", device.Method, strings.Join(duo.PossibleMethods, ", ")), messageMFAValidationFailed)
+ if !utils.IsStringInSlice(bodyJSON.Method, duo.PossibleMethods) {
+ ctx.Error(fmt.Errorf("unknown method '%s', it should be one of %s", bodyJSON.Method, strings.Join(duo.PossibleMethods, ", ")), messageMFAValidationFailed)
return
}
- userSession := ctx.GetSession()
- ctx.Logger.Debugf("Save new preferred Duo device and method of user %s to %s using %s", userSession.Username, device.Device, device.Method)
- err = ctx.Providers.StorageProvider.SavePreferredDuoDevice(ctx, model.DuoDevice{Username: userSession.Username, Device: device.Device, Method: device.Method})
+ if userSession, err = ctx.GetSession(); err != nil {
+ ctx.Error(err, messageMFAValidationFailed)
+ return
+ }
+
+ ctx.Logger.Debugf("Save new preferred Duo device and method of user %s to %s using %s", userSession.Username, bodyJSON.Device, bodyJSON.Method)
+ err = ctx.Providers.StorageProvider.SavePreferredDuoDevice(ctx, model.DuoDevice{Username: userSession.Username, Device: bodyJSON.Device, Method: bodyJSON.Method})
if err != nil {
- ctx.Error(fmt.Errorf("unable to save new preferred Duo device and method: %s", err), messageMFAValidationFailed)
+ ctx.Error(fmt.Errorf("unable to save new preferred Duo device and method: %w", err), messageMFAValidationFailed)
return
}
ctx.ReplyOK()
}
-// SecondFactorDuoDeviceDelete deletes the useres preferred Duo device and method.
-func SecondFactorDuoDeviceDelete(ctx *middlewares.AutheliaCtx) {
- userSession := ctx.GetSession()
+// DuoDeviceDELETE deletes the useres preferred Duo device and method.
+func DuoDeviceDELETE(ctx *middlewares.AutheliaCtx) {
+ var (
+ userSession session.UserSession
+ err error
+ )
+
+ if userSession, err = ctx.GetSession(); err != nil {
+ ctx.Error(fmt.Errorf("unable to get session to delete preferred Duo device and method: %w", err), messageMFAValidationFailed)
+ return
+ }
+
ctx.Logger.Debugf("Deleting preferred Duo device and method of user %s", userSession.Username)
- err := ctx.Providers.StorageProvider.DeletePreferredDuoDevice(ctx, userSession.Username)
- if err != nil {
- ctx.Error(fmt.Errorf("unable to delete preferred Duo device and method: %s", err), messageMFAValidationFailed)
+ if err = ctx.Providers.StorageProvider.DeletePreferredDuoDevice(ctx, userSession.Username); err != nil {
+ ctx.Error(fmt.Errorf("unable to delete preferred Duo device and method: %w", err), messageMFAValidationFailed)
return
}