source: trunk/www/admin/extensions/wizard.jsp @ 7233

Last change on this file since 7233 was 7233, checked in by Nicklas Nordborg, 6 years ago

References #2042: Add support for ignoring an extension or other file in the extensions directory

Implemented support for managing "ignored" files in the installation wizard. The ignored files are listed at the bottom of the table in a separate section (only displayed if there is at least one ignored file).

There are two possible actions: Install and Stop ignore which can be selected and that are processed in the ExtensionsControl and related classes. Since the files are not managed by the ExtensionsManager there is no special "About" information for them. We display the file size and last modification date.

File size: 9.9 KB
Line 
1<%-- $Id:manual_scan.jsp 4187 2008-03-20 11:15:25Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
5  Copyright (C) 2007 Martin Svensson
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  @author Nicklas
25  @version 2.0
26--%>
27<%@ page pageEncoding="UTF-8" session="false"
28  import="net.sf.basedb.core.Application"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.Permission"
33  import="net.sf.basedb.core.plugin.About"
34  import="net.sf.basedb.clients.web.Base"
35  import="net.sf.basedb.clients.web.WebException"
36  import="net.sf.basedb.util.Values"
37  import="net.sf.basedb.clients.web.util.HTML"
38  import="net.sf.basedb.util.formatter.Formatter"
39  import="net.sf.basedb.util.extensions.ExtensionPoint"
40  import="net.sf.basedb.util.extensions.Extension"
41  import="net.sf.basedb.util.extensions.ExtendedAbout"
42  import="net.sf.basedb.util.extensions.manager.ExtensionsManager"
43  import="net.sf.basedb.util.extensions.manager.ExtensionsFile"
44  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
45  import="net.sf.basedb.clients.web.extensions.UnsafeScriptable"
46  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
47  import="net.sf.basedb.clients.web.servlet.ContentSecurityPolicyFilter"
48  import="java.util.List"
49  import="java.io.File"
50  import="java.util.Date"
51%>
52<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
53<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
54<%
55final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
56final String ID = sc.getId();
57final float scale = Base.getScale(sc);
58DbControl dc = null;
59try
60{
61  Formatter<Date> dateFormatter = FormatterFactory.getDateTimeFormatter(sc);
62 
63  dc = sc.newDbControl();
64  ExtensionsControl ec = ExtensionsControl.get(dc);
65  ec.checkPermission(Permission.WRITE);
66  ec.scanForChanges();
67  List<ExtensionsFile> xtFiles = ec.getFiles();
68  List<File> ignoredFiles = ec.getIgnoredFiles();
69  %>
70  <base:page type="popup" title="Extensions and plug-ins installation wizard">
71  <base:head scripts="table.js,~wizard.js" styles="table.css">
72  <style>
73    .ignored-header td
74    {
75      font-weight: bold;
76      border-top-style: solid;
77      border-bottom-style: solid;
78      border-top-width: 1px;
79      border-bottom-width: 1px;
80      padding: 1px 2px;
81    }
82    .ignored-file td
83    {
84      opacity: 0.5;
85    }
86    .ignored-file .input
87    {
88      opacity: 1;
89    }
90  </style>
91  </base:head>
92  <base:body>
93  <h1>Extensions and plug-ins installation wizard <base:help helpid="extensions.install-wizard" /></h1>
94  <div class="content">
95  <tbl:table id="scan" subclass="fulltable" action="index.jsp" >
96    <tbl:columndef id="file" title="File" />
97    <tbl:columndef id="status" title="Status" style="text-align: center;"/>
98    <tbl:columndef id="install" title="Install" style="text-align: center;"/>
99    <tbl:columndef id="uninstall" title="Uninstall" style="text-align: center;"/>
100    <tbl:columndef id="ignore" title="Ignore" style="text-align: center;" />
101    <tbl:columndef id="about" title="About" />
102 
103    <tbl:data style="top: 0px; margin-top: 0px;">
104      <tbl:headers>
105        <tbl:headerrow>
106          <tbl:columnheaders />
107        </tbl:headerrow>
108      </tbl:headers>
109      <tbl:rows>
110      <%
111      for (ExtensionsFile xtFile : xtFiles)
112      {
113        if (xtFile.getFile() == null) continue; // We skip internal extensions/plug-ins files
114        List<Extension<?>> unsafeExtensions = ec.checkUnsafeScriptableUsage(xtFile);
115       
116        About about = xtFile.getAbout();
117        ExtendedAbout xtAbout = about instanceof ExtendedAbout ? (ExtendedAbout)about : null;
118        Throwable error = null;
119        String name = xtFile.getName();
120        String status = "";
121        String icon = "";
122        boolean allowInstall = false;
123        boolean allowUninstall = false;
124        boolean allowIgnore = false;
125        boolean checkInstall = false;
126        boolean checkUninstall = false;
127        boolean checkIgnore = false;
128        if (!xtFile.exists())
129        {
130          status = "Deleted";
131          allowUninstall = true;
132          checkUninstall = true;
133        }
134        else if (!xtFile.isValid())
135        {
136          status = "Invalid";
137          error = xtFile.getValidationError();
138          if (xtFile.isInstalled())
139          {
140            allowUninstall = true;
141            checkUninstall = true;
142          }
143          allowIgnore = true;
144          checkIgnore = true;
145        }
146        else if (xtFile.isNew())
147        {
148          status = "New";
149          allowInstall = true;
150          allowIgnore = true;
151          checkInstall = true;
152        }
153        else if (xtFile.wasModified())
154        {
155          status = "Modified";
156          allowInstall = true;
157          allowUninstall = true;
158          checkInstall = true;
159        }
160        else if (xtFile.hasError())
161        {
162          status = "Error";
163          allowInstall = true;
164          allowUninstall = true;
165          allowIgnore = true;
166        }
167        else
168        {
169          status = "Already installed";
170          allowInstall = true;
171          allowUninstall = true;
172          allowIgnore = true;
173        }
174        %>
175        <tbl:row>
176          <tbl:cell column="file" style="white-space: nowrap;"><%=name%></tbl:cell>
177          <tbl:cell column="status" style="text-align: center; white-space: nowrap;"><%=status%></tbl:cell>
178          <tbl:cell column="install" style="text-align: center;">
179            <%
180            if (allowInstall)
181            {
182              %>
183              <input type="checkbox" class="auto-init" data-auto-init="install" 
184                name="<%=name%>.install" value="1" <%=checkInstall ? "checked" : "" %>
185                >
186              <%
187            }
188            %>
189          </tbl:cell>
190          <tbl:cell column="uninstall" style="text-align: center;">
191            <%
192            if (allowUninstall)
193            {
194              %>
195              <input type="checkbox" class="auto-init" data-auto-init="uninstall"
196                name="<%=name%>.uninstall" value="1" <%=checkUninstall ? "checked" : "" %>
197                >
198              <%
199            }
200            %>
201          </tbl:cell>
202          <tbl:cell column="ignore" style="text-align: center;">
203            <%
204            if (allowIgnore)
205            {
206              %>
207              <input type="checkbox" class="auto-init" data-auto-init="ignore"
208                name="<%=name%>.ignore" value="1" <%=checkIgnore ? "checked" : "" %>
209                >
210              <%
211            }
212            %>
213          </tbl:cell>
214          <tbl:cell column="about">
215            <%
216            if (about != null)
217            {
218              %>
219              <b><%=HTML.encodeTags(about.getName())%></b> <%=about.getVersion() == null ? "" : "(v" + about.getVersion() + ")"%><br>
220              <%=HTML.encodeTags(about.getDescription())%><br>
221              <%=HTML.niceFormat(about.getUrl())%>
222              <%
223            }
224            if (unsafeExtensions.size() > 0)
225            {
226              %>
227              <div class="messagecontainer note">
228                <base:icon image="warning.png" />
229                This plug-in contain <%=unsafeExtensions.size()%> extension(s) that
230                may violate the <b>Content Security Policy</b> setting on this server.
231                See BASE documentation for more information.
232              </div>
233              <%
234            }
235            if (error != null)
236            {
237              %>
238              <div class="messagecontainer error">
239              <%=error.getClass().getSimpleName()%>: <%=HTML.encodeTags(error.getMessage())%>
240              </div>
241              <%
242            }
243            %>
244          </tbl:cell>
245         
246        </tbl:row>
247        <%
248      }
249      if (ignoredFiles.size() > 0)
250      {
251        %>
252        <tr class="ignored-header bg-filled-100">
253          <td colspan="2">Ignored files (<%=ignoredFiles.size() %>)</td>
254          <td class="cell" style="text-align: center;">Install</td>
255          <td class="cell" ></td>
256          <td  class="cell" style="text-align: center;">Stop ignoring</td>
257          <td class="cell"></td>
258        </tr>
259        <%
260        for (File ignoredFile : ignoredFiles)
261        {
262          String name = ignoredFile.getName();
263          String fileInfo = "";
264          boolean checkStopIgnore = false;
265          boolean allowInstall = true;
266          if (ignoredFile.isFile())
267          {
268            fileInfo = Values.formatBytes(ignoredFile.length());
269            fileInfo += "; " + dateFormatter.format(new Date(ignoredFile.lastModified()));
270          }
271          else
272          {
273            fileInfo = "File does not exist.";
274            checkStopIgnore = true;
275            allowInstall = false;
276          }
277          %>
278          <tbl:row clazz="ignored-file">
279            <tbl:cell column="file" style="white-space: nowrap;"><%=name%></tbl:cell>
280            <tbl:cell column="status" style="text-align: center; white-space: nowrap;">Ignored</tbl:cell>
281            <tbl:cell clazz="cell input" column="install" style="text-align: center;">
282              <%
283              if (allowInstall)
284              {
285                %>
286                <input type="checkbox" class="auto-init" data-auto-init="install" 
287                  name="<%=name%>.install" value="1">
288                <%
289              }
290              %>
291            </tbl:cell>
292            <tbl:cell clazz="cell input" column="ignore" style="text-align: center;">
293              <input type="checkbox" class="auto-init" data-auto-init="stop-ignore"
294                name="<%=name%>.stopignore" value="1" <%=checkStopIgnore ? "checked" : "" %>>
295            </tbl:cell>
296            <tbl:cell column="about"><%=HTML.encodeTags(fileInfo) %></tbl:cell>
297          </tbl:row>
298          <%
299        }
300      }
301      %>
302      </tbl:rows>
303    </tbl:data>
304  </tbl:table>
305  </div>
306
307  <base:buttongroup subclass="dialogbuttons">
308    <base:button id="startScan" title="Next" />
309    <base:button id="close" title="Cancel" />
310  </base:buttongroup>
311 
312  </base:body>
313  </base:page>
314  <%
315}
316finally
317{
318  if (dc != null) dc.close();
319}
320%>
Note: See TracBrowser for help on using the repository browser.