From 9f351136adde11a891664063c071a25235d74c5d Mon Sep 17 00:00:00 2001 From: Alberto Ricart Date: Mon, 10 May 2021 14:30:21 -0500 Subject: [PATCH] changed to a simple switch --- nats-base-client/jsutil.ts | 29 ++++++++++++++++++++++++++--- tests/jsm_test.ts | 36 ++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/nats-base-client/jsutil.ts b/nats-base-client/jsutil.ts index 9b2081b8..89caefcc 100644 --- a/nats-base-client/jsutil.ts +++ b/nats-base-client/jsutil.ts @@ -30,15 +30,38 @@ export function validateStreamName(name?: string) { return validateName("stream", name); } +function badChar(s: string): string { + switch (s) { + case ".": + return "dot (.)"; + case "*": + return "asterisk (*)"; + case ">": + return "greater than (>)"; + case "\r": + return "carriage return (␍)"; + case "\n": + return "line feed (␊)"; + case "\t": + return "tab (␉)"; + case "\f": + return "form feed (␌)"; + default: + return "unknown"; + } +} + export function validateName(context: string, name = "") { if (name === "") { throw Error(`${context} name required`); } - const bad = [".", "*", ">"]; + const bad = [".", "*", ">", "\r", "\n", "\t", "\f"]; bad.forEach((v) => { - if (name.indexOf(v) !== -1) { + const idx = name.indexOf(v); + if (idx !== -1) { + const rep = badChar(v); throw Error( - `invalid ${context} name - ${context} name cannot contain '${v}'`, + `invalid ${context} name - ${context} name cannot contain '${rep}'`, ); } }); diff --git a/tests/jsm_test.ts b/tests/jsm_test.ts index c694619b..c3789f9b 100644 --- a/tests/jsm_test.ts +++ b/tests/jsm_test.ts @@ -41,7 +41,10 @@ import { } from "./jstest_util.ts"; import { connect } from "../src/mod.ts"; import { assertThrowsAsyncErrorCode } from "./helpers/mod.ts"; -import { validateName } from "../nats-base-client/jsutil.ts"; +import { + validateName, + validateStreamName, +} from "../nats-base-client/jsutil.ts"; const StreamNameRequired = "stream name required"; const ConsumerNameRequired = "durable name required"; @@ -536,19 +539,23 @@ Deno.test("jsm - advisories", async () => { }); Deno.test("jsm - validate name", () => { - type t = [string, boolean]; + type t = [string, boolean, string]; const tests: t[] = [ - ["", false], - [".", false], - ["*", false], - [">", false], - ["hello.", false], - ["hello.*", false], - ["hello.>", false], - ["one.two", false], - ["one*two", false], - ["one>two", false], - ["stream", true], + ["", false, "name required"], + [".", false, "dot"], + ["*", false, "asterisk"], + [">", false, "greater than"], + ["hello\n", false, "line feed"], + ["hello\r", false, "carriage return"], + ["he\tllo", false, "tab"], + ["he\fllo", false, "form feed"], + ["hello.", false, "dot"], + ["hello*", false, "asterisk"], + ["hello>", false, "greater than"], + ["one.two", false, "dot"], + ["one*two", false, "asterisk"], + ["one>two", false, "greater than"], + ["stream", true, ""], ]; tests.forEach((v, idx) => { @@ -557,10 +564,11 @@ Deno.test("jsm - validate name", () => { if (!v[1]) { fail(`${v[0]} should have been rejected`); } - } catch (_err) { + } catch (err) { if (v[1]) { fail(`${v[0]} should have been valid`); } + assert(err.message.includes(v[2])); } }); });