diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index 6b28b5dcdfa68..2a6214d673af6 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -501,6 +501,7 @@ public boolean isMailerPluginPresent() { public User createAccount(String userName, String password) throws IOException { User user = User.getById(userName, true); user.addProperty(Details.fromPlainPassword(password)); + SecurityListener.fireUserCreated(user.getId()); return user; } diff --git a/core/src/main/java/jenkins/security/SecurityListener.java b/core/src/main/java/jenkins/security/SecurityListener.java index 134e992e7f662..a6bba962585ac 100644 --- a/core/src/main/java/jenkins/security/SecurityListener.java +++ b/core/src/main/java/jenkins/security/SecurityListener.java @@ -69,6 +69,15 @@ protected void failedToAuthenticate(@Nonnull String username){} */ protected void loggedIn(@Nonnull String username){} + /** + * @since TODO + * + * Fired when a new user account has been created. + * + * @param username the user + */ + protected void userCreated(@Nonnull String username) {} + /** * Fired when a user has failed to log in. * Would be called after {@link #failedToAuthenticate}. @@ -98,6 +107,14 @@ public static void fireAuthenticated(@Nonnull UserDetails details) { } } + /** @since TODO */ + public static void fireUserCreated(@Nonnull String username) { + LOGGER.log(Level.FINE, "new user created: {0}", username); + for (SecurityListener l : all()) { + l.userCreated(username); + } + } + /** @since 1.569 */ public static void fireFailedToAuthenticate(@Nonnull String username) { LOGGER.log(Level.FINE, "failed to authenticate: {0}", username); diff --git a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java index 2b0994aed3300..c458dc78e0416 100644 --- a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java +++ b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java @@ -290,6 +290,43 @@ public void selfRegistrationTriggerLoggedIn() throws Exception { assertTrue(spySecurityListener.loggedInUsernames.get(0).equals("bob")); } + @Issue("JENKINS-55307") + @Test + public void selfRegistrationTriggerUserCreation() throws Exception { + HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); + j.jenkins.setSecurityRealm(securityRealm); + j.jenkins.setCrumbIssuer(null); + + spySecurityListener.createdUsers.clear(); + assertTrue(spySecurityListener.createdUsers.isEmpty()); + + selfRegistration("bob"); + selfRegistration("charlie"); + assertTrue(spySecurityListener.createdUsers.get(0).equals("bob")); + assertTrue(spySecurityListener.createdUsers.get(1).equals("charlie")); + } + + @Issue("JENKINS-55307") + @Test + public void userCreationFromRealm() throws Exception { + HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(false, false, null); + j.jenkins.setSecurityRealm(securityRealm); + + spySecurityListener.createdUsers.clear(); + assertTrue(spySecurityListener.createdUsers.isEmpty()); + + User u1 = securityRealm.createAccount("alice", "alicePassword"); + u1.setFullName("Alice User"); + u1.save(); + + User u2 = securityRealm.createAccount("debbie", "debbiePassword"); + u2.setFullName("Debbie User"); + u2.save(); + + assertTrue(spySecurityListener.createdUsers.get(0).equals("alice")); + assertTrue(spySecurityListener.createdUsers.get(1).equals("debbie")); + } + private void createFirstAccount(String login) throws Exception { assertNull(User.getById(login, false)); @@ -366,11 +403,15 @@ private void selfRegistration(String login) throws Exception { @TestExtension public static class SpySecurityListenerImpl extends SecurityListener { private List loggedInUsernames = new ArrayList<>(); + private List createdUsers = new ArrayList(); @Override protected void loggedIn(@Nonnull String username) { loggedInUsernames.add(username); } + + @Override + protected void userCreated(@Nonnull String username) { createdUsers.add(username); } } @Issue("SECURITY-786")