Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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.