diff options
-rw-r--r-- | src/adbd-client.cpp | 39 | ||||
-rw-r--r-- | src/adbd-client.h | 1 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/usb-snap.cpp | 4 |
4 files changed, 43 insertions, 3 deletions
diff --git a/src/adbd-client.cpp b/src/adbd-client.cpp index 38f202f..edd403c 100644 --- a/src/adbd-client.cpp +++ b/src/adbd-client.cpp @@ -22,6 +22,9 @@ #include <gio/gio.h> #include <gio/gunixsocketaddress.h> +#include <algorithm> +#include <cctype> +#include <cstring> #include <chrono> #include <condition_variable> #include <mutex> @@ -89,6 +92,7 @@ private: auto self = data->self; struct PKRequest req; req.public_key = data->public_key; + req.fingerprint = get_fingerprint(req.public_key); req.respond = [self](PKResponse response){self->on_public_key_response(response);}; self->m_on_pk_request(req); } @@ -219,6 +223,37 @@ private: } } + static std::string get_fingerprint(const std::string& public_key) + { + // The first token is base64-encoded data, so cut on the first whitespace + const std::string base64 ( + public_key.begin(), + std::find_if( + public_key.begin(), public_key.end(), + [](const std::string::value_type& ch){return std::isspace(ch);} + ) + ); + + gsize digest_len {}; + auto digest = g_base64_decode(base64.c_str(), &digest_len); + + auto checksum = g_compute_checksum_for_data(G_CHECKSUM_MD5, digest, digest_len); + const gsize checksum_len = checksum ? strlen(checksum) : 0; + + // insert ':' between character pairs; eg "ff27b5f3" --> "ff:27:b5:f3" + std::string fingerprint; + for (gsize i=0; i<checksum_len; ) { + fingerprint.append(checksum+i, checksum+i+2); + if (i < checksum_len-2) + fingerprint.append(":"); + i += 2; + } + + g_clear_pointer(&digest, g_free); + g_clear_pointer(&checksum, g_free); + return fingerprint; + } + const std::string m_socket_path; GCancellable* m_cancellable = nullptr; std::thread m_worker_thread; @@ -241,6 +276,10 @@ AdbdClient::~AdbdClient() { } +/*** +**** +***/ + GAdbdClient::GAdbdClient(const std::string& socket_path): impl{new Impl{socket_path}} { diff --git a/src/adbd-client.h b/src/adbd-client.h index aef7674..dcee2f1 100644 --- a/src/adbd-client.h +++ b/src/adbd-client.h @@ -44,6 +44,7 @@ public: struct PKRequest { std::string public_key; + std::string fingerprint; std::function<void(PKResponse)> respond; }; diff --git a/src/main.cpp b/src/main.cpp index 62eca62..151b642 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -61,7 +61,7 @@ main(int /*argc*/, char** /*argv*/) static constexpr char const * ADB_SOCKET_PATH {"/dev/socket/adb"}; GAdbdClient adbd_client{ADB_SOCKET_PATH}; adbd_client.on_pk_request().connect([](const AdbdClient::PKRequest& req){ - auto snap = new UsbSnap(req.public_key); + auto snap = new UsbSnap(req.fingerprint); snap->on_user_response().connect([req,snap](AdbdClient::PKResponse response, bool /*FIXME: remember_choice*/){ req.respond(response); g_idle_add([](gpointer gsnap){delete static_cast<UsbSnap*>(gsnap); return G_SOURCE_REMOVE;}, snap); // delete-later diff --git a/src/usb-snap.cpp b/src/usb-snap.cpp index 40f02a2..87f4673 100644 --- a/src/usb-snap.cpp +++ b/src/usb-snap.cpp @@ -217,8 +217,8 @@ private: m_notification_id = 0; } - static constexpr char const * ACTION_ALLOW{"allow"}; - static constexpr char const * ACTION_DENY{"deny"}; + static constexpr char const * ACTION_ALLOW {"allow"}; + static constexpr char const * ACTION_DENY {"deny"}; static constexpr char const * BUS_NAME {"org.freedesktop.Notifications" }; static constexpr char const * IFACE_NAME {"org.freedesktop.Notifications" }; |