Changeset 1352 for trunk


Ignore:
Timestamp:
05/06/19 13:06:06 (5 years ago)
Author:
bln4
Message:

Refactor of account creation action.
New settings frame to record a users password recovery colleagues.
This new frame is unencrypted.

Location:
trunk/src/org/expeditee
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/auth/AuthenticatorBrowser.java

    r1347 r1352  
    7272        // The frame number of the frame containing the current authenticated users public key.
    7373        public static int CREDENTIALS_FRAME = -1;
     74        public static int PASSWORD_RECOVERY_FRAME = -1;
    7475        public static final String ADMINACCOUNT = "authadmin";
    7576        public static final String PROFILEENCRYPTIONLABEL = "Profile";
  • trunk/src/org/expeditee/auth/account/Create.java

    r1334 r1352  
    22
    33import java.io.File;
    4 import java.io.FileNotFoundException;
    54import java.io.FileWriter;
    65import java.io.IOException;
     
    5554         * @param userdata Should contain username, password and email.
    5655         */
    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) {                     
    5957                // Track progress
    6058                String message = "Creating new user account...";
     
    6866               
    6967                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);
    7669
    7770                // Generate keys
    7871                //      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                }
    8576                //      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);
    9885               
    9986                // Update in memory settings
     
    10390                UserSettings.setupDefaultFolders();
    10491                               
     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 {
    105202                // Establish the initial settings for the created user.
    106203                Map<String, Setting> initialSettings = new HashMap<String, Setting>();
     
    116213                initialSettings.put("org.expeditee.gui.folders.FolderSettings.AudioDirs", FolderSettings.AudioDirs);
    117214               
    118                 // Record the credentials frame number
     215                // Record the credentials frame number and password colleagues frame
    119216                Map<String, Consumer<Frame>> notifiers = new HashMap<String, Consumer<Frame>>();
    120217                notifiers.put("settings.identity", frame -> {
     
    129226                        }
    130227                });
     228                notifiers.put("settings.identity.passwordrecovery", frame -> {
     229                        AuthenticatorBrowser.PASSWORD_RECOVERY_FRAME = frame.getNumber();
     230                });
     231               
    131232               
    132233                // Create users profile
     
    143244                        f.getAllItems().stream().forEach(item -> item.setOwner(username));
    144245                        f.setChanged(true);
    145                         if (f.getNumber() != AuthenticatorBrowser.CREDENTIALS_FRAME) {
     246                        if (f.getNumber() != AuthenticatorBrowser.CREDENTIALS_FRAME &&
     247                                        f.getNumber() != AuthenticatorBrowser.PASSWORD_RECOVERY_FRAME) {
    146248                                f.setEncryptionLabel(AuthenticatorBrowser.PROFILEENCRYPTIONLABEL);
    147249                        }
     
    159261                        KeyList.PersonalKey.setSetting(backupPersonalKey);
    160262                }
    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               
    225294        private static TextSetting constructTextSetting(String tooltip, String text, String data) {
    226295                return new TextSetting(tooltip, text) {
Note: See TracChangeset for help on using the changeset viewer.