add swift version bullshit file and additional bullshittery

pull/1688/head
jeff 3 years ago committed by Jeff Becker
parent 0708a0d897
commit 5edd045c9b
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -35,6 +35,7 @@ if(RELEASE_MOTTO AND CMAKE_BUILD_TYPE MATCHES "[Rr][Ee][Ll][Ee][Aa][Ss][Ee]")
add_definitions(-DLLARP_RELEASE_MOTTO="${RELEASE_MOTTO}") add_definitions(-DLLARP_RELEASE_MOTTO="${RELEASE_MOTTO}")
endif() endif()
set(LOKINET_VERSION "${lokinet_VERSION_MAJOR}.${lokinet_VERSION_MINOR}.${lokinet_VERSION_PATCH}")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")

@ -18,11 +18,11 @@ fi
cd "$(dirname $0)/../" cd "$(dirname $0)/../"
if [ "$1" = "verify" ] ; then if [ "$1" = "verify" ] ; then
if [ $($binary --output-replacements-xml $(find jni daemon llarp include pybind | grep -E '\.[hc](pp)?$' | grep -v '\#') | grep '</replacement>' | wc -l) -ne 0 ] ; then if [ $($binary --output-replacements-xml $(find jni daemon llarp include pybind | grep -E '\.([hc](pp)?|mm)$' | grep -v '\#') | grep '</replacement>' | wc -l) -ne 0 ] ; then
exit 1 exit 1
fi fi
else else
$binary -i $(find jni daemon llarp include pybind | grep -E '\.[hc](pp)?$' | grep -v '\#') &> /dev/null $binary -i $(find jni daemon llarp include pybind | grep -E '\.([hc](pp)?|mm)$' | grep -v '\#') &> /dev/null
fi fi
swift_format=$(which swiftformat 2>/dev/null) swift_format=$(which swiftformat 2>/dev/null)

@ -9,7 +9,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>MacOS/lokinet</string> <string>MacOS/lokinet</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>org.lokinet.Daemon</string> <string>com.loki-project.lokinet</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>Lokinet</string>
<key>CFBundleExecutable</key>
<string>lokinet-extension</string>
<key>CFBundleIdentifier</key>
<string>org.lokinet.NetworkExtension</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Lokinet</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>0.1</string>
<key>CFBundleVersion</key>
<string>0.1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.networkextension.packet-tunnel</string>
<key>NSExtensionPrincipalClass</key>
<string>Lokinet.LLARPPacketTunnel</string>
</dict>
</dict>
</plist>

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>Lokinet</string>
<key>CFBundleExecutable</key>
<string>lokinet-extension</string>
<key>CFBundleIdentifier</key>
<string>com.loki-project.lokinet.network-extension</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleName</key>
<string>lokinet</string>
<key>CFBundleVersion</key>
<string>${LOKINET_VERSION}</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.networkextension.packet-tunnel</string>
<key>NSExtensionPrincipalClass</key>
<string>LLARPPacketTunnel</string>
</dict>
</dict>
</plist>

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<!--
<key>com.apple.developer.networking.vpn.api</key>
<array>
<string>allow-vpn</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>${CODESIGN_TEAM_ID}.com.loki-project.lokinet.network-extension</string>
</array>
-->
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
</dict>
</plist>

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<!--
<key>com.apple.developer.networking.vpn.api</key>
<array>
<string>allow-vpn</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>${CODESIGN_TEAM_ID}.com.loki-project.lokinet</string>
</array>
-->
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

@ -1,8 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -x
set -e set -e
for file in "${SIGN_TARGET}/Contents/Frameworks/lokinet-extension.framework" "${SIGN_TARGET}/Contents/MacOS/Lokinet" "${SIGN_TARGET}" ; do codesign --verbose=4 --force -s "${CODESIGN_KEY}" --entitlements "${NETEXT_ENTITLEMENTS}" --deep --timestamp --options=runtime "${SIGN_TARGET}/Contents/Frameworks/lokinet-extension.framework"
codesign -vvvv --force -s "${CODESIGN_KEY}" --entitlements "${SIGN_ENTITLEMENTS}" --deep --timestamp --options=runtime "$file" for file in "${SIGN_TARGET}/Contents/MacOS/Lokinet" "${SIGN_TARGET}" ; do
codesign --verbose=4 --force -s "${CODESIGN_KEY}" --entitlements "${LOKINET_ENTITLEMENTS}" --deep --timestamp --options=runtime "$file"
done done
codesign --verify "${SIGN_TARGET}"

