ID3v2_AttachedPictureFrame::ID3v2_AttachedPictureFrame(const SjByteVector &data, ID3v2_FrameHeader *h) : ID3v2_Frame(h) { m_textEncoding = SJ_LATIN1; m_type = ID3v2_Other; parseFields(fieldData(data)); }
void Controller::parseData(const QString& data) { parseGo(data); parseFields(data); parseGameResult(data); parseErrorInfo(data); }
static struct reglist_t const *parseRegisterSpec(char const *regname) { char const c = *regname ; if(isalpha(c) || ('_' == c)){ fprintf(stderr, "No support for named registers (yet)\n" ); } else if(isdigit(c)){ char *end ; unsigned long address = strtoul(regname,&end,16); if( (0 == *end) || (':' == *end) ){ struct fieldDescription_t *fields = 0 ; if( ':' == *end ){ fields = parseFields(0,end+1); if( !fields ) return 0 ; } struct reglist_t *out = new struct reglist_t ; out->address = address ; out->reg = 0 ; out->fields = fields ; out->next = 0 ; return out ; } else { fprintf( stderr, "Invalid register name or value '%s'. Use name or 0xHEX\n", regname ); } } else { fprintf( stderr, "Invalid register name or value '%s'. Use name or 0xHEX\n", regname ); } return 0 ; }
void ID3v2_Frame::parse(const SjByteVector &data) { if(m_header) m_header->setData(data); else m_header = new ID3v2_FrameHeader(data); parseFields(fieldData(data)); }
std::unique_ptr<Info> emitInfo(const RecordDecl *D, const FullComment *FC, int LineNumber, llvm::StringRef File, bool PublicOnly) { if (PublicOnly && !isPublic(D->getAccess(), D->getLinkageInternal())) return nullptr; auto I = llvm::make_unique<RecordInfo>(); populateSymbolInfo(*I, D, FC, LineNumber, File); I->TagType = D->getTagKind(); parseFields(*I, D, PublicOnly); if (const auto *C = dyn_cast<CXXRecordDecl>(D)) parseBases(*I, C); return std::unique_ptr<Info>{std::move(I)}; }
static void parseAnn(struct gff3File *g3f, char *line) /* parse an annotation line */ { // extra column to check for too many char *words[gffNumCols+1]; int numWords = chopString(line, "\t", words, gffNumCols+1); if (numWords != gffNumCols) gff3FileErr(g3f, "expected %d tab-separated columns: %s", gffNumCols, line); struct gff3Ann *g3a = gff3FileAlloc(g3f, sizeof(struct gff3Ann)); g3a->file = g3f; g3a->lineNum = g3f->lf->lineIx; parseFields(g3a, words); parseAttrs(g3a, words[8]); parseStdAttrs(g3a); slAddHead(&g3f->anns, g3a); }
void CMainWindow::on_cmdAdd_clicked() { // Input-Dialog zusammenbasteln QInputDialog *inDlg = new QInputDialog(this); inDlg->setOkButtonText("Platz suchen"); inDlg->setCancelButtonText("Suche abbrechen"); inDlg->setLabelText("Bitte geben Sie den oder die ICAO-Codes\ndes gesuchten Platzes ein\n(Mehrere ICAO-Codes durch Leerzeichen, Komma, Semikolon\noder Minus getrennt):"); // anzeigen und auswerten if(inDlg->exec() == QInputDialog::Accepted) { QString icao; icao = inDlg->textValue().toUpper(); QList<QString*> *lFields = parseFields(icao); mnet->getNewAirfields(lFields); } // Aufräumen delete inDlg; }
int main(int argc,const char **argv) { int first = 1,last = -1; char *fields = NULL; char *delim = (char*)"\t"; const char **args; int res = ca_parse(argc,argv,0,"f=s* d=s",&fields,&delim); if(res < 0) { printe("Invalid arguments: %s",ca_error(res)); usage(argv[0]); } if(ca_hasHelp()) usage(argv[0]); parseFields(fields,&first,&last); args = ca_getFree(); if(args[0] == NULL) handleFile(stdin,delim,first,last); else { FILE *f; while(*args) { if(isdir(*args)) { printe("'%s' is a directory!",*args); continue; } f = fopen(*args,"r"); if(!f) { printe("Unable to open '%s'",*args); continue; } handleFile(f,delim,first,last); fclose(f); args++; } } return EXIT_SUCCESS; }
void InertialParser::findMatchingResponse(InertialPacket& packet) { //attempt to get the pointer from the weak_ptr std::shared_ptr<ResponseCollector> collector(m_responseCollector.lock()); //if we got the shared_ptr if(collector) { //parse out the fields InertialDataFields fields = parseFields(packet); //if the response collector is waiting for any responses if(collector->waitingForResponse()) { //check each field in the packet for(InertialDataField field : fields) { //try to match the expected response in the response collector collector->matchExpected(field); } } } }
// . parse an incoming request // . return false and set g_errno on error // . CAUTION: we destroy "req" by replacing it's last char with a \0 // . last char must be \n or \r for it to be a proper request anyway bool HttpRequest::set ( char *origReq , long origReqLen , TcpSocket *sock ) { // reset number of cgi field terms reset(); if ( ! m_reqBuf.reserve ( origReqLen + 1 ) ) { log("http: failed to copy request: %s",mstrerror(g_errno)); return false; } // copy it to avoid mangling it m_reqBuf.safeMemcpy ( origReq , origReqLen ); // NULL term m_reqBuf.pushChar('\0'); m_reqBufValid = true; // and point to that char *req = m_reqBuf.getBufStart(); long reqLen = m_reqBuf.length() - 1; // save this m_userIP = 0; if ( sock ) m_userIP = sock->m_ip; m_isSSL = 0; if ( sock ) m_isSSL = (bool)sock->m_ssl; // TcpServer should always give us a NULL terminated request if ( req[reqLen] != '\0' ) { char *xx = NULL; *xx = 0; } // how long is the first line, the primary request long i; // for ( i = 0 ; i<reqLen && i<MAX_REQ_LEN && // req[i]!='\n' && req[i]!='\r'; i++); // . now fill up m_buf, used to log the request // . make sure the url was encoded correctly // . we don't want assholes encoding every char so we can't see what // url they are submitting to be spidered/indexed // . also, don't de-code encoded ' ' '+' '?' '=' '&' because that would // change the meaning of the url // . and finally, non-ascii chars that don't display correctly // . this should NULL terminate m_buf, too // . turn this off for now, just try to log a different way // m_bufLen = urlNormCode ( m_buf , MAX_REQ_LEN - 1 , req , i ); // ensure it's big enough to be a valid request if ( reqLen < 5 ) { log("http: got reqlen<5 = %s",req); g_errno = EBADREQUEST; return false; } // or if first line too long //if ( i >= 1024 ) { g_errno = EBADREQUEST; return false; } // get the type, must be GET or HEAD if ( strncmp ( req , "GET " , 4 ) == 0 ) m_requestType = 0; // these means a compressed reply was requested. use by query // compression proxies. else if ( strncmp ( req , "ZET " , 4 ) == 0 ) m_requestType = 0; else if ( strncmp ( req , "HEAD " , 5 ) == 0 ) m_requestType = 1; else if ( strncmp ( req , "POST " , 5 ) == 0 ) m_requestType = 2; else { log("http: got bad request cmd: %s",req); g_errno = EBADREQUEST; return false; } // . NULL terminate the request (a destructive operation!) // . this removes the last \n in the trailing \r\n // . shit, but it f***s up POST requests if ( m_requestType != 2 ) { req [ reqLen - 1 ] = '\0'; reqLen--; } // POST requests can be absolutely huge if you are injecting a 100MB // file, so limit our strstrs to the end of the mime char *d = NULL; char dc; // check for body if it was a POST request if ( m_requestType == 2 ) { d = strstr ( req , "\r\n\r\n" ); if ( d ) { dc = *d; *d = '\0'; } else log("http: Got POST request without \\r\\n\\r\\n."); } // . point to the file path // . skip over the "GET " long filenameStart = 4 ; // skip over extra char if it's a "HEAD " request if ( m_requestType == 1 || m_requestType == 2 ) filenameStart++; // are we a redirect? i = filenameStart; m_redirLen = 0; if ( strncmp ( &req[i] , "/?redir=" , 8 ) == 0 ) { for ( long k = i+8; k<reqLen && m_redirLen<126 ; k++) { if ( req[k] == '\r' ) break; if ( req[k] == '\n' ) break; if ( req[k] == '\t' ) break; if ( req[k] == ' ' ) break; m_redir[m_redirLen++] = req[k]; } } m_redir[m_redirLen] = '\0'; // find a \n space \r or ? that delimits the filename for ( i = filenameStart ; i < reqLen ; i++ ) { if ( is_wspace_a ( req [ i ] ) ) break; if ( req [ i ] == '?' ) break; } // now calc the filename length m_filenameLen = i - filenameStart; // return false and set g_errno if it's 0 if ( m_filenameLen <= 0 ) { log("http: got filenameLen<=0: %s",req); g_errno = EBADREQUEST; return false; } // . bitch if too big // . leave room for strcatting "index.html" below if ( m_filenameLen >= MAX_HTTP_FILENAME_LEN - 10 ) { log("http: got filenameLen>=max"); g_errno = EBADREQUEST; return false; } // . decode the filename into m_filename and reassign it's length // . decode %2F to / , etc... m_filenameLen = urlDecode(m_filename,req+filenameStart,m_filenameLen); // NULL terminate m_filename m_filename [ m_filenameLen ] = '\0'; // does it have a file extension AFTER the last / in the filename? bool hasExtension = false; for ( long j = m_filenameLen-1 ; j >= 0 ; j-- ) { if ( m_filename[j] == '.' ) { hasExtension = true; break; } if ( m_filename[j] == '/' ) break; } // if it has no file extension append a /index.html if ( ! hasExtension && m_filename [ m_filenameLen - 1 ] == '/' ) { strcat ( m_filename , "index.html" ); m_filenameLen = gbstrlen ( m_filename ); } // set file offset/size defaults m_fileOffset = 0; // -1 means ALL the file from m_fileOffset onwards m_fileSize = -1; // "e" points to where the range actually starts, if any //char *e; // . TODO: speed up by doing one strstr for Range: and maybe range: // . do they have a Range: 0-100\n in the mime denoting a partial get? //char *s = strstr ( req ,"Range:bytes=" ); //e = s + 12; // try alternate formats //if ( ! s ) { s = strstr ( req ,"Range: bytes=" ); e = s + 13; } //if ( ! s ) { s = strstr ( req ,"Range: " ); e = s + 7; } // parse out the range if we got one //if ( s ) { // long x = 0; // sscanf ( e ,"%li-%li" , &m_fileOffset , &x ); // // get all file if range's 2nd number is non-existant // if ( x == 0 ) m_fileSize = -1; // else m_fileSize = x - m_fileOffset; // // ensure legitimacy // if ( m_fileOffset < 0 ) m_fileOffset = 0; //} // reset our hostname m_hostLen = 0; // assume request is NOT from local network //m_isAdmin = false; m_isLocal = false; // get the virtual hostname they want to use char *s = strstr ( req ,"Host:" ); // try alternate formats if ( ! s ) s = strstr ( req , "host:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) !='\n' ) s = NULL; // parse out the host if we got one if ( s ) { // skip field name, host: s += 5; // skip e to beginning of the host name after "host:" while ( *s==' ' || *s=='\t' ) s++; // find end of the host name char *end = s; while ( *end && !is_wspace_a(*end) ) end++; // . now *end should be \0, \n, \r, ' ', ... // . get host len m_hostLen = end - s; // truncate if too big if ( m_hostLen >= 255 ) m_hostLen = 254; // copy into hostname memcpy ( m_host , s , m_hostLen ); } // NULL terminate it m_host [ m_hostLen ] = '\0'; // get Referer: field s = strstr ( req ,"Referer:" ); // find another if ( ! s ) s = strstr ( req ,"referer:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) !='\n' ) s = NULL; // assume no referer m_refLen = 0; // parse out the referer if we got one if ( s ) { // skip field name, referer: s += 8; // skip e to beginning of the host name after ':' while ( *s==' ' || *s=='\t' ) s++; // find end of the host name char *end = s; while ( *end && !is_wspace_a(*end) ) end++; // . now *end should be \0, \n, \r, ' ', ... // . get len m_refLen = end - s; // truncate if too big if ( m_refLen >= 255 ) m_refLen = 254; // copy into m_ref memcpy ( m_ref , s , m_refLen ); } // NULL terminate it m_ref [ m_refLen ] = '\0'; // get User-Agent: field s = strstr ( req ,"User-Agent:" ); // find another if ( ! s ) s = strstr ( req ,"user-agent:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) !='\n' ) s = NULL; // assume empty long len = 0; // parse out the referer if we got one if ( s ) { // skip field name, referer: s += 11; // skip e to beginning of the host name after ':' while ( *s==' ' || *s=='\t' ) s++; // find end of the agent name char *end = s; while ( *end && *end!='\n' && *end!='\r' ) end++; // . now *end should be \0, \n, \r, ' ', ... // . get agent len len = end - s; // truncate if too big if ( len > 127 ) len = 127; // copy into m_userAgent memcpy ( m_userAgent , s , len ); } // NULL terminate it m_userAgent [ len ] = '\0'; m_isMSIE = false; if ( strstr ( m_userAgent , "MSIE" ) ) m_isMSIE = true; // get Cookie: field s = strstr ( req, "Cookie:" ); // find another if ( !s ) s = strstr ( req, "cookie:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) != '\n' ) s = NULL; // assume empty // m_cookieBufLen = 0; m_cookiePtr = s; // parse out the cookie if we got one if ( s ) { // skip field name, Cookie: s += 7; // skip s to beginning of cookie after ':' while ( *s == ' ' || *s == '\t' ) s++; // find end of the cookie char *end = s; while ( *end && *end != '\n' && *end != '\r' ) end++; // save length m_cookieLen = end - m_cookiePtr; // get cookie len //m_cookieBufLen = end - s; // trunc if too big //if (m_cookieBufLen > 1023) m_cookieBufLen = 1023; // copy into m_cookieBuf //memcpy(m_cookieBuf, s, m_cookieBufLen); } // NULL terminate it if ( m_cookiePtr ) m_cookiePtr[m_cookieLen] = '\0'; //m_cookieBuf[m_cookieBufLen] = '\0'; // convert every '&' in cookie to a \0 for parsing the fields // for ( long j = 0 ; j < m_cookieBufLen ; j++ ) // if ( m_cookieBuf[j] == '&' ) m_cookieBuf[j] = '\0'; // mark it as cgi if it has a ? bool isCgi = ( req [ i ] == '?' ) ; // reset m_filename length to exclude the ?* stuff if ( isCgi ) { // skip over the '?' i++; // find a space the delmits end of cgi long j; for ( j = i; j < reqLen; j++) if (is_wspace_a(req[j])) break; // now add it if ( ! addCgi ( &req[i] , j-i ) ) return false; // update i i = j; } // . set path ptrs // . the whole /cgi/14.cgi?coll=xxx&..... thang m_path = req + filenameStart; m_plen = i - filenameStart; // we're local if hostname is 192.168.[0|1].y //if ( strncmp(iptoa(sock->m_ip),"192.168.1.",10) == 0) { // m_isAdmin = true; m_isLocal = true; } //if ( strncmp(iptoa(sock->m_ip),"192.168.0.",10) == 0) { // m_isAdmin = true; m_isLocal = true; } //if(strncmp(iptoa(sock->m_ip),"192.168.1.",10) == 0) m_isLocal = true; //if(strncmp(iptoa(sock->m_ip),"192.168.0.",10) == 0) m_isLocal = true; if ( sock && strncmp(iptoa(sock->m_ip),"192.168.",8) == 0) m_isLocal = true; if ( sock && strncmp(iptoa(sock->m_ip),"10.",3) == 0) m_isLocal = true; // steve cook's comcast at home: // if ( sock && strncmp(iptoa(sock->m_ip),"68.35.100.143",13) == 0) // m_isLocal = true; // procog's ip // if ( sock && strncmp(iptoa(sock->m_ip),"216.168.36.21",13) == 0) // m_isLocal = true; // roadrunner ip // if ( sock && strncmp(iptoa(sock->m_ip),"66.162.42.131",13) == 0) // m_isLocal = true; // cnsp ip //if ( sock && strncmp(iptoa(sock->m_ip),"67.130.216.27",13) == 0) // m_isLocal = true; // emily parker //if ( sock && strncmp(iptoa(sock->m_ip),"69.92.68.202",12) == 0) //m_isLocal = true; // 127.0.0.1 if ( sock && sock->m_ip == 16777343 ) m_isLocal = true; // steve cook's webserver //if ( sock && strncmp(iptoa(sock->m_ip),"216.168.36.21",13) == 0) // m_isLocal = true; // . also if we're coming from lenny at my house consider it local // . this is a security risk, however... TODO: FIX!!! //if ( sock->m_ip == atoip ("68.35.105.199" , 13 ) ) m_isAdmin = true; // . TODO: now add any cgi data from a POST..... // . look after the mime //char *d = NULL; // check for body if it was a POST request //if ( m_requestType == 2 ) d = strstr ( req , "\r\n\r\n" ); // now put d's char back, just in case... does it really matter? if ( d ) *d = dc; // return true now if no cgi stuff to parse if ( d ) { char *post = d + 4; long postLen = reqLen-(d+4-req) ; // post sometimes has a \r or\n after it while ( postLen > 0 && post[postLen-1]=='\r' ) postLen--; // add it to m_cgiBuf, filter and everything if ( ! addCgi ( post , postLen ) ) return false; } // sometimes i don't want to be admin //if ( getLong ( "admin" , 1 ) == 0 ) m_isAdmin = false; // success ///// // Handle Extra parms... char *ep = g_conf.m_extraParms; char *epend = g_conf.m_extraParms + g_conf.m_extraParmsLen; char *qstr = m_cgiBuf; long qlen = m_cgiBufLen; while (ep < epend){ char buf[AUTOBAN_TEXT_SIZE]; long bufLen = 0; // get next substring while (*ep && ep < epend && *ep != ' ' && *ep != '\n'){ buf[bufLen++] = *ep++; } // skip whitespace while (*ep && ep < epend && *ep == ' '){ ep++; } // null terminate buf[bufLen] = '\0'; // No match if (!bufLen || !strnstr(qstr, qlen, buf)){ // skip to end of line while (*ep && ep < epend && *ep != '\n') ep++; // skip newline while (*ep && ep < epend && *ep == '\n') ep++; // try next substr continue; } // found a match... // get parm string bufLen = 0; while (*ep && ep < epend && *ep != '\n'){ buf[bufLen++] = *ep++; } buf[bufLen] = '\0'; // skip newline while (*ep && ep < epend && *ep == '\n') ep++; logf(LOG_DEBUG, "query: appending \"%s\" to query", buf); long newSize = m_cgiBuf2Size + bufLen+1; char *newBuf = (char*)mmalloc(newSize, "extraParms"); if (!newBuf){ return log("query: unable to allocate %ld bytes " "for extraParms", newSize); } char *p = newBuf; if (m_cgiBuf2Size) { memcpy(newBuf, m_cgiBuf2, m_cgiBuf2Size); p += m_cgiBuf2Size-1; mfree(m_cgiBuf2, m_cgiBuf2Size, "extraParms"); m_cgiBuf2 = NULL; m_cgiBuf2Size = 0; } memcpy(p, buf, bufLen); m_cgiBuf2 = newBuf; m_cgiBuf2Size = newSize; p += bufLen; *p = '\0'; } // Put '\0' back into the HttpRequest buffer... if (m_cgiBuf){ // do not mangle the "ucontent"! long cgiBufLen = m_cgiBufLen; cgiBufLen -= m_ucontentLen; char *buf = m_cgiBuf; for (long i = 0; i < cgiBufLen ; i++) if (buf[i] == '&') buf[i] = '\0'; // don't decode the ucontent= field! long decodeLen = m_cgiBufLen; // so subtract that if ( m_ucontent ) decodeLen -= m_ucontentLen; // decode everything long len = urlDecode ( m_cgiBuf , m_cgiBuf , decodeLen ); // we're parsing crap after the null if the last parm // has no value //memset(m_cgiBuf+len, '\0', m_cgiBufLen-len); m_cgiBufLen = len; // ensure that is null i guess if ( ! m_ucontent ) m_cgiBuf[len] = '\0'; } if (m_cgiBuf2){ char *buf = m_cgiBuf2; for (long i = 0; i < m_cgiBuf2Size-1 ; i++) if (buf[i] == '&') buf[i] = '\0'; long len = urlDecode ( m_cgiBuf2 , m_cgiBuf2 , m_cgiBuf2Size); memset(m_cgiBuf2+len, '\0', m_cgiBuf2Size-len); } // . parse the fields after the ? in a cgi filename // . or fields in the content if it's a POST // . m_cgiBuf must be and is NULL terminated for this parseFields ( m_cgiBuf , m_cgiBufLen ); // Add extra parms to the request. if (m_cgiBuf2Size){ parseFields(m_cgiBuf2, m_cgiBuf2Size); } // urldecode the cookie buf too!! if ( m_cookiePtr ) { char *p = m_cookiePtr; for (long i = 0; i < m_cookieLen ; i++) { //if (p[i] == '&') p[i] = '\0'; // cookies are separated with ';' in the request only if (p[i] == ';') p[i] = '\0'; // a hack for the metacookie=.... // which uses &'s to separate its subcookies // this is a hack for msie's limit of 50 cookies if ( p[i] == '&' ) p[i] = '\0'; // set m_metaCookie to start of meta cookie if ( p[i] == 'm' && p[i+1] == 'e' && strncmp(p,"metacookie",10) == 0 ) m_metaCookie = p; } long len = urlDecode ( m_cookiePtr , m_cookiePtr, m_cookieLen ); // we're parsing crap after the null if the last parm // has no value memset(m_cookiePtr+len, '\0', m_cookieLen-len); m_cookieLen = len; } return true; }
void generator::generate(string classname, membersVector mv) { cout << "Start generating for template: " << m_templatePath << endl; membersMap mmap; for (membersVector::iterator p = mv.begin(); p != mv.end(); ++p) { string type = p->second; string name = p->first; mmap[name] = type; } stringstream inStream; ifstream templateFile(m_templatePath); if (templateFile.is_open()) { string line; while ( getline (templateFile, line) ) { inStream << line << endl; } templateFile.close(); } string result = inStream.str(); //Установка имени класса size_t pos; while ( (pos = result.find(cCNTemplate)) != std::string::npos) { result.replace(pos, cCNTemplate.size(), classname); } parseFields(result, mmap); cout << "----------- found members" << endl; for (membersMap::iterator p = mmap.begin(); p != mmap.end(); ++p) std::cout << p->first << " => " << p->second << '\n'; cout << "-----------" << endl; //Генерация полей stringstream fieldString; fieldString << endl; for (membersMap::iterator p = mmap.begin(); p != mmap.end(); ++p) { fieldString << "\t" << p->second << " m_" << p->first << ";" << endl; } fieldString << "\t"; replaceBetween(cPFBounds, fieldString.str(), result); //Генерация акксессоров stringstream accString; for (membersMap::iterator p = mmap.begin(); p != mmap.end(); ++p) { string type = p->second; string name = p->first; accString << endl; //генерация геттера accString << "\t" << "const " << type << " get_" << name << "(){" << endl << "\t\t" << "return m_" << name << ";" << endl << "\t}" << endl; //генерация сеттера accString << "\tvoid set_" << name << "(" << type << " val){" << endl << "\t\tm_" << name << " = val;" << endl << "\t}" << endl; } accString << "\t"; replaceBetween(cPMBounds, accString.str(), result); //cout << "Result: " << endl << result << endl; if (!m_dryRun) { ofstream ofile (m_resultPath); cout << "Writing to file " << m_resultPath << endl; if (ofile.is_open()) { ofile << result; ofile.close(); } } }
/* Main dissector routine to be invoked for a DIS PDU. */ static gint dissect_dis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_item *dis_tree = 0; proto_item *dis_node = 0; proto_item *dis_header_tree = 0; proto_item *dis_header_node = 0; proto_item *dis_payload_tree = 0; proto_item *dis_payload_node = 0; gint offset = 0; const gchar *pduString = 0; DIS_ParserNode *pduParser = 0; /* DIS packets must be at least 12 bytes long. DIS uses port 3000, by * default, but the Cisco Redundant Link Management protocol can also use * that port; RLM packets are 8 bytes long, so we use this to distinguish * between them. */ if (tvb_reported_length(tvb) < 12) { return 0; } /* Reset the global PDU type variable -- this will be parsed as part of * the DIS header. */ pduType = DIS_PDUTYPE_OTHER; protocolFamily = DIS_PROTOCOLFAMILY_OTHER; persistentObjectPduType = DIS_PERSISTENT_OBJECT_TYPE_OTHER; /* set the protocol column */ col_set_str(pinfo->cinfo, COL_PROTOCOL, dis_proto_name_short); /* Add the top-level DIS node under which the rest of the fields will be * displayed. */ dis_node = proto_tree_add_protocol_format(tree, proto_dis, tvb, offset, -1, "Distributed Interactive Simulation"); dis_tree = proto_item_add_subtree(dis_node, ett_dis); /* Add a node to contain the DIS header fields. */ dis_header_node = proto_tree_add_text(dis_tree, tvb, offset, -1, "Header"); dis_header_tree = proto_item_add_subtree(dis_header_node, ett_dis_header); offset = parseFields(tvb, dis_header_tree, offset, DIS_FIELDS_PDU_HEADER); proto_item_set_end(dis_header_node, tvb, offset); /* Locate the string name for the PDU type enumeration, * or default to "Unknown". */ pduString = val_to_str(pduType, DIS_PDU_Type_Strings, "Unknown"); /* Locate the appropriate PDU parser, if type is known. */ switch (protocolFamily) { case DIS_PROTOCOLFAMILY_PERSISTENT_OBJECT: { proto_item *dis_po_header_tree = 0; proto_item *dis_po_header_node = 0; dis_po_header_node = proto_tree_add_text (dis_header_tree, tvb, offset, -1, "PO Header"); dis_po_header_tree = proto_item_add_subtree (dis_po_header_node, ett_dis_po_header); offset = parseFields (tvb, dis_po_header_tree, offset, DIS_FIELDS_PERSISTENT_OBJECT_HEADER); proto_item_set_end(dis_po_header_node, tvb, offset); /* Locate the appropriate PO PDU parser, if type is known. */ switch (persistentObjectPduType) { case DIS_PERSISTENT_OBJECT_TYPE_SIMULATOR_PRESENT: pduParser = DIS_PARSER_SIMULATOR_PRESENT_PO_PDU; break; case DIS_PERSISTENT_OBJECT_TYPE_DESCRIBE_OBJECT: pduParser = DIS_PARSER_DESCRIBE_OBJECT_PO_PDU; break; case DIS_PERSISTENT_OBJECT_TYPE_OBJECTS_PRESENT: pduParser = DIS_PARSER_OBJECTS_PRESENT_PO_PDU; break; case DIS_PERSISTENT_OBJECT_TYPE_OBJECT_REQUEST: pduParser = DIS_PARSER_OBJECT_REQUEST_PO_PDU; break; case DIS_PERSISTENT_OBJECT_TYPE_DELETE_OBJECTS: pduParser = DIS_PARSER_DELETE_OBJECTS_PO_PDU; break; case DIS_PERSISTENT_OBJECT_TYPE_SET_WORLD_STATE: pduParser = DIS_PARSER_SET_WORLD_STATE_PO_PDU; break; case DIS_PERSISTENT_OBJECT_TYPE_NOMINATION: pduParser = DIS_PARSER_NOMINATION_PO_PDU; break; default: pduParser = 0; break; } /* Locate the string name for the PO PDU type enumeration, * or default to "Unknown". */ pduString = val_to_str (persistentObjectPduType, DIS_PDU_PersistentObjectType_Strings, "Unknown"); /* Add a node to contain the DIS PDU fields. */ dis_payload_node = proto_tree_add_text(dis_tree, tvb, offset, -1, "%s PO PDU", pduString); } break; default: /* Add a node to contain the DIS PDU fields. */ dis_payload_node = proto_tree_add_text(dis_tree, tvb, offset, -1, "%s PDU", pduString); switch (pduType) { /* DIS Entity Information / Interaction PDUs */ case DIS_PDUTYPE_ENTITY_STATE: pduParser = DIS_PARSER_ENTITY_STATE_PDU; break; /* DIS Distributed Emission Regeneration PDUs */ case DIS_PDUTYPE_ELECTROMAGNETIC_EMISSION: pduParser = DIS_PARSER_ELECTROMAGNETIC_EMISSION_PDU; break; /* DIS Radio Communications protocol (RCP) family PDUs */ case DIS_PDUTYPE_TRANSMITTER: pduParser = DIS_PARSER_TRANSMITTER_PDU; break; case DIS_PDUTYPE_SIGNAL: pduParser = DIS_PARSER_SIGNAL_PDU; break; /* DIS Warfare PDUs */ case DIS_PDUTYPE_FIRE: pduParser = DIS_PARSER_FIRE_PDU; break; case DIS_PDUTYPE_DETONATION: if ( disProtocolVersion < DIS_VERSION_IEEE_1278_1_200X ) { pduParser = DIS_PARSER_DETONATION_PDU; } else { /* TODO: Version 7 changed the Detonation PDU format * Need a different parser */ pduParser = DIS_PARSER_DETONATION_PDU; } break; /* DIS Simulation Management PDUs */ case DIS_PDUTYPE_START_RESUME: pduParser = DIS_PARSER_START_RESUME_PDU; break; case DIS_PDUTYPE_STOP_FREEZE: pduParser = DIS_PARSER_STOP_FREEZE_PDU; break; case DIS_PDUTYPE_ACKNOWLEDGE: pduParser = DIS_PARSER_ACKNOWLEDGE_PDU; break; case DIS_PDUTYPE_ACTION_REQUEST: pduParser = DIS_PARSER_ACTION_REQUEST_PDU; break; case DIS_PDUTYPE_ACTION_RESPONSE: pduParser = DIS_PARSER_ACTION_RESPONSE_PDU; break; case DIS_PDUTYPE_DATA: case DIS_PDUTYPE_SET_DATA: pduParser = DIS_PARSER_DATA_PDU; break; case DIS_PDUTYPE_DATA_QUERY: pduParser = DIS_PARSER_DATA_QUERY_PDU; break; case DIS_PDUTYPE_COMMENT: pduParser = DIS_PARSER_COMMENT_PDU; break; case DIS_PDUTYPE_CREATE_ENTITY: case DIS_PDUTYPE_REMOVE_ENTITY: pduParser = DIS_PARSER_SIMAN_ENTITY_PDU; break; /* DIS Simulation Management with Reliability PDUs */ case DIS_PDUTYPE_START_RESUME_R: pduParser = DIS_PARSER_START_RESUME_R_PDU; break; case DIS_PDUTYPE_STOP_FREEZE_R: pduParser = DIS_PARSER_STOP_FREEZE_R_PDU; break; case DIS_PDUTYPE_ACKNOWLEDGE_R: pduParser = DIS_PARSER_ACKNOWLEDGE_PDU; break; case DIS_PDUTYPE_ACTION_REQUEST_R: pduParser = DIS_PARSER_ACTION_REQUEST_R_PDU; break; case DIS_PDUTYPE_ACTION_RESPONSE_R: pduParser = DIS_PARSER_ACTION_RESPONSE_PDU; break; case DIS_PDUTYPE_DATA_R: case DIS_PDUTYPE_SET_DATA_R: pduParser = DIS_PARSER_DATA_R_PDU; break; case DIS_PDUTYPE_DATA_QUERY_R: pduParser = DIS_PARSER_DATA_QUERY_R_PDU; break; case DIS_PDUTYPE_COMMENT_R: pduParser = DIS_PARSER_COMMENT_PDU; break; case DIS_PDUTYPE_CREATE_ENTITY_R: case DIS_PDUTYPE_REMOVE_ENTITY_R: pduParser = DIS_PARSER_SIMAN_ENTITY_R_PDU; break; /* DIS Experimental V-DIS PDUs */ case DIS_PDUTYPE_APPLICATION_CONTROL: pduParser = DIS_PARSER_APPLICATION_CONTROL_PDU; break; default: pduParser = 0; break; } break; } /* If a parser was located, invoke it on the data packet. */ if (pduParser != 0) { dis_payload_tree = proto_item_add_subtree(dis_payload_node, ett_dis_payload); offset = parseFields(tvb, dis_payload_tree, offset, pduParser); proto_item_set_end(dis_payload_node, tvb, offset); } /* Add detail to the INFO column */ switch (pduType) { /* DIS Entity Information / Interaction PDUs */ case DIS_PDUTYPE_ENTITY_STATE: col_add_fstr( pinfo->cinfo, COL_INFO, "PDUType: %s, %s, %s", pduString, val_to_str(entityKind, DIS_PDU_EntityKind_Strings, "Unknown Entity Kind"), val_to_str(entityDomain, DIS_PDU_Domain_Strings, "Unknown Entity Domain") ); break; case DIS_PDUTYPE_SIGNAL: col_add_fstr( pinfo->cinfo, COL_INFO, "PDUType: %s, RadioID=%u, Encoding Type=%s, Number of Samples=%u", pduString, radioID, val_to_str(DIS_ENCODING_TYPE(encodingScheme), DIS_PDU_Encoding_Type_Strings, "Unknown Encoding Type"), numSamples ); break; case DIS_PDUTYPE_TRANSMITTER: col_add_fstr( pinfo->cinfo, COL_INFO, "PDUType: %s, RadioID=%u, Transmit State=%s", pduString, radioID, val_to_str(disRadioTransmitState, DIS_PDU_RadioTransmitState_Strings, "Unknown Transmit State") ); break; default: /* set the basic info column (pdu type) */ col_add_fstr( pinfo->cinfo, COL_INFO, "PDUType: %s", pduString); break; } return tvb_length(tvb); }
ID3v2_TextIdentificationFrame::ID3v2_TextIdentificationFrame(const SjByteVector &data, ID3v2_FrameHeader *h) : ID3v2_Frame(h) { m_textEncoding = SJ_LATIN1; parseFields(fieldData(data)); }
ID3v2_UniqueFileIdentifierFrame::ID3v2_UniqueFileIdentifierFrame(const SjByteVector &data, ID3v2_FrameHeader *h) : ID3v2_Frame(h) { parseFields(fieldData(data)); }
ID3v2_UnknownFrame::ID3v2_UnknownFrame(const SjByteVector &data, ID3v2_FrameHeader *h) : ID3v2_Frame(h) { parseFields(fieldData(data)); }
/* * appSetup(argc, argv); * * Perform all the setup for this application include setting up * required modules, parsing options, etc. This function should be * passed the same arguments that were passed into main(). * * Returns to the caller if all setup succeeds. If anything fails, * this function will cause the application to exit with a FAILURE * exit status. */ static void appSetup( int argc, char **argv) { SILK_FEATURES_DEFINE_STRUCT(features); unsigned int optctx_flags; int rv; /* verify same number of options and help strings */ assert((sizeof(appHelp)/sizeof(char *)) == (sizeof(appOptions)/sizeof(struct option))); /* register the application */ skAppRegister(argv[0]); skAppVerifyFeatures(&features, NULL); skOptionsSetUsageCallback(&appUsageLong); /* initialize globals */ memset(&ab_options, 0, sizeof(sk_aggbag_options_t)); ab_options.existing_silk_files = 1; ab_options.argc = argc; ab_options.argv = argv; optctx_flags = (SK_OPTIONS_CTX_INPUT_SILK_FLOW | SK_OPTIONS_CTX_ALLOW_STDIN | SK_OPTIONS_CTX_XARGS | SK_OPTIONS_CTX_COPY_INPUT | SK_OPTIONS_CTX_PRINT_FILENAMES); /* register the options */ if (skOptionsCtxCreate(&optctx, optctx_flags) || skOptionsCtxOptionsRegister(optctx) || skOptionsRegister(appOptions, &appOptionsHandler, NULL) || skAggBagOptionsRegister(&ab_options) || skIPv6PolicyOptionsRegister(&ipv6_policy) || sksiteOptionsRegister(SK_SITE_FLAG_CONFIG_FILE)) { skAppPrintErr("Unable to register options"); exit(EXIT_FAILURE); } /* register the teardown handler */ if (atexit(appTeardown) < 0) { skAppPrintErr("Unable to register appTeardown() with atexit()"); exit(EXIT_FAILURE); } /* parse options */ rv = skOptionsCtxOptionsParse(optctx, argc, argv); if (rv < 0) { skAppUsage(); /* never returns */ } /* try to load site config file; if it fails, we will not be able * to resolve flowtype and sensor from input file names, but we * should not consider it a complete failure */ sksiteConfigure(0); /* make sure the user specified at least one key field and one * counter field */ if (keys_arg == NULL || keys_arg[0] == '\0') { skAppPrintErr("The --%s switch is required", appOptions[OPT_KEYS].name); skAppUsage(); /* never returns */ } if (counters_arg == NULL || counters_arg[0] == '\0') { skAppPrintErr("The --%s switch is required", appOptions[OPT_COUNTERS].name); skAppUsage(); /* never returns */ } /* set up the key_name_map and counter_name_map */ if (createStringmaps()) { exit(EXIT_FAILURE); } /* create the aggregate bag */ if (skAggBagCreate(&ab)) { exit(EXIT_FAILURE); } skAggBagOptionsBind(ab, &ab_options); /* parse the --keys and --counters switches */ if (parseFields(key_name_map, keys_arg, OPT_KEYS)) { exit(EXIT_FAILURE); } if (parseFields(counter_name_map, counters_arg, OPT_COUNTERS)) { exit(EXIT_FAILURE); } /* create output stream to stdout if no --output-path was given */ if (NULL == output) { if ((rv = skStreamCreate(&output, SK_IO_WRITE, SK_CONTENT_SILK)) || (rv = skStreamBind(output, "-"))) { skStreamPrintLastErr(output, rv, &skAppPrintErr); skStreamDestroy(&output); exit(EXIT_FAILURE); } } /* make certain stdout is not being used for multiple outputs */ if (skStreamIsStdout(output) && skOptionsCtxCopyStreamIsStdout(optctx)) { skAppPrintErr("May not use stdout for multiple output streams"); exit(EXIT_FAILURE); } /* open the output stream but do not write anything yet */ rv = skStreamOpen(output); if (rv) { skStreamPrintLastErr(output, rv, &skAppPrintErr); skStreamDestroy(&output); exit(EXIT_FAILURE); } /* open the --copy-input stream */ if (skOptionsCtxOpenStreams(optctx, &skAppPrintErr)) { exit(EXIT_FAILURE); } return; /* OK */ }
ID3v2_CommentsFrame::ID3v2_CommentsFrame(const SjByteVector &data, ID3v2_FrameHeader *h) : ID3v2_Frame(h) { m_textEncoding = SJ_LATIN1; parseFields(fieldData(data)); }
// . parse an incoming request // . return false and set g_errno on error // . CAUTION: we destroy "req" by replacing it's last char with a \0 // . last char must be \n or \r for it to be a proper request anyway bool HttpRequest::set ( char *origReq , int32_t origReqLen , TcpSocket *sock ) { // reset number of cgi field terms reset(); if ( ! m_reqBuf.reserve ( origReqLen + 1 ) ) { log("http: failed to copy request: %s",mstrerror(g_errno)); return false; } // copy it to avoid mangling it m_reqBuf.safeMemcpy ( origReq , origReqLen ); // NULL term m_reqBuf.pushChar('\0'); m_reqBufValid = true; // and point to that char *req = m_reqBuf.getBufStart(); if( !req ) { log(LOG_ERROR, "http: req is NULL"); g_errno = EBADREQUEST; return false; } int32_t reqLen = m_reqBuf.length() - 1; // save this m_userIP = sock ? sock->m_ip : 0; m_isSSL = sock ? (sock->m_ssl!=NULL) : false; // TcpServer should always give us a NULL terminated request if ( req[reqLen] != '\0' ) { g_process.shutdownAbort(true); } // how long is the first line, the primary request // int32_t i; // for ( i = 0 ; i<reqLen && i<MAX_REQ_LEN && // req[i]!='\n' && req[i]!='\r'; i++); // . now fill up m_buf, used to log the request // . make sure the url was encoded correctly // . we don't want assholes encoding every char so we can't see what // url they are submitting to be spidered/indexed // . also, don't de-code encoded ' ' '+' '?' '=' '&' because that would // change the meaning of the url // . and finally, non-ascii chars that don't display correctly // . this should NULL terminate m_buf, too // . turn this off for now, just try to log a different way // m_bufLen = urlNormCode ( m_buf , MAX_REQ_LEN - 1 , req , i ); // ensure it's big enough to be a valid request if ( reqLen < 5 ) { log(LOG_WARN, "http: got reqlen %" PRId32"<5 = %s",reqLen,req); g_errno = EBADREQUEST; return false; } int32_t cmdLen = 0; // or if first line too long //if ( i >= 1024 ) { g_errno = EBADREQUEST; return false; } // get the type, must be GET or HEAD if ( strncmp ( req , "GET " , 4 ) == 0 ) { m_requestType = RT_GET; cmdLen = 3; } // these means a compressed reply was requested. use by query // compression proxies. else if ( strncmp ( req , "ZET " , 4 ) == 0 ) { m_requestType = RT_GET; cmdLen = 3; } else if ( strncmp ( req , "HEAD " , 5 ) == 0 ) { m_requestType = RT_HEAD; cmdLen = 4; } else if ( strncmp ( req , "POST " , 5 ) == 0 ) { m_requestType = RT_POST; cmdLen = 4; } else if ( strncmp ( req , "CONNECT " , 8 ) == 0 ) { // take this out until it stops losing descriptors and works //m_requestType = RT_CONNECT; //cmdLen = 7; // we no longer insert section info. emmanuel gets section // info when injecting a doc now i think in PageInject.cpp. // we do not proxy https requests because we can't // decrypt the page contents to cache them or to insert // the sectiondb voting markup, so it's kinda pointless... // and i'm not aiming to be a full-fledge squid proxy. log("http: CONNECT request not supported because we " "can't insert section markup and we can't cache: %s",req); g_errno = EBADREQUEST; return false; } else { log("http: got bad request cmd: %s",req); g_errno = EBADREQUEST; return false; } // . NULL terminate the request (a destructive operation!) // . this removes the last \n in the trailing \r\n // . shit, but it f***s up POST requests if ( m_requestType != RT_POST ) { req [ reqLen - 1 ] = '\0'; reqLen--; } // POST requests can be absolutely huge if you are injecting a 100MB // file, so limit our strstrs to the end of the mime char *d = NULL; char dc; // check for body if it was a POST request if ( m_requestType == RT_POST ) { d = strstr ( req , "\r\n\r\n" ); if ( d ) { dc = *d; *d = '\0'; } else log("http: Got POST request without \\r\\n\\r\\n."); } // is it a proxy request? m_isSquidProxyRequest = false; if ( strncmp ( req + cmdLen + 1, "http://" ,7) == 0 || strncmp ( req + cmdLen + 1, "https://",8) == 0 ) { m_isSquidProxyRequest = true; // set url parms for it m_squidProxiedUrl = req + cmdLen + 1; char *p = m_squidProxiedUrl + 7; if ( *p == '/' ) p++; // https:// ? // stop at whitespace or \0 for ( ; *p && ! is_wspace_a(*p) ; p++ ); // that's the length of it m_squidProxiedUrlLen = p - m_squidProxiedUrl; } else if ( m_requestType == RT_CONNECT ) { m_isSquidProxyRequest = true; // set url parms for it m_squidProxiedUrl = req + cmdLen + 1; // usually its like CONNECT diffbot.com:443 char *p = m_squidProxiedUrl; // stop at whitespace or \0 for ( ; *p && ! is_wspace_a(*p) ; p++ ); // that's the length of it m_squidProxiedUrlLen = p - m_squidProxiedUrl; } // check authentication char *auth = NULL; if ( m_isSquidProxyRequest && req ) auth = strstr(req,"Proxy-authorization: Basic "); //if ( m_isSquidProxyRequest && ! auth ) { // log("http: no auth in proxy request %s",req); // g_errno = EBADREQUEST; // return false; //} SafeBuf tmp; if ( auth ) { // find end of it char *p = auth; for ( ; *p && *p != '\r' && *p != '\n' ; p++ ); tmp.base64Decode ( auth , p - auth ); } // assume incorrect username/password bool matched = false; if ( m_isSquidProxyRequest ) { // now try to match in g_conf.m_proxyAuth safebuf of // username:password space-separated list char *p = g_conf.m_proxyAuth.getBufStart(); // loop over those for ( ; p && *p ; ) { // skip initial white space for ( ; *p && is_wspace_a(*p); p++ ); // skip to end of username:password thing char *end = p; for ( ; *end && !is_wspace_a(*end); end++); // save char *start = p; // advance p = end; // this is always a match if ( end-start == 3 && strncmp(start,"*:*",3) == 0 ) { matched = true; break; } // compare now if ( tmp.length() != end-start ) continue; if ( strncmp(tmp.getBufStart(),start,end-start) != 0 ) continue; // we got a match matched = true; break; } } // incorrect username:passwrod? if ( m_isSquidProxyRequest && ! matched ) { log("http: bad username:password in proxy request %s",req); g_errno = EPERMDENIED; return false; } // if proxy request to download a url through us, we are done if ( m_isSquidProxyRequest ) return true; bool multipart = false; if ( m_requestType == 2 ) { // is POST? char *cd ; cd = gb_strcasestr(req,"Content-Type: multipart/form-data"); if ( cd ) multipart = true; } // . point to the file path // . skip over the "GET " int32_t filenameStart = 4 ; // skip over extra char if it's a "HEAD " request if ( m_requestType == RT_HEAD || m_requestType == RT_POST ) filenameStart++; // are we a redirect? int32_t i = filenameStart; m_redirLen = 0; if ( strncmp ( &req[i] , "/?redir=" , 8 ) == 0 ) { for ( int32_t k = i+8; k<reqLen && m_redirLen<126 ; k++) { if ( req[k] == '\r' ) break; if ( req[k] == '\n' ) break; if ( req[k] == '\t' ) break; if ( req[k] == ' ' ) break; m_redir[m_redirLen++] = req[k]; } } m_redir[m_redirLen] = '\0'; // find a \n space \r or ? that delimits the filename for ( i = filenameStart ; i < reqLen ; i++ ) { if ( is_wspace_a ( req [ i ] ) ) break; if ( req [ i ] == '?' ) break; } // now calc the filename length m_filenameLen = i - filenameStart; // return false and set g_errno if it's 0 if ( m_filenameLen <= 0 ) { log("http: got filenameLen<=0: %s",req); g_errno = EBADREQUEST; return false; } // . bitch if too big // . leave room for strcatting "index.html" below if ( m_filenameLen >= MAX_HTTP_FILENAME_LEN - 10 ) { log("http: got filenameLen>=max"); g_errno = EBADREQUEST; return false; } // . decode the filename into m_filename and reassign it's length // . decode %2F to / , etc... m_filenameLen = urlDecode(m_filename,req+filenameStart,m_filenameLen); // NULL terminate m_filename m_filename [ m_filenameLen ] = '\0'; // does it have a file extension AFTER the last / in the filename? bool hasExtension = false; for ( int32_t j = m_filenameLen-1 ; j >= 0 ; j-- ) { if ( m_filename[j] == '.' ) { hasExtension = true; break; } if ( m_filename[j] == '/' ) break; } // if it has no file extension append a /index.html if ( ! hasExtension && m_filename [ m_filenameLen - 1 ] == '/' ) { strcat ( m_filename , "index.html" ); m_filenameLen = strlen ( m_filename ); } // . uses the TcpSocket::m_readBuf // . if *p was ? then keep going m_origUrlRequest = origReq + filenameStart; char *p = origReq + m_filenameLen; for ( ; *p && ! is_wspace_a(*p) ; p++ ); m_origUrlRequestLen = p - m_origUrlRequest; // set file offset/size defaults m_fileOffset = 0; // -1 means ALL the file from m_fileOffset onwards m_fileSize = -1; // "e" points to where the range actually starts, if any //char *e; // . TODO: speed up by doing one strstr for Range: and maybe range: // . do they have a Range: 0-100\n in the mime denoting a partial get? //char *s = strstr ( req ,"Range:bytes=" ); //e = s + 12; // try alternate formats //if ( ! s ) { s = strstr ( req ,"Range: bytes=" ); e = s + 13; } //if ( ! s ) { s = strstr ( req ,"Range: " ); e = s + 7; } // parse out the range if we got one //if ( s ) { // int32_t x = 0; // sscanf ( e ,"%" PRId32"-%" PRId32 , &m_fileOffset , &x ); // // get all file if range's 2nd number is non-existant // if ( x == 0 ) m_fileSize = -1; // else m_fileSize = x - m_fileOffset; // // ensure legitimacy // if ( m_fileOffset < 0 ) m_fileOffset = 0; //} // reset our hostname m_hostLen = 0; // assume request is NOT from local network //m_isMasterAdmin = false; m_isLocal = false; // get the virtual hostname they want to use char *s = strstr ( req ,"Host:" ); // try alternate formats if ( ! s ) s = strstr ( req , "host:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) !='\n' ) s = NULL; // parse out the host if we got one if ( s ) { // skip field name, host: s += 5; // skip e to beginning of the host name after "host:" while ( *s==' ' || *s=='\t' ) s++; // find end of the host name char *end = s; while ( *end && !is_wspace_a(*end) ) end++; // . now *end should be \0, \n, \r, ' ', ... // . get host len m_hostLen = end - s; // truncate if too big if ( m_hostLen >= 255 ) m_hostLen = 254; // copy into hostname gbmemcpy ( m_host , s , m_hostLen ); } // NULL terminate it m_host [ m_hostLen ] = '\0'; // get Referer: field s = strstr ( req ,"Referer:" ); // find another if ( ! s ) s = strstr ( req ,"referer:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) !='\n' ) s = NULL; // assume no referer m_refLen = 0; // parse out the referer if we got one if ( s ) { // skip field name, referer: s += 8; // skip e to beginning of the host name after ':' while ( *s==' ' || *s=='\t' ) s++; // find end of the host name char *end = s; while ( *end && !is_wspace_a(*end) ) end++; // . now *end should be \0, \n, \r, ' ', ... // . get len m_refLen = end - s; // truncate if too big if ( m_refLen >= 255 ) m_refLen = 254; // copy into m_ref gbmemcpy ( m_ref , s , m_refLen ); } // NULL terminate it m_ref [ m_refLen ] = '\0'; // get User-Agent: field s = strstr ( req ,"User-Agent:" ); // find another if ( ! s ) s = strstr ( req ,"user-agent:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) !='\n' ) s = NULL; // assume empty int32_t len = 0; // parse out the referer if we got one if ( s ) { // skip field name, referer: s += 11; // skip e to beginning of the host name after ':' while ( *s==' ' || *s=='\t' ) s++; // find end of the agent name char *end = s; while ( *end && *end!='\n' && *end!='\r' ) end++; // . now *end should be \0, \n, \r, ' ', ... // . get agent len len = end - s; // truncate if too big if ( len > 127 ) len = 127; // copy into m_userAgent gbmemcpy ( m_userAgent , s , len ); } // NULL terminate it m_userAgent [ len ] = '\0'; // get Cookie: field s = strstr ( req, "Cookie:" ); // find another if ( !s ) s = strstr ( req, "cookie:" ); // must be on its own line, otherwise it's not valid if ( s && s > req && *(s-1) != '\n' ) s = NULL; // assume empty // m_cookieBufLen = 0; m_cookiePtr = s; // parse out the cookie if we got one if ( s ) { // skip field name, Cookie: s += 7; // skip s to beginning of cookie after ':' while ( *s == ' ' || *s == '\t' ) s++; // find end of the cookie char *end = s; while ( *end && *end != '\n' && *end != '\r' ) end++; // save length m_cookieLen = end - m_cookiePtr; // get cookie len //m_cookieBufLen = end - s; // trunc if too big //if (m_cookieBufLen > 1023) m_cookieBufLen = 1023; // copy into m_cookieBuf //gbmemcpy(m_cookieBuf, s, m_cookieBufLen); } // NULL terminate it if ( m_cookiePtr ) m_cookiePtr[m_cookieLen] = '\0'; //m_cookieBuf[m_cookieBufLen] = '\0'; // convert every '&' in cookie to a \0 for parsing the fields // for ( int32_t j = 0 ; j < m_cookieBufLen ; j++ ) // if ( m_cookieBuf[j] == '&' ) m_cookieBuf[j] = '\0'; // mark it as cgi if it has a ? bool isCgi = ( req [ i ] == '?' ) ; // reset m_filename length to exclude the ?* stuff if ( isCgi ) { // skip over the '?' i++; // find a space the delmits end of cgi int32_t j; for ( j = i; j < reqLen; j++) if (is_wspace_a(req[j])) break; // now add it if ( ! addCgi ( &req[i] , j-i ) ) return false; // update i i = j; } // . set path ptrs // . the whole /cgi/14.cgi?coll=xxx&..... thang m_path = req + filenameStart; m_plen = i - filenameStart; // we're local if hostname is 192.168.[0|1].y //if ( strncmp(iptoa(sock->m_ip),"192.168.1.",10) == 0) { // m_isMasterAdmin = true; m_isLocal = true; } //if ( strncmp(iptoa(sock->m_ip),"192.168.0.",10) == 0) { // m_isMasterAdmin = true; m_isLocal = true; } //if(strncmp(iptoa(sock->m_ip),"192.168.1.",10) == 0) m_isLocal = true; //if(strncmp(iptoa(sock->m_ip),"192.168.0.",10) == 0) m_isLocal = true; if ( sock && strncmp(iptoa(sock->m_ip),"192.168.",8) == 0) m_isLocal = true; if ( sock && strncmp(iptoa(sock->m_ip),"10.",3) == 0) m_isLocal = true; // gotta scan all ips in hosts.conf as well... // if we are coming from any of our own hosts.conf c blocks // consider ourselves local uint32_t last = 0; for ( int32_t i = 0 ; i < g_hostdb.getNumHosts() ; i++ ) { Host *h = g_hostdb.getHost(i); // save time with this check if ( h->m_ip == last ) continue; // update it last = h->m_ip; // returns number of top bytes in comon int32_t nt = sock ? ipCmp ( sock->m_ip , h->m_ip ) : 0; // at least be in the same c-block as a host in hosts.conf if ( nt < 3 ) continue; m_isLocal = true; break; } // connectips/adminips // for ( int32_t i = 0 ; i < g_conf.m_numConnectIps ; i++ ) { // if ( sock->m_ip != g_conf.m_connectIps[i] ) continue; // m_isLocal = true; // break; // } // 127.0.0.1 if ( sock && sock->m_ip == 16777343 ) m_isLocal = true; // . TODO: now add any cgi data from a POST..... // . look after the mime //char *d = NULL; // check for body if it was a POST request //if ( m_requestType == RT_POST ) d = strstr ( req , "\r\n\r\n" ); // return true now if no cgi stuff to parse if ( d ) { // now put d's char back, just in case... does it really matter? *d = dc; char *post = d + 4; int32_t postLen = reqLen-(d+4-req) ; // post sometimes has a \r or\n after it while ( postLen > 0 && post[postLen-1]=='\r' ) postLen--; // add it to m_cgiBuf, filter and everything if ( ! addCgi ( post , postLen ) ) return false; } // Put '\0' back into the HttpRequest buffer... // crap, not if we are multi-part unencoded stuff... if ( m_cgiBuf && ! multipart ) { // do not mangle the "ucontent"! int32_t cgiBufLen = m_cgiBufLen; cgiBufLen -= m_ucontentLen; char *buf = m_cgiBuf; for (int32_t i = 0; i < cgiBufLen ; i++) if (buf[i] == '&') buf[i] = '\0'; // don't decode the ucontent= field! int32_t decodeLen = m_cgiBufLen; // so subtract that if ( m_ucontent ) decodeLen -= m_ucontentLen; // decode everything. fixed for %00 in &content= so it // doesn't set our parms when injecting. int32_t len = urlDecodeNoZeroes(m_cgiBuf,m_cgiBuf,decodeLen); // we're parsing crap after the null if the last parm // has no value //memset(m_cgiBuf+len, '\0', m_cgiBufLen-len); m_cgiBufLen = len; // ensure that is null i guess if ( ! m_ucontent ) m_cgiBuf[len] = '\0'; } if (m_cgiBuf2){ char *buf = m_cgiBuf2; for (int32_t i = 0; i < m_cgiBuf2Size-1 ; i++) if (buf[i] == '&') buf[i] = '\0'; // decode everything. fixed for %00 in &content= so it // doesn't set our parms when injecting. int32_t len = urlDecodeNoZeroes ( m_cgiBuf2 , m_cgiBuf2 , m_cgiBuf2Size); memset(m_cgiBuf2+len, '\0', m_cgiBuf2Size-len); } // . parse the fields after the ? in a cgi filename // . or fields in the content if it's a POST // . m_cgiBuf must be and is NULL terminated for this parseFields ( m_cgiBuf , m_cgiBufLen ); // Add extra parms to the request. if (m_cgiBuf2Size){ parseFields(m_cgiBuf2, m_cgiBuf2Size); } // urldecode the cookie buf too!! if ( m_cookiePtr ) { char *p = m_cookiePtr; for (int32_t i = 0; i < m_cookieLen ; i++) { //if (p[i] == '&') p[i] = '\0'; // cookies are separated with ';' in the request only if (p[i] == ';') p[i] = '\0'; // a hack for the metacookie=.... // which uses &'s to separate its subcookies // this is a hack for msie's limit of 50 cookies if ( p[i] == '&' ) p[i] = '\0'; // set m_metaCookie to start of meta cookie if ( p[i] == 'm' && p[i+1] == 'e' && strncmp(p,"metacookie",10) == 0 ) m_metaCookie = p; } int32_t len = urlDecode ( m_cookiePtr , m_cookiePtr, m_cookieLen ); // we're parsing crap after the null if the last parm // has no value memset(m_cookiePtr+len, '\0', m_cookieLen-len); m_cookieLen = len; } return true; }