Веб-приложение, предназначенное для кодирования и декодирования информации.
Рабочий стенд для проверки сканирования.
-
Убедитесь, что у вас установлены Java Development Kit (JDK) и Leiningen. Если они не установлены, следуйте инструкциям на официальных веб-сайтах для их установки.
-
Склонируйте репозиторий с сервером на свой компьютер:
git clone https://github.com/Untouchabl3Pineapple/clojureQrServer.git
- Перейдите в каталог проекта:
cd clojureQrServer/QR-Server
- Перекомпилируйте ClojureScript в JavaScript:
lein cljsbuild once cljs
- Запустите сервер с помощью команды:
lein run
Для использования сканера с мобильного устройства необходимо подключить протокол HTTPS, так как функция getUserMedia
из JavaScript не работает с HTTP протоколом.
После успешного запуска сервера вы сможете использовать его для кодирования и декодирования QR-кодов.
Чтобы пройти авторизацию, необходимо перейти на страницу /login. Пример авторизации:
Пример попытки авторизации с неверными данными:
Чтобы закодировать строку в QR-код, перейдите на страницу /qrgenerator и в поле Input message to encode введите строку, которую вы хотите закодировать. Например:
В ответе вы получите изображение QR-кода в формате PNG:
Чтобы декодировать QR-код в строку, перейдите на страницу /scanner, и в открывшееся окно с камерой наведите изображение содержащие QR-код:
В ответе вы получите декодированную строку.
Для получения лог данных необходимо перейти на страницу /logger. В результате будут отображены лог данные, а именно: id операции, время операции, оперируемые данные.
Для получения log данных необходимо иметь права администратора.
Пример логгера:
Пример попытки доступа к логгеру с неподходящим токеном:
(def app
(-> routes/app-routes
(wrap-defaults site-defaults)
(wrap-reload {:dirs ["src"]})))
(defn -main []
(let [port 3000]
(jetty/run-jetty app {:port port})))
В данном фрагменте кода представлен функция main, которая запускает веб-сервер на порте 3000 для обслуживания обработчика app.
(defroutes app-routes
(defroutes app-routes
(GET "/home" [] (handlers/home-gethandler))
(GET "/scanner" [] (handlers/scanner-gethandler))
(GET "/logger" [] (handlers/logger-gethandler))
(POST "/log" [qrData] (handlers/log-posthandler qrData))
(GET "/qrgenerator" [] (handlers/qr-generator-gethandler))
(POST "/qrgenerator" [text] (handlers/qr-generator-posthandler text))
(GET "/login" [] (handlers/login-gethandler))
(POST "/login" [] (handlers/login-posthandler))
(GET "/logout" [] (handlers/logout-gethandler)))
В данном фрагменте кода представлен обработчик последовательности машртрутов. Маршрут описан следующим образом:
- http-метод
- маршрут
- аргументы для функции-обработчика
- функция-обработчик
(defn home-gethandler []
...
)
(defn scanner-gethandler []
...
)
(defn logger-gethandler []
...
)
(defn log-posthandler [requestData]
...
)
(defn qr-generator-gethandler []
...
)
(defn qr-generator-posthandler [requestData]
...
)
(defn login-gethandler []
...
)
(defn login-posthandler []
...
)
(defn logout-gethandler []
...
)
В данном фрагменте кода представлены функции-обработчики машртрутов.
В функции qr-generator
была добавлена возможность автоматического сохранения сгенерированных QR-кодов на сервере. При необходимости этот функционал можно просто отключить. Сгенерированные изображения сохраняются в формате PNG и помещаются в папку root/resources/public/qrcodes/
.
(defn verify-token [token]
...
)
(defn verify-admin-token [token]
...
)
(defn- generate-token [login]
...
)
(defn- admin-login-validation [login password]
...
)
(defn- user-login-validation [login password]
...
)
(defn- login-validation [login password]
...
)
(defn- authentication [login password]
...
)
(defn cas-auth [request]
...
)
В данном фрагменте кода представлена реализация cas авторизации.
При попытке авторизации введенные пользователем данные передаются функции cas-auth. Cas-auth передает данные функции, которая генерирует специальный токен. Далее токен возвращается и проверяется его валидность. В случае валидности токена пользователь получает доступ к системе.
(def db-params
...
)
(defn get-connection []
...
)
(defn get-all-logs [db]
...
)
(defn insert-log [db, data]
...
)
В качестве СУБД была выбрана PostgreSQL.
База данных используется для хранения логов, предоставляющих следующую информацию: id, время выполнения операции, оперируемая строка.
Создание сущности лежит в директории db:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
DROP TABLE IF EXISTS logger;
CREATE TABLE IF NOT EXISTS logger
(
log_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
log_date_time TIMESTAMP WITH TIME ZONE NOT NULL,
log_data TEXT NOT NULL
);
Чтобы подключиться к БД, достаточно установить свои параметры в данные поля:
(def db-type
"postgresql")
(def db-name
"postgres")
(def db-user
"postgres")
(def db-password
"12345")
(def db-host
"localhost")
(def db-port
5432)
(defn main-layout [title content]
...
)
(defn scanner-page []
...
)
(defn logger-page [logs]
...
)
(defn qr-generator-page [unique-filename text]
...
)
(defn qr-page []
...
)
(defn home-page []
...
)
(defn login-layout [title, content]
...
)
(defn login-page []
...
)
В данном фрагменте кода предоставлены html-страницы.
Взаимодействие с камерой производится за счет подключения библиотеки jsQR.
Были использованы следующие библиотеки:
- hiccup.core - рендеринг дерева векторов в строку HTML.
- ring.util.anti-forgery - служебные функции для вставки токенов защиты от подделки в HTML-формы.
- next.jdbc - обертка Clojure низкого уровня для доступа к базам данных на основе JDBC
- com.nopolabs.clozxing.encode - функции, реализующие кодирование и декодирование QR-кодов
- clojure.java.io - полиморфные служебные функции ввода-вывода для Clojure
- ring.util.response - функции для создания и дополнения response maps.
- compojure.core - функции и макросы для построения маршрутов и их объединения в более сложные функции
- ring.adapter.jetty - адаптер Ring, использующий встроенный веб-сервер Jetty 9. Адаптеры используются для преобразования обработчиков Ring в работающие веб-серверы.
- ring.middleware.defaults - функции для предоставления обработчику значений по умолчанию.
- ring.middleware.reload - функции, которые перезагружают измененные пространства имен при каждом запросе.
- jsQR - библиотека чтения QR-кода на чистом JavaScript.