source: branches/3.13-stable/www/admin/extensions/wizard.jsp @ 7508

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

Fixes #2128: Extension installation wizard wants to uninstall an updated extension

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