summaryrefslogtreecommitdiff
path: root/src/com/p4square/grow/frontend/LoginFormAuthenticator.java
blob: d5a3c22dfa1c696134c6d8f783dfbdc97748b614 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright 2013 Jesse Morgan
 */

package com.p4square.grow.frontend;

import org.apache.log4j.Logger;

import org.restlet.Context;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.data.ChallengeResponse;
import org.restlet.data.ChallengeScheme;
import org.restlet.data.Form;
import org.restlet.data.Reference;
import org.restlet.security.Authenticator;
import org.restlet.security.Verifier;

/**
 * LoginFormAuthenticator changes 
 *
 *
 * @author Jesse Morgan <jesse@jesterpm.net>
 */
public class LoginFormAuthenticator extends Authenticator {
    private static final Logger LOG = Logger.getLogger(LoginFormAuthenticator.class);

    private final Verifier mVerifier;

    private String mLoginPage    = "/login.html";
    private String mLoginPostUrl = "/authenticate";
    private String mDefaultRedirect = "/index.html";

    public LoginFormAuthenticator(Context context, boolean optional, Verifier verifier) {
        super(context, false, optional, null);

        mVerifier = verifier;
    }

    public void setLoginFormUrl(String url) {
        mLoginPage = url;
    }

    public void setLoginPostUrl(String url) {
        mLoginPostUrl = url;
    }

    @Override
    protected int beforeHandle(Request request, Response response) {
        if (request.getClientInfo().isAuthenticated()) {
            // TODO: Logout
            LOG.debug("Already authenticated. Skipping");
            return CONTINUE;

        } else {
            return super.beforeHandle(request, response);
        }
    }


    @Override
    protected boolean authenticate(Request request, Response response) {
        String requestPath = request.getResourceRef().getPath();
        boolean isLoginAttempt = mLoginPostUrl.equals(requestPath);

        Form query = request.getOriginalRef().getQueryAsForm();
        String redirect = query.getFirstValue("redirect");
        if (redirect == null) {
            if (isLoginAttempt) {
                redirect = mDefaultRedirect;
            } else {
                redirect = request.getResourceRef().getRelativePart();
            }
        }

        boolean authenticationFailed = false;

        if (isLoginAttempt) {
            LOG.debug("Attempting authentication");

            // Process login form
            final Form form = new Form(request.getEntity());
            final String email = form.getFirstValue("email");
            final String password = form.getFirstValue("password");

            boolean authenticated = false;

            if (email != null && !"".equals(email) &&
                password != null && !"".equals(password)) {

                LOG.debug("Got login request from " + email);

                request.setChallengeResponse(
                    new ChallengeResponse(ChallengeScheme.HTTP_BASIC, email, password.toCharArray()));

                // We expect the verifier to setup the User object.
                int result = mVerifier.verify(request, response);
                if (result == Verifier.RESULT_VALID) {
                    // TODO: Ensure redirect is a relative url.
                    response.redirectSeeOther(redirect);
                    return true;
                }
            }

            authenticationFailed = true;
        }

        if (!isOptional() || authenticationFailed) {
            Reference ref = new Reference(mLoginPage);
            ref.addQueryParameter("redirect", redirect);

            if (authenticationFailed) {
                ref.addQueryParameter("retry", "t");
            }

            LOG.debug("Redirecting to " + ref.toString());
            response.redirectSeeOther(ref.toString());
        }
        LOG.debug("Failing authentication.");
        return false;
    }
}