NTSTATUS cli_full_connection(struct cli_state **output_cli, const char *my_name, const char *dest_host, struct in_addr *dest_ip, int port, const char *service, const char *service_type, const char *user, const char *domain, const char *password, int pass_len) { struct ntuser_creds creds; NTSTATUS nt_status; struct nmb_name calling; struct nmb_name called; struct cli_state *cli; struct in_addr ip; if (!output_cli) DEBUG(0, ("output_cli is NULL!?!")); *output_cli = NULL; make_nmb_name(&calling, my_name, 0x0); make_nmb_name(&called , dest_host, 0x20); again: if (!(cli = cli_initialise(NULL))) return NT_STATUS_NO_MEMORY; if (cli_set_port(cli, port) != port) { cli_shutdown(cli); return NT_STATUS_UNSUCCESSFUL; } ip = *dest_ip; DEBUG(3,("Connecting to host=%s share=%s\n", dest_host, service)); if (!cli_connect(cli, dest_host, &ip)) { DEBUG(1,("cli_establish_connection: failed to connect to %s (%s)\n", nmb_namestr(&called), inet_ntoa(*dest_ip))); cli_shutdown(cli); return NT_STATUS_UNSUCCESSFUL; } if (!cli_session_request(cli, &calling, &called)) { char *p; DEBUG(1,("session request to %s failed (%s)\n", called.name, cli_errstr(cli))); cli_shutdown(cli); if ((p=strchr(called.name, '.')) && !is_ipaddress(called.name)) { *p = 0; goto again; } if (strcmp(called.name, "*SMBSERVER")) { make_nmb_name(&called , "*SMBSERVER", 0x20); goto again; } return NT_STATUS_UNSUCCESSFUL; } if (!cli_negprot(cli)) { DEBUG(1,("failed negprot\n")); nt_status = NT_STATUS_UNSUCCESSFUL; cli_shutdown(cli); return nt_status; } if (!cli_session_setup(cli, user, password, pass_len, password, pass_len, domain)) { DEBUG(1,("failed session setup\n")); nt_status = cli_nt_error(cli); cli_shutdown(cli); if (NT_STATUS_IS_OK(nt_status)) nt_status = NT_STATUS_UNSUCCESSFUL; return nt_status; } if (service) { if (!cli_send_tconX(cli, service, service_type, password, pass_len)) { DEBUG(1,("failed tcon_X\n")); nt_status = cli_nt_error(cli); cli_shutdown(cli); if (NT_STATUS_IS_OK(nt_status)) nt_status = NT_STATUS_UNSUCCESSFUL; return nt_status; } } init_creds(&creds, user, domain, password, pass_len); cli_init_creds(cli, &creds); *output_cli = cli; return NT_STATUS_OK; }
int main( int argc, char ** argv ) { char * new_password; char * new_password2; krb5_context kcontext; krb5_error_code kerr; krb5_principal target_principal; if( argc < 2 ) { fprintf( stderr, "Usage: setpass user@REALM\n"); exit(1); } /* ** verify credentials - */ if( verify_creds() ) init_creds(); if( verify_creds() ) { fprintf( stderr, "No user credentials available\n"); exit(1); } /* ** check the principal name - */ krb5_init_context(&kcontext); kerr = krb5_parse_name( kcontext, argv[1], &target_principal ); { char * pname = NULL; kerr = krb5_unparse_name( kcontext, target_principal, &pname ); printf( "Changing password for %s:\n", pname); fflush( stdout ); free( pname ); } /* ** get the new password - */ for (;;) { new_password = getpass("Enter new password: "******"Verify new password: "******"Passwords do not match\n"); free( new_password ); free( new_password2 ); } /* ** change the password - */ { int pw_result; krb5_ccache ccache; krb5_data pw_res_string, res_string; kerr = krb5_cc_default( kcontext, &ccache ); if( kerr == 0 ) { kerr = krb5_set_password_using_ccache(kcontext, ccache, new_password, target_principal, &pw_result, &pw_res_string, &res_string ); if( kerr ) fprintf( stderr, "Failed: %s\n", error_message(kerr) ); else { if( pw_result ) { fprintf( stderr, "Failed(%d)", pw_result ); if( pw_res_string.length > 0 ) fprintf( stderr, ": %s", pw_res_string.data); if( res_string.length > 0 ) fprintf( stderr, " %s", res_string.data); fprintf( stderr, "\n"); } } } } return(0); }