A self hosted chat application with end-to-end encrypted messaging.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.9 KiB

  1. package db.migration;
  2. import java.io.BufferedWriter;
  3. import java.io.FileWriter;
  4. import java.nio.file.Files;
  5. import java.nio.file.Paths;
  6. import java.nio.file.attribute.PosixFilePermission;
  7. import java.security.SecureRandom;
  8. import java.sql.PreparedStatement;
  9. import org.flywaydb.core.api.migration.BaseJavaMigration;
  10. import org.flywaydb.core.api.migration.Context;
  11. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  12. import org.springframework.security.crypto.password.PasswordEncoder;
  13. public class V3__add_default_admin extends BaseJavaMigration {
  14. private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
  15. private final SecureRandom random = new SecureRandom();
  16. /** different dictionaries used */
  17. private final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  18. private final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
  19. private final String NUMERIC = "0123456789";
  20. private final String SPECIAL_CHARS = "!@#$%^&*_=+-/";
  21. /**
  22. * Method will generate random string based on the parameters
  23. *
  24. * @param len
  25. * the length of the random string
  26. * @param dic
  27. * the dictionary used to generate the password
  28. * @return the random password
  29. */
  30. public String generatePassword(int len, String dic) {
  31. String result = "";
  32. for (int i = 0; i < len; i++) {
  33. int index = random.nextInt(dic.length());
  34. result += dic.charAt(index);
  35. }
  36. return result;
  37. }
  38. @Override
  39. public void migrate(final Context context) throws Exception {
  40. try (final PreparedStatement ps = context.getConnection()
  41. .prepareStatement(
  42. "insert into users (user_id, name, password) values (0,?,?)")) {
  43. final String generatedPassword = generatePassword(60,
  44. ALPHA_CAPS + ALPHA + SPECIAL_CHARS);
  45. final BufferedWriter bw = new BufferedWriter(
  46. new FileWriter("gen-password.txt"));
  47. bw.write(generatedPassword);
  48. bw.write("\nPlease delete this file");
  49. bw.close();
  50. final var perms = Files
  51. .getPosixFilePermissions(Paths.get("gen-password.txt"));
  52. // add owners permission
  53. perms.add(PosixFilePermission.OWNER_READ);
  54. perms.add(PosixFilePermission.OWNER_WRITE);
  55. perms.remove(PosixFilePermission.OWNER_EXECUTE);
  56. // add group permissions
  57. perms.remove(PosixFilePermission.GROUP_READ);
  58. perms.remove(PosixFilePermission.GROUP_WRITE);
  59. perms.remove(PosixFilePermission.GROUP_EXECUTE);
  60. // add others permissions
  61. perms.remove(PosixFilePermission.OTHERS_READ);
  62. perms.remove(PosixFilePermission.OTHERS_WRITE);
  63. perms.remove(PosixFilePermission.OTHERS_EXECUTE);
  64. Files.setPosixFilePermissions(Paths.get("gen-password.txt"), perms);
  65. ps.setString(1, "admin");
  66. ps.setString(2, passwordEncoder.encode(generatedPassword));
  67. ps.execute();
  68. }
  69. try (final PreparedStatement ps = context.getConnection()
  70. .prepareStatement(
  71. "insert into users_roles (user_id, role_id) values (1,0)")) {
  72. ps.execute();
  73. }
  74. }
  75. }