static void popt_common_credentials_callback(poptContext con, enum poptCallbackReason reason, const struct poptOption *opt, const char *arg, const void *data) { struct user_auth_info *auth_info = talloc_get_type_abort( *((const char **)data), struct user_auth_info); char *p; if (reason == POPT_CALLBACK_REASON_PRE) { set_cmdline_auth_info_username(auth_info, "GUEST"); if (getenv("LOGNAME")) { set_cmdline_auth_info_username(auth_info, getenv("LOGNAME")); } if (getenv("USER")) { char *puser = SMB_STRDUP(getenv("USER")); if (!puser) { exit(ENOMEM); } set_cmdline_auth_info_username(auth_info, puser); } if (getenv("PASSWD")) { set_cmdline_auth_info_password(auth_info, getenv("PASSWD")); } if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) { get_password_file(auth_info); } return; } switch(opt->val) { case 'U': { char *lp; char *puser = SMB_STRDUP(arg); if ((lp=strchr_m(puser,'%'))) { size_t len; *lp = '\0'; set_cmdline_auth_info_username(auth_info, puser); set_cmdline_auth_info_password(auth_info, lp+1); len = strlen(lp+1); memset(lp + 1, '\0', len); } else { set_cmdline_auth_info_username(auth_info, puser); } SAFE_FREE(puser); } break; case 'A': get_credentials_file(auth_info, arg); break; case 'k': #ifndef HAVE_KRB5 d_printf("No kerberos support compiled in\n"); exit(1); #else set_cmdline_auth_info_use_krb5_ticket(auth_info); #endif break; case 'S': if (!set_cmdline_auth_info_signing_state(auth_info, arg)) { fprintf(stderr, "Unknown signing option %s\n", arg ); exit(1); } break; case 'P': set_cmdline_auth_info_use_machine_account(auth_info); break; case 'N': set_cmdline_auth_info_password(auth_info, ""); break; case 'e': set_cmdline_auth_info_smb_encrypt(auth_info); break; case 'C': set_cmdline_auth_info_use_ccache(auth_info, true); break; case 'H': set_cmdline_auth_info_use_pw_nt_hash(auth_info, true); break; } }
static void popt_common_credentials_callback(poptContext con, enum poptCallbackReason reason, const struct poptOption *opt, const char *arg, const void *data) { char *p; if (reason == POPT_CALLBACK_REASON_PRE) { cmdline_auth_info.use_kerberos = False; cmdline_auth_info.got_pass = False; cmdline_auth_info.signing_state = Undefined; pstrcpy(cmdline_auth_info.username, "GUEST"); if (getenv("LOGNAME"))pstrcpy(cmdline_auth_info.username,getenv("LOGNAME")); if (getenv("USER")) { pstrcpy(cmdline_auth_info.username,getenv("USER")); if ((p = strchr_m(cmdline_auth_info.username,'%'))) { *p = 0; pstrcpy(cmdline_auth_info.password,p+1); cmdline_auth_info.got_pass = True; memset(strchr_m(getenv("USER"),'%')+1,'X',strlen(cmdline_auth_info.password)); } } if (getenv("PASSWD")) { pstrcpy(cmdline_auth_info.password,getenv("PASSWD")); cmdline_auth_info.got_pass = True; } if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) { get_password_file(&cmdline_auth_info); cmdline_auth_info.got_pass = True; } return; } switch(opt->val) { case 'U': { char *lp; pstrcpy(cmdline_auth_info.username,arg); if ((lp=strchr_m(cmdline_auth_info.username,'%'))) { *lp = 0; pstrcpy(cmdline_auth_info.password,lp+1); cmdline_auth_info.got_pass = True; memset(strchr_m(arg,'%')+1,'X',strlen(cmdline_auth_info.password)); } } break; case 'A': get_credentials_file(arg, &cmdline_auth_info); break; case 'k': #ifndef HAVE_KRB5 d_printf("No kerberos support compiled in\n"); exit(1); #else cmdline_auth_info.use_kerberos = True; cmdline_auth_info.got_pass = True; #endif break; case 'S': { cmdline_auth_info.signing_state = -1; if (strequal(arg, "off") || strequal(arg, "no") || strequal(arg, "false")) cmdline_auth_info.signing_state = False; else if (strequal(arg, "on") || strequal(arg, "yes") || strequal(arg, "true") || strequal(arg, "auto") ) cmdline_auth_info.signing_state = True; else if (strequal(arg, "force") || strequal(arg, "required") || strequal(arg, "forced")) cmdline_auth_info.signing_state = Required; else { fprintf(stderr, "Unknown signing option %s\n", arg ); exit(1); } } break; case 'P': { char *opt_password = NULL; /* it is very useful to be able to make ads queries as the machine account for testing purposes and for domain leave */ if (!secrets_init()) { d_printf("ERROR: Unable to open secrets database\n"); exit(1); } opt_password = secrets_fetch_machine_password(lp_workgroup(), NULL, NULL); if (!opt_password) { d_printf("ERROR: Unable to fetch machine password\n"); exit(1); } pstr_sprintf(cmdline_auth_info.username, "%s$", global_myname()); pstrcpy(cmdline_auth_info.password,opt_password); SAFE_FREE(opt_password); /* machine accounts only work with kerberos */ cmdline_auth_info.use_kerberos = True; cmdline_auth_info.got_pass = True; } break; } }