int main( int argc, char *argv[] ){ int sock; config_t *conf; if ( argc > 1 ) conf = parse_file( argv[1] ); else conf = parse_file( PREFIX"/etc/client.conf" ); if ( conf ) printf( "Read client config.\n" ); else die( 1, "Could not open client config\n" ); sock = connect_to_serv( conf ); if ( sock < 0 ) die( 1, "Unknown socket error" ); test_connect( sock ); close( sock ); free( conf ); return 0; }
int gere_cmd(t_main *c) { if (check_cmd(c->tab)) return (1); if (c->connect == FALSE && !strcmp("/server", c->tab[0])) { connect_to_serv(c); return (1); } else if (c->connect == TRUE && !strcmp("/disconnect", c->tab[0])) { disconnect(c); return (1); } else if (c->connect == FALSE) return (-1); return (0); }
int service_vsap(Connection *Conn) { CStr(request,1024); CStr(reqver,128); const char *req; int svsock,shared,clsock,rcode; CStr(myport,256); CStr(sockname,MaxHostNameLen); CStr(peername,MaxHostNameLen); int wcc,rcc; CStr(com,1024); CStr(arg,1024); const char *argp; CStr(opt,32); const char *op; int timeout; int AuthOk; FILE *authout; minit_vsapsv(); if( ToS <= 0 || FromS <= 0 ){ /* If the DST_HOST is not local connect to the master and simple_relay... */ } if( !isMYSELF(DFLT_HOST) ){ daemonlog("E","VSAP relaying to %s:%d\n",DFLT_HOST,DFLT_PORT); if( ToS < 0 ) connect_to_serv(Conn,FromC,ToC,0); relay_svcl(Conn,FromC,ToC,FromS,ToS); close(ToS); return 0; } /* timeout = 300; */ timeout = IO_TIMEOUT; shared = 0; myport[0] = 0; SvSockN = 0; ClSockN = 0; clsock = -1; svsock = -1; reqver[0] = 0; authout = TMPFILE("VSAP-AUTH"); if( doAUTH(Conn,NULL,authout,"vsap","-",0,CVStr("user-xxxx:pass-xxxx"),CVStr("host-xxxx"),NULL,NULL) == EOF ){ AuthOk = 0; }else AuthOk = -1; if( ImMaster ){ sprintf(myport,"%s:%d",DST_HOST,DST_PORT); }else for(;;){ if( DDI_fgetsFromCbuf(Conn,AVStr(request),sizeof(request),NULL) == 0 ) { int closed = 0; for(;;){ if( PollIn(FromC,1*1000) != 0 ) break; closed |= checkCloseOnTimeout(1); if( 0 <= clsock && !IsAlive(clsock) ){ daemonlog("E","## disconnected by peer\n"); SockPrintf(ToC,"%s %d %s.\r\n",VER,NO_GENERIC_BYE,"disconnected by peer"); close(clsock);del_clsock(clsock); goto EXIT; } } if( (rcc = RecvLine(FromC,request,sizeof(request))) <= 0 ) break; } daemonlog("D","CLIENT-SAYS: %s",request); daemonlog("E","CLIENT-SAYS: %s",request); req = request; if( strncmp(req,"VSAP/",5) == 0 ) req = wordScan(req,reqver); argp = wordScan(req,com); arg[0] = 0; lineScan(argp,arg); if( strcasecmp(com,"AUTH") == 0 ){ CStr(ahost,MaxHostNameLen); ahost[0] = 0; if( doAUTH(Conn,NULL,authout,"vsap","-",0,AVStr(arg),AVStr(ahost),NULL,NULL) == EOF ){ }else{ AuthOk = 1; SockPrintf(ToC,"%s %d OK\r\n",VER,OK_GENERIC); continue; } } if( AuthOk == 0 ){ SockPrintf(ToC,"%s %d forbidden\r\n",VER,NO_PERMISSION); sv1log("WITH AUTHORIZER, but NO AUTH from client\n"); break; } if( strcasecmp(com,"ECHO") == 0 ){ CStr(stime,64); StrftimeLocal(AVStr(stime),sizeof(stime),TIMEFORM_HTTPD,time(0),0); SockPrintf(ToC,"%s %d [%s] %s\r\n",VER,OK_GENERIC, stime,arg); }else if( strcasecmp(com,"CONNECT") == 0 ){ strcpy(myport,arg); if( !vsap_permit(Conn,myport) ) break; clsock = do_connect(svsock,myport,ToC); if( clsock < 0 ) break; }else if( strcasecmp(com,"BIND") == 0 ){ CStr(opts,1024); opts[0] = 0; Xsscanf(arg,"%s %[^\r\n]",AVStr(myport),AVStr(opts)); if( !vsap_permit(Conn,myport) ) break; svsock = do_bind(-1,AVStr(myport),opts,&shared,AVStr(sockname),ToC); if( svsock < 0 ) break; }else if( strcasecmp(com,"LISTEN") == 0 ){ int nlisten = atoi(arg); Socket1("VSAP",svsock,NULL,NULL,NULL,VStrANYPORT,ANYPORT,nlisten,NULL,0); SockPrintf(ToC,"%s %d listen ok.\r\n",VER,OK_LISTEN); }else if( strcasecmp(com,"ACCEPT") == 0 ){ int priority; if( Conn->cl_count <= 1 ) priority = 0; else priority = 1; clsock = do_accept(myport,arg,shared,priority,FromC,ToC); if( !shared ) svsock = -1; if( clsock < 0 ){ wcc = SockPrintf(ToC,"%s %d accept fail\r\n", VER,NO_ACCEPT); break; } add_clsock(clsock); if( myport[0] == '/' ){ strcpy(sockname,myport); strcpy(peername,myport); }else getpairName(clsock,AVStr(sockname),AVStr(peername)); wcc = SockPrintf(ToC,"%s %d %d %s %s accepted.\r\n", VER,OK_ACCEPT,ClSockN,sockname,peername); }else if( strcasecmp(com,"QUIT") == 0 ){ SockPrintf(ToC,"%s %d bye.\r\n",VER,OK_BYE); break; }else if( strcasecmp(com,"FORWARD") == 0 ){ do_forward(Conn,myport,arg,shared,svsock,0,FromC,ToC); }else if( strcasecmp(com,"RELAY") == 0 ){ /* -t timeout */ for( op = arg; *op == '-'; ){ if( strneq(op,"-t=",3) ){ int to; op = numscanX(op+3,AVStr(opt),sizeof(opt)); to = atoi(opt); if( to < timeout ) timeout = to; }else{ break; } } tcp_relay2(timeout*1000,FromC,clsock,clsock,ToC); /* set_linger(clsock,10); */ set_linger(clsock,LIN_TIMEOUT); close(clsock);del_clsock(clsock); break; }else if( strcasecmp(com,"PROXY") == 0 ){ ToS = FromS = ToC; ToC = FromC = clsock; daemonlog("E","##### VSAP switch protocol to '%s'\n",arg); if( strcmp(arg,"http")==0 ) service_http(Conn); else if( strcmp(arg,"ftp")==0 ) service_ftp(Conn); set_linger(clsock,10); close(clsock);del_clsock(clsock); break; }else { /* wcc = write(clsock,req,rcc); tcp_relay2(timeout*1000,FromC,clsock,clsock,ToC); */ SockPrintf(ToC,"%s %d %s",VER,NO_GENERIC,request); } } EXIT: fclose(authout); return 0; }
static void imap_change_server(Connection *Conn,PVStr(login)) { const char *dp; IStr(proto,64); CStr(host,LNSIZE); const char *opts; CStr(user,LNSIZE); CStr(tmp,LNSIZE); int port; if( *login == '"' ) wordScanY(login+1,user,"^\""); else wordScan(login,user); if( dp = strrpbrk(user,"@%") ){ truncVStr(dp); strcpy(tmp,user); wordScan(dp+1,host); sprintf(user,"//%s/%s",host,tmp); } opts = CTX_mount_url_to(Conn,NULL,"GET",AVStr(user)); strcpy(proto,"imap"); if( strncasecmp(user,"imap://",7) == 0 ) { ovstrcpy(user,user+5); } if( strncasecmp(user,"imaps://",8) == 0 ) { strcpy(proto,"imaps"); ovstrcpy(user,user+6); } if( Xsscanf(user,"//%[^/]/%s",AVStr(tmp),AVStr(user)) == 2 ){ /* port = scan_hostportX("imap",tmp,AVStr(host),sizeof(host)); */ port = scan_hostportX(proto,tmp,AVStr(host),sizeof(host)); sprintf(login,"\"%s\"",user); goto SWSERV; } dp = strrpbrk(login,"@%"); if( dp == 0 ) return; /* port = scan_hostportX("imap",dp+1,AVStr(host),sizeof(host)); */ port = scan_hostportX(proto,dp+1,AVStr(host),sizeof(host)); if( strtailchr(login) == '"' ) *(char*)dp++ = '"'; /**/ truncVStr(dp); SWSERV: sv1log("IMAP LOGIN %s @ %s:%d\n",login,host,port); /* set_realserver(Conn,"imap",host,port); */ set_realserver(Conn,proto,host,port); if( streq(CLNT_PROTO,"imaps") && (ClientFlags & PF_MITM_DO) ){ ServerFlags |= (PF_SSL_IMPLICIT | PF_STLS_DO); } connect_to_serv(Conn,FromC,ToC,0); }
int service_imap(Connection *Conn) { FILE *fc,*tc,*ts,*fs; FILE *fpv[2]; /**/ int rds[2],idle; const char *dp; const char *ap; CStr(req,LNSIZE); CStr(qtag,LNSIZE); CStr(qcmd,LNSIZE); CStr(qarg,LNSIZE); CStr(qrem,LNSIZE); CStr(resp,LNSIZE); CStr(rtag,LNSIZE); CStr(rstat,LNSIZE); CStr(myhost,LNSIZE); IStr(serv,MaxHostNameLen); int newconn; fc = fdopen(FromC,"r"); tc = fdopen(ToC,"w"); if( 0 <= ToS ){ ts = fdopen(ToS,"w"); fs = fdopen(FromS,"r"); if( fgetsTIMEOUT(AVStr(resp),sizeof(resp),fs) == NULL ) return -1; sv1log("S: %s",resp); IMAP_STARTTLS_withSV(Conn,ts,fs,""); }else{ ts = NULL; fs = NULL; ClientIF_name(Conn,FromC,AVStr(myhost)); sprintf(resp,"* OK %s Proxy IMAP4 server DeleGate/%s\r\n", myhost,DELEGATE_ver()); sv1log("D: %s",resp); } capSTLS(Conn,AVStr(resp)); fputs(resp,tc); for(;;){ fflush(tc); if( pollYY(Conn,"IMAP-REQ",fc) != 0 ){ break; } if( fgetsTIMEOUT(AVStr(req),sizeof(req),fc) == NULL ){ sv1log("C: EOF\n"); break; } dp = wordScan(req,qtag); ap = wordScan(dp,qcmd); dp = wordScan(ap,qarg); lineScan(dp,qrem); if( strcaseeq(qcmd,"LOGIN") ){ sv1log("C: %s %s %s ****\n",qtag,qcmd,qarg); }else sv1log("C: %s",req); if( method_permitted(Conn,"imap",qcmd,1) == 0 ){ fprintf(tc,"%s NO (forbidden) %s\r\n",qtag,qcmd); fflush(tc); continue; } if( IMAP_STARTTLS_withCL(Conn,fc,tc,qtag,qcmd,qarg) ){ continue; } if( needSTLS(Conn) ){ if( !strcaseeq(qcmd,"XECHO") ) if( !strcaseeq(qcmd,"LOGOUT") ) if( !strcaseeq(qcmd,"CAPABILITY") ){ fprintf(tc,"%s BAD Say STARTTLS first.\r\n",qtag); continue; } } if( ts == NULL ){ if( strcaseeq(qcmd,"XECHO") ){ while( *ap == ' ' || *ap == '\t' ) ap++; fputs(ap,tc); continue; } if( strcaseeq(qcmd,"LOGOUT") ){ sv1log("D: %s OK %s\r\n",qtag,qcmd); fprintf(tc,"%s OK %s\r\n",qtag,qcmd); fflush(tc); break; } if( strcaseeq(qcmd,"CAPABILITY") ){ sv1log("D: %s OK %s\r\n",qtag,qcmd); /* fprintf(tc,"* CAPABILITY IMAP4 AUTH-LOGIN\r\n"); */ /* fprintf(tc,"* CAPABILITY IMAP4 AUTH-LOGIN"); */ fprintf(tc,"* CAPABILITY IMAP4"); fprintf(tc," IMAP4rev1"); fprintf(tc," AUTH-LOGIN"); if( willSTLS_CL(Conn) ){ fprintf(tc," STARTTLS"); } fprintf(tc,"\r\n"); fprintf(tc,"%s OK %s\r\n",qtag,qcmd); continue; } if( strcaseeq(qcmd,"LOGIN") ) imap_change_server(Conn,AVStr(qarg)); if( ToS < 0 ){ fprintf(tc,"%s BAD LOGIN user@host first.\r\n", qtag); sv1log("D: %s BAD LOGIN user@host first.\r\n", qtag); imaplog(Conn,qcmd,qarg); continue; } ts = fdopen(ToS,"w"); fs = fdopen(FromS,"r"); if( fgetsTIMEOUT(AVStr(resp),sizeof(resp),fs) == NULL ) return -1; sv1log(">>>> %s",resp); sprintf(req,"%s %s %s %s\r\n",qtag,qcmd,qarg,qrem); sv1log(">>>> %s %s %s ****\n",qtag,qcmd,qarg); IMAP_STARTTLS_withSV(Conn,ts,fs,""); newconn = 1; } else newconn = 0; if( strcaseeq(qcmd,"AUTHENTICATE") ){ if( CTX_withAuth(Conn) ){ sv1log("#### NO AUTHENTICATE [%s]\n",qarg); fprintf(tc,"%s NO do LOGIN instead\r\n",qtag); fflush(tc); continue; } } if( strcaseeq(qcmd,"LOGIN") ){ CStr(user,64); CStr(pass,64); if( *qarg == '"' ) wordScanY(qarg+1,user,"^\""); else wordScan(qarg,user); if( *qrem == '"' ) wordScanY(qrem+1,pass,"^\""); else wordScan(qrem,pass); /* if( CTX_auth(Conn,user,qrem) < 0 ){ */ if( CTX_auth(Conn,user,pass) < 0 ){ sv1log("#### [%s] LOGIN forbidden\n",user); fprintf(tc,"%s NO LOGIN forbidden\r\n",qtag); fflush(tc); continue; } } fputs(req,ts); fflush(ts); rstat[0] = 0; /* if( strcaseeq(qcmd,"IDLE") || strcaseeq(qcmd,"APPEND") ){ */ if( strcaseeq(qcmd,"IDLE") || strcaseeq(qcmd,"APPEND") || strcaseeq(qcmd,"AUTHENTICATE") ){ fpv[0] = fc; fpv[1] = fs; idle = 1; }else idle = 0; for(;;){ if( idle ){ fflush(tc); if( fPollIns(0,2,fpv,rds) < 0 ) break; if( 0 < rds[0] ){ if( fgets(req,sizeof(req),fc) == NULL ){ sv1log("C> EOF in IDLE\n"); goto EXIT; } Verbose("C> %s",req); fputs(req,ts); fflush(ts); } if( rds[1] <= 0 ) continue; } if( fgetsTIMEOUT(AVStr(resp),sizeof(resp),fs) == NULL ){ sv1log("S: EOF\n"); break; } dp = wordScan(resp,rtag); dp = wordScan(dp,rstat); if( streq(rtag,"*") && strcaseeq(qcmd,"CAPABILITY") ){ capSTLS(Conn,QVStr((char*)dp,resp)); } if( redirect(fs,qcmd,resp,AVStr(serv),AVStr(req)) ){ sv1log("IMAP redirect=>%s %s\n",serv,req); set_realserver(Conn,"imap",serv,143); connect_to_serv(Conn,FromC,ToC,0); if( 0 <= ToS ){ redirectSV(Conn,serv,req,AVStr(resp), &fs,&ts); } } fputs(resp,tc); if( qtag[0] == 0 || strcmp(qtag,rtag) == 0 ) break; Verbose("S> %s",resp); } sv1log("S: %s",resp); fflush(tc); if( strcaseeq(qcmd,"LOGOUT") && strcaseeq(rstat,"OK") || feof(fs) ) break; if( strcaseeq(qcmd,"LOGIN") ) if( newconn ) if( !strcaseeq(rstat,"OK") ){ fprintf(ts,"X LOGOUT\r\n"); /* fclose(ts); fclose(fs); */ finishServYY(FL_ARG,Conn); CTX_fcloses(FL_ARG,"IMAPserv",Conn,ts,fs); ts = fs = NULL; ToS = FromS = -1; sv1log(">>>> IMAP connection to the server closed.\n"); /* must clear FSV,FTOSV,FFROMSV if exists */ } if( strcaseeq(qcmd,"LOGIN") ) imaplog(Conn,qcmd,qarg); } EXIT: finishServYY(FL_ARG,Conn); CTX_fcloses(FL_ARG,"IMAPserv",Conn,ts,fs); CTX_fcloses(FL_ARG,"IMAPclnt",Conn,tc,fc); return 0; }
int sudo_main(int ac,const char *av[],Connection *Conn){ int ai; const char *arg; int sock; int sendfd = 0; int sockfd = fileno(stderr); const char *optpw = 0; IStr(local,128); IStr(remote,128); CStr(opts,128); IStr(host,128); int port = 0; if( ac <= 1 ){ fprintf(stderr,"Usage: %s [host:port] [-a d:u:p] [-b h:p]\n", av[0]); return 0; } sprintf(host,"%s/sudo/sudo/port/P",DELEGATE_DGROOT); port = 1; for( ai = 1; ai < ac; ai++ ){ arg = av[ai]; if( streq(arg,"-a") ){ if( ai+1 < ac ){ arg = av[++ai]; optpw = arg; } }else if( streq(arg,"-b") ){ if( ai+1 < ac ){ arg = av[++ai]; sendfd = 1; sockfd = newSocket("BIND/test",""); strcpy(opts,arg); } }else if( streq(arg,"-d") ){ sendfd = 1; }else{ Xsscanf(arg,"%[^:]:%d",AVStr(host),&port); } } set_realserver(Conn,"sudo",host,port); Conn->from_myself = 1; sock = connect_to_serv(Conn,0,1,0); if( sock < 0 ){ sock = client_open_un("SUDO",host,32); if( sock < 0 ){ fprintf(stderr,"---- cannot open '%s:%d'\n",host,port); return -1; } } if( optpw ){ int wcc,rcc; CStr(msg,128); sprintf(msg,"PAM %s\r\n",optpw); wcc = write(sock,msg,strlen(msg)); PollIn(sock,8*1000); rcc = read(sock,msg,sizeof(msg)); fprintf(stderr,"---- %s\n",msg); } if( sendfd ){ CStr(msg,128); int wcc; double Start = Time(); if( sockfd == fileno(stderr) ) sprintf(msg,"STDERR\r\n"); else sprintf(msg,"BIND %s\r\n",opts); fprintf(stderr,"---- command BIND sockfd=%d ==> %d\n",sockfd,sock); wcc = write(sock,msg,strlen(msg)); /* fprintf(stderr,"---- sending sockfd=%d ==> %d\n",sockfd,usock); wcc = sendFd(usock,sockfd,0); */ PollIn(sock,8*1000); getpairName(sockfd,AVStr(local),AVStr(remote)); fprintf(stderr,"---- SUDO %s SENT=%d [%.3f] sock=%d [%s][%s]\n", msg,wcc,Time()-Start,sockfd,local,remote); } return 0; }