From b0d90f32974f6473552d8b1bf5387f9fc4995970 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Thu, 25 Jul 2024 19:09:41 +0200 Subject: samba: Add credentials object Ask for enough permissions to be able to create sockets. --- libs/samba/src/main/cpp/samba.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'libs/samba/src/main/cpp/samba.cpp') diff --git a/libs/samba/src/main/cpp/samba.cpp b/libs/samba/src/main/cpp/samba.cpp index 5eafacc..e3b689d 100644 --- a/libs/samba/src/main/cpp/samba.cpp +++ b/libs/samba/src/main/cpp/samba.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -52,7 +53,9 @@ class Url { class Context { public: - Context() : context_(smb2_init_context(), ContextDeleter{}) {} + explicit Context(int timeout) : context_(smb2_init_context(), ContextDeleter{}) { + smb2_set_timeout(context_.get(), timeout); + } ~Context() = default; Context(const Context&) = delete; @@ -63,8 +66,10 @@ class Context { return ptr ? std::make_unique(ptr): nullptr; } - bool Connect(const Url& url) { - return smb2_connect_share(context_.get(), url.server(), url.share(), url.user()) == 0; + bool Connect(const Url& url, const std::optional& username, const std::optional& password) { + if (password.has_value()) smb2_set_password(context_.get(), password->c_str()); + auto* user = username.has_value() ? username->c_str() : url.user(); + return smb2_connect_share(context_.get(), url.server(), url.share(), user) == 0; } [[nodiscard]] std::string_view GetError() { @@ -86,8 +91,8 @@ class Context { std::shared_ptr context_; }; -jlong nativeContextNew(JNIEnv* env, jclass clazz) { - return reinterpret_cast(new Context()); +jlong nativeContextNew(JNIEnv* env, jclass clazz, jint timeout) { + return reinterpret_cast(new Context(static_cast(timeout))); } void nativeContextDestroy(JNIEnv* env, jclass clazz, jlong ptr) { @@ -98,10 +103,14 @@ jlong nativeContextParseUrl(JNIEnv* env, jclass clazz, jlong ptr, jstring url) { return reinterpret_cast(reinterpret_cast(ptr)->ParseUrl(jni::StringToUTF8(env, jni::ParamRef(env, url))).release()); } -jboolean nativeContextConnect(JNIEnv* env, jclass clazz, jlong context_ptr, jlong url_ptr) { +jboolean nativeContextConnect(JNIEnv* env, jclass clazz, jlong context_ptr, jlong url_ptr, jstring j_username, jstring j_password) { auto* url = reinterpret_cast(url_ptr); if (!url) return JNI_FALSE; - return reinterpret_cast(context_ptr)->Connect(*url) ? JNI_TRUE : JNI_FALSE; + std::optional username; + std::optional password; + if (j_username) username = jni::StringToUTF8(env, jni::ParamRef(env, j_username)); + if (j_password) password = jni::StringToUTF8(env, jni::ParamRef(env, j_password)); + return reinterpret_cast(context_ptr)->Connect(*url, username, password) ? JNI_TRUE : JNI_FALSE; } jstring nativeContextGetError(JNIEnv* env, jclass clazz, jlong ptr) { @@ -128,10 +137,10 @@ void RegisterSamba(JNIEnv* env) { auto clazz = jni::FindClass(env, "org/the_jk/cleversync/io/samba/NativeSamba"); ABORT_IF_NULL(env, clazz); static const JNINativeMethod methods[] = { - { "nativeContextNew", "()J", reinterpret_cast(&nativeContextNew) }, + { "nativeContextNew", "(I)J", reinterpret_cast(&nativeContextNew) }, { "nativeContextDestroy", "(J)V", reinterpret_cast(&nativeContextDestroy) }, { "nativeContextParseUrl", "(JLjava/lang/String;)J", reinterpret_cast(&nativeContextParseUrl) }, - { "nativeContextConnect", "(JJ)Z", reinterpret_cast(&nativeContextConnect) }, + { "nativeContextConnect", "(JJLjava/lang/String;Ljava/lang/String;)Z", reinterpret_cast(&nativeContextConnect) }, { "nativeContextGetError", "(J)Ljava/lang/String;", reinterpret_cast(&nativeContextGetError) }, { "nativeContextOpenDir", "(JLjava/lang/String;)J", reinterpret_cast(&nativeContextOpenDir) }, -- cgit v1.2.3-70-g09d2