summaryrefslogtreecommitdiff
path: root/internal/handlers/handler_sign_duo.go
diff options
context:
space:
mode:
authorClement Michaud <clement.michaud34@gmail.com>2019-11-17 11:47:07 +0100
committerClément Michaud <clement.michaud34@gmail.com>2019-11-17 16:30:33 +0100
commit3b2d733367c88621e4178301f2bcb4bc03613eee (patch)
tree41ac41fc5b6cece04db85a08bfa7c32a022f7354 /internal/handlers/handler_sign_duo.go
parenta06b69dd458e756f1a3d6867eb5b9f54560e2ee1 (diff)
Move source code into internal directory to follow standard project layout.
https://github.com/golang-standards/project-layout
Diffstat (limited to 'internal/handlers/handler_sign_duo.go')
-rw-r--r--internal/handlers/handler_sign_duo.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/internal/handlers/handler_sign_duo.go b/internal/handlers/handler_sign_duo.go
new file mode 100644
index 000000000..eee49df4f
--- /dev/null
+++ b/internal/handlers/handler_sign_duo.go
@@ -0,0 +1,71 @@
+package handlers
+
+import (
+ "fmt"
+ "net/url"
+
+ "github.com/clems4ever/authelia/internal/authentication"
+ "github.com/clems4ever/authelia/internal/duo"
+ "github.com/clems4ever/authelia/internal/middlewares"
+)
+
+// SecondFactorDuoPost handler for sending a push notification via duo api.
+func SecondFactorDuoPost(duoAPI duo.API) middlewares.RequestHandler {
+ return func(ctx *middlewares.AutheliaCtx) {
+ var requestBody signDuoRequestBody
+ err := ctx.ParseBody(&requestBody)
+
+ if err != nil {
+ ctx.Error(err, mfaValidationFailedMessage)
+ return
+ }
+
+ userSession := ctx.GetSession()
+
+ values := url.Values{}
+ // { username, ipaddr: clientIP, factor: "push", device: "auto", pushinfo: `target%20url=${targetURL}`}
+ values.Set("username", userSession.Username)
+ values.Set("ipaddr", ctx.RemoteIP().String())
+ values.Set("factor", "push")
+ values.Set("device", "auto")
+ if requestBody.TargetURL != "" {
+ values.Set("pushinfo", fmt.Sprintf("target%%20url=%s", requestBody.TargetURL))
+ }
+
+ duoResponse, err := duoAPI.Call(values)
+ if err != nil {
+ ctx.Error(fmt.Errorf("Duo API errored: %s", err), mfaValidationFailedMessage)
+ return
+ }
+
+ if duoResponse.Response.Result != "allow" {
+ ctx.ReplyUnauthorized()
+ return
+ }
+
+ userSession.AuthenticationLevel = authentication.TwoFactor
+ err = ctx.SaveSession(userSession)
+
+ if err != nil {
+ ctx.Error(fmt.Errorf("Unable to update authentication level with Duo: %s", err), mfaValidationFailedMessage)
+ return
+ }
+
+ if requestBody.TargetURL != "" {
+ targetURL, err := url.ParseRequestURI(requestBody.TargetURL)
+
+ if err != nil {
+ ctx.Error(fmt.Errorf("Unable to parse target URL: %s", err), mfaValidationFailedMessage)
+ return
+ }
+
+ if targetURL != nil && isRedirectionSafe(*targetURL, ctx.Configuration.Session.Domain) {
+ ctx.SetJSONBody(redirectResponse{Redirect: requestBody.TargetURL})
+ } else {
+ ctx.ReplyOK()
+ }
+ } else {
+ ctx.ReplyOK()
+ }
+ }
+}