- Timestamp:
- 05/06/19 13:06:06 (5 years ago)
- Location:
- trunk/src/org/expeditee
- Files:
-
- 2 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/expeditee/auth/AuthenticatorBrowser.java
r1347 r1352 72 72 // The frame number of the frame containing the current authenticated users public key. 73 73 public static int CREDENTIALS_FRAME = -1; 74 public static int PASSWORD_RECOVERY_FRAME = -1; 74 75 public static final String ADMINACCOUNT = "authadmin"; 75 76 public static final String PROFILEENCRYPTIONLABEL = "Profile"; -
trunk/src/org/expeditee/auth/account/Create.java
r1334 r1352 2 2 3 3 import java.io.File; 4 import java.io.FileNotFoundException;5 4 import java.io.FileWriter; 6 5 import java.io.IOException; … … 55 54 * @param userdata Should contain username, password and email. 56 55 */ 57 public static void createAccount(Map<AuthenticationTag, String> userdata) throws InvalidFramesetNameException, ExistingFramesetException, 58 KeyStoreException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, ClassNotFoundException, IOException, SQLException { 56 public static CreateResult createAccount(Map<AuthenticationTag, String> userdata) { 59 57 // Track progress 60 58 String message = "Creating new user account..."; … … 68 66 69 67 Progress progressBar = MessageBay.displayProgress(message); 70 try { 71 progressBar.UpdateMessage(message + "Generating Keys.", progress += step); 72 } catch (Exception e) { 73 e.printStackTrace(); 74 } 75 DisplayController.refreshBayArea(); 68 progress = progress(message + "Generating Keys.", progress, step, progressBar); 76 69 77 70 // Generate keys 78 71 // Personal key 79 Random rand = new SecureRandom(); 80 byte[] keyBytes = new byte[16]; 81 rand.nextBytes(keyBytes); 82 SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm); 83 AuthenticatorBrowser.getInstance().putKey(username, password, key); 84 String personalKey = Base64.getEncoder().encodeToString(key.getEncoded()); 72 String personalKey = generatePersonalKey(username, password); 73 if (personalKey == null) { 74 return CreateResult.ErrorSymmetricKey; 75 } 85 76 // Public and private keys 86 KeyPairGenerator keyGen = KeyPairGenerator.getInstance(AsymmetricAlgorithm); 87 keyGen.initialize(1024); 88 KeyPair keyPair = keyGen.generateKeyPair(); 89 String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()); 90 String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); 91 92 try { 93 progressBar.UpdateMessage(message + "Creating Profile Frameset.", progress += step); 94 } catch (Exception e) { 95 e.printStackTrace(); 96 } 97 DisplayController.refreshBayArea(); 77 String[] keys = generateAsymmetricKeys(); 78 if (keys == null) { 79 return CreateResult.ErrorAsymmetricKeys; 80 } 81 String privateKey = keys[0]; 82 String publicKey = keys[1]; 83 84 progress = progress(message + "Creating Profile Frameset.", progress, step, progressBar); 98 85 99 86 // Update in memory settings … … 103 90 UserSettings.setupDefaultFolders(); 104 91 92 Frame profile; 93 try { 94 profile = createNewProfile(username, email, personalKey, privateKey, publicKey); 95 } catch (InvalidFramesetNameException | ExistingFramesetException e) { 96 return CreateResult.ErrorNewProfile; 97 } 98 99 if (AuthenticatorBrowser.CREDENTIALS_FRAME == -1) { 100 return CreateResult.ErrorCredentialsFrame; 101 } 102 103 progress = progress(message + "Establishing user credentials.", progress, step, progressBar); 104 105 // Create credentials 106 boolean success = setupCredentialsFrame(username, profile); 107 if (!success) { 108 return CreateResult.ErrorIODuringCredentialsFrameSetup; 109 } 110 111 progress = progress(message + "Creating Individual Space.", progress, step, progressBar); 112 113 // Copy private resources to personal area 114 Path personalResources = createPersonalArea(username); 115 116 progress = progress(message + "Creating Space For Dead Drops.", progress, step, progressBar); 117 118 createDeaddropsArea(personalResources); 119 120 System.err.println("**** Hardwired call in Apollo's AuthioPathManager"); 121 AudioPathManager.activateAndScanAudioDir(); // **** 122 123 progress = progress(message + "Done.", progress, step, progressBar); 124 125 return CreateResult.SuccessCreateAccount; 126 } 127 128 public static CreateResult createAlternativeAccess(Map<AuthenticationTag, String> userdata) { 129 String username = userdata.get(AuthenticationTag.Username); 130 FrameIO.CreateFrame(username, null, "default1"); 131 return null; 132 } 133 134 public enum CreateResult { 135 SuccessCreateAccount ("Account created."), 136 SuccessAlternativeAccount ("Alternative access to account established."), 137 ErrorSymmetricKey ("An error occured while trying to generate your personal key."), 138 ErrorAsymmetricKeys ("An error occured while trying to generate asymmetric keys."), 139 ErrorNewProfile ("An error occured while creating the profile frames."), 140 ErrorCredentialsFrame ("Unable to establish credentials frame for new profile frame."), 141 ErrorIODuringCredentialsFrameSetup ("An error occured during the setup of the new users credentials frame."); 142 143 private String message = null; 144 145 private CreateResult(String message) { 146 this.message = message; 147 } 148 149 public String toString() { 150 return message; 151 } 152 } 153 154 private static int progress(String message, int progress, int step, Progress progressBar) { 155 try { 156 progressBar.UpdateMessage(message, progress += step); 157 } catch (Exception e) { 158 e.printStackTrace(); 159 } 160 DisplayController.refreshBayArea(); 161 return progress; 162 } 163 164 private static void createDeaddropsArea(Path personalResources) { 165 File deadDropsDir = new File(personalResources.resolve("deaddrops").toAbsolutePath().toString()); 166 deadDropsDir.mkdir(); 167 } 168 169 private static Path createPersonalArea(String username) { 170 Path personalResources = UserSettings.PublicAndPrivateResources ? FrameIO.setupPersonalResources(username) : Paths.get(FrameIO.PARENT_FOLDER); 171 172 File contactsDir = new File(personalResources.resolve("contacts").toAbsolutePath().toString()); 173 contactsDir.mkdir(); 174 return personalResources; 175 } 176 177 private static boolean setupCredentialsFrame(String username, Frame profile) { 178 try { 179 File credentialsDir = new File(profile.getFramesetPath() + username + "-credentials"); 180 credentialsDir.mkdir(); 181 // credentials.inf file. 182 String credentialsPath = credentialsDir.getAbsolutePath() + File.separator + "credentials.inf"; 183 File credentialsFile = new File(credentialsPath); 184 credentialsFile.createNewFile(); 185 FileWriter out = new FileWriter(credentialsFile); 186 out.write(AuthenticatorBrowser.CREDENTIALS_FRAME + ".exp"); 187 out.flush(); 188 out.close(); 189 // migrate credentials frame 190 Frame credentialsFrame = FrameIO.LoadFrame(username + AuthenticatorBrowser.CREDENTIALS_FRAME); 191 Path destinationDirectory = Paths.get(credentialsDir.getAbsolutePath()); 192 Path destinationFile = destinationDirectory.resolve(AuthenticatorBrowser.CREDENTIALS_FRAME + ExpReader.EXTENTION); 193 FrameIO.migrateFrame(credentialsFrame, destinationFile); 194 return true; 195 } catch (IOException e) { 196 return false; 197 } 198 } 199 200 private static Frame createNewProfile(String username, String email, String personalKey, String privateKey, 201 String publicKey) throws InvalidFramesetNameException, ExistingFramesetException { 105 202 // Establish the initial settings for the created user. 106 203 Map<String, Setting> initialSettings = new HashMap<String, Setting>(); … … 116 213 initialSettings.put("org.expeditee.gui.folders.FolderSettings.AudioDirs", FolderSettings.AudioDirs); 117 214 118 // Record the credentials frame number 215 // Record the credentials frame number and password colleagues frame 119 216 Map<String, Consumer<Frame>> notifiers = new HashMap<String, Consumer<Frame>>(); 120 217 notifiers.put("settings.identity", frame -> { … … 129 226 } 130 227 }); 228 notifiers.put("settings.identity.passwordrecovery", frame -> { 229 AuthenticatorBrowser.PASSWORD_RECOVERY_FRAME = frame.getNumber(); 230 }); 231 131 232 132 233 // Create users profile … … 143 244 f.getAllItems().stream().forEach(item -> item.setOwner(username)); 144 245 f.setChanged(true); 145 if (f.getNumber() != AuthenticatorBrowser.CREDENTIALS_FRAME) { 246 if (f.getNumber() != AuthenticatorBrowser.CREDENTIALS_FRAME && 247 f.getNumber() != AuthenticatorBrowser.PASSWORD_RECOVERY_FRAME) { 146 248 f.setEncryptionLabel(AuthenticatorBrowser.PROFILEENCRYPTIONLABEL); 147 249 } … … 159 261 KeyList.PersonalKey.setSetting(backupPersonalKey); 160 262 } 161 162 if (AuthenticatorBrowser.CREDENTIALS_FRAME == -1) { 163 System.err.println("authActions::Unable to establish credentials frame for new profile frame. Account creation failed."); 164 return; 165 } 166 167 try { 168 progressBar.UpdateMessage(message + "Establishing user credentials.", progress += step); 169 } catch (Exception e) { 170 e.printStackTrace(); 171 } 172 DisplayController.refreshBayArea(); 173 174 // Create credentials 175 File credentialsDir = new File(profile.getFramesetPath() + username + "-credentials"); 176 credentialsDir.mkdir(); 177 // credentials.inf file. 178 String credentialsPath = credentialsDir.getAbsolutePath() + File.separator + "credentials.inf"; 179 File credentialsFile = new File(credentialsPath); 180 credentialsFile.createNewFile(); 181 FileWriter out = new FileWriter(credentialsFile); 182 out.write(AuthenticatorBrowser.CREDENTIALS_FRAME + ".exp"); 183 out.flush(); 184 out.close(); 185 // migrate credentials frame 186 Frame credentialsFrame = FrameIO.LoadFrame(username + AuthenticatorBrowser.CREDENTIALS_FRAME); 187 Path destinationDirectory = Paths.get(credentialsDir.getAbsolutePath()); 188 Path destinationFile = destinationDirectory.resolve(AuthenticatorBrowser.CREDENTIALS_FRAME + ExpReader.EXTENTION); 189 FrameIO.migrateFrame(credentialsFrame, destinationFile); 190 191 try { 192 progressBar.UpdateMessage(message + "Creating Individual Space.", progress += step); 193 } catch (Exception e) { 194 e.printStackTrace(); 195 } 196 DisplayController.refreshBayArea(); 197 198 // Copy private resources to personal area 199 Path personalResources = UserSettings.PublicAndPrivateResources ? FrameIO.setupPersonalResources(username) : Paths.get(FrameIO.PARENT_FOLDER); 200 201 File contactsDir = new File(personalResources.resolve("contacts").toAbsolutePath().toString()); 202 contactsDir.mkdir(); 203 204 try { 205 progressBar.UpdateMessage(message + "Creating Space For Dead Drops.", progress += step); 206 } catch (Exception e) { 207 e.printStackTrace(); 208 } 209 DisplayController.refreshBayArea(); 210 211 File deadDropsDir = new File(personalResources.resolve("deaddrops").toAbsolutePath().toString()); 212 deadDropsDir.mkdir(); 213 214 System.err.println("**** Hardwired call in Apollo's AuthioPathManager"); 215 AudioPathManager.activateAndScanAudioDir(); // **** 216 217 try { 218 progressBar.UpdateMessage(message + "Done.", 100); 219 } catch (Exception e) { 220 e.printStackTrace(); 221 } 222 DisplayController.refreshBayArea(); 223 } 224 263 return profile; 264 } 265 266 private static String generatePersonalKey(String username, String password) { 267 try { 268 Random rand = new SecureRandom(); 269 byte[] keyBytes = new byte[16]; 270 rand.nextBytes(keyBytes); 271 SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm); 272 AuthenticatorBrowser.getInstance().putKey(username, password, key); 273 String personalKey = Base64.getEncoder().encodeToString(key.getEncoded()); 274 return personalKey; 275 } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | ClassNotFoundException 276 | IOException | SQLException e) { 277 return null; 278 } 279 } 280 281 private static String[] generateAsymmetricKeys() { 282 try { 283 KeyPairGenerator keyGen = KeyPairGenerator.getInstance(AsymmetricAlgorithm); 284 keyGen.initialize(1024); 285 KeyPair keyPair = keyGen.generateKeyPair(); 286 String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()); 287 String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); 288 return new String[] { privateKey, publicKey }; 289 } catch (NoSuchAlgorithmException e) { 290 return null; 291 } 292 } 293 225 294 private static TextSetting constructTextSetting(String tooltip, String text, String data) { 226 295 return new TextSetting(tooltip, text) {
Note:
See TracChangeset
for help on using the changeset viewer.