void HMACSetup(HashratCtx *Ctx) { char *Tempstr=NULL, *ptr; STREAM *S; ptr=GetVar(Ctx->Vars,"EncryptionKey"); if (StrLen(ptr)==0) { if (isatty(0)) { write(1, "Enter HMAC Key: ",16); S=STREAMFromFD(0); Tempstr=STREAMReadLine(Tempstr,S); StripTrailingWhitespace(Tempstr); SetVar(Ctx->Vars,"EncryptionKey",Tempstr); ptr=Tempstr; STREAMDisassociateFromFD(S); } //By now we must have an encryption key! if (! StrLen(ptr)) { write(1,"ERROR: No HMAC Key given!\n",27); exit(2); } } DestroyString(Tempstr); }
STREAM *STREAMOpenFile(const char *FilePath, int Flags) { int fd, Mode=FALSE; STREAM *Stream; struct stat myStat; Mode = Flags & ~(O_LOCK|O_TRUNC); if (strcmp(FilePath,"-")==0) { Stream=STREAMFromDualFD(0,1); Stream->Path=CopyStr(Stream->Path,FilePath); return(Stream); } fd=open(FilePath, Mode, 0600); if (fd==-1) return(NULL); if (Flags & O_LOCK) { if (flock(fd,LOCK_EX | LOCK_NB)==-1) { close(fd); return(NULL); } } // check for symlink naughtyness. Basically a malicious user can // try to guess the name of the file we are going to open in order // to get us to write somewhere other than intended. if (lstat(FilePath, &myStat) !=0) { close(fd); return(NULL); } if (S_ISLNK(myStat.st_mode)) { syslog(LOG_USER | LOG_WARNING, "STREAMOpenFile Opened symlink when trying to open %s. Possible DOS attack?",FilePath); close(fd); return(NULL); } if (Flags & O_TRUNC) ftruncate(fd,0); Stream=STREAMFromFD(fd); Stream->Path=CopyStr(Stream->Path,FilePath); STREAMSetTimeout(Stream,0); STREAMSetFlushType(Stream,FLUSH_FULL,0); return(Stream); }
STREAM *STREAMOpenUDP(int Port,int NonBlock) { int fd; STREAM *Stream; fd=OpenUDPSock(Port); if (fd <0) return(NULL); Stream=STREAMFromFD(fd); Stream->Path=FormatStr(Stream->Path,"udp::%d",Port); Stream->Type=STREAM_TYPE_UDP; return(Stream); }
TLogFile *LogFileGetEntry(const char *FileName) { ListNode *Node; TLogFile *LogFile=NULL; STREAM *S=NULL; if (! StrLen(FileName)) return(NULL); if (! LogFiles) LogFiles=ListCreate(); if (! LogFileDefaults) LogFileSetupDefaults(); Node=ListFindNamedItem(LogFiles,FileName); if (Node) LogFile=(TLogFile *) Node->Item; else { if (strcmp(FileName,"STDOUT")==0) S=STREAMFromFD(1); else if (strcmp(FileName,"STDERR")==0) S=STREAMFromFD(2); else if (strcmp(FileName,"SYSLOG")==0) S=STREAMCreate(); else { S=STREAMOpenFile(FileName,SF_CREAT | SF_APPEND | SF_WRONLY); } if (S) { LogFile=(TLogFile *) calloc(1,sizeof(TLogFile)); LogFile->Path=CopyStr(LogFile->Path,FileName); LogFile->LogFacility=LogFileDefaults->LogFacility; LogFile->Flags=LogFileDefaults->Flags; LogFile->MaxSize=LogFileDefaults->MaxSize; LogFile->S=S; if (strcmp(FileName,"SYSLOG")==0) LogFile->Flags |= LOGFILE_SYSLOG; ListAddNamedItem(LogFiles,FileName,LogFile); STREAMSetItem(S,"TLogFile",LogFile); } } return(LogFile); }
int ConnectManagerAddServer(int sock, char *Name, CONNECT_FUNC OnConnect, ONDATA_FUNC OnData) { TConnectManagerItem *Item; if (! ConnectManServers) ConnectManServers=ListCreate(); if (sock==-1) return(FALSE); Item=(TConnectManagerItem *) calloc(1,sizeof(TConnectManagerItem)); Item->OnConnect=OnConnect; Item->OnData=OnData; Item->Data=(void *) STREAMFromFD(sock); Item->Name=CopyStr(Item->Name,Name); ListAddItem(ConnectManServers,Item); return(TRUE); }
int OAuthConnectBack(OAUTH *Ctx, int sock) { int result; char *Tempstr=NULL, *Token=NULL; const char *ptr, *tptr; STREAM *S; result=IPServerAccept(sock, NULL); if (result > -1) { S=STREAMFromFD(result); Tempstr=STREAMReadLine(Tempstr, S); if (Tempstr) { //GET (or possibly POST) ptr=GetToken(Tempstr,"\\S", &Token,0); //URL ptr=GetToken(ptr,"\\S", &Token,0); if (ptr) { tptr=strchr(Token, '?'); if (tptr) tptr++; else tptr=Token; OAuthParseReply(Ctx, "application/x-www-form-urlencoded", tptr); } while (Tempstr) { StripTrailingWhitespace(Tempstr); if (StrLen(Tempstr) ==0) break; Tempstr=STREAMReadLine(Tempstr, S); } } Tempstr=MCopyStr(Tempstr, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n",GetVar(Ctx->Vars,"connect_back_page"),NULL); STREAMWriteLine(Tempstr, S); STREAMClose(S); } DestroyString(Tempstr); DestroyString(Token); if (result > -1) return(TRUE); return(FALSE); }
main(int argc, char *argv[]) { STREAM *S, *Out; ListNode *Vars; char *Path=NULL, *Tempstr=NULL, *ptr; int bytes_read, bytes_total, val, result; S=STREAMOpenFile(argv[1],O_RDONLY); Out=STREAMFromFD(1); Vars=ListCreate(); while (TarReadHeader(S, Vars)) { Path=CopyStr(Path,GetVar(Vars,"Path")); printf("PATH: %s %s %s\n",Path,GetVar(Vars,"Size"),GetVar(Vars,"Type")); if (StrLen(Path)) { ptr=GetVar(Vars,"Type"); if (ptr && (strcmp(ptr,"file")==0)) { bytes_read=0; bytes_total=atoi(GetVar(Vars,"Size")); Tempstr=SetStrLen(Tempstr,BUFSIZ); while (bytes_read < bytes_total) { val=bytes_total - bytes_read; if (val > BUFSIZ) val=BUFSIZ; if ((val % 512)==0) result=val; else result=((val / 512) + 1) * 512; result=STREAMReadBytes(S,Tempstr,result); if (result > val) result=val; printf("READ: %d\n",val); fflush(NULL); if (Out) STREAMWriteBytes(Out,Tempstr,result); bytes_read+=result; } } } ListClear(Vars,DestroyString); } ListDestroy(Vars,DestroyString); DestroyString(Tempstr); DestroyString(Path); }
int OAuthListen(OAUTH *Ctx, int Port, const char *URL, int Flags) { int netfd, result; STREAM *S; char *Tempstr=NULL; fd_set fds; FD_ZERO(&fds); if (Port > 0) { netfd=IPServerInit(SOCK_STREAM, "127.0.0.1", Port); if (netfd==-1) return(FALSE); } FD_SET(netfd, &fds); if (Flags & OAUTH_STDIN) FD_SET(0, &fds); result=select(netfd+1, &fds, NULL, NULL, NULL); if (result > 0) { if (FD_ISSET(netfd, &fds)) OAuthConnectBack(Ctx, netfd); else if (FD_ISSET(0, &fds)) { S=STREAMFromFD(0); STREAMSetTimeout(S,0); Tempstr=STREAMReadLine(Tempstr, S); if ( (strncmp(Tempstr, "http:", 5)==0) || (strncmp(Tempstr, "https:", 6)==0) ) OAuthParseReply(Ctx, "application/x-www-form-urlencoded", Tempstr); else { StripTrailingWhitespace(Tempstr); Ctx->VerifyCode=HTTPQuote(Ctx->VerifyCode, Tempstr); SetVar(Ctx->Vars, "code", Ctx->VerifyCode); } STREAMDestroy(S); } OAuthFinalize(Ctx, URL); } DestroyString(Tempstr); close(netfd); return(TRUE); }
int ProxyControlConnect(TSession *Session, char *Host, int Port) { char *Tempstr=NULL; int fd, result=FALSE; if (StrLen(Host)==0) { SendLoggedLine(Session,"421 ERROR: Proxy cannot connect. No destination host."); } else { Tempstr=IPCRequest(Tempstr, Session, "GetIP", Host); if (strcmp(Tempstr,"DENIED")==0) { Tempstr=FormatStr(Tempstr,"421 ERROR: Proxy connection denied for host %s:%d",Host,Port); SendLoggedLine(Session,Tempstr); } else { fd=ConnectToHost(Tempstr,Port,FALSE); if (fd==-1) { Tempstr=FormatStr(Tempstr,"421 ERROR: Proxy cannot connect to host %s:%d",Host,Port); SendLoggedLine(Session,Tempstr); } else { Session->ProxySock=STREAMFromFD(fd); result=TRUE; do { Tempstr=STREAMReadLine(Tempstr,Session->ProxySock); STREAMWriteLine(Tempstr,Session->ClientSock); } while ( (Tempstr[3]=='-') || (isspace(Tempstr[0])) ); STREAMFlush(Session->ClientSock); } } } DestroyString(Tempstr); return(result); }
void *MatchesLoad(int Flags) { char *Line=NULL, *Tempstr=NULL, *Type=NULL, *ptr; TFingerprint *FP; STREAM *S; int count=0; S=STREAMFromFD(0); STREAMSetTimeout(S,100); Line=STREAMReadLine(Line,S); if (! StrValid(Line)) return(NULL); if (strncasecmp(Line,"<?xml ",6)==0) { //xml document. Must be an OpenIOC fileq while (Line) { StripTrailingWhitespace(Line); Tempstr=CatStr(Tempstr,Line); Line=STREAMReadLine(Line,S); } count=LoadFromIOC(Tempstr,Flags); } else { while (Line) { StripTrailingWhitespace(Line); FP=TFingerprintParse(Line); if (MatchAdd(FP, "", Flags)) count++; Line=STREAMReadLine(Line, S); } } if (Flags & FLAG_MEMCACHED) printf("Stored %d hashes in memcached server\n", count); DestroyString(Tempstr); DestroyString(Line); DestroyString(Type); return(Tree); }
void CommandLineHandleUpdate(int argc, char *argv[], int i, HashratCtx *Ctx) { char *Token=NULL, *ptr; Flags |= FLAG_UPDATE; strcpy(argv[i],""); i++; ptr=GetToken(argv[i],",",&Token,0); while (ptr) { if (strcasecmp(Token, "stderr")==0) Ctx->Aux=STREAMFromFD(2); else if (strcasecmp(Token, "xattr")==0) Ctx->Flags |= CTX_STORE_XATTR; else if (strcasecmp(Token, "txattr")==0) Ctx->Flags |= CTX_STORE_XATTR | CTX_XATTR_ROOT; else if (strcasecmp(Token, "memcached")==0) Ctx->Flags |= CTX_STORE_MEMCACHED; else if (strcasecmp(Token, "mcd")==0) Ctx->Flags |= CTX_STORE_MEMCACHED; else if (! Ctx->Aux) Ctx->Aux=STREAMOpenFile(Token,SF_WRONLY | SF_CREAT | SF_TRUNC); ptr=GetToken(ptr,",",&Token,0); } strcpy(argv[i],""); DestroyString(Token); }
STREAM *STREAMSpawnCommand(const char *Command, const char *User, const char *Group, int Flags) { int to_fd, from_fd; pid_t pid; STREAM *S=NULL; char *Tempstr=NULL; if (Flags & SPAWN_TRUST_COMMAND) Tempstr=CopyStr(Tempstr,Command); else Tempstr=MakeShellSafeString(Tempstr, Command, 0); if (Flags & COMMS_BY_PTY) { pid=PseudoTTYSpawn(&to_fd,Tempstr,User,Group,Flags); if (pid > 0) S=STREAMFromFD(to_fd); } else { if (Flags & COMMS_COMBINE_STDERR) { pid=PipeSpawn(&to_fd, &from_fd, COMMS_COMBINE_STDERR, Tempstr,User,Group); } else pid=PipeSpawn(&to_fd, &from_fd, NULL, Tempstr,User,Group); if (pid > 0) S=STREAMFromDualFD(from_fd, to_fd); } if (S) { STREAMSetFlushType(S,FLUSH_LINE,0,0); Tempstr=FormatStr(Tempstr,"%d",pid); STREAMSetValue(S,"PeerPID",Tempstr); } DestroyString(Tempstr); return(S); }
//this is the main parsing function that goes through the command-line args HashratCtx *CommandLineParseArgs(int argc,char *argv[]) { int i=0; char *ptr, *Tempstr=NULL; HashratCtx *Ctx; int ParseFlags=0; //You never know when you're going to be run with no args at all (say, out of inetd) //Setup default context Ctx=(HashratCtx *) calloc(1,sizeof(HashratCtx)); Ctx->Action=ACT_HASH; Ctx->ListPath=CopyStr(Ctx->ListPath,"-"); if (argc < 1) { Ctx->Action=ACT_PRINTUSAGE; return(Ctx); } Ctx->Vars=ListCreate(); Ctx->Out=STREAMFromFD(1); SetVar(Ctx->Vars,"HashType","md5"); //argv[0] might be full path to the program, or just its name ptr=strrchr(argv[0],'/'); if (! ptr) ptr=argv[0]; else ptr++; //if the program name is something other than 'hashrat', then we're being used as a drop-in //replacement for another program. Change flags/behavior accordingly if (strcmp(ptr,"md5sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "md5",Ctx->Vars); if ( (strcmp(ptr,"sha1sum")==0) || (strcmp(ptr,"shasum")==0) ) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "sha1",Ctx->Vars); if (strcmp(ptr,"sha256sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "sha256",Ctx->Vars); if (strcmp(ptr,"sha512sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "sha512",Ctx->Vars); if (strcmp(ptr,"whirlpoolsum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "whirlpool",Ctx->Vars); if (strcmp(ptr,"jh224sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "jh-224",Ctx->Vars); if (strcmp(ptr,"jh256sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "jh-256",Ctx->Vars); if (strcmp(ptr,"jh384sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "jh-385",Ctx->Vars); if (strcmp(ptr,"jh512sum")==0) ParseFlags |= CommandLineHandleArg(0, argv, i, 0, FLAG_TRAD_OUTPUT, "HashType", "jh-512",Ctx->Vars); if (strcmp(ptr,"hashrat.cgi")==0) { Ctx->Action=ACT_CGI; return(Ctx); } //here we got through the command-line args, and set things up whenever we find one that we //recognize. We blank the args we use so that any 'unrecognized' ones still left after this //process can be treated as filenames for hashing for (i=1; i < argc; i++) { if ( (strcmp(argv[i],"-V")==0) || (strcmp(argv[i],"--version")==0) || (strcmp(argv[i],"-version")==0) ) { printf("version: %s\n",VERSION); return(NULL); } else if ( (strcmp(argv[i],"--help")==0) || (strcmp(argv[i],"-help")==0) || (strcmp(argv[i],"-?")==0) ) { Ctx->Action=ACT_PRINTUSAGE; return(Ctx); } else if (strcmp(argv[i],"-C")==0) { Ctx->Action = ACT_CHECK; CommandLineSetCtx(argc, argv, i, Ctx, CTX_RECURSE,0); } else if (strcmp(argv[i],"-Cf")==0) { Ctx->Action = ACT_CHECK; CommandLineSetCtx(argc, argv, i, Ctx, CTX_RECURSE,0); ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_OUTPUT_FAILS, "", "",Ctx->Vars); strcpy(argv[i],""); } else if (strcmp(argv[i],"-c")==0) { Ctx->Action = ACT_CHECK_LIST; strcpy(argv[i],""); } else if (strcmp(argv[i],"-cf")==0) { Ctx->Action = ACT_CHECK_LIST; ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_OUTPUT_FAILS, "", "",Ctx->Vars); } else if (strcmp(argv[i],"-s")==0) { Ctx->Action = ACT_SIGN; strcpy(argv[i],""); } else if (strcmp(argv[i],"-sign")==0) { Ctx->Action = ACT_SIGN; strcpy(argv[i],""); } else if (strcmp(argv[i],"-cs")==0) { Ctx->Action = ACT_CHECKSIGN; strcpy(argv[i],""); } else if (strcmp(argv[i],"-checksign")==0) { Ctx->Action = ACT_CHECKSIGN; strcpy(argv[i],""); } else if (strcmp(argv[i],"-m")==0) { Ctx->Action = ACT_FINDMATCHES; strcpy(argv[i],""); } else if (strcmp(argv[i],"-lm")==0) { Ctx->Action = ACT_LOADMATCHES; strcpy(argv[i],""); } else if (strcmp(argv[i],"-dups")==0) { Ctx->Action = ACT_FINDDUPLICATES; strcpy(argv[i],""); } else if (strcmp(argv[i],"-B")==0) { Ctx->Action = ACT_BACKUP; strcpy(argv[i],""); } else if (strcmp(argv[i],"-cB")==0) { Ctx->Action = ACT_CHECKBACKUP; strcpy(argv[i],""); } else if ((strcmp(argv[i],"-dir")==0) || (strcmp(argv[i],"-dirmode")==0)) { Ctx->Action = ACT_HASHDIR; Ctx->Flags |= CTX_RECURSE; strcpy(argv[i],""); } else if ((strcmp(argv[i],"-hook")==0) || (strcmp(argv[i],"-h")==0)) { strcpy(argv[i],""); i++; if ((i < argc) && StrLen(argv[i])) { DiffHook=CopyStr(DiffHook,argv[i]); strcpy(argv[i],""); } else { printf("ERROR: No hook function supplied to -h/-hook switch (are you looking for help? Try --help or -?)\n"); exit(1); } } else if (strcmp(argv[i],"-cgi")==0) { Ctx->Action = ACT_CGI; strcpy(argv[i],""); } else if (strcmp(argv[i],"-md5")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "md5",Ctx->Vars); else if (strcmp(argv[i],"-sha")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "sha1",Ctx->Vars); else if (strcmp(argv[i],"-sha1")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "sha1",Ctx->Vars); else if (strcmp(argv[i],"-sha256")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "sha256",Ctx->Vars); else if (strcmp(argv[i],"-sha512")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "sha512",Ctx->Vars); else if (strcmp(argv[i],"-whirl")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "whirlpool",Ctx->Vars); else if (strcmp(argv[i],"-whirlpool")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "whirlpool",Ctx->Vars); else if (strcmp(argv[i],"-jh-224")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-224",Ctx->Vars); else if (strcmp(argv[i],"-jh-256")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-256",Ctx->Vars); else if (strcmp(argv[i],"-jh-384")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-384",Ctx->Vars); else if (strcmp(argv[i],"-jh-512")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-512",Ctx->Vars); else if (strcmp(argv[i],"-jh224")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-224",Ctx->Vars); else if (strcmp(argv[i],"-jh256")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-256",Ctx->Vars); else if (strcmp(argv[i],"-jh384")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-384",Ctx->Vars); else if (strcmp(argv[i],"-jh512")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-512",Ctx->Vars); else if (strcmp(argv[i],"-jh")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "jh-512",Ctx->Vars); else if (strcmp(argv[i],"-type")==0) { strcpy(argv[i],""); i++; ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", argv[i],Ctx->Vars); } //else if (strcmp(argv[i],"-crc32")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, 0, "HashType", "crc32",Ctx->Vars); else if (strcmp(argv[i],"-8")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_OCTAL); else if (strcmp(argv[i],"-10")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_DECIMAL); else if (strcmp(argv[i],"-16")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_HEX); else if (strcmp(argv[i],"-H")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_HEXUPPER); else if (strcmp(argv[i],"-HEX")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_HEXUPPER); else if (strcmp(argv[i],"-64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_BASE64); else if (strcmp(argv[i],"-base64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_BASE64); else if (strcmp(argv[i],"-i64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_IBASE64); else if (strcmp(argv[i],"-p64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_PBASE64); else if (strcmp(argv[i],"-x64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_XXENC); else if (strcmp(argv[i],"-u64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_UUENC); else if (strcmp(argv[i],"-g64")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_CRYPT); else if (strcmp(argv[i],"-a85")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_ASCII85); else if (strcmp(argv[i],"-z85")==0) CommandLineSetCtx(argc, argv, i, Ctx, 0, ENCODE_Z85); else if (strcmp(argv[i],"-d")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_DEREFERENCE,0); else if (strcmp(argv[i],"-X")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_EXES,0); else if (strcmp(argv[i],"-exe")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_EXES,0); else if (strcmp(argv[i],"-r")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_RECURSE,0); else if (strcmp(argv[i],"-fs")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_ONE_FS,0); else if (strcmp(argv[i],"-n")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_ARG_NAMEVALUE, 0, "Output:Length", "",Ctx->Vars); else if (strcmp(argv[i],"-hmac")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_ARG_NAMEVALUE, FLAG_HMAC, "EncryptionKey", "",Ctx->Vars); else if (strcmp(argv[i],"-idfile")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_ARG_NAMEVALUE, 0, "SshIdFile", "",Ctx->Vars); else if (strcmp(argv[i],"-f")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_FROM_LISTFILE, 0, "", "",Ctx->Vars); else if (strcmp(argv[i],"-i")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_INCLUDE,0); else if (strcmp(argv[i],"-x")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_EXCLUDE,0); else if (strcmp(argv[i],"-devmode")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_DEVMODE, "", "",Ctx->Vars); else if (strcmp(argv[i],"-lines")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_LINEMODE, "", "",Ctx->Vars); else if (strcmp(argv[i],"-rawlines")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_RAW|FLAG_LINEMODE, "", "",Ctx->Vars); else if (strcmp(argv[i],"-hide-input")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_HIDE_INPUT, "", "",Ctx->Vars); else if (strcmp(argv[i],"-star-input")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_STAR_INPUT, "", "",Ctx->Vars); else if (strcmp(argv[i],"-rl")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_RAW|FLAG_LINEMODE, "", "",Ctx->Vars); else if (strcmp(argv[i],"-xattr")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_XATTR, 0, "", "",Ctx->Vars); else if (strcmp(argv[i],"-txattr")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_TXATTR, 0, "", "",Ctx->Vars); else if (strcmp(argv[i],"-cache")==0) CommandLineSetCtx(argc, argv, i, Ctx, CTX_XATTR_CACHE,0); else if (strcmp(argv[i],"-strict")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_FULLCHECK, "", "",Ctx->Vars); else if (strcmp(argv[i],"-color")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_COLOR, "", "",Ctx->Vars); else if (strcmp(argv[i],"-S")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_FULLCHECK, "", "",Ctx->Vars); else if (strcmp(argv[i],"-net")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_NET, "", "",Ctx->Vars); else if (strcmp(argv[i],"-memcached")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_ARG_NAMEVALUE|CMDLINE_MEMCACHED, 0, "Memcached:Server", "",Ctx->Vars); else if (strcmp(argv[i],"-mcd")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, CMDLINE_ARG_NAMEVALUE| CMDLINE_MEMCACHED, 0, "Memcached:Server", "",Ctx->Vars); else if (strcmp(argv[i],"-xsel")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_XSELECT, "", "",Ctx->Vars); else if (strcmp(argv[i],"-v")==0) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_VERBOSE, "", "",Ctx->Vars); else if ( (strcmp(argv[i],"-t")==0) || (strcmp(argv[i],"-trad")==0) ) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_TRAD_OUTPUT, "", "",Ctx->Vars); else if ( (strcmp(argv[i],"-bsd")==0) || (strcmp(argv[i],"-tag")==0) || (strcmp(argv[i],"--tag")==0) ) ParseFlags |= CommandLineHandleArg(argc, argv, i, 0, FLAG_BSD_OUTPUT, "", "",Ctx->Vars); else if (strcmp(argv[i],"-u")==0) CommandLineHandleUpdate(argc, argv, i, Ctx); else if (strcmp(argv[i],"-attrs")==0) { strcpy(argv[i],""); i++; if ((i < argc) && StrLen(argv[i])) { SetupXAttrList(argv[i]); strcpy(argv[i],""); } else printf("ERROR: No list of attribute names given to -attrs argument\n"); } } //The rest of this function finalizes setup based on what we parsed over all the command line //if we're reading from a list file, then... if ((ParseFlags & CMDLINE_FROM_LISTFILE)) { //... set appropriate action type if (Ctx->Action==ACT_HASH) Ctx->Action=ACT_HASH_LISTFILE; //find list file name on command line (will still be untouched as it wasn't //recognized as a flag in the above processing for (i=1; i < argc; i++) { if (StrLen(argv[i])) { Ctx->ListPath=CopyStr(Ctx->ListPath, argv[i]); strcpy(argv[i],""); break; } } } //if -hmac set, then upgrade hash type to the hmac version if (Flags & FLAG_HMAC) { Ctx->HashType=MCopyStr(Ctx->HashType,"hmac-",GetVar(Ctx->Vars,"HashType"),NULL); HMACSetup(Ctx); } else Ctx->HashType=CopyStr(Ctx->HashType,GetVar(Ctx->Vars,"HashType")); switch (Ctx->Action) { case ACT_CHECK: case ACT_CHECK_LIST: if (ParseFlags & CMDLINE_XATTR) Ctx->Action=ACT_CHECK_XATTR; if (ParseFlags & CMDLINE_MEMCACHED) Ctx->Action=ACT_CHECK_MEMCACHED; break; case ACT_HASH: case ACT_HASH_LISTFILE: if (ParseFlags & CMDLINE_XATTR) Ctx->Flags |= CTX_STORE_XATTR; if (ParseFlags & CMDLINE_TXATTR) Ctx->Flags |= CTX_STORE_XATTR | CTX_XATTR_ROOT; if (ParseFlags & CMDLINE_MEMCACHED) Ctx->Flags |= CTX_STORE_MEMCACHED; break; case ACT_FINDMATCHES: if (ParseFlags & CMDLINE_MEMCACHED) Ctx->Action=ACT_FINDMATCHES_MEMCACHED; break; } if (Ctx->Encoding==0) Ctx->Encoding=ENCODE_HEX; //if no path given, then force to '-' for 'standard in' ptr=GetVar(Ctx->Vars,"Path"); if (! StrLen(ptr)) SetVar(Ctx->Vars,"Path","-"); DestroyString(Tempstr); return(Ctx); }
int InternalCopyFile(TTransferContext *Ctx, TFileInfo *iSrcFI) { STREAM *Src=NULL, *Dest=NULL; TFileInfo *SrcFI=NULL, *DestFI=NULL; char *Buffer=NULL, *Tempstr=NULL, *ptr; int BuffSize=4096; int result, bytes=0, towrite=0; unsigned int TotalBytes=0, BytesSent=0, percent=0, secs=0, val; double bigval; //TFileInfo *FI; int RetVal=TRANSFER_OKAY; struct timeval StartTime, Now; TProcessingModule *CompressionMod=NULL; if (! Ctx->SrcFS->ReadBytes) return(ERR_READ_NOTSUPPORTED); if (Ctx->DestFS && (! Ctx->DestFS->WriteBytes)) return(ERR_WRITE_NOTSUPPORTED); gettimeofday(&StartTime,NULL); if (Ctx->DestFS && Ctx->DestFS->BuffSize) BuffSize=Ctx->DestFS->BuffSize; Buffer=SetStrLen(Buffer,BuffSize*2+1); SrcFI=FileInfoClone(iSrcFI); DestFI=FileInfoClone(iSrcFI); DestFI->Path=FileStoreFormatPath(DestFI->Path, Ctx->DestFS, iSrcFI->Name); //if a PreCopyHook script is specified, then run it if (StrLen(Ctx->PreCopyHook)) { Tempstr=FormatStr(Tempstr,"%s '%s' '%s' '%s'",Ctx->PreCopyHook,DestFI->Name,DestFI->Path,""); system(Tempstr); } Src=InternalCopyOpenSource(Ctx, SrcFI); TotalBytes=SrcFI->Size; if (Ctx->CmdFlags & FLAG_CMD_RESUME) BytesSent=SrcFI->ResumePoint; if (Src) { if (Ctx->SrcFS->Settings & FS_COMPRESSION) CompressionMod=ActivateCompression(Ctx->DestFS,Ctx->SrcFS); if (Ctx->DestFS) Dest=InternalCopyOpenDest(Ctx, SrcFI, DestFI); else Dest=STREAMFromFD(1); if (Dest) { result=Ctx->SrcFS->ReadBytes(Ctx->SrcFS,Src,Buffer,BuffSize*2); while ((bytes > 0) || (result != EOF)) { if (CompressionMod) result=HandleCompression(CompressionMod,Buffer,result); if (result > 0) bytes+=result; if (bytes > BuffSize) towrite=BuffSize; else towrite=bytes; if (Ctx->DestFS) result=Ctx->DestFS->WriteBytes(Ctx->DestFS,Dest,Buffer,towrite); else result=STREAMWriteBytes(Dest,Buffer,towrite); if (result==-1) { RetVal=ERR_INTERRUPTED; break; } if (Settings.Flags & FLAG_INTERRUPT) { Settings.Flags &= ~FLAG_INTERRUPT; RetVal=ERR_CANCEL; break; } BytesSent+=result; bytes-=result; if (bytes > 0) memmove(Buffer,Buffer+result,bytes); gettimeofday(&Now,NULL); val=Now.tv_sec - StartTime.tv_sec; if (val > secs) { secs=val; if (secs > 0) DisplayTransferStatus(SrcFI->Name,BytesSent,TotalBytes,&percent,secs,Ctx->CmdFlags,Ctx->Throttle); } result=Ctx->SrcFS->ReadBytes(Ctx->SrcFS,Src,Buffer+bytes,BuffSize*2 -bytes); } if (Ctx->SrcFS->CloseFile) Ctx->SrcFS->CloseFile(Ctx->SrcFS,Src); if (Ctx->DestFS && Ctx->DestFS->CloseFile) { result=Ctx->DestFS->CloseFile(Ctx->DestFS,Dest); if (result !=TRUE) { //Handle Errors returned by Close file if (RetVal >= FALSE) RetVal=result; SetVar(Ctx->Vars,"Error",GetVar(Ctx->DestFS->Vars,"Error")); SetVar(Ctx->DestFS->Vars,"Error",""); } else ListAddNamedItem(Ctx->DestFS->DirListing,DestFI->Name,FileInfoClone(DestFI)); } else STREAMFlush(Dest); if ((TotalBytes > 0) && (BytesSent < TotalBytes)) RetVal=ERR_INTERRUPTED; } else RetVal=ERR_DESTFILE; secs=Now.tv_sec - StartTime.tv_sec; if (secs < 1) secs=1; DisplayTransferStatus(SrcFI->Name,BytesSent,TotalBytes,&percent,secs,0,0); //if (! (CmdFlags & FLAG_QUIET)) printf("\n"); } else RetVal=ERR_SOURCEFILE; Ctx->TotalBytes+=BytesSent; FileInfoDestroy(DestFI); FileInfoDestroy(SrcFI); DestroyString(Buffer); DestroyString(Tempstr); return(RetVal); }
void RunTelnetSession(TSession *Session) { STREAM *Local, *S; char *Tempstr=NULL; int result, fd; ListNode *Streams; struct passwd *pwent; struct group *grent; struct timeval tv; time_t Duration, Start, Now, LastActivity; time(&Start); LastActivity=Start; Streams=ListCreate(); ListAddItem(Streams,Session->S); //if '-real-user' was specified on the command-line, then this overrides //anything read from password files if (Settings.Flags & FLAG_FORCE_REALUSER) { Session->RealUser=CopyStr(Session->RealUser,Settings.RealUser); } //Get User Details before we chroot! if (StrLen(Session->RealUser)) { pwent=getpwnam(Session->RealUser); if (! pwent) { syslog(Settings.InfoLogLevel,"Failed to lookup RealUser '%s' for user '%s'",Session->RealUser,Session->User); exit(1); } Session->RealUserUID=pwent->pw_uid; Session->GroupID=pwent->pw_gid; } //if '-shell' was specified on the command-line, then this overrides //anything read from password files if (Settings.Flags & FLAG_FORCE_SHELL) { Session->Shell=CopyStr(Session->Shell,Settings.RealUser); } if (Settings.Flags & FLAG_DYNHOME) { Session->HomeDir=SessionSubstituteVars(Session->HomeDir,Settings.DynamicHomeDir,Session); Session->HomeDir=SlashTerminateDirectoryPath(Session->HomeDir); MakeDirPath(Session->HomeDir,0777); } //CD to the user's home directory if (StrLen(Session->HomeDir)) { chdir(Session->HomeDir); } DoBindMounts(Settings.BindMounts,0); //This login script allows setting up any aspects of the environment before we launch the shell. For instance it //might be used to copy files into the chroot environment before chrooting if (StrLen(Settings.LoginScript)) system(Settings.LoginScript); //LAUNCH THE SHELL FUNCTION!!! This launches the program that the telnet user is 'speaking' to. //If chhome is active, then it will be chrooted into the user's home directory PseudoTTYSpawnFunction(&fd, LaunchPtyFunc, Session, TTYFLAG_CANON | TTYFLAG_ECHO | TTYFLAG_CRLF | TTYFLAG_LFCR | TTYFLAG_IGNSIG); Local=STREAMFromFD(fd); STREAMSetTimeout(Local,0); //Might as well chroot on this side of the pipe too, unless we have a 'LogoutScript' //Logout scripts exist to allow copying stuff back out of the chroot when the session is //finished. We can't do this if we chroot this side as well as the 'shell' side if ( (! StrLen(Settings.LogoutScript)) && (Settings.Flags & FLAG_CHHOME) ) chroot("."); //DON'T SWITCH USER. NEED root TO UNBIND MOUNTS //if (setreuid(Session->RealUserUID,Session->RealUserUID) !=0) exit(1); ListAddItem(Streams,Local); Tempstr=SetStrLen(Tempstr,4096); while (1) { if (Settings.IdleTimeout) tv.tv_sec=Settings.IdleTimeout; else tv.tv_sec=3600 * 24; S=STREAMSelect(Streams,&tv); time(&Now); if (S) { if (S==Session->S) { result=TelnetReadBytes(Session->S, Tempstr, 4096, TNRB_NONBLOCK); if (result ==-1) break; STREAMWriteBytes(Local,Tempstr,result); } else { result=STREAMReadBytes(Local,Tempstr,4096); if (result < 0) break; STREAMWriteBytes(Session->S,Tempstr,result); if (result < 0) break; } if (Settings.Flags & FLAG_WINSIZE) SetWindowSize(Session->S->out_fd); LastActivity=Now; } if ((Settings.IdleTimeout > 0) && ((Now - LastActivity) > Settings.IdleTimeout)) break; } if (StrLen(Settings.LogoutScript)) system(Settings.LogoutScript); if (Settings.Flags & FLAG_UNMOUNT) UndoBindMounts(Settings.BindMounts, 0); if (Settings.Flags & FLAG_DYNHOME) rmdir(Session->HomeDir); Duration=time(NULL) - Start; syslog(Settings.InfoLogLevel,"%s@%s logged out after %d secs",Session->User,Session->ClientIP, Duration); STREAMClose(Session->S); STREAMClose(Local); DestroyString(Tempstr); }
void ConnectManagerMainLoop() { TConnectManagerItem *Item, *NewItem; ListNode *Curr, *Prev; int highfd=0; fd_set ReadSet, WriteSet; int sock, result, SelectResult, NextTimerFire; STREAM *S; time_t Now; struct timeval tv; int MoreData=FALSE; while (1) { MoreData=FALSE; time(&Now); NextTimerFire=60; Curr=ListGetNext(Timers); while (Curr) { Item=(TConnectManagerItem *) Curr->Item; if (Item->LastTimerFire==0) Item->LastTimerFire=Now; result=(Item->LastTimerFire + Item->TimerVal) - Now; if (result < NextTimerFire) NextTimerFire=result; Curr=ListGetNext(Curr); } FD_ZERO(&ReadSet); FD_ZERO(&WriteSet); Curr=ListGetNext(ConnectManServers); while (Curr) { Item=(TConnectManagerItem *) Curr->Item; S=(STREAM *) Item->Data; FD_SET(S->in_fd,&ReadSet); if (S->in_fd > highfd) highfd=S->in_fd; Curr=ListGetNext(Curr); } Curr=ListGetNext(ConnectManClients); while (Curr) { Item=(TConnectManagerItem *) Curr->Item; S=(STREAM *) Item->Data; if (! S) { ListDeleteNode(Curr); continue; } if (S->State & SS_CONNECTING) { FD_SET(S->in_fd,&WriteSet); } if (S->InEnd > S->InStart) MoreData=TRUE; else { //always add to read set FD_SET(S->in_fd,&ReadSet); if (S->in_fd > highfd) highfd=S->in_fd; } Curr=ListGetNext(Curr); } if (MoreData) { tv.tv_usec = 10; tv.tv_sec = 0; SelectResult=0; } else { //SELECT!!! tv.tv_usec = 20000; tv.tv_sec = NextTimerFire; } SelectResult=select(highfd+1,&ReadSet,&WriteSet,NULL,&tv); if (SelectResult > 0) { Curr=ListGetNext(ConnectManServers); while (Curr) { Item=(TConnectManagerItem *) Curr->Item; S=(STREAM *) Item->Data; if (! S) { ListDeleteNode(Curr); continue; } if (FD_ISSET(S->in_fd,&ReadSet)) { sock=TCPServerSockAccept(S->in_fd,&S->Path); if (sock > -1) { S=STREAMFromFD(sock); STREAMSetFlushType(S,FLUSH_LINE,0,0); NewItem=ConnectManagerAddIncoming(S,Item->Name, Item->OnData); if (Item->OnConnect) Item->OnConnect(NewItem); } } Curr=ListGetNext(Curr); } } Curr=ListGetNext(ConnectManClients); while (Curr) { Item=(TConnectManagerItem *) Curr->Item; S=(STREAM *) Item->Data; if (! S) { ListDeleteNode(Curr); continue; } if ((SelectResult > 0) && FD_ISSET(S->in_fd,&WriteSet)) { if (S->State & SS_CONNECTING) { if (STREAMIsConnected(S)) { STREAMSetFlags(S, 0, SF_NONBLOCK); if (Item->OnConnect) Item->OnConnect(Item); } } } if ( (S->InEnd > S->InStart) || ((SelectResult > 0) && (FD_ISSET(S->in_fd,&ReadSet))) ) { if (! (S->State & SS_CONNECTING)) { if (Item->OnData) { result=Item->OnData(S, Item->Name); if (! result) { STREAMClose(S); Prev=ListGetPrev(Curr); ListDeleteNode(Curr); free(Item); Curr=Prev; } else if (result==RECONNECT) { STREAMClose(S); S=STREAMCreate(); STREAMConnectToHost(S,Item->Host,Item->Port,CONNECT_NONBLOCK); Item->Data=(void *) S; } } } } Curr=ListGetNext(Curr); } time(&Now); Curr=ListGetNext(Timers); while (Curr) { Item=(TConnectManagerItem *) Curr->Item; if ( (Now - Item->LastTimerFire) >= Item->TimerVal ) { if (Item->OnData) ((ONTIMER_FUNC)Item->OnData)(Item->Data,Item->Name); Item->LastTimerFire=Now; } Curr=ListGetNext(Curr); } } }
main(int argc, char *argv[]) { ListNode *Curr, *Next; int OverrideType=TYPE_NONE; char *Tempstr=NULL; int result; //HTTPSetFlags(HTTP_NOCOMPRESS); StdIn=STREAMFromFD(0); STREAMSetTimeout(StdIn,0); ParseEnvironmentVariables(); DownloadQueue=ListCreate(); Tempstr=MCopyStr(Tempstr,"Movgrab ",Version,NULL); HTTPSetUserAgent(Tempstr); FormatPreference=CopyStr(FormatPreference,"mp4,flv,webm,m4v,mov,mpg,mpeg,wmv,avi,3gp,reference,mp3,m4a,wma,m3u8,m3u8-stream"); AddOutputFile("", TRUE); ParseCommandLine(argc, argv, DownloadQueue, &OverrideType); CheckSettings(); if (StrLen(Proxy)) { if (! SetGlobalConnectionChain(Proxy)) { printf("ERROR: Failed to set proxy settings to '%s'\n",Proxy); exit(1); } } if (Flags & FLAG_PRINT_USAGE) PrintUsage(); else if (Flags & FLAG_PRINT_VERSION) PrintVersion(); else if (! (Flags & FLAG_STDIN)) { if (ListSize(DownloadQueue)==0) PrintUsage(); } while (1) { if ((Flags & FLAG_STDIN) && (ListSize(DownloadQueue)==0) ) { Tempstr=STREAMReadLine(Tempstr,StdIn); StripTrailingWhitespace(Tempstr); ListAddItem(DownloadQueue,CopyStr(NULL,Tempstr)); } Curr=ListGetNext(DownloadQueue); while (Curr) { if (Flags & FLAG_TEST_SITES) { fprintf(stderr,"Checking %-20s ",Curr->Tag); fflush(NULL); } result=GrabMovie((char *) Curr->Item,OverrideType); Next=ListGetNext(Curr); //must do this after grab movie //incase more items added while grabbing if (Flags & FLAG_TEST_SITES) { if (result) fprintf(stderr," okay\n"); else fprintf(stderr," BROKEN\n"); } ListDeleteNode(Curr); Curr=Next; } if (Flags & FLAG_TEST_SITES) break; if (! (Flags & FLAG_STDIN)) break; } }