// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.trustosm; import static org.openstreetmap.josm.gui.help.HelpUtil.ht; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import javax.swing.JMenu; import javax.swing.JMenuItem; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.ExtensionFileFilter; import org.openstreetmap.josm.gui.MainMenu; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.preferences.PreferenceSetting; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; import org.openstreetmap.josm.plugins.trustosm.actions.ExportSigsAction; import org.openstreetmap.josm.plugins.trustosm.data.TrustOsmPrimitive; import org.openstreetmap.josm.plugins.trustosm.gui.dialogs.TrustDialog; import org.openstreetmap.josm.plugins.trustosm.gui.dialogs.TrustPreferenceEditor; import org.openstreetmap.josm.plugins.trustosm.io.SigExporter; import org.openstreetmap.josm.plugins.trustosm.io.SigImporter; import org.openstreetmap.josm.plugins.trustosm.util.TrustGPG; public class TrustOSMplugin extends Plugin { static JMenu gpgJMenu; private TrustDialog trustDialog; /** Use a TrustGPGPreparer to sign or validate signatures */ public static TrustGPG gpg; /** A global list with all OSM-Ids and corresponding TrustOSMItems */ public static final Map<String, TrustOsmPrimitive> signedItems = new HashMap<>(); /** * Will be invoked by JOSM to bootstrap the plugin * * @param info information about the plugin and its local installation */ public TrustOSMplugin(PluginInformation info) { // init the plugin super(info); // check if the jarlibs are already extracted or not and extract them if not /*if (!Main.pref.getBoolean("trustosm.jarLibsExtracted")) { Main.pref.put("trustosm.jarLibsExtracted", extractFiles("trustosm","lib")); Main.pref.put("trustosm.jarLibsExtracted", extractFiles("trustosm","resources")); }*/ extractFiles("trustosm", "lib"); extractFiles("trustosm", "resources"); refreshMenu(); checkForUnrestrictedPolicyFiles(); // register new SigImporter and SigExporter ExtensionFileFilter.addImporter(new SigImporter()); ExtensionFileFilter.addExporter(new SigExporter()); gpg = new TrustGPG(); setSettings(); File gpgDir = new File(getGpgPath()); if (!gpgDir.exists()) gpgDir.mkdirs(); } public static void checkForUnrestrictedPolicyFiles() { byte[] data = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; // create a cipher and attempt to encrypt the data block with our key try { Cipher c = Cipher.getInstance("AES/CBC/NoPadding"); // create a 192 bit secret key from raw bytes SecretKey key192 = new SecretKeySpec(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }, "AES"); // now try encrypting with the larger key c.init(Cipher.ENCRYPT_MODE, key192); c.doFinal(data); } catch (InvalidKeyException e) { Main.warn(e, "It seems that the Unrestricted Policy Files are not available in this JVM. "+ "So high level crypto is not allowed. Problems may occur."); installUnrestrictedPolicyFiles(); } catch (BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException | NoSuchAlgorithmException e) { Main.error(e); } } public static boolean installUnrestrictedPolicyFiles() { /* String[] cmd = new String[3]; cmd[0] = "sudo"; cmd[1] = "-S"; cmd[2] = "/tmp/skript.sh"; try { Process p = Runtime.getRuntime().exec(cmd); OutputStream os = p.getOutputStream(); Writer writer = new OutputStreamWriter(os); JPasswordField passwordField = new JPasswordField(10); JOptionPane.showMessageDialog(null, passwordField, "Enter password", JOptionPane.OK_OPTION); String password = passwordField.getPassword().toString(); writer.write(password + "\n"); writer.close(); InputStream in = p.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String satz = reader.readLine(); while (satz != null) { System.out.println(satz); satz = reader.readLine(); } int rc = p.waitFor(); } catch (Exception e) { System.out.println(e.toString()); } /* Process p; int exitCode; String stdout,stderr; String sysSecPath = System.getProperty("java.home")+"/lib/security"; File localPolicy = new File(sysSecPath+"/local_policy.jar"); if (!localPolicy.exists()) { System.err.println("No local_policy.jar file found in "+sysSecPath+"\n Is this the right java directory?"); return false; } String cmd = "sh -c sudo -S mv "+sysSecPath+"/local_policy.jar "+sysSecPath+"/local_policy.jar.restricted"; /* String cmd2 = "sudo -S mv "+sysSecPath+"/US_export_policy.jar "+sysSecPath+"/US_export_policy.jar.restricted"; String cmd3 = "sudo -S cp "+Main.pref.getPluginsDirectory().getPath()+"/trustosm/jce/US_export_policy.jar "+sysSecPath; String cmd4 = "sudo -S cp "+Main.pref.getPluginsDirectory().getPath()+"/trustosm/jce/local_policy.jar "+sysSecPath; //System.out.println (cmd); try { p = Runtime.getRuntime().exec(cmd); } catch(IOException io) { System.err.println ("io Error" + io.getMessage ()); return false; } JPasswordField passwordField = new JPasswordField(10); JOptionPane.showMessageDialog(null, passwordField, "Enter password", JOptionPane.OK_OPTION); String password = passwordField.getPassword().toString(); if (password != null) { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); try { out.write(password); out.close(); } catch(IOException io) { System.err.println("Exception at write! " + io.getMessage ()); return false; } } try { exitCode = p.exitValue (); if (exitCode==0) { System.err.println("Everything seems to be ok."); } else { System.err.println("Exit code was not 0."); StringBuffer buf = new StringBuffer(); InputStream errIn = p.getErrorStream(); int read; while ((read = errIn.read()) != -1) { buf.append(read); } System.err.println(buf.toString()); } } catch (IllegalThreadStateException itse) { return false; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ return false; } public static boolean extractFiles(String pluginname, String extractDir) { if (extractDir == null) extractDir = "lib"; String path = Main.pref.getPluginsDirectory().getPath(); try (JarFile jar = new JarFile(path+"/"+pluginname+".jar")) { Enumeration<JarEntry> entries = jar.entries(); InputStream is; FileOutputStream fos; File file; while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); String name = entry.getName(); if (name.startsWith(extractDir+"/") && !entry.isDirectory()) { file = new File(path+"/"+pluginname+"/"+name); file.getParentFile().mkdirs(); is = jar.getInputStream(entry); fos = new FileOutputStream(file); while (is.available() > 0) { // write contents of 'is' to 'fos' fos.write(is.read()); } fos.close(); is.close(); } } return true; } catch (IOException e) { e.printStackTrace(); return false; } } public static void refreshMenu() { MainMenu menu = Main.main.menu; if (gpgJMenu == null) { gpgJMenu = menu.addMenu("GPG", tr("GPG"), KeyEvent.VK_B, menu.getDefaultMenuPos(), ht("/Plugin/TrustOSM")); gpgJMenu.add(new JMenuItem(new ExportSigsAction())); } } public static void setSettings() { Map<String, String> prefs = Main.pref.getAllPrefix("trustosm."); // if setting isn't present, we set a default // This makes sense for example when we start the plugin for the first time if (!prefs.containsKey("trustosm.gpg")) Main.pref.put("trustosm.gpg", "gpg"); if (!prefs.containsKey("trustosm.gpg.separateHomedir")) Main.pref.put("trustosm.gpg.separateHomedir", true); } @Override public PreferenceSetting getPreferenceSetting() { return new TrustPreferenceEditor(); } @Override public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) { if (oldFrame == null && newFrame != null) { trustDialog = new TrustDialog(); newFrame.addToggleDialog(trustDialog); } } public static String getGpgPath() { return Main.pref.getPluginsDirectory().getPath() + "/trustosm/gnupg/"; } }