Skip to content

Commit

Permalink
Merge pull request #63 from AtmosSystem/kernel-2.0
Browse files Browse the repository at this point in the history
Kernel 2.0
  • Loading branch information
xerp committed May 12, 2020
2 parents 9bef639 + e45d206 commit 18ebeed
Show file tree
Hide file tree
Showing 14 changed files with 188 additions and 382 deletions.
24 changes: 0 additions & 24 deletions CHANGELOG.md

This file was deleted.

26 changes: 4 additions & 22 deletions project.clj
Original file line number Diff line number Diff line change
@@ -1,31 +1,13 @@
(defproject atmos-kernel "1.5"
(defproject atmos-kernel "2.0"
:description "Core of Atmos System"
:url "https://github.com/AtmosSystem/Kernel"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]
:dependencies [[org.clojure/clojure "1.10.0"]
;configuration-deps
[aero "1.1.3"]
[aero "1.1.6"]
;pem
[xsc/pem-reader "0.1.1"]
;web-service-deps
[org.clojure/data.json "0.2.6"]
[clj-http "3.10.0"]
[com.cemerick/url "0.1.1"]
[compojure "1.6.1"]
;ring
[ring/ring-defaults "0.3.2"]
[ring/ring-core "1.7.1"]
[ring/ring-json "0.4.0"]
[ring/ring-codec "1.1.2"]
[ring-cors "0.1.12"]
;authorization-deps
[buddy/buddy-auth "2.2.0"]
;logs-deps
[org.clojure/tools.logging "0.4.1"]
[ch.qos.logback/logback-classic "1.2.3"]
;others
[javax.xml.bind/jaxb-api "2.3.0"]]
[xsc/pem-reader "0.1.1"]]
:repositories [["releases" {:url "https://clojars.org/repo"
:username :env/CLOJAR_USERNAME
:password :env/CLOJAR_PASSWORD
Expand Down
20 changes: 16 additions & 4 deletions src/atmos_kernel/configuration.clj
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
(ns atmos-kernel.configuration
(:require [aero.core :refer [read-config]]
[clojure.java.io :as io]))
[clojure.java.io :as io]
[clojure.spec.alpha :as s]))

(defn read-resource
"Load a resource configuration"
[file extension]
(let [source (io/resource (str (name file) "." (name extension)))]
(if-let [source (io/resource (str (name file) "." (name extension)))]
(read-config source)))

(s/fdef read-resource
:args (s/cat :file :atmos-kernel.spec/non-blank-string
:extension :atmos-kernel.spec/non-blank-string)
:ret (s/or :if-not-source nil?
:if-source :atmos-kernel.spec/non-empty-map))

(defn read-edn
"Load a edn resource"
"Load an edn resource"
[file]
(read-resource file :edn))
(read-resource file :edn))

(s/fdef read-edn
:args (s/cat :file :atmos-kernel.spec/non-blank-string)
:ret (s/or :if-not-file nil?
:if-file :atmos-kernel.spec/non-empty-map))
35 changes: 25 additions & 10 deletions src/atmos_kernel/core.clj
Original file line number Diff line number Diff line change
@@ -1,28 +1,43 @@
(ns atmos-kernel.core
(:require [clojure.tools.logging :refer :all]))
(:require [clojure.spec.alpha :as s]))

(defn keyword-map
"Convert the keys of map (and subsequent maps) to clojure keyword"
"Convert the keys of map (and subsequent maps) to clojure keyword."
[data]
(into {} (map (fn [[k v]] [(keyword k) (if (map? v)
(keyword-map
v) v)]) data)))

(s/fdef keyword-map
:args (s/cat :data map?)
:ret map?)

(defn nil-or-empty?
"Check is the coll is nil or empty"
[coll]
(or (nil? coll) (empty? coll)))
"Check is the collection is nil or empty."
[collection]
(or (nil? collection) (empty? collection)))

(s/fdef nil-or-empty?
:args (s/cat :collection (s/coll-of any?))
:ret boolean?)

(defn in?
"true if coll contains elm"
[coll elm]
(some #(= elm %) coll))
"true if collection contains element."
[collection element]
(some #(= element %) collection))

(s/fdef in?
:args (s/cat :collection (s/coll-of any?)
:element any?)
:ret boolean?)

(defn throw-exception
"Throw an exception"
"Throw an exception."
([message data]
(throw (ex-info message data)))
([message]
(throw (ex-info message {}))))
(throw-exception message {})))

(s/fdef throw-exception
:args (s/cat :message string? :data (s/? map?))
:ret :atmos-kernel.spec/exception)
12 changes: 9 additions & 3 deletions src/atmos_kernel/io.clj
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
(ns atmos-kernel.io
(:require [atmos-kernel.core :refer [nil-or-empty?]]
[clojure.java.io :as io]))
[clojure.java.io :as io]
[clojure.spec.alpha :as s]))

