💡 Introduction
Sometimes in Joget applications, user or contact records may be created without passwords — especially during data imports or integrations.
To fix that, we can automate password creation using a BeanShell script, which directly connects to Joget’s database and assigns secure random passwords to any empty password fields.
🎯 Goal
Automatically generate a secure, random password for every record in the app_fd_Contacts table where c_Password is NULL.
⚙️ How It Works
This BeanShell script:
- Connects to Joget’s database using
AppUtil. - Finds all records missing passwords.
- Generates a random secure password.
- Updates the database with the new passwords.
- Logs the output for easy tracking.
🧱 BeanShell Script
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Random;
import javax.sql.DataSource;
import org.joget.apps.app.service.AppUtil;
import org.joget.commons.util.LogUtil;
// Character sets for password generation
private final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
private final String CHAR_UPPER = CHAR_LOWER.toUpperCase();
private final String NUMBER = "0123456789";
private final String SPECIAL_CHARS = "!@#$%^&*()_-+=<>?";
private final String ALL_CHARS = CHAR_LOWER + CHAR_UPPER + NUMBER + SPECIAL_CHARS;
private final Random RANDOM = new Random();
Connection connection = null;
public void RandomPasswordGenerator() {
try {
// Get Joget database connection from AppUtil
DataSource ds = (DataSource) AppUtil.getApplicationContext().getBean("setupDataSource");
connection = ds.getConnection();
// Select records with missing passwords
String selectQuery = "SELECT id FROM app_fd_Contacts WHERE c_Password IS NULL";
// Update query to assign new passwords
String updateQuery = "UPDATE app_fd_Contacts SET c_Password = ? WHERE id = ?";
PreparedStatement selectStatement = connection.prepareStatement(selectQuery);
PreparedStatement updateStatement = connection.prepareStatement(updateQuery);
ResultSet resultSet = selectStatement.executeQuery();
while (resultSet.next()) {
LogUtil.info("", "Inside while loop");
// Get record ID
String id = resultSet.getString("id");
// Generate new random password
String newPassword = generateRandomPassword();
LogUtil.info("", newPassword);
// Update the record with the generated password
updateStatement.setString(1, newPassword);
updateStatement.setString(2, id);
updateStatement.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// Always close connection in finally block
if (connection != null) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// Function to generate a secure random password
public String generateRandomPassword() {
StringBuilder sb = new StringBuilder(8);
// Ensure at least one character from each category
sb.append(CHAR_LOWER.charAt(RANDOM.nextInt(CHAR_LOWER.length())));
sb.append(CHAR_UPPER.charAt(RANDOM.nextInt(CHAR_UPPER.length())));
sb.append(NUMBER.charAt(RANDOM.nextInt(NUMBER.length())));
sb.append(SPECIAL_CHARS.charAt(RANDOM.nextInt(SPECIAL_CHARS.length())));
// Fill the rest of the password randomly
for (int i = 4; i < 8; i++) {
int randomIndex = RANDOM.nextInt(ALL_CHARS.length());
sb.append(ALL_CHARS.charAt(randomIndex));
}
// Shuffle the generated password for randomness
char[] passwordChars = sb.toString().toCharArray();
for (int i = 0; i < passwordChars.length; i++) {
int randomIndex = RANDOM.nextInt(passwordChars.length);
char temp = passwordChars[i];
passwordChars[i] = passwordChars[randomIndex];
passwordChars[randomIndex] = temp;
}
return new String(passwordChars);
}
// Execute the function
RandomPasswordGenerator();
Top comments (0)