@ -1,19 +1,17 @@
if(APPLE) if(APPLE)
option(WITH_SWIFT "use swift" ON) set(LOKINET_SWIFT_SOURCES lokinet.swift)
if(WITH_SWIFT) add_executable(lokinet ${LOKINET_SWIFT_SOURCES})
add_executable(lokinet lokinet.swift) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Lokinet.modulemap.in ${CMAKE_CURRENT_BINARY_DIR}/swift/LokinetExtension/module.modulemap ESCAPE_QUOTES @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Lokinet.modulemap.in ${CMAKE_CURRENT_BINARY_DIR}/swift/LokinetExtension/module.modulemap ESCAPE_QUOTES @ONLY) target_include_directories(lokinet PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/swift)
target_include_directories(lokinet PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/swift)
else()
add_executable(lokinet lokinet.mm)
endif()
target_link_libraries(lokinet PUBLIC lokinet-extension) target_link_libraries(lokinet PUBLIC lokinet-extension)
add_executable(lokinet-old lokinet.cpp)
enable_lto(lokinet-old)
else() else()
add_executable(lokinet lokinet.cpp) add_executable(lokinet lokinet.cpp)
add_executable(lokinet-vpn lokinet-vpn.cpp)
add_executable(lokinet-bootstrap lokinet-bootstrap.cpp)
enable_lto(lokinet lokinet-vpn lokinet-bootstrap)
endif() endif()
add_executable(lokinet-vpn lokinet-vpn.cpp)
add_executable(lokinet-bootstrap lokinet-bootstrap.cpp)
enable_lto(lokinet lokinet-vpn lokinet-bootstrap)
if(TRACY_ROOT) if(TRACY_ROOT)
target_sources(lokinet PRIVATE ${TRACY_ROOT}/TracyClient.cpp) target_sources(lokinet PRIVATE ${TRACY_ROOT}/TracyClient.cpp)
@ -35,16 +33,19 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
endif() endif()
endif() endif()
target_link_libraries(lokinet-bootstrap PUBLIC cpr::cpr) if(NOT APPLE)
if(NOT WIN32) target_link_libraries(lokinet-bootstrap PUBLIC cpr::cpr)
find_package(OpenSSL REQUIRED) if(NOT WIN32)
# because debian sid's curl doesn't link against openssl for some godawful cursed reason find_package(OpenSSL REQUIRED)
target_link_libraries(lokinet-bootstrap PUBLIC OpenSSL::SSL OpenSSL::Crypto) # because debian sid's curl doesn't link against openssl for some godawful cursed reason
target_link_libraries(lokinet-bootstrap PUBLIC OpenSSL::SSL OpenSSL::Crypto)
endif()
endif() endif()
set(exetargets lokinet-vpn lokinet-bootstrap) if(APPLE)
if(NOT APPLE) set(exetargets lokinet-old lokinet)
set(exetargets lokinet ${exes}) else()
set(exetargets lokinet lokinet-vpn lokinet-bootstrap)
endif() endif()
foreach(exe ${exetargets}) foreach(exe ${exetargets})
@ -55,11 +56,11 @@ foreach(exe ${exetargets})
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
target_link_directories(${exe} PRIVATE /usr/local/lib) target_link_directories(${exe} PRIVATE /usr/local/lib)
endif() endif()
target_link_libraries(${exe} PRIVATE liblokinet) target_link_libraries(${exe} PUBLIC liblokinet)
if(WITH_JEMALLOC) if(WITH_JEMALLOC)
target_link_libraries(${exe} PUBLIC jemalloc) target_link_libraries(${exe} PUBLIC jemalloc)
endif() endif()
target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}) target_include_directories(${exe} PUBLIC "${PROJECT_SOURCE_DIR}")
target_compile_definitions(${exe} PRIVATE -DVERSIONTAG=${GIT_VERSION_REAL}) target_compile_definitions(${exe} PRIVATE -DVERSIONTAG=${GIT_VERSION_REAL})
add_log_tag(${exe}) add_log_tag(${exe})
if(should_install) if(should_install)
@ -87,18 +88,23 @@ if(APPLE)
MACOSX_BUNDLE TRUE MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_STRING "Lokinet IP Packet Onion Router" MACOSX_BUNDLE_INFO_STRING "Lokinet IP Packet Onion Router"
MACOSX_BUNDLE_BUNDLE_NAME "Lokinet" MACOSX_BUNDLE_BUNDLE_NAME "Lokinet"
MACOSX_BUNDLE_BUNDLE_VERSION "${lokinet_VERSION_MAJOR}.${lokinet_VERSION_MINOR}.${lokinet_VERSION_PATCH}" MACOSX_BUNDLE_BUNDLE_VERSION "${LOKINET_VERSION}"
MACOSX_BUNDLE_LONG_VERSION_STRING "${lokinet_VERSION}.$lokinet_VERSION_MINOR}" MACOSX_BUNDLE_LONG_VERSION_STRING "${lokinet_VERSION}.$lokinet_VERSION_MINOR}"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${lokinet_VERSION_MAJOR}.${lokinet_VERSION_MINOR}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${lokinet_VERSION_MAJOR}.${lokinet_VERSION_MINOR}"
MACOSX_BUNDLE_GUI_IDENTIFIER "org.lokinet.lokinet" MACOSX_BUNDLE_GUI_IDENTIFIER "com.loki-project.lokinet"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/contrib/macos/Info.plist" MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/contrib/macos/Info.plist"
MACOSX_BUNDLE_ICON_FILE "${CMAKE_CURRENT_BINARY_DIR}/lokinet.icns" MACOSX_BUNDLE_ICON_FILE "${CMAKE_CURRENT_BINARY_DIR}/lokinet.icns"
MACOSX_BUNDLE_COPYRIGHT "© 2021, The Loki Project") MACOSX_BUNDLE_COPYRIGHT "© 2021, The Loki Project")
option(CODESIGN_KEY "codesign all the shit with this key" OFF) option(CODESIGN_KEY "codesign all the shit with this key" OFF)
if (CODESIGN_KEY) if (CODESIGN_KEY AND CODESIGN_TEAM_ID)
message(STATUS "codesigning with ${CODESIGN_KEY}") message(STATUS "codesigning with ${CODESIGN_KEY}")
set(SIGN_TARGET "${CMAKE_CURRENT_BINARY_DIR}/Lokinet.app") set(SIGN_TARGET "${CMAKE_CURRENT_BINARY_DIR}/Lokinet.app")
set(SIGN_ENTITLEMENTS "${CMAKE_SOURCE_DIR}/contrib/macos/lokinet.entitlements.plist") configure_file("${CMAKE_SOURCE_DIR}/contrib/macos/lokinet.entitlements.plist.in"
"${CMAKE_BINARY_DIR}/lokinet.entitlements.plist")
configure_file("${CMAKE_SOURCE_DIR}/contrib/macos/lokinet-extension.entitlements.plist.in"
"${CMAKE_BINARY_DIR}/lokinet-extension.entitlements.plist")
set(LOKINET_ENTITLEMENTS "${CMAKE_BINARY_DIR}/lokinet.entitlements.plist")
set(NETEXT_ENTITLEMENTS "${CMAKE_BINARY_DIR}/lokinet-extension.entitlements.plist")
configure_file( configure_file(
"${PROJECT_SOURCE_DIR}/contrib/macos/sign.sh.in" "${PROJECT_SOURCE_DIR}/contrib/macos/sign.sh.in"
"${CMAKE_BINARY_DIR}/sign.sh") "${CMAKE_BINARY_DIR}/sign.sh")

