source: trunk/www/main.jsp @ 7540

Last change on this file since 7540 was 7540, checked in by Nicklas Nordborg, 3 years ago

References #2131: Add support for installing multiple authentication managers

Updated the error handling for NotLoggedIn exceptions. The existing solution didn't work well with multiple authentication manages since switching between them reloads the login form. This causes other context information to be lost.

The new solution only display an error message with a link that opens the login dialog in a popup window. Once the login has been completed the page with the error message is reloaded and hopefully the original action can be completed.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.6 KB
Line 
1<%-- $Id: main.jsp 7540 2018-12-03 08:11:18Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
5  Copyright (C) 2007 Nicklas Nordborg
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 3
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with BASE. If not, see <http://www.gnu.org/licenses/>.
22  ------------------------------------------------------------------
23
24  This is the front page of BASE. It displays a login form
25  and some of the relevant news items.
26
27  @param login The value to display in the login input field.
28  @param error An error message that should be displayed
29
30  @author Nicklas
31  @version 2.0
32--%>
33<%@ page pageEncoding="UTF-8" session="false"
34  import="net.sf.basedb.core.Application"
35  import="net.sf.basedb.core.SessionControl"
36  import="net.sf.basedb.core.DbControl"
37  import="net.sf.basedb.core.News"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultIterator"
40  import="net.sf.basedb.core.query.Orders"
41  import="net.sf.basedb.core.query.Hql"
42  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
43  import="net.sf.basedb.util.extensions.ActionIterator"
44  import="net.sf.basedb.clients.web.Base"
45  import="net.sf.basedb.clients.web.util.HTML"
46  import="net.sf.basedb.util.formatter.Formatter"
47  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
48  import="net.sf.basedb.clients.web.extensions.JspContext"
49  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
50  import="net.sf.basedb.clients.web.servlet.RssNewsFeed"
51  import="net.sf.basedb.clients.web.extensions.login.LoginFormAction"
52  import="net.sf.basedb.clients.web.extensions.login.FieldInfo"
53  import="net.sf.basedb.clients.web.extensions.login.PasswordLoginFormFactory"
54  import="net.sf.basedb.util.Values"
55  import="java.util.Date"
56  import="java.util.Map"
57  import="java.util.TreeMap"
58%>
59<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
60<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
61<%! 
62// If value is null, return "", else <prefix>+<value>+<suffix>
63String valueIfNotNull(String prefix, String value, String suffix)
64{
65  return value == null ? "" : prefix+value+suffix;
66}
67%>
68<%
69final String login = Values.getString(request.getParameter("login"), "");
70final String error = Values.getString(request.getParameter("error"), null);
71final boolean again = Values.getBoolean(request.getParameter("again"));
72final String requestedLoginForm = Values.getString(request.getParameter("loginForm"), null);
73final String root = request.getContextPath()+"/";
74
75final SessionControl sc = Base.getSessionControl(pageContext, true);
76final String ID = sc.getId();
77final Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
78final DbControl dc = sc.newDbControl();
79
80try
81{
82  String broadcastTitle = (String)application.getAttribute("broadcast.title");
83  String broadcastMessage = (String)application.getAttribute("broadcast.message");
84  boolean denyLogin = Boolean.TRUE.equals(application.getAttribute("broadcast.deny-login"));
85 
86  ItemResultIterator<News> news = null;
87  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
88  ExtensionsInvoker<LoginFormAction> invoker = (ExtensionsInvoker<LoginFormAction>)ExtensionsControl.useExtensions(jspContext, "net.sf.basedb.clients.web.login-form");
89
90  LoginFormAction loginAction = null;
91  String selectedLoginForm = null;
92  Map<String, String> allForms = new TreeMap<String, String>();
93 
94  ActionIterator<LoginFormAction> it = invoker.iterate();
95  while (it.hasNext())
96  {
97    LoginFormAction action = it.next();
98    if (action != null)
99    {
100      String formId = action.getId();
101      if (formId == null) formId = it.getExtension().getId();
102      String displayName = action.getDisplayName();
103      if (displayName == null) displayName = it.getExtension().getAbout().getName();
104      allForms.put(formId, displayName);
105     
106      if (loginAction == null || formId.equals(requestedLoginForm))
107      {
108        loginAction = action;
109        selectedLoginForm = formId;
110      }
111    }
112  }
113  if (loginAction == null)
114  {
115    loginAction = PasswordLoginFormFactory.INSTANCE;
116    selectedLoginForm = loginAction.getId();
117  }
118
119  FieldInfo loginField = loginAction.getLoginField();
120  FieldInfo passwordField = loginAction.getPasswordField();
121  FieldInfo extraField = loginAction.getExtraField();
122  %>
123  <base:page type="default">
124  <base:head styles="login.css" scripts="~login.js">
125    <ext:scripts context="<%=jspContext%>" />
126    <ext:stylesheets context="<%=jspContext%>" />
127  </base:head>
128  <base:body style="padding-top: 5em;" data-login-form="<%=HTML.encodeTags(selectedLoginForm)%>" data-requested-form="<%=HTML.encodeTags(requestedLoginForm) %>">
129    <form name="login" action="login.jsp" method="post">
130    <input type="hidden" name="ID" value="<%=ID%>">
131    <input type="hidden" name="again" value="<%=again?1:0%>">
132    <input type="hidden" name="useAutoStartPage" value="1">
133    <input type="hidden" name="deviceToken" value="">
134   
135    <table style="margin: auto; max-width: 700px; display: none;" id="the-login-form">
136    <tr>
137    <td>
138      <%
139      if (allForms.size() > 1)
140      {
141        %>
142        <div style="text-align: right; margin-bottom: 0.25em;">
143          <b>Login with</b>
144          <select name="loginForm" id="loginForm" style="min-width: 10em;">
145          <%
146          for (Map.Entry<String, String> entry : allForms.entrySet())
147          {
148            String formId = entry.getKey();
149            %>
150            <option value="<%=formId%>" <%=formId.equals(selectedLoginForm) ? "selected" : ""%>><%=HTML.encodeTags(entry.getValue()) %>
151            <%
152          }
153          %>
154          </select>
155        </div>
156        <%
157      }
158      else if (selectedLoginForm != null)
159      {
160        %>
161        <input type="hidden" name="loginForm" value="<%=selectedLoginForm%>">
162        <%
163      }
164      if (loginAction.getHelp() != null)
165      {
166        %>
167        <div class="messagecontainer help" style="margin-bottom: 1em; font-style: italic;" id="login-help">
168        <%=loginAction.getHelp() %>
169        </div>
170        <%
171      }
172      if (error != null) 
173      {
174        %>
175        <div class="messagecontainer error" style="margin-top: 1em; margin-bottom: 1em;"><%=error%></div>
176        <%
177      }
178      %>
179      <table style="width: 100%; border-collapse: separate;">
180      <tr>
181        <td class="base-logo"><img src="images/baselogo.png" alt="BASE logo"></td>
182        <td style="width: 515px;">
183          <div id="loginform">
184          <table style="width: 100%;">
185            <tr <%=valueIfNotNull("class=\"", loginField.getClazz(), "\"")%> id="login-row">
186              <th class="bg-filled-100"><%=loginField.getPrompt() %></th>
187              <td colspan="2"><input class="text" name="login" id="login"
188                type="<%=loginField.hasHiddenCharacters() ? "password" : "text"%>"
189                value="<%=loginAction.rememberLastLogin() ? HTML.encodeTags(login) : ""%>" 
190                <%=denyLogin ? "disabled" : ""%>
191                <%=valueIfNotNull("style=\"", loginField.getStyle(), "\"") %>
192                <%=valueIfNotNull("title=\"", loginField.getTooltip(), "\"") %>
193                <%=valueIfNotNull("placeholder=\"", loginField.getPlaceHolder(), "\"") %>
194                <%=loginAction.rememberLastLogin() ? "" : "autocomplete=\"off\" data-use-last-login=\"0\""%>
195                maxlength="100" 
196                tabindex="1">
197              </td>
198            </tr>
199            <tr <%=valueIfNotNull("class=\"", passwordField.getClazz(), "\"")%> id="password-row">
200              <th class="bg-filled-100"><%=passwordField.getPrompt() %></th>
201              <td><input class="text" name="password" id="password"
202                type="<%=passwordField.hasHiddenCharacters() ? "password" : "text"%>"
203                <%=denyLogin ? "disabled" : ""%>
204                <%=valueIfNotNull("style=\"", passwordField.getStyle(), "\"") %>
205                <%=valueIfNotNull("title=\"", passwordField.getTooltip(), "\"") %>
206                <%=valueIfNotNull("placeholder=\"", passwordField.getPlaceHolder(), "\"") %>
207                maxlength="80"
208                tabindex="2">
209              </td>
210              <td <%=extraField != null?"rowspan=\"2\"" : "" %> style="vertical-align: bottom;">
211                  <base:buttongroup>
212                    <base:button 
213                      id="btnLogin"
214                      subclass="<%=denyLogin ? "disabled" : ""%>"
215                      image="login.png" title="Login" 
216                      tooltip="<%=HTML.encodeTags(broadcastTitle)%>" tabindex="4" 
217                    />
218                    <base:button 
219                      id="close" title="Cancel" tabindex="5"
220                      visible="<%=again %>"
221                    />
222                  </base:buttongroup>
223              </td>
224            </tr>
225            <%
226            if (extraField != null)
227            {
228              %>
229              <tr <%=valueIfNotNull("class=\"", extraField.getClazz(), "\"")%> id="extra-row">
230                <th class="bg-filled-100"><%=extraField.getPrompt() %></th>
231                <td><input class="text" name="extraField" id="extraField"
232                  type="<%=extraField.hasHiddenCharacters() ? "password" : "text"%>"
233                  <%=denyLogin ? "disabled" : ""%>
234                  <%=valueIfNotNull("style=\"", extraField.getStyle(), "\"") %>
235                  <%=valueIfNotNull("title=\"", extraField.getTooltip(), "\"") %>
236                  <%=valueIfNotNull("placeholder=\"", extraField.getPlaceHolder(), "\"") %>
237                  maxlength="80"
238                  tabindex="3">
239                </td>
240              </tr>
241              <%
242            }
243            %>
244            <tr>
245              <th class="bg-filled-100 subprompt"></th>
246              <td colspan="2">
247              <%
248              String forgotPassword = sc.getClientDefaultSetting("server.forgotten.password");
249              String getAccount = sc.getClientDefaultSetting("server.get.account");
250              if (forgotPassword != null)
251              {
252                %>
253                <base:icon id="forgotPassword" image="bullet.png" 
254                  tooltip="Click here if you have forgotten your password">Forgot your password?</base:icon>
255                <%
256              }
257              if (getAccount != null)
258              {
259                %>
260                <base:icon id="getAccount" image="bullet.png" 
261                  tooltip="Click here if you want to get an account on this server">Get an account!</base:icon>
262                <%
263              }
264              %>
265              </td>
266            </tr>
267            </table>
268          </div>
269        </td>
270      </tr>
271      </table>
272      <%
273      if (denyLogin)
274      {
275        %>
276        <div class="messagecontainer help" id="denyLogin">
277          <b><%=HTML.encodeTags(broadcastTitle) %> (login disabled)</b><br>
278          <%=HTML.niceFormat(broadcastMessage)%>
279          <base:buttongroup style="margin-top: 1em;">
280            <base:button id="btnLoginAnyway" title="Login anyway" image="login.png" tooltip="At your own risk!" />
281          </base:buttongroup>
282        </div>
283        <%
284      }
285      if (!again)
286      {
287        String aboutServer = sc.getClientDefaultSetting("server.about");
288        if (aboutServer != null)
289        {
290          %>
291          <h3 style="margin-top: 1em;">About this server</h3>
292          <p>
293            <%=aboutServer%>
294          </p>
295          <base:icon id="aboutServer" image="bullet.png">More about this server</base:icon>
296          <%
297        }
298        %>
299        <h3 style="margin-top: 1em;">News and announcements
300        <%
301        if (RssNewsFeed.isEnabled()) 
302        {
303          %>
304          <a href="info/news.rss" 
305            title="Subscribe to news from this BASE server"
306            ><base:icon image="rss.png" style="float: right;" /></a>
307          <%
308        }
309        %>
310        </h3>
311        <div id="news" class="news">
312        <%
313        if (broadcastTitle != null)
314        {
315          %>
316          <div class="item note sticky">
317            <div class="headline">
318              <span class="date"><%=dateFormatter.format(new Date())%></span>
319              <%=HTML.encodeTags(broadcastTitle)%><%=denyLogin ? " (login disabled)" : "" %>
320            </div>
321            <div class="text"><%=HTML.niceFormat(broadcastMessage)%></div>
322          </div>
323          <% 
324        }
325       
326        ItemQuery<News> query = News.getQuery();
327        query.order(Orders.desc(Hql.property("sticky")));
328        query.order(Orders.desc(Hql.property("newsDate")));
329        query.order(Orders.desc(Hql.property("id")));
330        query.setCacheResult(true);
331        query.setReturnTotalCount(true);
332        news = query.iterate(dc);
333        int numListed = 0;
334        while (news.hasNext())
335        {
336          News n = news.next();
337          if (numListed >= 10 && !n.isSticky()) break;
338          %>
339          <div class="item <%=n.isSticky() ? "note sticky" : ""%>">
340            <div class="headline">
341              <span class="date"><%=dateFormatter.format(n.getNewsDate())%></span>
342              <%=HTML.encodeTags(n.getName())%>
343            </div>
344            <div class="text"><%=HTML.niceFormat(n.getDescription())%></div>
345          </div>
346          <%
347          numListed++;
348        }
349        if (numListed < news.getTotalCount())
350        {
351          %>
352          <base:icon image="bullet.png" /><a href="info/news.jsp" 
353            title="Show older news..."><%=news.getTotalCount()-numListed%> more</a>
354          <%
355        }
356        %>
357        </div>
358        <%
359      }
360      %>
361    </td>
362    </tr>
363    </table>
364
365    </form>
366  </base:body>
367  </base:page>
368  <%
369}
370finally
371{
372  if (dc != null) dc.close();
373}
374%>
375
Note: See TracBrowser for help on using the repository browser.