diff --git a/deps.edn b/deps.edn index 5833359..415ad59 100644 --- a/deps.edn +++ b/deps.edn @@ -11,7 +11,9 @@ {;; Application org.clojure/clojure {:mvn/version "1.11.4"} org.clojure/spec.alpha {:mvn/version "0.5.238"} - orchestra/orchestra {:mvn/version "2021.01.01-1"}} + orchestra/orchestra {:mvn/version "2021.01.01-1"} + cheshire/cheshire {:mvn/version "5.13.0"} + com.widdindustries/cljc.java-time {:mvn/version "0.1.21"}} ;; --------------------------------------------------------- ;; --------------------------------------------------------- diff --git a/src/dda/backup/cred_rot/domain.clj b/src/dda/backup/cred_rot/domain.clj index f05ce35..abe2e1b 100644 --- a/src/dda/backup/cred_rot/domain.clj +++ b/src/dda/backup/cred_rot/domain.clj @@ -1,11 +1,37 @@ (ns dda.backup.cred-rot.domain (:require [orchestra.core :refer [defn-spec]] - [clojure.spec.alpha :as s])) + [clojure.spec.alpha :as s] + [clojure.string :as str] + [cljc.java-time.local-date :as ld] + [cljc.java-time.format.date-time-formatter :as df])) (s/def ::new-password-file string?) -; Refer to "docs/CredentialRotation.md" for specifics +(def lowercase-numeric #"[a-z0-9]+") +(def alphanumeric #"[a-zA-Z0-9]+") + +; true | false +(s/def ::current boolean?) +; 521e0760 +(s/def ::id (s/and string? #(re-matches lowercase-numeric %))) +; root +(s/def ::userName #(re-matches alphanumeric %)) +; backup-restore-65bd9b6ff5-z69sn +(s/def ::hostName (fn [in] (every? #(re-matches lowercase-numeric %) (str/split in #"-")))) +; "2024-10-18 13:08:16" +(def timestamp-formatter (df/of-pattern "yyyy-MM-dd HH:mm:ss")) +(s/def ::created #(try + (ld/parse % timestamp-formatter) + true + (catch Exception _ false))) + +(s/def ::entry (s/keys :opt-un [] + :req-un [::current ::id ::userName ::hostName ::created])) +(s/def ::response (s/coll-of ::entry)) + + +; Refer to "docs/CredentialRotation.md" for specifics (defn-spec add-new-password! nil? [new-password-file ::new-password-file] diff --git a/test/dda/backup/cred_rot/domain_test.clj b/test/dda/backup/cred_rot/domain_test.clj new file mode 100644 index 0000000..95042bc --- /dev/null +++ b/test/dda/backup/cred_rot/domain_test.clj @@ -0,0 +1,33 @@ +(ns dda.backup.cred-rot.domain-test + (:require + [clojure.test :refer [deftest is]] + [clojure.spec.alpha :as s] + [clojure.spec.test.alpha :as st] + [dda.backup.cred-rot.domain :as cut])) + +(deftest test-spec-id + (is (s/valid? ::cut/id "521e0760")) + (is (s/valid? ::cut/id "test")) + (is (s/valid? ::cut/id "123456")) + (is (not (s/valid? ::cut/id "ROOT"))) + (is (not (s/valid? ::cut/id "Test!")))) + +(deftest test-spec-username + (is (s/valid? ::cut/userName "521e0760")) + (is (s/valid? ::cut/userName "Testuser")) + (is (s/valid? ::cut/userName "root")) + (is (s/valid? ::cut/userName "ROOT")) + (is (not (s/valid? ::cut/userName "test-user")))) + +(deftest test-spec-hostName + (let [valid #(s/valid? ::cut/hostName %)] + (is (valid "test-some-combination-2")) + (is (valid "backup-restore-65bd9b6ff5-z69sn")))) + +(deftest test-spec-created + (let [valid #(s/valid? ::cut/created %)] + (is (valid "2024-10-18 13:08:16")) + (is (valid "2032-09-01 12:56:59")) + (is (not (valid "2024-13-5 13:08:16"))) + (is (not (valid "2024-6-42 13:08:16"))) + (is (not (valid "test"))))) \ No newline at end of file