source: trunk/www/main.jsp @ 7815

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

References #2213: Extend registration of devices

A device is now registered without verification.

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