diff --git a/services/tunnelbroker/CMakeLists.txt b/services/tunnelbroker/CMakeLists.txt index ad9b8739c..c14acc23e 100644 --- a/services/tunnelbroker/CMakeLists.txt +++ b/services/tunnelbroker/CMakeLists.txt @@ -1,168 +1,163 @@ PROJECT(tunnelbroker C CXX) cmake_minimum_required(VERSION 3.16) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin) if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) set(CMAKE_CXX_STANDARD 17) + # For C++17 on MacOS, we must set minimum target to 10.14+ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14) find_package(PkgConfig REQUIRED) find_package(double-conversion REQUIRED) find_package(Folly REQUIRED) find_package(protobuf REQUIRED) find_package(gRPC REQUIRED) # Find AMQP-CPP installation find_package(amqpcpp CONFIG REQUIRED) # Find Cryptopp installation pkg_check_modules(CRYPTOPP REQUIRED IMPORTED_TARGET libcryptopp=8.6 ) # Find Libuv installation pkg_check_modules(LIBUV REQUIRED IMPORTED_TARGET libuv>=1.43 ) if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL "/transferred/tunnelbroker") # Inside the docker build contex set(_proto_path "grpc") else() # Inside repo set(_proto_path "../../native/cpp/CommonCpp/grpc") endif() # Shared Comm protos add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${_proto_path} ${CMAKE_CURRENT_BINARY_DIR}/protos EXCLUDE_FROM_ALL ) # Shared services code add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../lib/src ${CMAKE_CURRENT_BINARY_DIR}/common EXCLUDE_FROM_ALL ) set(BUILD_TESTING OFF CACHE BOOL "Turn off tests" FORCE) set(WITH_GFLAGS OFF CACHE BOOL "Turn off gflags" FORCE) find_package(AWSSDK REQUIRED COMPONENTS core dynamodb) find_package(Boost 1.40 COMPONENTS program_options thread system context filesystem regex REQUIRED ) find_package(OpenSSL REQUIRED) find_package(glog) -# Corrosion Rust integration -find_package(Corrosion REQUIRED) -corrosion_import_crate(MANIFEST_PATH "rust-notifications/Cargo.toml") -set(RUST_HEADERS_INCLUDE_DIR "rust-notifications/extern") -set(RUST_LIBS "rust-notifications") - file(GLOB_RECURSE SOURCE_CODE "./src/*.cpp") set( SOURCE_CODE ${DOUBLE_CONVERSION_SOURCES} ${GENERATED_CODE} ${SOURCE_CODE} ) set( LIBS comm-services-common comm-tunnelbroker-grpc gRPC::grpc++_reflection gRPC::grpc++ ${AWSSDK_LINK_LIBRARIES} PkgConfig::CRYPTOPP PkgConfig::LIBUV ${Boost_LIBRARIES} ${RUST_LIBS} amqpcpp OpenSSL::SSL glog::glog double-conversion::double-conversion Folly::folly ) # SERVER add_executable( tunnelbroker ${GENERATED_CODE} ${SOURCE_CODE} ) target_include_directories(tunnelbroker PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/Database ${CMAKE_CURRENT_SOURCE_DIR}/src/DeliveryBroker ${CMAKE_CURRENT_SOURCE_DIR}/src/Service ${CMAKE_CURRENT_SOURCE_DIR}/src/Tools ${CMAKE_CURRENT_SOURCE_DIR}/src/Amqp ) target_link_libraries( tunnelbroker ${LIBS} ) install( TARGETS tunnelbroker RUNTIME DESTINATION bin/ ) # TEST if($ENV{COMM_TEST_SERVICES} MATCHES 1) file(GLOB TEST_CODE "./test/*.cpp") list(FILTER SOURCE_CODE EXCLUDE REGEX "./src/server.cpp") enable_testing() find_package(GTest REQUIRED) add_executable( runTests ${SOURCE_CODE} ${TEST_CODE} ) target_link_libraries( runTests ${LIBS} GTest::gtest_main ) target_include_directories(runTests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/Database ${CMAKE_CURRENT_SOURCE_DIR}/src/DeliveryBroker ${CMAKE_CURRENT_SOURCE_DIR}/src/Service ${CMAKE_CURRENT_SOURCE_DIR}/src/Tools ${CMAKE_CURRENT_SOURCE_DIR}/src/Amqp ) include(GoogleTest) gtest_discover_tests(runTests) endif() diff --git a/services/tunnelbroker/rust-notifications/src/apns.rs b/services/tunnelbroker/rust-notifications/src/apns.rs new file mode 100644 index 000000000..1511473a5 --- /dev/null +++ b/services/tunnelbroker/rust-notifications/src/apns.rs @@ -0,0 +1,30 @@ +use a2::{ + Client, Endpoint, NotificationBuilder, NotificationOptions, + PlainNotificationBuilder, +}; +use anyhow::Result; +use std::fs::File; + +pub async fn send_by_a2_client( + certificate_path: &str, + certificate_password: &str, + device_token: &str, + message: &str, + sandbox: bool, +) -> Result { + let mut certificate = File::open(certificate_path)?; + let endpoint = if sandbox { + Endpoint::Sandbox + } else { + Endpoint::Production + }; + let client = + Client::certificate(&mut certificate, certificate_password, endpoint)?; + let options = NotificationOptions { + ..Default::default() + }; + let builder = PlainNotificationBuilder::new(message); + let payload = builder.build(device_token, options); + let response = client.send(payload).await?; + Ok(response.code) +} diff --git a/services/tunnelbroker/rust-notifications/src/lib.rs b/services/tunnelbroker/rust-notifications/src/lib.rs index 8b1378917..c3cd17252 100644 --- a/services/tunnelbroker/rust-notifications/src/lib.rs +++ b/services/tunnelbroker/rust-notifications/src/lib.rs @@ -1 +1,39 @@ +use anyhow::Result; +use lazy_static::lazy_static; +use tokio::runtime::Runtime; +pub mod apns; +#[cxx::bridge] +mod ffi { + extern "Rust" { + #[cxx_name = "sendNotifToAPNS"] + fn send_notif_to_apns( + certificate_path: &str, + certificate_password: &str, + device_token: &str, + message: &str, + sandbox: bool, + ) -> Result; + } +} + +lazy_static! { + // Lazy static Tokio runtime initialization + pub static ref RUNTIME: Runtime = Runtime::new().unwrap(); +} + +pub fn send_notif_to_apns( + certificate_path: &str, + certificate_password: &str, + device_token: &str, + message: &str, + sandbox: bool, +) -> Result { + RUNTIME.block_on(apns::send_by_a2_client( + certificate_path, + certificate_password, + device_token, + message, + sandbox, + )) +}