static void bookmark_save_one(FILE *fp, url_t *url) { if(url == gvLocalUrl) fprintf(fp, "local"); else if(url == gvDefaultUrl) fprintf(fp, "default"); else { fprintf(fp, "machine %s://%s", url->protocol ? url->protocol : "ftp", url->hostname); if(url->port != -1) fprintf(fp, ":%d", url->port); if(url->alias) { char *a = xquote_chars(url->alias, "\'\""); fprintf(fp, " alias '%s'", a); free(a); } } if(url_isanon(url) && url->password && strcmp(url->password, gvAnonPasswd) == 0) fprintf(fp, "\n anonymous"); else if(url->username) { fprintf(fp, "\n login %s", url->username); if(url->password) { if(url_isanon(url)) fprintf(fp, " password %s", url->password); else { char *cq; base64_encode(url->password, strlen(url->password), &cq); fprintf(fp, " password [base64]%s", cq); free(cq); } } } if(url->directory) fprintf(fp, " cwd '%s'", url->directory); if(url->protlevel) fprintf(fp, " prot %s", url->protlevel); if(url->mech) { char *mech_string = stringify_list(url->mech); if(mech_string) { fprintf(fp, " mech '%s'", mech_string); free(mech_string); } } if(url->pasvmode != -1) fprintf(fp, " passive %s", url->pasvmode ? "true" : "false"); if(url->sftp_server) fprintf(fp, " sftp %s", url->sftp_server); if(url->noupdate) fprintf(fp, " noupdate"); fprintf(fp, "\n\n"); }
void cmd_url(int argc, char **argv) { int c; struct option longopts[] = { {"no-encoding", no_argument, 0, 'e'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; bool no_encoding = false; optind = 0; while((c = getopt_long(argc, argv, "eh", longopts, 0)) != EOF) { switch(c) { case 'h': show_help(_("Print the current URL."), "url [options]", _(" -e, --no-encoding don't encode URL as RFC1738 says\n")); return; case 'e': no_encoding = true; break; case '?': return; } } maxargs(optind - 1); need_connected(); need_loggedin(); printf("ftp://"); if(no_encoding) { printf("%s@%s", ftp->url->username, ftp->url->hostname); if(ftp->url->port != 21) printf(":%d", ftp->url->port); printf("/%s\n", ftp->curdir); return; } if(!url_isanon(ftp->url)) { char *e = encode_url_username(ftp->url->username); printf("%s@", e); free(e); } printf("%s", ftp->url->hostname); if(ftp->url->port != 21) printf(":%u", ftp->url->port); if(strcmp(ftp->curdir, ftp->homedir) != 0) { char *d; char *e = ftp->curdir; #if 0 if(strncmp(ftp->curdir, ftp->homedir, strlen(ftp->homedir)) == 0) e = ftp->curdir + strlen(ftp->homedir) + 1; #endif d = encode_url_directory(e); printf("/%s", d); free(d); } printf("\n"); }
static void create_bookmark(const char *guessed_alias) { char *default_alias = 0; char *prompt; url_t *url; listitem *li; int a; char *alias; alias = xstrdup(guessed_alias); while(true) { if(!alias) { default_alias = guess_alias(ftp->url); if(default_alias) asprintf(&prompt, "alias (%s): ", default_alias); else prompt = xstrdup("alias: "); force_completion_type = cpBookmark; alias = input_read_string(prompt); free(prompt); if(!alias || !*alias) alias = default_alias; else free(default_alias); } url = url_clone(ftp->url); url_setalias(url, alias); free(alias); alias = 0; li = list_search(gvBookmarks, (listsearchfunc)urlcmp, url); if(li) { a = ask(ASKYES|ASKNO|ASKCANCEL, ASKYES, _("a bookmark named '%s' already exists, overwrite?"), url->alias ? url->alias : url->hostname); if(a == ASKCANCEL) { url_destroy(url); return; } if(a == ASKYES) break; } else break; } /* password is automatically saved if anonymous login */ if(!url_isanon(url) && url->password) { a = ask(ASKYES|ASKNO, ASKNO, _("Save password?")); if(a == ASKNO) url_setpassword(url, 0); } create_the_bookmark(url); printf(_("created bookmark %s\n"), url->alias); }
int get_password(url_t *url, const char *anonpass, bool isproxy) { if(!url->password) { char *e; if(url_isanon(url) && isproxy == false) { char *prompt; e = 0; if(ftp->getuser_hook) { if(anonpass && isproxy == false) { if (asprintf(&prompt, _("password (%s): "), anonpass) == -1) { fprintf(stderr, _("Failed to allocate memory.\n")); return -1; } } else prompt = xstrdup(_("password: "******"Proxy password: "******"password: "******"You loose\n")); return -1; } url_setpassword(url, e); free(e); } return 0; }
int ftp_login(const char *guessed_username, const char *anonpass) { int ptype, r; static url_t *purl = 0; if(!ftp_connected()) return 1; if(!ftp->url) return -1; #ifdef HAVE_LIBSSH if (ftp->session) /* login authentication is performed by the ssh program */ return 0; #endif ptype = proxy_type(ftp->url); if(purl) { url_destroy(purl); purl = 0; } if(ptype > 0) purl = url_clone(gvProxyUrl); r = get_username(ftp->url, guessed_username, false); if(r != 0) return r; if(ptype > 1 && ptype < 7) { r = get_username(purl, 0, true); if(r != 0) return r; } #ifdef SECFTP ftp->sec_complete = false; ftp->data_prot = prot_clear; /* don't use secure stuff if anonymous */ if(!url_isanon(ftp->url)) { list *mechlist; /* request a protection level */ if(ftp->url->protlevel) { if(sec_request_prot(ftp->url->protlevel) != 0) ftp_err(_("Invalid protection level '%s'\n"), ftp->url->protlevel); } /* get list of mechanisms to try */ mechlist = ftp->url->mech ? ftp->url->mech : gvDefaultMechanism; if(mechlist) { listitem *li = mechlist->first; int ret = 0; for(; li; li=li->next) { const char *mech_name; mech_name = secext_name((char *)li->data); if(mech_name == 0) { ftp_err(_("unknown mechanism '%s'\n"), (char *)li->data); continue; } if(mech_unsupported(mech_name)) { ftp_err(_("Yafc was not compiled with support for %s\n"), mech_name); continue; } ret = sec_login(host_getname(ftp->host), mech_name); if(ret == -1) { if(ftp->code == ctError && ftp->fullcode != 504 && ftp->fullcode != 534) url_setmech(ftp->url, "none"); } if(ret != 1) break; } } if(ftp->sec_complete) ftp_err(_("Authentication successful.\n")); else ftp_err(_("*** Using plaintext username" " and password ***\n")); } #endif if(url_isanon(ftp->url)) fprintf(stderr, _("logging in anonymously...\n")); ftp_set_tmp_verbosity(ftp->url->password ? vbError : vbCommand); switch(ptype) { case 0: default: ftp_cmd("USER %s", ftp->url->username); break; case 1: ftp_cmd("USER %s@%s", ftp->url->username, ftp->url->hostname); break; case 2: case 3: case 4: ftp_cmd("USER %s", purl->username); if(ftp->code == ctContinue) { r = get_password(purl, 0, true); if(r != 0) return 0; ftp_cmd("PASS %s", purl->password); /* FIXME: what reply code do we expect now? */ if(ftp->code < ctTransient) { if(ptype == 2) { ftp_cmd("USER %s@%s", ftp->url->username, ftp->url->hostname); } else { if(ptype == 3) ftp_cmd("SITE %s", purl->hostname); else ftp_cmd("OPEN %s", purl->hostname); if(ftp->code < ctTransient) ftp_cmd("USER %s", ftp->url->username); } } } break; case 5: ftp_cmd("USER %s@%s@%s", ftp->url->username, purl->username, ftp->url->hostname); break; case 6: ftp_cmd("USER %s@%s", purl->username, ftp->url->hostname); if(ftp->code == ctContinue) { r = get_password(purl, 0, true); if(r != 0) return 0; ftp_cmd("PASS %s", purl->password); if(ftp->code < ctTransient) ftp_cmd("USER %s", ftp->url->username); } break; case 7: ftp_cmd("USER %s@%s:%i", ftp->url->username, ftp->url->hostname, ftp->url->port); break; } if(ftp->code == ctContinue) { ftp->loggedin = false; r = get_password(ftp->url, anonpass, false); if(r != 0) return r; if(ptype == 5) { r = get_password(purl, 0, true); if(r != 0) { url_destroy(purl); purl = 0; return 0; } } ftp_set_tmp_verbosity(vbCommand); switch(ptype) { default: case 0: case 1: case 2: case 3: case 4: case 6: ftp_cmd("PASS %s", ftp->url->password); break; case 5: ftp_cmd("PASS %s@%s", ftp->url->password, purl->password); break; } } url_destroy(purl); purl = 0; if(ftp->code > ctContinue) { if(ftp->fullcode == 530 && ftp_loggedin()) { /* this probable means '530 Already logged in' */ return 2; } ftp->loggedin = false; return 1; } if(ftp->code == ctComplete) { ftp->loggedin = true; #ifdef SECFTP /* we are logged in, now set the requested data protection level * requested from the autologin information in the config file, * if any, else uses default protection level 'clear', ie * no protection on the data channel */ if(ftp->sec_complete) { sec_set_protection_level(); fprintf(stderr, _("Data protection is %s\n"), level_to_name(ftp->data_prot)); } #endif ftp->homedir = ftp_getcurdir(); ftp->curdir = xstrdup(ftp->homedir); ftp->prevdir = xstrdup(ftp->homedir); if(ftp->url->directory) ftp_chdir(ftp->url->directory); ftp_get_feat(); return 0; } if(ftp->code == ctTransient) return 1; return -1; }
void auto_create_bookmark(void) { listitem *li; int a; bool auto_create, had_passwd = false; bool update = false; if(gvAutoBookmark == 0 && gvAutoBookmarkUpdate == 0) return; if(!ftp_loggedin() || gvSighupReceived) return; auto_create = (gvAutoBookmark == 1); /* check if bookmark already exists */ li = list_search(gvBookmarks, (listsearchfunc)urlcmp, ftp->url); if(li) { if(!should_update_bookmark((url_t *)li->data)) return; /* bookmark already exist, update it */ if(gvAutoBookmarkUpdate == 2) { a = ask(ASKYES|ASKNO, ASKYES, _("Do you want to update the bookmark for this site?")); if(a == ASKNO) return; } update = true; auto_create = true; had_passwd = (((url_t *)li->data)->password != 0); } if(gvAutoBookmark == 2 && !auto_create) { a = ask(ASKYES|ASKNO, ASKYES, _("Do you want to create a bookmark for this site?")); if(a == ASKNO) return; create_bookmark(0); } else { /* auto autobookmark... */ url_t* url = url_clone(ftp->url); char* a = guess_alias(ftp->url); url_setalias(url, a); free(a); li = list_search(gvBookmarks, (listsearchfunc)urlcmp, url); if(li) { /* bookmark already exist, overwrite it */ while(true) { url_t *xurl = (url_t *)li->data; if(xurl->alias && (strcmp(xurl->alias, url->alias) == 0) && (strcmp(xurl->hostname, url->hostname) != 0)) { /* create a new version of the alias, since guessed alias * already exists but for another host */ update = false; char* par = strrchr(url->alias, '('); int ver = 1; if (par) { *par = 0; ver = atoi(par + 1); } if (asprintf(&a, "%s(%d)", url->alias, ver + 1) == -1) { fprintf(stderr, _("Failed to allocate memory.\n")); url_destroy(url); return; } url_setalias(url, a); free(a); } else { update = true; had_passwd = (xurl->password != 0); break; } li = list_search(gvBookmarks, (listsearchfunc)urlcmp, url); if(li == 0) break; } if(li) /* overwrite bookmark (ie, delete old and create a new) */ list_delitem(gvBookmarks, li); if(!url_isanon(url) && gvAutoBookmarkSavePasswd == false && !had_passwd) url_setpassword(url, 0); } else { if(!url_isanon(url) && gvAutoBookmarkSavePasswd == false) url_setpassword(url, 0); } create_the_bookmark(url); if(!gvAutoBookmarkSilent) { if(update) printf(_("updated bookmark %s\n"), url->alias); else printf(_("created bookmark %s\n"), url->alias); } } }