mirror of
https://github.com/yuto-yuto/node-red-contrib-password-generator.git
synced 2026-03-04 02:17:22 +01:00
Add options
This commit is contained in:
@@ -7,14 +7,35 @@ const AsciiRange = {
|
||||
/** childe mark ~ */
|
||||
max: 126,
|
||||
}
|
||||
const optRegexes = {
|
||||
space: " ",
|
||||
special: "!\"#\\$%&'\\(\\)\\*\\+,-./:;<=>\\?@\\[\\\\\\]\\^_`\\{|\\}~",
|
||||
number: "\\d",
|
||||
};
|
||||
|
||||
export interface DisableOptions {
|
||||
space?: boolean;
|
||||
special?: boolean;
|
||||
number?: boolean;
|
||||
}
|
||||
|
||||
export async function generatePassword(length: number, disableOpts?: DisableOptions): Promise<string> {
|
||||
if (length < 5) {
|
||||
throw new Error("Password length must be longer than 5.");
|
||||
}
|
||||
|
||||
export async function generatePassword(length: number): Promise<string> {
|
||||
let result = "";
|
||||
const regex = createRegex(disableOpts)
|
||||
|
||||
while (true) {
|
||||
const bytes = await promisify(crypto.randomBytes)(length * 2);
|
||||
const byteArray = Array.from(bytes);
|
||||
const filtered = byteArray.filter(isInAsciiRange);
|
||||
result += String.fromCharCode(...filtered);
|
||||
if (regex) {
|
||||
result = result.replace(regex, "");
|
||||
}
|
||||
|
||||
if (result.length >= length) {
|
||||
result = result.slice(0, length);
|
||||
break;
|
||||
@@ -25,4 +46,16 @@ export async function generatePassword(length: number): Promise<string> {
|
||||
|
||||
function isInAsciiRange(value: number) {
|
||||
return AsciiRange.min <= value && value <= AsciiRange.max;
|
||||
}
|
||||
|
||||
function createRegex(disableOpts?: DisableOptions): RegExp | undefined {
|
||||
if (!disableOpts) {
|
||||
return undefined;
|
||||
}
|
||||
let reg = "";
|
||||
if (disableOpts?.space) { reg += optRegexes.space };
|
||||
if (disableOpts?.special) { reg += optRegexes.special };
|
||||
if (disableOpts?.number) { reg += optRegexes.number };
|
||||
|
||||
return new RegExp(`[${reg}]`, "g");
|
||||
}
|
||||
@@ -5,8 +5,11 @@
|
||||
color: "#D8BFD8",
|
||||
defaults: {
|
||||
name: { value: "" },
|
||||
length: { value: "", required: true, validate: RED.validators.number() },
|
||||
length: { value: "", required: true, validate: (v) => v > 4 },
|
||||
setTo: { value: "" },
|
||||
isNumberDisabled: { value: false, require: true },
|
||||
isSpecialCharsDisabled: { value: false, require: true },
|
||||
isSpaceDisabled: { value: false, require: true },
|
||||
},
|
||||
inputs: 1,
|
||||
outputs: 1,
|
||||
@@ -26,9 +29,21 @@
|
||||
<input type="text" id="node-input-length">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-setTo"><i class="fa fa-ellipsis-he"></i> to</label>
|
||||
<label for="node-input-setTo"><i class="fa fa-ellipsis-h"></i> to</label>
|
||||
<input type="text" id="node-input-setTo">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-isNumberDisabled"> Disable Number</label>
|
||||
<input type="checkbox" id="node-input-isNumberDisabled">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-isSpecialCharsDisabled"> Disable Special chars</label>
|
||||
<input type="checkbox" id="node-input-isSpecialCharsDisabled">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-isSpaceDisabled"> Disable Space</label>
|
||||
<input type="checkbox" id="node-input-isSpaceDisabled">
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="password-generator">
|
||||
@@ -40,5 +55,7 @@
|
||||
<dd> Password length. </dd>
|
||||
<dt>to</dt>
|
||||
<dd> The property to set generated password. </dd>
|
||||
<dt>Disable options</dt>
|
||||
<dd> Excludes the characters from the generated password. </dd>
|
||||
</dl>
|
||||
</script>
|
||||
</script>
|
||||
Reference in New Issue
Block a user