switch(domain_list[i].trust_type) {
case WBC_DOMINFO_TRUSTTYPE_NONE:
- d_printf("None ");
+ if (domain_list[i].trust_routing != NULL) {
+ d_printf("%s\n", domain_list[i].trust_routing);
+ } else {
+ d_printf("None\n");
+ }
+ continue;
+ case WBC_DOMINFO_TRUSTTYPE_LOCAL:
+ d_printf("Local\n");
+ continue;
+ case WBC_DOMINFO_TRUSTTYPE_RWDC:
+ d_printf("RWDC\n");
+ continue;
+ case WBC_DOMINFO_TRUSTTYPE_RODC:
+ d_printf("RODC\n");
+ continue;
+ case WBC_DOMINFO_TRUSTTYPE_PDC:
+ d_printf("PDC\n");
+ continue;
+ case WBC_DOMINFO_TRUSTTYPE_WKSTA:
+ d_printf("Workstation ");
break;
case WBC_DOMINFO_TRUSTTYPE_FOREST:
d_printf("Forest ");
d_printf("%s : %s\n",
domain_list[i].short_name,
- is_offline ? "offline" : "online" );
+ is_offline ? "no active connection" : "active connection" );
}
wbcFreeMemory(domain_list);
return true;
}
+static bool wbinfo_xids_to_sids(const char *arg)
+{
+ fstring idstr;
+ struct wbcUnixId *xids = NULL;
+ struct wbcDomainSid *sids;
+ wbcErr wbc_status;
+ int num_xids = 0;
+ const char *p;
+ int i;
+
+ p = arg;
+
+ while (next_token(&p, idstr, LIST_SEP, sizeof(idstr))) {
+ xids = talloc_realloc(talloc_tos(), xids, struct wbcUnixId,
+ num_xids+1);
+ if (xids == NULL) {
+ d_fprintf(stderr, "talloc failed\n");
+ return false;
+ }
+
+ switch (idstr[0]) {
+ case 'u':
+ xids[num_xids] = (struct wbcUnixId) {
+ .type = WBC_ID_TYPE_UID,
+ .id.uid = atoi(&idstr[1])
+ };
+ break;
+ case 'g':
+ xids[num_xids] = (struct wbcUnixId) {
+ .type = WBC_ID_TYPE_GID,
+ .id.gid = atoi(&idstr[1])
+ };
+ break;
+ default:
+ d_fprintf(stderr, "%s is an invalid id\n", idstr);
+ TALLOC_FREE(xids);
+ return false;
+ }
+ num_xids += 1;
+ }
+
+ sids = talloc_array(talloc_tos(), struct wbcDomainSid, num_xids);
+ if (sids == NULL) {
+ d_fprintf(stderr, "talloc failed\n");
+ TALLOC_FREE(xids);
+ return false;
+ }
+
+ wbc_status = wbcUnixIdsToSids(xids, num_xids, sids);
+ if (!WBC_ERROR_IS_OK(wbc_status)) {
+ d_fprintf(stderr, "wbcUnixIdsToSids failed: %s\n",
+ wbcErrorString(wbc_status));
+ TALLOC_FREE(sids);
+ TALLOC_FREE(xids);
+ return false;
+ }
+
+ for (i=0; i<num_xids; i++) {
+ char str[WBC_SID_STRING_BUFLEN];
+ struct wbcDomainSid null_sid = { 0 };
+
+ if (memcmp(&null_sid, &sids[i], sizeof(struct wbcDomainSid)) == 0) {
+ d_printf("NOT MAPPED\n");
+ continue;
+ }
+ wbcSidToStringBuf(&sids[i], str, sizeof(str));
+ d_printf("%s\n", str);
+ }
+
+ return true;
+}
+
static bool wbinfo_allocate_uid(void)
{
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
if (use_ntlmv2) {
DATA_BLOB server_chal;
DATA_BLOB names_blob;
+ const char *netbios_name = NULL;
+ const char *domain = NULL;
+
+ netbios_name = get_winbind_netbios_name(),
+ domain = get_winbind_domain();
+ if (domain == NULL) {
+ d_fprintf(stderr, "Failed to get domain from winbindd\n");
+ return false;
+ }
server_chal = data_blob(params.password.response.challenge, 8);
/* Pretend this is a login to 'us', for blob purposes */
names_blob = NTLMv2_generate_names_blob(NULL,
- get_winbind_netbios_name(),
- get_winbind_domain());
+ netbios_name,
+ domain);
- if (!SMBNTLMv2encrypt(NULL, name_user, name_domain, pass,
+ if (pass != NULL &&
+ !SMBNTLMv2encrypt(NULL, name_user, name_domain, pass,
&server_chal,
&names_blob,
&lm, &nt, NULL, NULL)) {
if (wbc_status == WBC_ERR_AUTH_ERROR) {
d_fprintf(stderr,
- "wbcAuthenticateUserEx(%s%c%s): error code was %s (0x%x)\n"
+ "wbcAuthenticateUserEx(%s%c%s): error code was "
+ "%s (0x%x, authoritative=%"PRIu8")\n"
"error message was: %s\n",
name_domain,
winbind_separator(),
name_user,
err->nt_string,
err->nt_status,
+ err->authoritative,
err->display_string);
wbcFreeMemory(err);
} else if (WBC_ERROR_IS_OK(wbc_status)) {
if (verbose && (info != NULL)) {
struct wbcAuthUserInfo *i = info->info;
+ uint32_t j;
if (i->account_name != NULL) {
d_printf("account_name: %s\n", i->account_name);
d_printf("home_drive: %s\n", i->home_drive);
}
+ d_printf("sids:");
+
+ for (j=0; j<i->num_sids; j++) {
+ char buf[WBC_SID_STRING_BUFLEN];
+ wbcSidToStringBuf(&i->sids[j].sid, buf, sizeof(buf));
+ d_printf(" %s", buf);
+ }
+ d_printf("\n");
+
wbcFreeMemory(info);
info = NULL;
}
OPT_REMOVE_UID_MAPPING,
OPT_REMOVE_GID_MAPPING,
OPT_SIDS_TO_XIDS,
+ OPT_XIDS_TO_SIDS,
OPT_SEPARATOR,
OPT_LIST_ALL_DOMAINS,
OPT_LIST_OWN_DOMAIN,
OPT_CHANGE_USER_PASSWORD,
OPT_CCACHE_SAVE,
OPT_SID_TO_FULLNAME,
+ OPT_NTLMV1,
OPT_NTLMV2,
OPT_PAM_LOGON,
OPT_LOGOFF,
int int_subarg = -1;
int result = 1;
bool verbose = false;
- bool use_ntlmv2 = false;
+ bool use_ntlmv2 = true;
bool use_lanman = false;
char *logoff_user = getenv("USER");
int logoff_uid = geteuid();
{ "remove-gid-mapping", 0, POPT_ARG_STRING, &string_arg, OPT_REMOVE_GID_MAPPING, "Remove gid to sid mapping in idmap", "GID,SID" },
{ "sids-to-unix-ids", 0, POPT_ARG_STRING, &string_arg,
OPT_SIDS_TO_XIDS, "Translate SIDs to Unix IDs", "Sid-List" },
+ { "unix-ids-to-sids", 0, POPT_ARG_STRING, &string_arg,
+ OPT_XIDS_TO_SIDS, "Translate Unix IDs to SIDs",
+ "ID-List (u<num> g<num>)" },
{ "check-secret", 't', POPT_ARG_NONE, 0, 't', "Check shared secret" },
{ "change-secret", 'c', POPT_ARG_NONE, 0, 'c', "Change shared secret" },
{ "ping-dc", 'P', POPT_ARG_NONE, 0, 'P',
{ "all-domains", 0, POPT_ARG_NONE, 0, OPT_LIST_ALL_DOMAINS, "List all domains (trusted and own domain)" },
{ "own-domain", 0, POPT_ARG_NONE, 0, OPT_LIST_OWN_DOMAIN, "List own domain" },
{ "sequence", 0, POPT_ARG_NONE, 0, OPT_SEQUENCE, "Deprecated command, see --online-status" },
- { "online-status", 0, POPT_ARG_NONE, 0, OPT_ONLINESTATUS, "Show whether domains are marked as online or offline"},
+ { "online-status", 0, POPT_ARG_NONE, 0, OPT_ONLINESTATUS, "Show whether domains maintain an active connection"},
{ "domain-info", 'D', POPT_ARG_STRING, &string_arg, 'D', "Show most of the info we have about the domain" },
{ "user-info", 'i', POPT_ARG_STRING, &string_arg, 'i', "Get user info", "USER" },
{ "uid-info", 0, POPT_ARG_INT, &int_arg, OPT_UID_INFO, "Get user info from uid", "UID" },
{ "separator", 0, POPT_ARG_NONE, 0, OPT_SEPARATOR, "Get the active winbind separator", NULL },
{ "verbose", 0, POPT_ARG_NONE, 0, OPT_VERBOSE, "Print additional information per command", NULL },
{ "change-user-password", 0, POPT_ARG_STRING, &string_arg, OPT_CHANGE_USER_PASSWORD, "Change the password for a user", NULL },
+ { "ntlmv1", 0, POPT_ARG_NONE, 0, OPT_NTLMV1,
+ "Use NTLMv1 cryptography for user authentication", NULL},
{ "ntlmv2", 0, POPT_ARG_NONE, 0, OPT_NTLMV2, "Use NTLMv2 cryptography for user authentication", NULL},
{ "lanman", 0, POPT_ARG_NONE, 0, OPT_LANMAN, "Use lanman cryptography for user authentication", NULL},
POPT_COMMON_VERSION
case OPT_VERBOSE:
verbose = true;
break;
- case OPT_NTLMV2:
- use_ntlmv2 = true;
+ case OPT_NTLMV1:
+ use_ntlmv2 = false;
break;
case OPT_LANMAN:
use_lanman = true;
goto done;
}
break;
+ case OPT_XIDS_TO_SIDS:
+ if (!wbinfo_xids_to_sids(string_arg)) {
+ d_fprintf(stderr, "wbinfo_xids_to_sids "
+ "failed\n");
+ goto done;
+ }
+ break;
case 't':
if (!wbinfo_check_secret(opt_domain_name)) {
d_fprintf(stderr, "Could not check secret\n");