Commit c1c0df9c authored by jan.koester's avatar jan.koester
Browse files

test

parent ea929617
Loading
Loading
Loading
Loading
+3 −1
Changes for CMakeLists.txt: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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)
+34 −6
Changes for src/smb.cpp: 34 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -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

@@ -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;