Loading CMakeLists.txt +3 −1 Changes for CMakeLists.txt: 3 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -41,8 +41,10 @@ add_executable(sharedd ) target_include_directories(sharedd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src) set(SHAREDD_ADCONNECT_SOCKET "/run/adconnect.sock" CACHE FILEPATH "adconnectd's socket, for Kerberos logins") set(SHAREDD_ADCONNECT_CONFIG "/etc/adconnect/adconnect.yaml" CACHE FILEPATH "adconnect's configuration (its domains)") target_compile_definitions(sharedd PRIVATE SHAREDD_CONFIG="${SHAREDD_CONFIG}" SHAREDD_ADCONNECT_SOCKET="${SHAREDD_ADCONNECT_SOCKET}") SHAREDD_ADCONNECT_SOCKET="${SHAREDD_ADCONNECT_SOCKET}" SHAREDD_ADCONNECT_CONFIG="${SHAREDD_ADCONNECT_CONFIG}") target_link_libraries(sharedd PRIVATE confplus::confplus sysbus::sysbus) add_executable(sharectl src/sharectl.cpp) Loading src/smb.cpp +34 −6 Changes for src/smb.cpp: 34 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -323,12 +323,40 @@ void subAuth(uint32_t out[3]) { } } // the domains adconnectd serves (adconnect.yaml's "domain:" keys): a client // that logs in as DOMAIN\user sends ksmbd only "user", while adconnect may // name the account user@domain (qualified_names) std::vector<std::string> adDomains() { std::vector<std::string> out; std::ifstream in(SHAREDD_ADCONNECT_CONFIG); for (std::string line; std::getline(in, line);) { size_t k = line.find_first_not_of(" \t-"); if (k == std::string::npos || line.compare(k, 7, "domain:") != 0) continue; std::string v = line.substr(k + 7); v.erase(0, v.find_first_not_of(" \t\"'")); v.erase(v.find_last_not_of(" \t\"'\r") + 1); if (!v.empty()) out.push_back(lower(v)); } return out; } // account as given, lowercased, and else (no domain in it) as user@domain // of adconnect's domains std::vector<std::string> accountNames(const std::string &account) { std::vector<std::string> names{account}; std::string l = lower(account); if (l != account) names.push_back(l); if (account.find('@') == std::string::npos) for (auto &d : adDomains()) names.push_back(l + "@" + d); return names; } #ifndef SHAREDD_UID_R // passwd entry of an SMB account name (SMB user names are case-insensitive) struct passwd *lookupUser(const std::string &account) { if (struct passwd *pw = getpwnam(account.c_str())) return pw; std::string l = lower(account); return l != account ? getpwnam(l.c_str()) : nullptr; for (auto &n : accountNames(account)) if (struct passwd *pw = getpwnam(n.c_str())) return pw; return nullptr; } #endif Loading Loading @@ -374,9 +402,9 @@ IdR toIdR(const uid_r_t &id) { bool lookupAccount(const std::string &account, Account &a) { #ifdef SHAREDD_UID_R struct passwd_id_r *p = getpwnam_id_r(account.c_str()); std::string l = lower(account); if (!p && l != account) p = getpwnam_id_r(l.c_str()); struct passwd_id_r *p = nullptr; for (auto &n : accountNames(account)) if ((p = getpwnam_id_r(n.c_str()))) break; if (!p) return false; a.name = p->pw_name; a.ruid = p->pw_uid; Loading Loading
CMakeLists.txt +3 −1 Changes for CMakeLists.txt: 3 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -41,8 +41,10 @@ add_executable(sharedd ) target_include_directories(sharedd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src) set(SHAREDD_ADCONNECT_SOCKET "/run/adconnect.sock" CACHE FILEPATH "adconnectd's socket, for Kerberos logins") set(SHAREDD_ADCONNECT_CONFIG "/etc/adconnect/adconnect.yaml" CACHE FILEPATH "adconnect's configuration (its domains)") target_compile_definitions(sharedd PRIVATE SHAREDD_CONFIG="${SHAREDD_CONFIG}" SHAREDD_ADCONNECT_SOCKET="${SHAREDD_ADCONNECT_SOCKET}") SHAREDD_ADCONNECT_SOCKET="${SHAREDD_ADCONNECT_SOCKET}" SHAREDD_ADCONNECT_CONFIG="${SHAREDD_ADCONNECT_CONFIG}") target_link_libraries(sharedd PRIVATE confplus::confplus sysbus::sysbus) add_executable(sharectl src/sharectl.cpp) Loading
src/smb.cpp +34 −6 Changes for src/smb.cpp: 34 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -323,12 +323,40 @@ void subAuth(uint32_t out[3]) { } } // the domains adconnectd serves (adconnect.yaml's "domain:" keys): a client // that logs in as DOMAIN\user sends ksmbd only "user", while adconnect may // name the account user@domain (qualified_names) std::vector<std::string> adDomains() { std::vector<std::string> out; std::ifstream in(SHAREDD_ADCONNECT_CONFIG); for (std::string line; std::getline(in, line);) { size_t k = line.find_first_not_of(" \t-"); if (k == std::string::npos || line.compare(k, 7, "domain:") != 0) continue; std::string v = line.substr(k + 7); v.erase(0, v.find_first_not_of(" \t\"'")); v.erase(v.find_last_not_of(" \t\"'\r") + 1); if (!v.empty()) out.push_back(lower(v)); } return out; } // account as given, lowercased, and else (no domain in it) as user@domain // of adconnect's domains std::vector<std::string> accountNames(const std::string &account) { std::vector<std::string> names{account}; std::string l = lower(account); if (l != account) names.push_back(l); if (account.find('@') == std::string::npos) for (auto &d : adDomains()) names.push_back(l + "@" + d); return names; } #ifndef SHAREDD_UID_R // passwd entry of an SMB account name (SMB user names are case-insensitive) struct passwd *lookupUser(const std::string &account) { if (struct passwd *pw = getpwnam(account.c_str())) return pw; std::string l = lower(account); return l != account ? getpwnam(l.c_str()) : nullptr; for (auto &n : accountNames(account)) if (struct passwd *pw = getpwnam(n.c_str())) return pw; return nullptr; } #endif Loading Loading @@ -374,9 +402,9 @@ IdR toIdR(const uid_r_t &id) { bool lookupAccount(const std::string &account, Account &a) { #ifdef SHAREDD_UID_R struct passwd_id_r *p = getpwnam_id_r(account.c_str()); std::string l = lower(account); if (!p && l != account) p = getpwnam_id_r(l.c_str()); struct passwd_id_r *p = nullptr; for (auto &n : accountNames(account)) if ((p = getpwnam_id_r(n.c_str()))) break; if (!p) return false; a.name = p->pw_name; a.ruid = p->pw_uid; Loading