source: branches/3.18-stable/www/views/sessions/list_sessions.jsp @ 7944

Last change on this file since 7944 was 7944, checked in by Nicklas Nordborg, 9 months ago

Fixes #2249: View Sessions and View Devices fail to display anything

The problem was that the "Owned by others" option had been enabled when the "Administrator" role was active. Then, when de-activating the "Administrator" role, the permission system notices that the user lacks the "Owned by others" permissions and applies a "denyAll" filter. The reason for this is that there is no "owned by me" filter defined for Session and Device items, so this is added to HibernateUtil.addFilterConditions(). Also realized that the Messages item has a similar underlying problem (except that it can never be triggered from the GUI since there is no "Owned by others" option for administrators to view messages for other users). To make everything work a QueryRuntimeFilter implementation is needed for Sessions, Devices and Messages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 14.5 KB
Line 
1<%-- $Id: list_sessions.jsp 7944 2021-05-06 08:51:19Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.Session"
31  import="net.sf.basedb.core.User"
32  import="net.sf.basedb.core.ItemQuery"
33  import="net.sf.basedb.core.Include"
34  import="net.sf.basedb.core.ItemResultIterator"
35  import="net.sf.basedb.core.ItemResultList"
36  import="net.sf.basedb.core.ItemContext"
37  import="net.sf.basedb.core.Permission"
38  import="net.sf.basedb.core.PluginDefinition"
39  import="net.sf.basedb.core.PermissionDeniedException"
40  import="net.sf.basedb.core.query.Hql"
41  import="net.sf.basedb.core.query.Restrictions"
42  import="net.sf.basedb.core.query.Expressions"
43  import="net.sf.basedb.core.plugin.GuiContext"
44  import="net.sf.basedb.core.plugin.Plugin"
45  import="net.sf.basedb.util.Enumeration"
46  import="net.sf.basedb.clients.web.Base"
47  import="net.sf.basedb.clients.web.ModeInfo"
48  import="net.sf.basedb.clients.web.PermissionUtil"
49  import="net.sf.basedb.clients.web.util.HTML"
50  import="net.sf.basedb.util.EmailUtil"
51  import="net.sf.basedb.util.GeoLocation"
52  import="net.sf.basedb.util.Values"
53  import="net.sf.basedb.util.formatter.Formatter"
54  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
55  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
56  import="net.sf.basedb.clients.web.extensions.JspContext"
57  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
58  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
59  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
60  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
61  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
62  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
63  import="java.util.List"
64  import="java.util.Map"
65  import="java.util.Date"
66%>
67<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
68<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
69<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
70<%!
71  private static final Item itemType = Item.SESSION;
72  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
73%>
74<%
75final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
76final String ID = sc.getId();
77final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
78final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
79
80final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
81final String callback = request.getParameter("callback");
82final String title = mode.generateTitle("session", "sessions");
83final DbControl dc = sc.newDbControl();
84ItemResultIterator<Session> sessions = null;
85try
86{
87  final User user = User.getById(dc, sc.getLoggedInUserId());
88
89  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
90  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
91  try
92  {
93    final ItemQuery<Session> query = Base.getConfiguredQuery(dc, cc, jspContext, true, Session.getQuery(null), mode);
94    cc.setMessage(query.toQl(dc));
95    sessions = query.iterate(dc);
96  }
97  catch (Throwable t)
98  {
99    cc.setMessage(t.getMessage());
100  }
101  int numListed = 0;
102  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
103  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
104  ExtensionsInvoker<ListColumnAction<Session,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
105  %>
106  <base:page title="<%=title==null ? "Sessions" : title%>" type="<%=mode.getPageType()%>" id="list-page">
107  <base:head scripts="table.js,~sessions.js" styles="table.css,toolbar.css">
108    <ext:scripts context="<%=jspContext%>" />
109    <ext:stylesheets context="<%=jspContext%>" />
110  </base:head>
111 
112  <base:body>
113    <h1><%=title==null ? "Sessions" : title%></h1>
114    <div class="content">
115    <tbl:table 
116      id="sessions" 
117      columns="<%=cc.getSetting("columns")%>"
118      sortby="<%=cc.getSortProperty()%>" 
119      direction="<%=cc.getSortDirection()%>"
120      action="index.jsp"
121      sc="<%=sc%>"
122      item="<%=itemType%>"
123      filterrows="<%=cc.getFilterRows()%>"
124      subclass="fulltable"
125      stickyheaders="loginTime"
126      >
127      <tbl:hidden 
128        name="mode" 
129        value="<%=mode.getName()%>" 
130      />
131      <tbl:hidden 
132        name="callback" 
133        value="<%=callback%>" 
134        skip="<%=callback == null%>" 
135      />
136      <tbl:columndef 
137        id="id"
138        clazz="uniquecol"
139        property="id"
140        datatype="int"
141        title="ID"
142        sortable="true"
143        filterable="true"
144        exportable="true"
145      />
146      <tbl:columndef 
147        id="loginTime"
148        property="loginTime"
149        datatype="timestamp"
150        title="Login time"
151        sortable="true" 
152        filterable="true"
153        exportable="true"
154        show="always" 
155      />
156      <tbl:columndef 
157        id="logoutTime"
158        property="logoutTime"
159        datatype="timestamp"
160        title="Logout time"
161        sortable="true" 
162        filterable="true"
163        exportable="true"
164        formatter="<%=dateTimeFormatter%>"
165      />
166      <tbl:columndef 
167        id="impersonated"
168        property="impersonated"
169        datatype="boolean"
170        title="Impersonated"
171        sortable="true" 
172        filterable="true"
173        exportable="true"
174      />
175      <tbl:columndef 
176        id="client"
177        property="client.name"
178        datatype="string"
179        title="Client application" 
180        sortable="true" 
181        filterable="true" 
182        exportable="true"
183      />
184      <tbl:columndef 
185        id="device"
186        property="device.name"
187        datatype="string"
188        title="Device" 
189        sortable="true" 
190        filterable="true" 
191        exportable="true"
192      />
193      <tbl:columndef 
194        id="authenticationMethod"
195        property="authenticationMethod"
196        datatype="string"
197        title="Authentication method" 
198        sortable="true" 
199        filterable="true" 
200        exportable="true"
201      />
202      <tbl:columndef 
203        id="remoteId"
204        property="remoteId"
205        datatype="string"
206        title="Remote ID" 
207        sortable="true" 
208        filterable="true" 
209        exportable="true"
210      />
211      <tbl:columndef 
212        id="location"
213        property="location"
214        datatype="string"
215        title="Location" 
216        sortable="true" 
217        filterable="true" 
218        exportable="true"
219      />
220      <tbl:columndef 
221        id="comment"
222        property="loginComment"
223        datatype="string"
224        title="Comment" 
225        sortable="true" 
226        filterable="true" 
227        exportable="true"
228      />
229      <tbl:columndef 
230        id="user"
231        property="user.name"
232        datatype="string"
233        title="User" 
234        sortable="true" 
235        filterable="true" 
236        exportable="true"
237      />
238      <tbl:columndef
239        id="permission"
240        title="Permission"
241      />
242      <tbl:columndef 
243        id="xt-columns" 
244        extensions="<%=columnsInvoker%>" 
245        jspcontext="<%=jspContext%>" 
246      />
247      <div class="panelgroup bg-filled-50 bottomborder">
248        <tbl:toolbar
249          subclass="bottomborder"
250          visible="<%=mode.hasToolbar()%>"
251          >
252          <tbl:button 
253            id="btnColumns"
254            image="columns.png" 
255            title="Columns&hellip;" 
256            tooltip="Show, hide and re-order columns" 
257          />
258          <tbl:button 
259            id="btnExport"
260            data-plugin-type="EXPORT"
261            image="export.png" 
262            title="Export&hellip;" 
263            tooltip="Export data" 
264            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
265          />
266          <tbl:button 
267            id="btnRunPlugin"
268            data-plugin-type="OTHER"
269            image="runplugin.png" 
270            title="Run plugin&hellip;" 
271            tooltip="Run a plugin" 
272            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
273          />
274          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
275            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
276        </tbl:toolbar>
277        <tbl:panel>
278          <tbl:presetselector />
279          <tbl:navigator
280            page="<%=cc.getPage()%>" 
281            rowsperpage="<%=cc.getRowsPerPage()%>" 
282            totalrows="<%=sessions == null ? 0 : sessions.getTotalCount()%>" 
283            visible="<%=mode.hasNavigator()%>"
284          />
285        </tbl:panel>
286      </div>
287      <tbl:data>
288        <tbl:headers>
289          <tbl:headerrow>
290            <tbl:header clazz="row-index bg-filled-100" />
291            <tbl:columnheaders />
292          </tbl:headerrow>
293          <%
294          int numFilters = cc.getNumPropertyFilters();
295          int numRows = cc.getFilterRows();
296          for (int filterNo = 0; filterNo < numRows; filterNo++)
297          {
298            boolean lastRow = filterNo == numRows-1;
299            %>
300            <tbl:headerrow>
301              <tbl:header subclass="row-index bg-filled-100">
302                <div class="index-<%=mode.getName()%>">
303                  <div class="index"></div>
304                  <div class="check">
305                    <base:icon 
306                      subclass="link table-check"
307                      image="check_uncheck.png" 
308                      tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
309                      visible="<%=lastRow && mode.hasCheck()%>"
310                    />
311                  </div>
312                  <div class="icons">
313                    <base:icon
314                      subclass="link table-filter-row-action"
315                      image="add.png"
316                      tooltip="Add extra filter row"
317                      visible="<%=lastRow%>"
318                    /><base:icon
319                      subclass="link table-filter-row-action"
320                      image="remove.png"
321                      tooltip="Remove this filter row"
322                      visible="<%=numRows > 1 || numFilters > 0 %>"
323                      data-remove-row="<%=filterNo%>"
324                    />
325                  </div>
326                </div>
327              </tbl:header>
328              <tbl:propertyfilter row="<%=filterNo%>" />
329            </tbl:headerrow>
330            <%
331          }
332          %>
333          <tbl:columnsubtitles />
334        </tbl:headers>
335        <tbl:rows>
336          <%
337          if (cc.getMessage() != null)
338          {
339            %>
340            <tbl:panel subclass="bg-filled-50">
341              <div class="messagecontainer error"><%=cc.getMessage()%></div>
342            </tbl:panel>
343            <%
344            cc.setMessage(null);
345          }
346          int index = cc.getPage()*cc.getRowsPerPage();
347          int selectedItemId = cc.getId();
348          if (sessions != null)
349          {
350            String tooltip = mode.isSelectionMode() ?
351              "Select this item" : "View this item";
352            while (sessions.hasNext())
353            {
354              Session item = sessions.next();
355              int itemId = item.getId();
356              String name = "TODO";
357              index++;
358              numListed++;
359              %>
360              <tbl:row>
361                <tbl:header clazz="row-index bg-filled-100">
362                  <div class="index-<%=mode.getName()%>">
363                    <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
364                    <div class="check">
365                      <base:input
366                        type="checkbox" 
367                        name="<%=itemId%>" 
368                        value="<%=itemId%>" 
369                        title="<%=name%>" 
370                        checked="<%=cc.getSelected().contains(itemId)%>"
371                        visible="<%=mode.hasCheck()%>"
372                      />
373                      <base:input 
374                        type="radio" 
375                        name="item_id" 
376                        value="<%=itemId%>" 
377                        title="<%=name%>" 
378                        checked="<%=selectedItemId == itemId%>"
379                        visible="<%=mode.hasRadio()%>"
380                      />
381                    </div>
382                    <div class="icons"></div>
383                  </div>
384                </tbl:header>
385                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
386                <tbl:cell column="loginTime"><div 
387                  class="link table-item"
388                  data-item-id="<%=itemId%>"
389                  data-no-edit="1"
390                  tabindex="0"
391                  title="<%=tooltip%>"><%=dateTimeFormatter.format(item.getLoginTime())%></div></tbl:cell>
392                <tbl:cell column="logoutTime" value="<%=item.getLogoutTime()%>" />
393                <tbl:cell column="impersonated"><%=item.getImpersonated()%></tbl:cell>
394                <tbl:cell column="authenticationMethod"><%=HTML.encodeTags(item.getAuthenticationMethod())%></tbl:cell>
395                <tbl:cell column="remoteId"><%=HTML.encodeTags(item.getRemoteId())%></tbl:cell>
396                <tbl:cell column="location"><%=HTML.encodeTags(item.getLocation())%>
397                  <% String mapURL = GeoLocation.getURLToMap(item.getLocationLatitude(), item.getLocationLongitude()); %>
398                  <base:icon href="<%=mapURL%>" image="map.png" tooltip="Show map" visible="<%=mapURL != null %>"/>               
399                </tbl:cell>
400                <tbl:cell column="comment"><%=HTML.encodeTags(item.getLoginComment())%></tbl:cell>
401                <tbl:cell column="user"
402                  ><base:propertyvalue 
403                    item="<%=item%>" 
404                    property="user"
405                    enableEditLink="<%=mode.hasEditLink()%>" 
406                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
407                  /></tbl:cell>
408                <tbl:cell column="client"
409                  ><base:propertyvalue 
410                    item="<%=item%>" 
411                    property="client"
412                    enableEditLink="<%=mode.hasEditLink()%>" 
413                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
414                  /></tbl:cell>
415                <tbl:cell column="device"
416                  ><base:propertyvalue 
417                    item="<%=item%>" 
418                    property="device"
419                    nulltext="<i>- unknown -</i>"
420                    enableEditLink="<%=mode.hasEditLink()%>" 
421                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
422                  /></tbl:cell>
423                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
424                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
425                  <tbl:cell column="xt-columns" />
426                </tbl:xt-cells>
427            </tbl:row>
428            <%
429            }
430          }
431          if (numListed == 0)
432          {
433            %>
434            <tbl:panel subclass="bg-filled-50">
435              <div class="messagecontainer note">
436              <%=sessions == null || sessions.getTotalCount() == 0 ? "No sessions were found" : "No sessions on this page. Please select another page!" %>
437              </div>
438            </tbl:panel>
439            <%
440          }
441          %>
442        </tbl:rows>
443      </tbl:data>
444    </tbl:table>
445    </div>
446   
447    <base:buttongroup subclass="dialogbuttons">
448      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
449      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
450      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
451    </base:buttongroup>
452   
453  </base:body>
454  </base:page>
455  <%
456}
457finally
458{
459  if (sessions != null) sessions.close();
460  if (dc != null) dc.close();
461}
462%>
Note: See TracBrowser for help on using the repository browser.