Changeset 35bb8c5


Ignore:
Timestamp:
Aug 7, 2014 7:06:41 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
5064199
Parents:
79fe799
Message:

Plugins: partial SU3 support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java

    r79fe799 r35bb8c5  
    176176                return;
    177177            }
    178             File tempDir = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + "-unzip");
    179             if (!FileUtil.extractZip(to, tempDir, Log.ERROR)) {
    180                 f.delete();
    181                 to.delete();
    182                 FileUtil.rmdir(tempDir, false);
    183                 statusDone("<b>" + _("Plugin from {0} is corrupt", url) + "</b>");
    184                 return;
    185             }
    186             File installProps = new File(tempDir, "plugin.config");
    187             Properties props = new OrderedProperties();
    188             try {
    189                 DataHelper.loadProps(props, installProps);
    190             } catch (IOException ioe) {
    191                 f.delete();
    192                 to.delete();
    193                 FileUtil.rmdir(tempDir, false);
    194                 statusDone("<b>" + _("Plugin from {0} does not contain the required configuration file", url) + "</b>");
    195                 return;
    196             }
    197             // we don't need this anymore, we will unzip again
    198             FileUtil.rmdir(tempDir, false);
     178            Properties props = getPluginConfig(f, to, url);
     179            if (props == null)
     180                return;
    199181
    200182            // ok, now we check sigs and deal with a bad sig
     
    260242            String sudVersion = TrustedUpdate.getVersionString(f);
    261243            f.delete();
    262             processFinal(to, appDir, tempDir, url, props, sudVersion, pubkey, signer);
     244            processFinal(to, appDir, url, props, sudVersion, pubkey, signer);
    263245        }
    264246
     
    267249         */
    268250        private void processSU3(File f, File appDir, String url) {
    269             // TODO
     251            SU3File su3 = new SU3File(_context, f);
     252            File to = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + ZIP);
     253            String sudVersion;
     254            String signingKeyName;
     255            try {
     256                su3.verifyAndMigrate(to);
     257                sudVersion = su3.getVersionString();
     258                signingKeyName = su3.getSignerString();
     259            } catch (IOException ioe) {
     260                statusDone("<b>" + ioe + ' ' + _("from {0}", url) + " </b>");
     261                f.delete();
     262                to.delete();
     263                return;
     264            }
     265            Properties props = getPluginConfig(f, to, url);
     266            if (props == null)
     267                return;
     268            String pubkey = props.getProperty("key");
     269            String signer = props.getProperty("signer");
     270            if (pubkey == null || signer == null || pubkey.length() != 172 || signer.length() <= 0) {
     271                f.delete();
     272                to.delete();
     273                statusDone("<b>" + _("Plugin from {0} contains an invalid key", url) + "</b>");
     274                return;
     275            }
     276            if (!signer.equals(signingKeyName)) {
     277                f.delete();
     278                to.delete();
     279                if (signingKeyName == null)
     280                    _log.error("Failed to verify plugin signature, corrupt plugin or bad signature, signed by: " + signer);
     281                else
     282                    // shouldn't happen
     283                    _log.error("Plugin signer \"" + signer + "\" does not match new signer in plugin.config file \"" + signingKeyName + "\"");
     284                statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>");
     285                return;
     286            }
     287            processFinal(to, appDir, url, props, sudVersion, pubkey, signer);
     288        }
     289
     290        /**
     291         *  @since 0.9.15
     292         *  @return null on error
     293         */
     294        private Properties getPluginConfig(File f, File to, String url) {
     295            File tempDir = new File(_context.getTempDir(), "tmp" + _context.random().nextInt() + "-unzip");
     296            if (!FileUtil.extractZip(to, tempDir, Log.ERROR)) {
     297                f.delete();
     298                to.delete();
     299                FileUtil.rmdir(tempDir, false);
     300                statusDone("<b>" + _("Plugin from {0} is corrupt", url) + "</b>");
     301                return null;
     302            }
     303            File installProps = new File(tempDir, "plugin.config");
     304            Properties props = new OrderedProperties();
     305            try {
     306                DataHelper.loadProps(props, installProps);
     307            } catch (IOException ioe) {
     308                f.delete();
     309                to.delete();
     310                statusDone("<b>" + _("Plugin from {0} does not contain the required configuration file", url) + "</b>");
     311                return null;
     312            } finally {
     313                // we don't need this anymore, we will unzip again
     314                FileUtil.rmdir(tempDir, false);
     315            }
     316            return props;
    270317        }
    271318
     
    273320         *  @since 0.9.15
    274321         */
    275         private void processFinal(File to, File appDir, File tempDir, String url, Properties props, String sudVersion, String pubkey, String signer) {
     322        private void processFinal(File to, File appDir, String url, Properties props, String sudVersion, String pubkey, String signer) {
    276323            boolean update = false;
    277324            String appName = props.getProperty("name");
     
    325372                } catch (IOException ioe) {
    326373                    to.delete();
    327                     FileUtil.rmdir(tempDir, false);
    328374                    statusDone("<b>" + _("Installed plugin does not contain the required configuration file", url) + "</b>");
    329375                    return;
Note: See TracChangeset for help on using the changeset viewer.