1   package com.atlassian.security.auth.trustedapps.filter;
2   
3   import com.atlassian.security.auth.trustedapps.TransportErrorMessage;
4   import com.atlassian.security.auth.trustedapps.Null;
5   
6   import javax.servlet.http.HttpServletRequest;
7   import javax.servlet.http.HttpServletResponse;
8   import java.security.Principal;
9   
10  /**
11   * Authenticate a TrustedApplication request
12   */
13  public interface Authenticator
14  {
15      Result authenticate(HttpServletRequest request, HttpServletResponse response);
16  
17      static class Result
18      {
19          private final Result.Status status;
20          private final TransportErrorMessage message;
21          private final Principal user;
22  
23          Result(Result.Status status)
24          {
25              this(status, null, null);
26          }
27  
28          Result(Result.Status status, TransportErrorMessage message)
29          {
30              this(status, message, null);
31  
32              Null.not("message", message);
33          }
34  
35          Result(Result.Status status, Principal principal)
36          {
37              this(status, null, principal);
38  
39              Null.not("principal", principal);
40          }
41  
42          Result(Result.Status status, TransportErrorMessage message, Principal user)
43          {
44              if (status == null)
45              {
46                  throw new IllegalArgumentException("status");
47              }
48              this.status = status;
49              this.message = message;
50              this.user = user;
51          }
52  
53          public Result.Status getStatus()
54          {
55              return status;
56          }
57  
58          public String getMessage()
59          {
60              return message.toString();
61          }
62  
63          public Principal getUser()
64          {
65              return user;
66          }
67  
68          static final class Status
69          {
70              /**
71               * Necessary to declare these as int constants as javac is too dumb to realise that a final member of a
72               * final class's static constants is a constant
73               */
74              static final class Constants
75              {
76                  static final int SUCCESS = 0;
77                  static final int FAILED = 1;
78                  static final int ERROR = 2;
79                  static final int NO_ATTEMPT = 3;
80              }
81  
82              static final Result.Status SUCCESS = new Result.Status(Result.Status.Constants.SUCCESS, "success");
83              static final Result.Status FAILED = new Result.Status(Result.Status.Constants.FAILED, "failed");
84              static final Result.Status ERROR = new Result.Status(Result.Status.Constants.ERROR, "error");
85              static final Result.Status NO_ATTEMPT = new Result.Status(Result.Status.Constants.NO_ATTEMPT, "no attempt");
86  
87              private final int ordinal;
88              private final String name;
89  
90              private Status(int ordinal, String name)
91              {
92                  this.ordinal = ordinal;
93                  this.name = name;
94              }
95  
96              int getOrdinal()
97              {
98                  return ordinal;
99              }
100 
101             public String toString()
102             {
103                 return name;
104             }
105         }
106 
107         public static final class NoAttempt extends Result
108         {
109             NoAttempt()
110             {
111                 super(Status.NO_ATTEMPT);
112             }
113         }
114 
115         public static final class Error extends Result
116         {
117             Error(TransportErrorMessage message)
118             {
119                 super(Status.ERROR, message);
120             }
121         }
122 
123         public static final class Failure extends Result
124         {
125             Failure(TransportErrorMessage message)
126             {
127                 super(Status.FAILED, message);
128             }
129         }
130 
131         public static final class Success extends Result
132         {
133             private final String signedRequestUrl;
134             
135             public Success(Principal principal)
136             {
137                 super(Status.SUCCESS, principal);
138                 this.signedRequestUrl = null;
139             }
140             
141             public Success(Principal principal, String signedRequestUrl)
142             {
143                 super(Status.SUCCESS, principal);
144                 this.signedRequestUrl = signedRequestUrl;
145             }
146             
147             public String getSignedUrl()
148             {
149                 return signedRequestUrl;
150             }
151         }
152     }
153 }