From 96e419c12cab8e85e8f8a683b65cf05333f6e073 Mon Sep 17 00:00:00 2001 From: James Pace Date: Thu, 18 Nov 2021 02:56:54 +0000 Subject: [PATCH] Cleanup. --- CMakeLists.txt | 4 -- README.md | 5 +- include/jwp-plugin/AuthList.hpp | 13 +++++ include/jwp-plugin/Authorizer.hpp | 19 ++++++- include/jwp-plugin/jwp-plugin.h | 30 +++++++++++ priv.key | 3 -- pub.key | 3 -- src/AuthList.cpp | 15 +++++- src/Authorizer.cpp | 20 ++++++-- src/jwp-plugin.cpp | 34 ++++++------- src/jwt-example.cpp | 55 --------------------- test/{python-ex.py => get-token-example.py} | 0 test/mosquitto.conf | 47 +----------------- 13 files changed, 109 insertions(+), 139 deletions(-) create mode 100644 include/jwp-plugin/jwp-plugin.h delete mode 100644 priv.key delete mode 100644 pub.key delete mode 100644 src/jwt-example.cpp rename test/{python-ex.py => get-token-example.py} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 74ea801..57f27ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,3 @@ target_include_directories(jwp-plugin PUBLIC ${jwt-cpp_INCLUDE_DIR} ) target_link_libraries(jwp-plugin OpenSSL::Crypto) - -add_executable(jwt-example src/jwt-example.cpp) -target_include_directories(jwt-example PRIVATE ${jwt-cpp_INCLUDE_DIR}) -target_link_libraries(jwt-example OpenSSL::Crypto) diff --git a/README.md b/README.md index 6488ab5..721f582 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ -sudo apt install mosquitto-dev g++ cmake libmosquitto-dev mosquitto-clients +# Dependencies +sudo apt install mosquitto-dev g++ cmake libmosquitto-dev mosquitto-clients sudo apt install openssl libssl-dev - +# Generating Ed25519 Keys for Testing openssl genpkey -algorithm Ed25519 -out priv.key openssl pkey -in priv.key -pubout > pub.key diff --git a/include/jwp-plugin/AuthList.hpp b/include/jwp-plugin/AuthList.hpp index f9460f2..6255070 100644 --- a/include/jwp-plugin/AuthList.hpp +++ b/include/jwp-plugin/AuthList.hpp @@ -1,3 +1,16 @@ +// Copyright 2021 James Pace +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #pragma once #include #include diff --git a/include/jwp-plugin/Authorizer.hpp b/include/jwp-plugin/Authorizer.hpp index 2a93ba7..a5687a7 100644 --- a/include/jwp-plugin/Authorizer.hpp +++ b/include/jwp-plugin/Authorizer.hpp @@ -1,9 +1,24 @@ +// Copyright 2021 James Pace +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #pragma once -#include -#include #include + +#include + #include +#include class Authorizer { diff --git a/include/jwp-plugin/jwp-plugin.h b/include/jwp-plugin/jwp-plugin.h new file mode 100644 index 0000000..b56aa6f --- /dev/null +++ b/include/jwp-plugin/jwp-plugin.h @@ -0,0 +1,30 @@ +// Copyright 2021 James Pace +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern "C" { + #include "mosquitto.h" + #include "mosquitto_broker.h" + #include "mosquitto_plugin.h" +} + +// Stuff we're "exporting" for the dynamic loading. +extern "C" { + int mosquitto_plugin_version(int supported_version_count, const int *supported_versions); + int mosquitto_plugin_init(mosquitto_plugin_id_t *identifier, void **userdata, struct mosquitto_opt *options, int option_count); + int mosquitto_plugin_cleanup(void *userdata, struct mosquitto_opt *options, int option_count); +} +// My functions +int jwp_auth_basic_auth_callback(int event, void *event_data, void *userdata); +int jwp_acl_check_callback(int event, void *event_data, void *userdata); +int jwp_disconnect_callback(int event, void *event_data, void *userdata); diff --git a/priv.key b/priv.key deleted file mode 100644 index a759af3..0000000 --- a/priv.key +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PRIVATE KEY----- -MC4CAQAwBQYDK2VwBCIEID6d/A9UnVV5xXf9RAvXSNTk/a1QNUrzfvawzEAWDh3e ------END PRIVATE KEY----- diff --git a/pub.key b/pub.key deleted file mode 100644 index 8234de3..0000000 --- a/pub.key +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PUBLIC KEY----- -MCowBQYDK2VwAyEA+IYMWskcPLcC8IsUy6xsj3whqlzYwFWuAmVR7ue/LLw= ------END PUBLIC KEY----- diff --git a/src/AuthList.cpp b/src/AuthList.cpp index ee69d9d..f22320d 100644 --- a/src/AuthList.cpp +++ b/src/AuthList.cpp @@ -1,5 +1,18 @@ -#include +// Copyright 2021 James Pace +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #include +#include AuthList::AuthList(): _allowedUsernames{} diff --git a/src/Authorizer.cpp b/src/Authorizer.cpp index 5935ba2..22ec220 100644 --- a/src/Authorizer.cpp +++ b/src/Authorizer.cpp @@ -1,12 +1,24 @@ +// Copyright 2021 James Pace +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #include -#include -#include #include + +#include + #include #include #include -#include - Authorizer::Authorizer(const std::string& pub_key, const std::string& issuer): _pub_key{pub_key}, diff --git a/src/jwp-plugin.cpp b/src/jwp-plugin.cpp index e2bac5a..f8f53bf 100644 --- a/src/jwp-plugin.cpp +++ b/src/jwp-plugin.cpp @@ -1,29 +1,25 @@ -extern "C" { - #include "mosquitto.h" - #include "mosquitto_broker.h" - #include "mosquitto_plugin.h" -} +// Copyright 2021 James Pace +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include +#include #include #include -#include - -// Stuff we're "exporting" for the dynamic loading. -extern "C" { - int mosquitto_plugin_version(int supported_version_count, const int *supported_versions); - int mosquitto_plugin_init(mosquitto_plugin_id_t *identifier, void **userdata, struct mosquitto_opt *options, int option_count); - int mosquitto_plugin_cleanup(void *userdata, struct mosquitto_opt *options, int option_count); -} -// My functions -int jwp_auth_basic_auth_callback(int event, void *event_data, void *userdata); -int jwp_acl_check_callback(int event, void *event_data, void *userdata); -int jwp_disconnect_callback(int event, void *event_data, void *userdata); - // Mosquitto Globals static mosquitto_plugin_id_t *plugin_id = nullptr; static std::unique_ptr authorizer = nullptr; - int mosquitto_plugin_version(int supported_version_count, const int *supported_versions) { for(int index = 0; index < supported_version_count; index++) diff --git a/src/jwt-example.cpp b/src/jwt-example.cpp deleted file mode 100644 index 6218984..0000000 --- a/src/jwt-example.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -int main(int argc, char *argv[]) -{ - std::string pub_key = R"(-----BEGIN PUBLIC KEY----- -MCowBQYDK2VwAyEA+IYMWskcPLcC8IsUy6xsj3whqlzYwFWuAmVR7ue/LLw= ------END PUBLIC KEY-----)"; - std::string priv_key = R"(-----BEGIN PRIVATE KEY----- -MC4CAQAwBQYDK2VwBCIEID6d/A9UnVV5xXf9RAvXSNTk/a1QNUrzfvawzEAWDh3e ------END PRIVATE KEY-----)"; - - auto token = jwt::create() - .set_type("JWT") - .set_issuer("jamesp") - .set_subject("jimmy") - .set_audience("mqtt") - .set_payload_claim("topics", jwt::claim(std::string{"{'/help/*', '/test/*'}"})) - .set_expires_at(std::chrono::system_clock::now()) - .sign(jwt::algorithm::ed25519(pub_key, priv_key, "", "")); - - std::cout << "Token: " << token << std::endl; - - auto verifier = jwt::verify() - .allow_algorithm(jwt::algorithm::ed25519(pub_key, "", "", "")) - .with_issuer("jamesp"); - - auto decoded = jwt::decode(token); - - try - { - verifier.verify(decoded); - } - catch(jwt::error::token_verification_exception& exception) - { - std::cout << exception.what() << std::endl; - return -1; - } - - for(auto& e : decoded.get_header_claims()) - { - std::cout << e.first << ": " << e.second.to_json() << std::endl; - } - - std::cout << std::endl; - - for(auto& e : decoded.get_payload_claims()) - { - std::cout << e.first << ": " << e.second.to_json() << std::endl; - } - - return 0; -} - diff --git a/test/python-ex.py b/test/get-token-example.py similarity index 100% rename from test/python-ex.py rename to test/get-token-example.py diff --git a/test/mosquitto.conf b/test/mosquitto.conf index c303ccb..f65be9a 100644 --- a/test/mosquitto.conf +++ b/test/mosquitto.conf @@ -4,53 +4,8 @@ protocol websockets listener 8081 protocol mqtt - log_type all allow_anonymous true auth_plugin /home/jimmy/Develop/mosquitto-plugin/build/libjwp-plugin.so -auth_opt_issuer https://auth.jpace121.net/realms/jpace121-main -auth_opt_public_key /home/jimmy/Develop/mosquitto-plugin/test/key.pem - -# ----------------------------------------------------------------- -# External authentication and topic access plugin options -# ----------------------------------------------------------------- - -# External authentication and access control can be supported with the -# auth_plugin option. This is a path to a loadable plugin. See also the -# auth_opt_* options described below. -# -# The auth_plugin option can be specified multiple times to load multiple -# plugins. The plugins will be processed in the order that they are specified -# here. If the auth_plugin option is specified alongside either of -# password_file or acl_file then the plugin checks will be made first. -# -#auth_plugin - -# If the auth_plugin option above is used, define options to pass to the -# plugin here as described by the plugin instructions. All options named -# using the format auth_opt_* will be passed to the plugin, for example: -# -# auth_opt_db_host -# auth_opt_db_port -# auth_opt_db_username -# auth_opt_db_password - -# ----------------------------------------------------------------- -# Default authentication and topic access control -# ----------------------------------------------------------------- - -# Control access to the broker using a password file. This file can be -# generated using the mosquitto_passwd utility. If TLS support is not compiled -# into mosquitto (it is recommended that TLS support should be included) then -# plain text passwords are used, in which case the file should be a text file -# with lines in the format: -# username:password -# The password (and colon) may be omitted if desired, although this -# offers very little in the way of security. -# -# See the TLS client require_certificate and use_identity_as_username options -# for alternative authentication options. If an auth_plugin is used as well as -# password_file, the auth_plugin check will be made first. -#password_file - +auth_opt_issuer https://auth.jpace121.net/realms/jpace121-main \ No newline at end of file