source: osm/applications/editors/josm/plugins/native-password-manager/src/org/netbeans/modules/keyring/fallback/FallbackProvider.java@ 35665

Last change on this file since 35665 was 35665, checked in by Don-vip, 4 years ago

update to latest JNA

File size: 4.9 KB
Line 
1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3 *
4 * Copyright 2010 Oracle and/or its affiliates. All rights reserved.
5 *
6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7 * Other names may be trademarks of their respective owners.
8 *
9 * The contents of this file are subject to the terms of either the GNU
10 * General Public License Version 2 only ("GPL") or the Common
11 * Development and Distribution License("CDDL") (collectively, the
12 * "License"). You may not use this file except in compliance with the
13 * License. You can obtain a copy of the License at
14 * http://www.netbeans.org/cddl-gplv2.html
15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16 * specific language governing permissions and limitations under the
17 * License. When distributing the software, include this License Header
18 * Notice in each file and include the License file at
19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
20 * particular file as subject to the "Classpath" exception as provided
21 * by Oracle in the GPL Version 2 section of the License file that
22 * accompanied this code. If applicable, add the following below the
23 * License Header, with the fields enclosed by brackets [] replaced by
24 * your own identifying information:
25 * "Portions Copyrighted [year] [name of copyright owner]"
26 *
27 * If you wish your version of this file to be governed by only the CDDL
28 * or only the GPL Version 2, indicate your decision by adding
29 * "[Contributor] elects to include this software in this distribution
30 * under the [CDDL or GPL Version 2] license." If you do not indicate a
31 * single choice of license, a recipient has the option to distribute
32 * your version of this file under either the CDDL, the GPL Version 2 or
33 * to extend the choice of license to its licensees as provided above.
34 * However, if you add GPL Version 2 code and therefore, elected the GPL
35 * Version 2 license, then the option applies only if the new code is
36 * made subject to such option by the copyright holder.
37 *
38 * Contributor(s):
39 *
40 * Portions Copyrighted 2009 Sun Microsystems, Inc.
41 */
42
43package org.netbeans.modules.keyring.fallback;
44
45import java.nio.charset.StandardCharsets;
46import java.security.SecureRandom;
47import java.util.logging.Level;
48import java.util.logging.Logger;
49
50import org.netbeans.modules.keyring.spi.EncryptionProvider;
51import org.netbeans.spi.keyring.KeyringProvider;
52
53/**
54 * Platform-independent keyring provider using a master password and the user directory.
55 */
56public class FallbackProvider implements KeyringProvider {
57
58 private static final Logger LOG = Logger.getLogger(FallbackProvider.class.getName());
59 private static final String DESCRIPTION = ".description";
60 private static final String SAMPLE_KEY = "__sample__";
61
62 private EncryptionProvider encryption;
63 private IPreferences prefs;
64
65 // simple interface for a generic preferences store
66 public interface IPreferences {
67 byte[] getByteArray(String key, byte[] def);
68 void putByteArray(String key, byte[] val);
69 void remove(String key);
70 }
71
72 public FallbackProvider(EncryptionProvider encryption, IPreferences prefs) {
73 this.encryption = encryption;
74 this.prefs = prefs;
75 }
76
77 @Override
78 public boolean enabled() {
79 if (encryption.enabled()) {
80 if (testSampleKey()) {
81 LOG.log(Level.FINE, "Using provider: {0}", encryption);
82 return true;
83 }
84 }
85 LOG.fine("No provider");
86 return false;
87 }
88
89 private boolean testSampleKey() {
90 encryption.freshKeyring(true);
91 byte[] randomArray = new byte[36];
92 new SecureRandom().nextBytes(randomArray);
93 if (_save(SAMPLE_KEY, (SAMPLE_KEY + new String(randomArray, StandardCharsets.UTF_8)).toCharArray())) {
94 LOG.fine("saved sample key");
95 return true;
96 } else {
97 LOG.fine("could not save sample key");
98 return false;
99 }
100 }
101
102 @Override
103 public char[] read(String key) {
104 byte[] ciphertext = prefs.getByteArray(key, null);
105 if (ciphertext == null) {
106 return null;
107 }
108 try {
109 return encryption.decrypt(ciphertext);
110 } catch (Exception x) {
111 LOG.log(Level.FINE, "failed to decrypt password for " + key, x);
112 }
113 return null;
114 }
115
116 @Override
117 public void save(String key, char[] password, String description) {
118 _save(key, password);
119 }
120
121 private boolean _save(String key, char[] password) {
122 try {
123 prefs.putByteArray(key, encryption.encrypt(password));
124 } catch (Exception x) {
125 LOG.log(Level.FINE, "failed to encrypt password for " + key, x);
126 return false;
127 }
128 return true;
129 }
130
131 @Override
132 public void delete(String key) {
133 prefs.remove(key);
134 prefs.remove(key + DESCRIPTION);
135 }
136
137}
Note: See TracBrowser for help on using the repository browser.