/* Performs login with existing credentials and ask the user for new ones on failure */ static int login( access_t *p_access ) { access_sys_t *p_sys = p_access->p_sys; /* Try to authenticate on the remote machine */ if( smb_connect( p_access ) != VLC_SUCCESS ) { for( int i = 0; i < BDSM_LOGIN_DIALOG_RETRY; i++ ) { login_dialog( p_access ); if( smb_connect( p_access ) == VLC_SUCCESS ) return VLC_SUCCESS; } msg_Err( p_access, "Unable to login with username = %s, domain = %s", p_sys->creds.login, p_sys->creds.domain ); return VLC_EGENERIC; } else if( smb_session_is_guest( p_sys->p_session ) ) msg_Warn( p_access, "Login failure but you were logged in as a Guest"); return VLC_SUCCESS; }
int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int copies; /* Number of copies */ int port; /* Port number */ char uri[1024], /* URI */ *sep, /* Pointer to separator */ *password; /* Password */ const char *username, /* Username */ *server, /* Server name */ *printer; /* Printer name */ const char *workgroup; /* Workgroup */ FILE *fp; /* File to print */ int status=0; /* Status of LPD job */ struct cli_state *cli; /* SMB interface */ char null_str[1]; int tries = 0; const char *dev_uri; null_str[0] = '\0'; /* we expect the URI in argv[0]. Detect the case where it is in argv[1] and cope */ if (argc > 2 && strncmp(argv[0],"smb://", 6) && !strncmp(argv[1],"smb://", 6)) { argv++; argc--; } if (argc == 1) { /* * NEW! In CUPS 1.1 the backends are run with no arguments to list the * available devices. These can be devices served by this backend * or any other backends (i.e. you can have an SNMP backend that * is only used to enumerate the available network printers... :) */ list_devices(); return (0); } if (argc < 6 || argc > 7) { fprintf(stderr, "Usage: %s [DEVICE_URI] job-id user title copies options [file]\n", argv[0]); fputs(" The DEVICE_URI environment variable can also contain the\n", stderr); fputs(" destination printer:\n", stderr); fputs("\n", stderr); fputs(" smb://[username:password@][workgroup/]server[:port]/printer\n", stderr); return (1); } /* * If we have 7 arguments, print the file named on the command-line. * Otherwise, print data from stdin... */ if (argc == 6) { /* * Print from Copy stdin to a temporary file... */ fp = stdin; copies = 1; } else if ((fp = fopen(argv[6], "rb")) == NULL) { perror("ERROR: Unable to open print file"); return (1); } else copies = atoi(argv[4]); /* * Find the URI... */ dev_uri = getenv("DEVICE_URI"); if (dev_uri) strncpy(uri, dev_uri, sizeof(uri) - 1); else if (strncmp(argv[0], "smb://", 6) == 0) strncpy(uri, argv[0], sizeof(uri) - 1); else { fputs("ERROR: No device URI found in DEVICE_URI environment variable or argv[0] !\n", stderr); return (1); } uri[sizeof(uri) - 1] = '\0'; /* * Extract the destination from the URI... */ if ((sep = strrchr_m(uri, '@')) != NULL) { username = uri + 6; *sep++ = '\0'; server = sep; /* * Extract password as needed... */ if ((password = strchr_m(username, ':')) != NULL) *password++ = '\0'; else password = null_str; } else { username = null_str; password = null_str; server = uri + 6; } if ((sep = strchr_m(server, '/')) == NULL) { fputs("ERROR: Bad URI - need printer name!\n", stderr); return (1); } *sep++ = '\0'; printer = sep; if ((sep = strchr_m(printer, '/')) != NULL) { /* * Convert to smb://[username:password@]workgroup/server/printer... */ *sep++ = '\0'; workgroup = server; server = printer; printer = sep; } else workgroup = NULL; if ((sep = strrchr_m(server, ':')) != NULL) { *sep++ = '\0'; port=atoi(sep); } else port=0; /* * Setup the SAMBA server state... */ setup_logging("smbspool", True); in_client = True; /* Make sure that we tell lp_load we are */ load_case_tables(); if (!lp_load(dyn_CONFIGFILE, True, False, False, True)) { fprintf(stderr, "ERROR: Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE); return (1); } if (workgroup == NULL) workgroup = lp_workgroup(); load_interfaces(); do { if ((cli = smb_connect(workgroup, server, port, printer, username, password, argv[2])) == NULL) { if (getenv("CLASS") == NULL) { fprintf(stderr, "ERROR: Unable to connect to CIFS host, will retry in 60 seconds...\n"); sleep (60); /* should just waiting and retrying fix authentication ??? */ tries++; } else { fprintf(stderr, "ERROR: Unable to connect to CIFS host, trying next printer...\n"); return (1); } } } while ((cli == NULL) && (tries < MAX_RETRY_CONNECT)); if (cli == NULL) { fprintf(stderr, "ERROR: Unable to connect to CIFS host after (tried %d times)\n", tries); return (1); } /* * Now that we are connected to the server, ignore SIGTERM so that we * can finish out any page data the driver sends (e.g. to eject the * current page... Only ignore SIGTERM if we are printing data from * stdin (otherwise you can't cancel raw jobs...) */ if (argc < 7) CatchSignal(SIGTERM, SIG_IGN); /* * Queue the job... */ for (i = 0; i < copies; i ++) if ((status = smb_print(cli, argv[3] /* title */, fp)) != 0) break; cli_shutdown(cli); /* * Return the queue status... */ return (status); }
/* Performs login with existing credentials and ask the user for new ones on failure */ static int login( stream_t *p_access ) { int i_ret = VLC_EGENERIC; access_sys_t *p_sys = p_access->p_sys; vlc_credential credential; char *psz_var_domain; const char *psz_login, *psz_password, *psz_domain; bool b_guest = false; vlc_credential_init( &credential, &p_sys->url ); psz_var_domain = var_InheritString( p_access, "smb-domain" ); credential.psz_realm = psz_var_domain ? psz_var_domain : NULL; vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd", NULL, NULL ); if( !credential.psz_username ) { psz_login = "******"; psz_password = ""; b_guest = true; } else { psz_login = credential.psz_username; psz_password = credential.psz_password; } psz_domain = credential.psz_realm ? credential.psz_realm : p_sys->netbios_name; /* Try to authenticate on the remote machine */ if( smb_connect( p_access, psz_login, psz_password, psz_domain ) != VLC_SUCCESS ) { while( vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd", SMB_LOGIN_DIALOG_TITLE, SMB_LOGIN_DIALOG_TEXT, p_sys->netbios_name ) ) { b_guest = false; psz_login = credential.psz_username; psz_password = credential.psz_password; psz_domain = credential.psz_realm ? credential.psz_realm : p_sys->netbios_name; if( smb_connect( p_access, psz_login, psz_password, psz_domain ) == VLC_SUCCESS ) goto success; } msg_Err( p_access, "Unable to login" ); goto error; } else if( smb_session_is_guest( p_sys->p_session ) == 1 ) { msg_Warn( p_access, "Login failure but you were logged in as a Guest"); b_guest = true; } success: msg_Warn( p_access, "Creds: username = '******', domain = '%s'", psz_login, psz_domain ); if( !b_guest ) vlc_credential_store( &credential, p_access ); i_ret = VLC_SUCCESS; error: vlc_credential_clean( &credential ); free( psz_var_domain ); return i_ret; }