(defn copy-file
"Copy content from source to destination using stream"
"Copy content from source to destination using stream."
[source destination]
(if (and (not (nil-or-empty? source)) (not (nil-or-empty? destination)))
(let [destination-file (io/file destination)]
(with-open [in-stream (io/input-stream source)
out-stream (io/output-stream destination-file)]
(io/copy in-stream out-stream)
destination-file))))
destination-file))))

(s/fdef copy-file
:args (s/cat :source :atmos-kernel.spec/file-path
:destination :atmos-kernel.spec/file-path)
:ret nil?)
51 changes: 0 additions & 51 deletions src/atmos_kernel/protocol.clj

This file was deleted.

59 changes: 56 additions & 3 deletions src/atmos_kernel/security/ssl.clj
Original file line number Diff line number Diff line change
@@ -1,40 +1,78 @@
(ns atmos-kernel.security.ssl
(:require [pem-reader.core :as pem]
[clojure.java.io :as io])
[clojure.java.io :as io]
[clojure.spec.alpha :as s])
(:import (java.security KeyStore)
(java.security.cert CertificateFactory)))
(java.security.cert CertificateFactory Certificate)))

(s/def ::key-store #(instance? KeyStore %))
(s/def ::trust-store #(instance? KeyStore %))
(s/def ::keystore-or-truststore (s/or :key ::key-store :trust ::trust-store))
(s/def ::PEM-file map?)
(s/def ::certificate #(instance? Certificate %))

(defn create-keystore
"Create a Java KeyStore with(out) password."
([password]
(doto (KeyStore/getInstance (KeyStore/getDefaultType))
(.load nil (if password (char-array password)))))
([]
(create-keystore nil)))

(s/fdef create-keystore
:args (s/alt :without-password (s/cat)
:with-password (s/nilable :atmos-kernel.spec/non-blank-string))
:ret ::key-store)


(defn create-truststore
"Create a Java TrustStore with(out) password."
([password]
(doto (KeyStore/getInstance (KeyStore/getDefaultType))
(.load nil (if password (char-array password)))))
([]
(create-truststore nil)))

(s/fdef create-truststore
:args (s/alt :no-params (s/cat)
:with-params (s/cat :password (s/nilable :atmos-kernel.spec/non-blank-string)))
:ret ::trust-store)

(defn save-keystore
"Persist KeyStore/TrustStore."
([store store-file-path password]
(with-open [output-stream (io/output-stream store-file-path)]
(.store store output-stream (if password (char-array password)))))
([store store-file-path]
(save-keystore store store-file-path nil)))

(s/fdef save-keystore
:args (s/cat :store ::keystore-or-truststore
:store-file-path :atmos-kernel.spec/file-path
:password (s/nilable :atmos-kernel.spec/non-blank-string))
:ret nil?)

(defn read-key-pem-file
"Read PEM file."
[pem-file-path]
(pem/read pem-file-path))

(s/fdef read-key-pem-file
:args (s/cat :pem-file-path :atmos-kernel.spec/file-path)
:ret ::PEM-file)

(defn read-certificate-pem-file
"Read Certificate from PEM file."
[pem-file-path]
(let [certificate-factory (CertificateFactory/getInstance "X.509")]
(.generateCertificate certificate-factory (io/input-stream pem-file-path))))

(s/fdef read-certificate-pem-file
:args (s/cat :pem-file-path :atmos-kernel.spec/file-path)
:ret ::certificate)

(defn add-pem-client-key
"Add client key to Java KeyStore."
([keystore alias client-pem-certificate client-pem-key password]
(let [client-certificate-file (if (instance? String client-pem-certificate)
(read-certificate-pem-file client-pem-certificate)
Expand All @@ -49,10 +87,25 @@
([keystore alias client-pem-certificate client-pem-key]
(add-pem-client-key keystore alias client-pem-certificate client-pem-key "")))

(s/fdef add-pem-client-key
:args (s/cat :keystore ::key-store
:alias :atmos-kernel.spec/non-blank-string
:client-pem-certificate :atmos-kernel.spec/file-path
:client-pem-key string?
:password (s/nilable string?))
:ret ::key-store)

(defn add-trust-certificate
"Add certificate to Java TrustStore."
[truststore alias pem-certificate]
(let [certificate-file (if (instance? String pem-certificate)
(read-certificate-pem-file pem-certificate)
pem-certificate)]
(doto truststore
(.setCertificateEntry (name alias) certificate-file))))
(.setCertificateEntry (name alias) certificate-file))))

(s/fdef add-trust-certificate
:args (s/cat :truststore ::trust-store
:alias :atmos-kernel.spec/non-blank-string
:pem-certificate :atmos-kernel.spec/file-path)
:ret ::trust-store)
Loading

0 comments on commit 18ebeed

Please sign in to comment.