source: subversion/applications/editors/josm/plugins/trustosm/src/org/openstreetmap/josm/plugins/trustosm/TrustOSMplugin.java

Last change on this file was 34565, checked in by donvip, 8 months ago

update to JOSM 14153

File size: 10.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.trustosm;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.KeyEvent;
8import java.io.File;
9import java.io.FileOutputStream;
10import java.io.IOException;
11import java.io.InputStream;
12import java.security.InvalidKeyException;
13import java.security.NoSuchAlgorithmException;
14import java.util.Enumeration;
15import java.util.HashMap;
16import java.util.Map;
17import java.util.jar.JarEntry;
18import java.util.jar.JarFile;
19
20import javax.crypto.BadPaddingException;
21import javax.crypto.Cipher;
22import javax.crypto.IllegalBlockSizeException;
23import javax.crypto.NoSuchPaddingException;
24import javax.crypto.SecretKey;
25import javax.crypto.spec.SecretKeySpec;
26import javax.swing.JMenu;
27import javax.swing.JMenuItem;
28
29import org.openstreetmap.josm.actions.ExtensionFileFilter;
30import org.openstreetmap.josm.data.Preferences;
31import org.openstreetmap.josm.gui.MainApplication;
32import org.openstreetmap.josm.gui.MainMenu;
33import org.openstreetmap.josm.gui.MapFrame;
34import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
35import org.openstreetmap.josm.plugins.Plugin;
36import org.openstreetmap.josm.plugins.PluginInformation;
37import org.openstreetmap.josm.plugins.trustosm.actions.ExportSigsAction;
38import org.openstreetmap.josm.plugins.trustosm.data.TrustOsmPrimitive;
39import org.openstreetmap.josm.plugins.trustosm.gui.dialogs.TrustDialog;
40import org.openstreetmap.josm.plugins.trustosm.gui.dialogs.TrustPreferenceEditor;
41import org.openstreetmap.josm.plugins.trustosm.io.SigExporter;
42import org.openstreetmap.josm.plugins.trustosm.io.SigImporter;
43import org.openstreetmap.josm.plugins.trustosm.util.TrustGPG;
44import org.openstreetmap.josm.spi.preferences.Config;
45import org.openstreetmap.josm.tools.Logging;
46
47public class TrustOSMplugin extends Plugin {
48
49    static JMenu gpgJMenu;
50
51    private TrustDialog trustDialog;
52
53    /** Use a TrustGPGPreparer to sign or validate signatures */
54    public static TrustGPG gpg;
55
56    /** A global list with all OSM-Ids and corresponding TrustOSMItems */
57    public static final Map<String, TrustOsmPrimitive> signedItems = new HashMap<>();
58
59    /**
60     * Will be invoked by JOSM to bootstrap the plugin
61     *
62     * @param info  information about the plugin and its local installation
63     */
64    public TrustOSMplugin(PluginInformation info) {
65        // init the plugin
66        super(info);
67        // check if the jarlibs are already extracted or not and extract them if not
68        /*if (!Config.getPref().getBoolean("trustosm.jarLibsExtracted")) {
69            Config.getPref().put("trustosm.jarLibsExtracted", extractFiles("trustosm","lib"));
70            Config.getPref().put("trustosm.jarLibsExtracted", extractFiles("trustosm","resources"));
71        }*/
72        extractFiles("trustosm", "lib");
73        extractFiles("trustosm", "resources");
74
75        refreshMenu();
76        checkForUnrestrictedPolicyFiles();
77        // register new SigImporter and SigExporter
78        ExtensionFileFilter.addImporter(new SigImporter());
79        ExtensionFileFilter.addExporter(new SigExporter());
80
81        gpg = new TrustGPG();
82        setSettings();
83        File gpgDir = new File(getGpgPath());
84        if (!gpgDir.exists())
85            gpgDir.mkdirs();
86
87    }
88
89    public static void checkForUnrestrictedPolicyFiles() {
90        byte[] data = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
91
92        // create a cipher and attempt to encrypt the data block with our key
93        try {
94            Cipher c = Cipher.getInstance("AES/CBC/NoPadding");
95            // create a 192 bit secret key from raw bytes
96
97            SecretKey key192 = new SecretKeySpec(new byte[] {0x00, 0x01, 0x02,
98                   0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
99                   0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
100                   0x17 }, "AES");
101
102            // now try encrypting with the larger key
103
104            c.init(Cipher.ENCRYPT_MODE, key192);
105            c.doFinal(data);
106        } catch (InvalidKeyException e) {
107            Logging.log(Logging.LEVEL_WARN, "It seems that the Unrestricted Policy Files are not available in this JVM. "+
108                      "So high level crypto is not allowed. Problems may occur.", e);
109            installUnrestrictedPolicyFiles();
110        } catch (BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException | NoSuchAlgorithmException e) {
111            Logging.error(e);
112        }
113    }
114
115    public static boolean installUnrestrictedPolicyFiles() {
116        /*
117        String[] cmd = new String[3];
118        cmd[0] = "sudo";
119        cmd[1] = "-S";
120        cmd[2] = "/tmp/skript.sh";
121
122        try
123        {
124            Process p = Runtime.getRuntime().exec(cmd);
125            OutputStream os = p.getOutputStream();
126            Writer writer = new OutputStreamWriter(os);
127
128            JPasswordField passwordField = new JPasswordField(10);
129            JOptionPane.showMessageDialog(null, passwordField, "Enter password", JOptionPane.OK_OPTION);
130            String password = passwordField.getPassword().toString();
131
132            writer.write(password + "\n");
133            writer.close();
134            InputStream in = p.getInputStream();
135            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
136            String satz = reader.readLine();
137            while (satz != null)
138            {
139                System.out.println(satz);
140                satz = reader.readLine();
141            }
142            int rc = p.waitFor();
143        }
144        catch (Exception e)
145        {
146            System.out.println(e.toString());
147        }
148
149        /*
150
151        Process    p;
152        int exitCode;
153        String stdout,stderr;
154        String sysSecPath = System.getProperty("java.home")+"/lib/security";
155        File localPolicy = new File(sysSecPath+"/local_policy.jar");
156        if (!localPolicy.exists()) {
157            System.err.println("No local_policy.jar file found in "+sysSecPath+"\n Is this the right java directory?");
158            return false;
159        }
160
161
162        String cmd = "sh -c sudo -S mv "+sysSecPath+"/local_policy.jar "+sysSecPath+"/local_policy.jar.restricted";
163        /*        String cmd2 = "sudo -S mv "+sysSecPath+"/US_export_policy.jar "+sysSecPath+"/US_export_policy.jar.restricted";
164        String cmd3 = "sudo -S cp "+Config.getPref().getPluginsDirectory().getPath()+"/trustosm/jce/US_export_policy.jar "+sysSecPath;
165        String cmd4 = "sudo -S cp "+Config.getPref().getPluginsDirectory().getPath()+"/trustosm/jce/local_policy.jar "+sysSecPath;
166
167
168        //System.out.println (cmd);
169
170        try
171        {
172            p = Runtime.getRuntime().exec(cmd);
173        }
174        catch(IOException io)
175        {
176            System.err.println ("io Error" + io.getMessage ());
177            return false;
178        }
179
180        JPasswordField passwordField = new JPasswordField(10);
181        JOptionPane.showMessageDialog(null, passwordField, "Enter password", JOptionPane.OK_OPTION);
182        String password = passwordField.getPassword().toString();
183
184        if (password != null)
185        {
186            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
187            try
188            {
189                out.write(password);
190                out.close();
191            }
192            catch(IOException io)
193            {
194                System.err.println("Exception at write! " + io.getMessage ());
195                return false;
196            }
197        }
198
199        try
200        {
201            exitCode = p.exitValue ();
202            if (exitCode==0) {
203                System.err.println("Everything seems to be ok.");
204            } else {
205                System.err.println("Exit code was not 0.");
206                StringBuffer buf = new StringBuffer();
207                InputStream errIn = p.getErrorStream();
208                int read;
209                while ((read = errIn.read()) != -1) {
210                    buf.append(read);
211                }
212                System.err.println(buf.toString());
213            }
214        }
215        catch (IllegalThreadStateException itse)
216        {
217            return false;
218        } catch (IOException e) {
219            // TODO Auto-generated catch block
220            e.printStackTrace();
221        }
222
223         */
224        return false;
225    }
226
227    public static boolean extractFiles(String pluginname, String extractDir) {
228        if (extractDir == null) extractDir = "lib";
229        String path = Preferences.main().getPluginsDirectory().getPath();
230        try (JarFile jar = new JarFile(path+"/"+pluginname+".jar")) {
231            Enumeration<JarEntry> entries = jar.entries();
232            InputStream is;
233            FileOutputStream fos;
234            File file;
235            while (entries.hasMoreElements()) {
236                JarEntry entry = entries.nextElement();
237                String name = entry.getName();
238                if (name.startsWith(extractDir+"/") && !entry.isDirectory()) {
239                    file = new File(path+"/"+pluginname+"/"+name);
240                    file.getParentFile().mkdirs();
241                    is = jar.getInputStream(entry);
242                    fos = new FileOutputStream(file);
243                    while (is.available() > 0) {  // write contents of 'is' to 'fos'
244                        fos.write(is.read());
245                    }
246                    fos.close();
247                    is.close();
248                }
249            }
250            return true;
251
252        } catch (IOException e) {
253            e.printStackTrace();
254            return false;
255        }
256    }
257
258    public static void refreshMenu() {
259        MainMenu menu = MainApplication.getMenu();
260
261        if (gpgJMenu == null) {
262            gpgJMenu = menu.addMenu("GPG", tr("GPG"), KeyEvent.VK_B, menu.getDefaultMenuPos(), ht("/Plugin/TrustOSM"));
263            gpgJMenu.add(new JMenuItem(new ExportSigsAction()));
264        }
265    }
266
267    public static void setSettings() {
268        Map<String, String> prefs = Preferences.main().getAllPrefix("trustosm.");
269
270        // if setting isn't present, we set a default
271        // This makes sense for example when we start the plugin for the first time
272        if (!prefs.containsKey("trustosm.gpg")) Config.getPref().put("trustosm.gpg", "gpg");
273        if (!prefs.containsKey("trustosm.gpg.separateHomedir")) Config.getPref().putBoolean("trustosm.gpg.separateHomedir", true);
274    }
275
276    @Override
277    public PreferenceSetting getPreferenceSetting() {
278        return new TrustPreferenceEditor();
279    }
280
281    @Override
282    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
283        if (oldFrame == null && newFrame != null) {
284            trustDialog = new TrustDialog();
285            newFrame.addToggleDialog(trustDialog);
286        }
287    }
288
289    public static String getGpgPath() {
290        return Preferences.main().getPluginsDirectory().getPath() + "/trustosm/gnupg/";
291    }
292}
Note: See TracBrowser for help on using the repository browser.