static int open_log(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs) { int ret=-1; char *logpath=NULL; const char *peer_version=get_string(cconfs[OPT_PEER_VERSION]); if(!(logpath=prepend_s(sdirs->rworking, "log"))) goto end; if(log_fzp_set(logpath, cconfs)) { logp("could not open log file: %s\n", logpath); goto end; } logp("Client version: %s\n", peer_version?:""); logp("Protocol: %d\n", (int)get_protocol(cconfs)); if(get_int(cconfs[OPT_CLIENT_IS_WINDOWS])) logp("Client is Windows\n"); // Make sure a warning appears in the backup log. // The client will already have been sent a message with logw. // This time, prevent it sending a logw to the client by specifying // NULL for cntr. if(get_int(cconfs[OPT_VERSION_WARN])) version_warn(asfd, NULL, cconfs); ret=0; end: free_w(&logpath); return ret; }
int authorise_server(struct asfd *asfd, struct conf **globalcs, struct conf **cconfs) { int ret=-1; char *cp=NULL; char *password=NULL; char *cname=NULL; char whoareyou[256]=""; struct iobuf *rbuf=asfd->rbuf; const char *peer_version=NULL; if(asfd->read(asfd)) { logp("unable to read initial message\n"); goto end; } if(rbuf->cmd!=CMD_GEN || strncmp_w(rbuf->buf, "hello")) { iobuf_log_unexpected(rbuf, __func__); goto end; } // String may look like... // "hello" // "hello:(version)" // (version) is a version number if((cp=strchr(rbuf->buf, ':'))) { cp++; if(cp && set_string(cconfs[OPT_PEER_VERSION], cp)) goto end; } iobuf_free_content(rbuf); snprintf(whoareyou, sizeof(whoareyou), "whoareyou"); peer_version=get_string(cconfs[OPT_PEER_VERSION]); if(peer_version) { long min_ver=0; long cli_ver=0; if((min_ver=version_to_long("1.3.2"))<0 || (cli_ver=version_to_long(peer_version))<0) return -1; // Stick the server version on the end of the whoareyou string. // if the client version is recent enough. if(min_ver<=cli_ver) snprintf(whoareyou, sizeof(whoareyou), "whoareyou:%s", VERSION); } if(asfd->write_str(asfd, CMD_GEN, whoareyou) || asfd->read(asfd)) { logp("unable to get client name\n"); goto end; } if(!(cname=strdup_w(rbuf->buf, __func__))) goto end; if(!get_int(globalcs[OPT_CNAME_FQDN])) strip_fqdn(&cname); if(get_int(globalcs[OPT_CNAME_LOWERCASE])) strlwr(cname); if(set_string(cconfs[OPT_CNAME], cname)) goto end; iobuf_free_content(rbuf); if(asfd->write_str(asfd, CMD_GEN, "okpassword") || asfd->read(asfd)) { logp("unable to get password for client %s\n", get_string(cconfs[OPT_CNAME])); goto end; } password=rbuf->buf; iobuf_init(rbuf); if(check_client_and_password(globalcs, password, cconfs)) goto end; if(get_int(cconfs[OPT_VERSION_WARN])) version_warn(asfd, globalcs, cconfs); logp("auth ok for: %s%s\n", get_string(cconfs[OPT_CNAME]), get_int(cconfs[OPT_PASSWORD_CHECK])? "":" (no password needed)"); if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; ret=0; end: iobuf_free_content(rbuf); free_w(&password); free_w(&cname); return ret; }
int authorise_server(struct asfd *asfd, struct conf *conf, struct conf *cconf) { int ret=-1; char *cp=NULL; char *password=NULL; char whoareyou[256]=""; struct iobuf *rbuf=asfd->rbuf; if(asfd->read(asfd)) { logp("unable to read initial message\n"); goto end; } if(rbuf->cmd!=CMD_GEN || strncmp_w(rbuf->buf, "hello")) { iobuf_log_unexpected(rbuf, __func__); goto end; } // String may look like... // "hello" // "hello:(version)" // (version) is a version number if((cp=strchr(rbuf->buf, ':'))) { cp++; if(cp && !(cconf->peer_version=strdup_w(cp, __func__))) goto end; } iobuf_free_content(rbuf); snprintf(whoareyou, sizeof(whoareyou), "whoareyou"); if(cconf->peer_version) { long min_ver=0; long cli_ver=0; if((min_ver=version_to_long("1.3.2"))<0 || (cli_ver=version_to_long(cconf->peer_version))<0) return -1; // Stick the server version on the end of the whoareyou string. // if the client version is recent enough. if(min_ver<=cli_ver) snprintf(whoareyou, sizeof(whoareyou), "whoareyou:%s", VERSION); } asfd->write_str(asfd, CMD_GEN, whoareyou); if(asfd->read(asfd)) { logp("unable to get client name\n"); goto end; } cconf->cname=rbuf->buf; iobuf_init(rbuf); asfd->write_str(asfd, CMD_GEN, "okpassword"); if(asfd->read(asfd)) { logp("unable to get password for client %s\n", cconf->cname); goto end; } password=rbuf->buf; iobuf_init(rbuf); if(check_client_and_password(conf, password, cconf)) goto end; if(cconf->version_warn) version_warn(asfd, conf, cconf); logp("auth ok for: %s%s\n", cconf->cname, cconf->password_check?"":" (no password needed)"); asfd->write_str(asfd, CMD_GEN, "ok"); ret=0; end: iobuf_free_content(rbuf); free_w(&password); return ret; }
int authorise_server(struct config *conf, char **client, char **cversion, struct config *cconf, struct cntr *p1cntr) { char cmd; char *cp=NULL; size_t len=0; char *buf=NULL; char *password=NULL; char whoareyou[256]=""; if(async_read(&cmd, &buf, &len)) { logp("unable to read initial message\n"); return -1; } if(cmd!=CMD_GEN || strncmp(buf, "hello", strlen("hello"))) { logp("unexpected command given: %c %s\n", cmd, buf); free(buf); return -1; } // String may look like... // "hello" // "hello:(version)" // (version) is a version number if((cp=strchr(buf, ':'))) { cp++; if(cp) *cversion=strdup(cp); } free(buf); buf=NULL; snprintf(whoareyou, sizeof(whoareyou), "whoareyou"); if(*cversion) { long min_ver=0; long cli_ver=0; if((min_ver=version_to_long("1.3.2"))<0 || (cli_ver=version_to_long(*cversion))<0) return -1; // Stick the server version on the end of the whoareyou string. // if the client version is recent enough. if(min_ver<=cli_ver) snprintf(whoareyou, sizeof(whoareyou), "whoareyou:%s", VERSION); } async_write_str(CMD_GEN, whoareyou); if(async_read(&cmd, &buf, &len) || !len) { logp("unable to get client name\n"); if(*cversion) free(*cversion); *cversion=NULL; return -1; } *client=buf; buf=NULL; async_write_str(CMD_GEN, "okpassword"); if(async_read(&cmd, &buf, &len) || !len) { logp("unable to get password for client %s\n", *client); if(*client) free(*client); *client=NULL; if(*cversion) free(*cversion); *cversion=NULL; free(buf); buf=NULL; return -1; } password=buf; buf=NULL; if(check_client_and_password(conf, *client, password, cconf)) { if(*client) free(*client); *client=NULL; if(*cversion) free(*cversion); *cversion=NULL; free(password); password=NULL; return -1; } version_warn(p1cntr, *client, *cversion); logp("auth ok for client: %s\n", *client); if(password) free(password); async_write_str(CMD_GEN, "ok"); return 0; }