@ -11,6 +11,10 @@
#include <dbghelp.h> #include <dbghelp.h>
#endif #endif
#ifdef __APPLE__
#include <llarp/util/logging/apple_logger.hpp>
#endif
#include <csignal> #include <csignal>
#include <cxxopts.hpp> #include <cxxopts.hpp>
@ -396,6 +400,10 @@ lokinet_main(int argc, char* argv[])
{ {
return result; return result;
} }
#ifdef __APPLE__
llarp::LogContext::Instance().logStream.reset(new llarp::NSLogStream{});
#endif
llarp::RuntimeOptions opts; llarp::RuntimeOptions opts;
#ifdef _WIN32 #ifdef _WIN32

@ -1,9 +0,0 @@
#import <Foundation/Foundation.h>
#include <NetworkExtension/NetworkExtension.h>
int main (int argc, const char * argv[])
{
return 0;
}

@ -1,52 +1,70 @@
// AppDelegateExtension.swift import AppKit
import Foundation import Foundation
import LokinetExtension import LokinetExtension
import NetworkExtension import NetworkExtension
class LokinetMain: NSObject { let app = NSApplication.shared
var vpnManager = NETunnelProviderManager()
let lokinetComponent = "org.lokinet.NetworkExtension" class LokinetMain: NSObject, NSApplicationDelegate {
var vpnManager = NETunnelProviderManager()
let lokinetComponent = "com.loki-project.lokinet.network-extension"
var lokinetAdminTimer: DispatchSourceTimer? var lokinetAdminTimer: DispatchSourceTimer?
func runMain() { func applicationDidFinishLaunching(_: Notification) {
print("Starting up lokinet") setupVPNJizz()
NETunnelProviderManager.loadAllFromPreferences { (savedManagers: [NETunnelProviderManager]?, error: Error?) in }
func bail() {
app.terminate(self)
}
func setupVPNJizz() {
NSLog("Starting up lokinet")
NETunnelProviderManager.loadAllFromPreferences { [self] (savedManagers: [NETunnelProviderManager]?, error: Error?) in
if let error = error { if let error = error {
print(error) NSLog(error.localizedDescription)
bail()
} }
if let savedManagers = savedManagers { if let savedManagers = savedManagers {
for manager in savedManagers { for manager in savedManagers {
if (manager.protocolConfiguration as? NETunnelProviderProtocol)?.providerBundleIdentifier == self.lokinetComponent { if (manager.protocolConfiguration as? NETunnelProviderProtocol)?.providerBundleIdentifier == self.lokinetComponent {
print("Found saved VPN Manager") NSLog("%@", manager)
NSLog("Found saved VPN Manager")
self.vpnManager = manager self.vpnManager = manager
} }
} }
} }
let providerProtocol = NETunnelProviderProtocol() let providerProtocol = NETunnelProviderProtocol()
providerProtocol.serverAddress = "lokinet" providerProtocol.serverAddress = ""
providerProtocol.username = "anonymous"
providerProtocol.providerBundleIdentifier = self.lokinetComponent providerProtocol.providerBundleIdentifier = self.lokinetComponent
providerProtocol.includeAllNetworks = true
self.vpnManager.protocolConfiguration = providerProtocol self.vpnManager.protocolConfiguration = providerProtocol
self.vpnManager.isEnabled = true self.vpnManager.isEnabled = true
self.vpnManager.isOnDemandEnabled = true
self.vpnManager.saveToPreferences(completionHandler: { error -> Void in self.vpnManager.saveToPreferences(completionHandler: { error -> Void in
if error != nil { if error != nil {
print("Error saving to preferences") NSLog("Error saving to preferences")
NSLog(error!.localizedDescription)
bail()
} else { } else {
print("saved...")
self.vpnManager.loadFromPreferences(completionHandler: { error in self.vpnManager.loadFromPreferences(completionHandler: { error in
if error != nil { if error != nil {
print("Error loading from preferences") NSLog("Error loading from preferences")
NSLog(error!.localizedDescription)
bail()
} else { } else {
do { do {
print("Trying to start") NSLog("Trying to start")
self.initializeConnectionObserver() self.initializeConnectionObserver()
try self.vpnManager.connection.startVPNTunnel() try self.vpnManager.connection.startVPNTunnel()
} catch let error as NSError { } catch let error as NSError {
print(error) NSLog(error.localizedDescription)
bail()
} catch { } catch {
print("There was a fatal error") NSLog("There was a fatal error")
bail()
} }
} }
}) })
@ -57,21 +75,21 @@ class LokinetMain: NSObject {
func initializeConnectionObserver() { func initializeConnectionObserver() {
NotificationCenter.default.addObserver(forName: NSNotification.Name.NEVPNStatusDidChange, object: vpnManager.connection, queue: OperationQueue.main) { _ -> Void in NotificationCenter.default.addObserver(forName: NSNotification.Name.NEVPNStatusDidChange, object: vpnManager.connection, queue: OperationQueue.main) { _ -> Void in
if self.vpnManager.connection.status == .invalid { if self.vpnManager.connection.status == .invalid {
print("VPN configuration is invalid") NSLog("VPN configuration is invalid")
} else if self.vpnManager.connection.status == .disconnected { } else if self.vpnManager.connection.status == .disconnected {
print("VPN is disconnected.") NSLog("VPN is disconnected.")
} else if self.vpnManager.connection.status == .connecting { } else if self.vpnManager.connection.status == .connecting {
print("VPN is connecting...") NSLog("VPN is connecting...")
} else if self.vpnManager.connection.status == .reasserting { } else if self.vpnManager.connection.status == .reasserting {
print("VPN is reasserting...") NSLog("VPN is reasserting...")
} else if self.vpnManager.connection.status == .disconnecting { } else if self.vpnManager.connection.status == .disconnecting {
print("VPN is disconnecting...") NSLog("VPN is disconnecting...")
} }
} }
} }
} }
let lokinet = LokinetMain() let delegate = LokinetMain()
lokinet.runMain() app.delegate = delegate
app.run()

@ -1,4 +0,0 @@
module Lokinet {
header "lokinet-extension.hpp"
}

@ -1,43 +0,0 @@
// AppDelegateExtension.swift
// lifed from yggdrasil network ios port
//
import Foundation
import Lokinet
import NetworkExtension
class LokinetMain: PlatformAppDelegate {
var vpnManager = NETunnelProviderManager()
var app = NSApplication.shared()
let lokinetComponent = "org.lokinet.NetworkExtension"
var lokinetAdminTimer: DispatchSourceTimer?
func runMain() {
print("Starting up lokinet")
NETunnelProviderManager.loadAllFromPreferences { (savedManagers: [NETunnelProviderManager]?, error: Error?) in
if let error = error {
print(error)
}
if let savedManagers = savedManagers {
for manager in savedManagers {
if (manager.protocolConfiguration as? NETunnelProviderProtocol)?.providerBundleIdentifier == self.lokinetComponent {
print("Found saved VPN Manager")
self.vpnManager = manager
}
}
}
self.vpnManager.loadFromPreferences(completionHandler: { (error: Error?) in
if let error = error {
print(error)
}
self.vpnManager.localizedDescription = "Lokinet"
self.vpnManager.isEnabled = true
})
}
app.finishLaunching()
app.run()
print("end")
}
}

@ -6,13 +6,16 @@ struct ContextWrapper;
@interface LLARPPacketTunnel : NEPacketTunnelProvider @interface LLARPPacketTunnel : NEPacketTunnelProvider
{ {
@private
struct ContextWrapper* m_Context; struct ContextWrapper* m_Context;
} }
- (void)startTunnelWithOptions:(NSDictionary<NSString*, NSObject*>*)options - (void)startTunnelWithOptions:(NSDictionary<NSString*, NSObject*>*)options
completionHandler:(void (^)(NSError* error))completionHandler; completionHandler:(void (^)(NSError* error))completionHandler;
- (void)stopTunnelWithReason:(NEProviderStopReason)reason - (void)stopTunnelWithReason:(NEProviderStopReason)reason
completionHandler:(void (^)(void))completionHandler; completionHandler:(void (^)(void))completionHandler;
- (void)handleAppMessage:(NSData*)messageData
completionHandler:(void (^)(NSData* responseData))completionHandler;
@end @end

@ -8,6 +8,7 @@ add_library(lokinet-util
util/fs.cpp util/fs.cpp
util/json.cpp util/json.cpp
util/logging/android_logger.cpp util/logging/android_logger.cpp
util/logging/apple_logger.mm
util/logging/buffer.cpp util/logging/buffer.cpp
util/logging/file_logger.cpp util/logging/file_logger.cpp
util/logging/json_logger.cpp util/logging/json_logger.cpp
@ -37,6 +38,11 @@ target_link_libraries(lokinet-util PUBLIC
oxenmq::oxenmq oxenmq::oxenmq
) )
if(APPLE)
find_library(FOUNDATION Foundation REQUIRED)
target_link_libraries(lokinet-util PUBLIC ${FOUNDATION})
endif()
if(ANDROID) if(ANDROID)
target_link_libraries(lokinet-util PUBLIC log) target_link_libraries(lokinet-util PUBLIC log)
endif() endif()
@ -263,6 +269,7 @@ if(BUILD_LIBLOKINET)
endif() endif()
if(APPLE) if(APPLE)
# god made apple so that man may suffer
find_library(NETEXT NetworkExtension REQUIRED) find_library(NETEXT NetworkExtension REQUIRED)
find_library(COREFOUNDATION CoreFoundation REQUIRED) find_library(COREFOUNDATION CoreFoundation REQUIRED)
@ -276,15 +283,18 @@ if(APPLE)
${COREFOUNDATION} ${COREFOUNDATION}
${NETEXT}) ${NETEXT})
configure_file(${CMAKE_SOURCE_DIR}/contrib/macos/LokinetExtension.Info.plist.in
${CMAKE_CURRENT_BINARY_DIR}/LokinetExtension.Info.plist)
set_target_properties(lokinet-extension PROPERTIES set_target_properties(lokinet-extension PROPERTIES
FRAMEWORK TRUE FRAMEWORK TRUE
FRAMEWORK_VERSION CXX FRAMEWORK_VERSION ${lokinet_VERSION}
MACOSX_FRAMEWORK_IDENTIFIER org.lokinet.NetworkExtension MACOSX_FRAMEWORK_IDENTIFIER com.loki-project.lokinet.network-extension
MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_SOURCE_DIR}/contrib/macos/LokinetExtension.Info.plist MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/LokinetExtension.Info.plist
# "current version" in semantic format in Mach-O binary file # "current version" in semantic format in Mach-O binary file
VERSION 16.4.0 VERSION ${lokinet_VERSION}
# "compatibility version" in semantic format in Mach-O binary file # "compatibility version" in semantic format in Mach-O binary file
SOVERSION 1.0.0 SOVERSION ${lokinet_VERSION}
PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/lokinet-extension.hpp) PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/lokinet-extension.hpp)
endif() endif()

@ -4,6 +4,7 @@
#include <llarp/config/config.hpp> #include <llarp/config/config.hpp>
#include <llarp/ev/vpn.hpp> #include <llarp/ev/vpn.hpp>
#include <llarp/util/thread/queue.hpp> #include <llarp/util/thread/queue.hpp>
#include <llarp/util/logging/apple_logger.hpp>
#include <string> #include <string>
@ -11,54 +12,51 @@ namespace llarp::apple
{ {
struct FrameworkContext : public llarp::Context struct FrameworkContext : public llarp::Context
{ {
explicit FrameworkContext(NEPacketTunnelProvider* tunnel);
explicit FrameworkContext(NEPacketTunnelProvider * tunnel);
~FrameworkContext()
{}
~FrameworkContext() {}
std::shared_ptr<vpn::Platform> std::shared_ptr<vpn::Platform>
makeVPNPlatform() override; makeVPNPlatform() override;
void void
Start(); Start();
private: private:
NEPacketTunnelProvider * m_Tunnel; NEPacketTunnelProvider* const m_Tunnel;
std::unique_ptr<std::thread> m_Runner; std::unique_ptr<std::thread> m_Runner;
}; };
class VPNInterface final : public vpn::NetworkInterface class VPNInterface final : public vpn::NetworkInterface
{ {
NEPacketTunnelProvider * m_Tunnel; NEPacketTunnelProvider* const m_Tunnel;
static inline constexpr auto PacketQueueSize = 1024; static inline constexpr auto PacketQueueSize = 1024;
thread::Queue<net::IPPacket> m_ReadQueue; thread::Queue<net::IPPacket> m_ReadQueue;
void void
OfferReadPacket(NSData * data) OfferReadPacket(NSData* data)
{ {
llarp::net::IPPacket pkt; llarp::net::IPPacket pkt;
const llarp_buffer_t buf{static_cast<const uint8_t *>(data.bytes), data.length}; const llarp_buffer_t buf{static_cast<const uint8_t*>(data.bytes), data.length};
if(pkt.Load(buf)) if (pkt.Load(buf))
m_ReadQueue.tryPushBack(std::move(pkt)); m_ReadQueue.tryPushBack(std::move(pkt));
} }
public: public:
explicit VPNInterface(NEPacketTunnelProvider * tunnel) explicit VPNInterface(NEPacketTunnelProvider* tunnel)
: m_Tunnel{tunnel}, : m_Tunnel{tunnel}, m_ReadQueue{PacketQueueSize}
m_ReadQueue{PacketQueueSize}
{ {
auto handler = auto handler = [this](NSArray<NSData*>* packets, NSArray<NSNumber*>*) {
[this](NSArray<NSData*> * packets, NSArray<NSNumber*> *) NSUInteger num = [packets count];
for (NSUInteger idx = 0; idx < num; ++idx)
{ {
NSUInteger num = [packets count]; NSData* pkt = [packets objectAtIndex:idx];
for(NSUInteger idx = 0; idx < num ; ++idx) OfferReadPacket(pkt);
{ }
NSData * pkt = [packets objectAtIndex:idx]; };
OfferReadPacket(pkt);
}
};
[m_Tunnel.packetFlow readPacketsWithCompletionHandler:handler]; [m_Tunnel.packetFlow readPacketsWithCompletionHandler:handler];
} }
@ -73,12 +71,12 @@ namespace llarp::apple
{ {
return ""; return "";
} }
net::IPPacket net::IPPacket
ReadNextPacket() override ReadNextPacket() override
{ {
net::IPPacket pkt{}; net::IPPacket pkt{};
if(not m_ReadQueue.empty()) if (not m_ReadQueue.empty())
pkt = m_ReadQueue.popFront(); pkt = m_ReadQueue.popFront();
return pkt; return pkt;
} }
@ -87,61 +85,53 @@ namespace llarp::apple
WritePacket(net::IPPacket pkt) override WritePacket(net::IPPacket pkt) override
{ {
const sa_family_t fam = pkt.IsV6() ? AF_INET6 : AF_INET; const sa_family_t fam = pkt.IsV6() ? AF_INET6 : AF_INET;
const uint8_t * pktbuf = pkt.buf; const uint8_t* pktbuf = pkt.buf;
const size_t pktsz = pkt.sz; const size_t pktsz = pkt.sz;
NSData * datapkt = [NSData dataWithBytes:pktbuf length:pktsz]; NSData* datapkt = [NSData dataWithBytes:pktbuf length:pktsz];
NEPacket * npkt = [[NEPacket alloc] initWithData:datapkt protocolFamily:fam]; NEPacket* npkt = [[NEPacket alloc] initWithData:datapkt protocolFamily:fam];
NSArray * pkts = @[npkt]; NSArray* pkts = @[npkt];
return [m_Tunnel.packetFlow writePacketObjects:pkts]; return [m_Tunnel.packetFlow writePacketObjects:pkts];
} }
}; };
class VPNPlatform final : public vpn::Platform class VPNPlatform final : public vpn::Platform
{ {
NEPacketTunnelProvider * m_Tunnel; NEPacketTunnelProvider* const m_Tunnel;
public:
explicit VPNPlatform(NEPacketTunnelProvider * tunnel) public:
: m_Tunnel{tunnel} explicit VPNPlatform(NEPacketTunnelProvider* tunnel) : m_Tunnel{tunnel}
{ {}
}
std::shared_ptr<vpn::NetworkInterface> ObtainInterface(vpn::InterfaceInfo) override
std::shared_ptr<vpn::NetworkInterface>
ObtainInterface(vpn::InterfaceInfo) override
{ {
return std::make_shared<VPNInterface>(m_Tunnel); return std::make_shared<VPNInterface>(m_Tunnel);
} }
}; };
FrameworkContext::FrameworkContext(NEPacketTunnelProvider* tunnel)
FrameworkContext::FrameworkContext(NEPacketTunnelProvider * tunnel) : : llarp::Context{}, m_Tunnel{tunnel}
llarp::Context{}, {}
m_Tunnel{tunnel}
{
}
void void
FrameworkContext::Start() FrameworkContext::Start()
{ {
std::promise<void> result; std::promise<void> result;
m_Runner = std::make_unique<std::thread>( m_Runner = std::make_unique<std::thread>([&result, this]() {
[&result, this]() const RuntimeOptions opts{};
try
{ {
const RuntimeOptions opts{}; Setup(opts);
try Configure(llarp::Config::NetworkExtensionConfig());
{ }
Setup(opts); catch (std::exception&)
Configure(llarp::Config::NetworkExtensionConfig()); {
} result.set_exception(std::current_exception());
catch(std::exception & ) return;
{ }
result.set_exception(std::current_exception()); result.set_value();
return; Run(opts);
} });
result.set_value();
Run(opts);
});
auto ftr = result.get_future(); auto ftr = result.get_future();
ftr.get(); ftr.get();
@ -154,13 +144,13 @@ namespace llarp::apple
} }
} }
struct ContextWrapper struct ContextWrapper
{ {
std::shared_ptr<llarp::apple::FrameworkContext> m_Context; std::unique_ptr<llarp::apple::FrameworkContext> m_Context;
public:
explicit ContextWrapper(NEPacketTunnelProvider * tunnel) : public:
m_Context{std::make_shared<llarp::apple::FrameworkContext>(tunnel)} explicit ContextWrapper(NEPacketTunnelProvider* tunnel)
: m_Context{std::make_unique<llarp::apple::FrameworkContext>(tunnel)}
{} {}
void void
@ -176,20 +166,35 @@ public:
m_Context->Wait(); m_Context->Wait();
} }
}; };
static std::string_view
DataAsStringView(NSData* data)
{
return std::string_view{reinterpret_cast<const char*>(data.bytes), data.length};
}
static NSData*
StringViewToData(std::string_view data)
{
const char* ptr = data.data();
const size_t sz = data.size();
return [NSData dataWithBytes:ptr length:sz];
}
@implementation LLARPPacketTunnel @implementation LLARPPacketTunnel
- (void)startTunnelWithOptions:(NSDictionary<NSString *,NSObject *> *)options completionHandler:(void (^)(NSError *error))completionHandler { - (void)startTunnelWithOptions:(NSDictionary<NSString*, NSObject*>*)options
completionHandler:(void (^)(NSError*))completionHandler
{
m_Context = new ContextWrapper{self}; m_Context = new ContextWrapper{self};
m_Context->Start(); m_Context->Start();
completionHandler(nullptr); [self setTunnelNetworkSettings:nullptr completionHandler:completionHandler];
} }
- (void)stopTunnelWithReason:(NEProviderStopReason)reason - (void)stopTunnelWithReason:(NEProviderStopReason)reason
completionHandler:(void (^)(void))completionHandler { completionHandler:(void (^)(void))completionHandler
if(m_Context) {
if (m_Context)
{ {
m_Context->Stop(); m_Context->Stop();
delete m_Context; delete m_Context;
@ -198,5 +203,13 @@ completionHandler:(void (^)(void))completionHandler {
completionHandler(); completionHandler();
} }
- (void)handleAppMessage:(NSData*)messageData
completionHandler:(void (^)(NSData* responseData))completionHandler
{
const auto data = DataAsStringView(messageData);
LogInfo("app message: ", data);
completionHandler(StringViewToData("ok"));
}
@end @end

@ -0,0 +1,32 @@
#pragma once
#ifdef __APPLE__
#include "logstream.hpp"
namespace llarp
{
struct NSLogStream : public ILogStream
{
void
PreLog(
std::stringstream& s,
LogLevel lvl,
const char* fname,
int lineno,
const std::string& nodename) const override;
void
Print(LogLevel lvl, const char* tag, const std::string& msg) override;
void
PostLog(std::stringstream& ss) const override;
virtual void
ImmediateFlush() override
{}
void Tick(llarp_time_t) override
{}
};
} // namespace llarp
#endif

@ -0,0 +1,38 @@
#ifdef __APPLE__
#include "apple_logger.hpp"
#include "logger_internal.hpp"
#include <Foundation/Foundation.h>
namespace llarp
{
void
NSLogStream::PreLog(
std::stringstream& ss,
LogLevel lvl,
const char* fname,
int lineno,
const std::string& nodename) const
{
ss << "[" << LogLevelToString(lvl) << "] ";
ss << "[" << nodename << "]"
<< "(" << thread_id_string() << ") " << log_timestamp() << " " << fname << ":" << lineno
<< "\t";
}
void
NSLogStream::Print(LogLevel, const char*, const std::string& msg)
{
const char* msg_ptr = msg.c_str();
const char* msg_fmt = "%s";
NSString* fmt = [[NSString alloc] initWithUTF8String:msg_ptr];
NSString* str = [[NSString alloc] initWithUTF8String:msg_fmt];
NSLog(fmt, str);
}
void
NSLogStream::PostLog(std::stringstream&) const
{}
} // namespace llarp
#endif

@ -62,7 +62,7 @@ alternatively you can build from source, make sure you have cmake, libuv and xco
$ git clone --recursive https://github.com/oxen-io/lokinet $ git clone --recursive https://github.com/oxen-io/lokinet
$ cd lokinet $ cd lokinet
$ ./contrib/mac.sh -DCODESIGN_KEY='insert your key identity here' $ ./contrib/mac.sh -DCODESIGN_KEY='insert your key identity here' -DCODESIGN_TEAM_ID='team id here'
### Windows ### Windows

Loading…
Cancel
Save