Random Password in catalog item run script

Brendan Hallida
Kilo Guru

Hi all,

So I got some assistance from a consultant on this script.  Our requirements are to generate a random password, and the password needed to have the following:

  • 8 characters
  • At least 1 Uppercase
  • At least 1 Lowercase
  • At least 1 Number

The password is then passed over to our custom powershell activities.

We came up with the below:

var randomNum;
lowerUpperNum = false;
while(!lowerUpperNum) {
    randomNum = GlideSecureRandomUtil.getSecureRandomString(8);
    if(hasLowerUpperNumCase(randomNum)) {
        lowerUpperNum = true;
    }
}

current.variables.password = randomNum; //passes string to request item variable

function hasLowerUpperNumCase(_randomNum) {
    return (/[a-zA-Z0-9]/.test(_randomNum));
}

It seemed to be working, however, i just got a result without a lowercase: ie this was it 38B9U485.

Anyone know what could be happening, or if there was a better way to meet our requirements?

 

Cheers,

Brendan

 

1 ACCEPTED SOLUTION

Try running it with the print enclosed inside of an evaluation of lowerUpperNum. As you've written it, the password is always printed, even if lowerUpperNum evaluates as false.

I just tested the following and got 1,000 matches exactly.

 

for (i=0; i<1000; ){
	var lowerUpperNum = false;
	while(!lowerUpperNum) {

		var password = GlideSecureRandomUtil.getSecureRandomString(8);	
		lowerUpperNum = !!((password).match(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/));
		
		if(lowerUpperNum) {
			gs.print(password);
			i++;
		}

		//current.variables.password = GlideSecureRandomUtil.getSecureRandomString(8);	
		//lowerUpperNum = !!((current.variables.password).match(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/));
	}
}

 

You could take it a step further and modify it for your application by the following, which guarantees that lowerUpperNum needs to be truthy before password is assigned.

 

var lowerUpperNum = false;
while(!lowerUpperNum) {

	var password = GlideSecureRandomUtil.getSecureRandomString(8);	
	lowerUpperNum = !!((password).match(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/));
	
	if(lowerUpperNum) {
		current.variables.password = password;	
	}
	
}

View solution in original post

11 REPLIES 11

Thanks a lot, that has worked a treat!

I am making baby steps with Java, however, I have a long, long way to go haha

Don't worry, we've all had to start somewhere! I'm glad that it worked for you.