⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpsvc.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 4 页
字号:
  PINDEX pos, len, start = 0, finish = 0;  PSecureConfig securedConf(process.GetProductKey(), process.GetSecuredKeys());  PTime expiry = securedConf.GetTime(securedConf.GetExpiryDateKey());  static PRegularExpression Default("<?!--#registration[ \t\n]*start[ \t\n]*Default[ \t\n]*-->?",                                    PRegularExpression::Extended|PRegularExpression::IgnoreCase);  static PRegularExpression Permanent("<?!--#registration[ \t\n]*start[ \t\n]*Permanent[ \t\n]*-->?",                                      PRegularExpression::Extended|PRegularExpression::IgnoreCase);  static PRegularExpression Temporary("<?!--#registration[ \t\n]*start[ \t\n]*Temporary[ \t\n]*-->?",                                      PRegularExpression::Extended|PRegularExpression::IgnoreCase);  static PRegularExpression Expired("<?!--#registration[ \t\n]*start[ \t\n]*Expired[ \t\n]*-->?",                                    PRegularExpression::Extended|PRegularExpression::IgnoreCase);  static PRegularExpression Invalid("<?!--#registration[ \t\n]*start[ \t\n]*Invalid[ \t\n]*-->?",                                    PRegularExpression::Extended|PRegularExpression::IgnoreCase);  static PRegularExpression Pending("name[ \t\n]*=[ \t\n]*\"" +                                    securedConf.GetPendingPrefix() +                                    "[^\"]+\"",                                    PRegularExpression::Extended|PRegularExpression::IgnoreCase);  PServiceHTML::ProcessMacros(request, text,                              GetURL().AsString(PURL::PathOnly).Mid(1),                              PServiceHTML::LoadFromFile);  switch (securedConf.GetValidation()) {    case PSecureConfig::Defaults :      while (FindSpliceBlock(Default, text, pos, len, start, finish))        text.Splice(text(start, finish), pos, len);      while (FindSpliceBlock(Permanent, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Temporary, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Expired, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Invalid, text, pos, len, start, finish))        text.Delete(pos, len);      break;    case PSecureConfig::Invalid :    case PSecureConfig::Pending :      while (FindSpliceBlock(Default, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Permanent, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Temporary, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Expired, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Invalid, text, pos, len, start, finish))        text.Splice(text(start, finish), pos, len);      break;    case PSecureConfig::Expired :      while (FindSpliceBlock(Default, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Permanent, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Temporary, text, pos, len, start, finish))        text.Delete(pos, len);      while (FindSpliceBlock(Expired, text, pos, len, start, finish))        text.Splice(text(start, finish), pos, len);      while (FindSpliceBlock(Invalid, text, pos, len, start, finish))        text.Delete(pos, len);      break;    case PSecureConfig::IsValid :      while (text.FindRegEx(Pending, pos, len)) {        static PINDEX pendingLength = securedConf.GetPendingPrefix().GetLength();        text.Delete(text.Find('"', pos)+1, pendingLength);        start = pos + len - pendingLength;      }      if (expiry.GetYear() < 2011) {        while (FindSpliceBlock(Default, text, pos, len, start, finish))          text.Delete(pos, len);        while (FindSpliceBlock(Permanent, text, pos, len, start, finish))          text.Delete(pos, len);        while (FindSpliceBlock(Temporary, text, pos, len, start, finish))          text.Splice(text(start, finish), pos, len);        while (FindSpliceBlock(Expired, text, pos, len, start, finish))          text.Delete(pos, len);        while (FindSpliceBlock(Invalid, text, pos, len, start, finish))          text.Delete(pos, len);      }      else {        while (FindSpliceBlock(Default, text, pos, len, start, finish))          text.Delete(pos, len);        while (FindSpliceBlock(Permanent, text, pos, len, start, finish))          text.Splice(text(start, finish), pos, len);        while (FindSpliceBlock(Temporary, text, pos, len, start, finish))          text.Delete(pos, len);        while (FindSpliceBlock(Expired, text, pos, len, start, finish))          text.Delete(pos, len);        while (FindSpliceBlock(Invalid, text, pos, len, start, finish))          text.Delete(pos, len);      }  }  static PRegularExpression ExpiryDate("<?!--#registration[ \t\n]*ExpiryDate[ \t\n]*-->?",                                       PRegularExpression::Extended|PRegularExpression::IgnoreCase);  while (text.FindRegEx(ExpiryDate, pos, len, 0))    text.Splice(expiry.AsString(PTime::LongDate), pos, len);  PHTTPConfig::OnLoadedText(request, text);  PServiceHTML::ProcessMacros(request, text, "", PServiceHTML::NoOptions);}BOOL PRegisterPage::Post(PHTTPRequest & request,                         const PStringToString & data,                         PHTML & reply){  if (fields.GetSize() == 0)    LoadText(request);  BOOL retval = PHTTPConfig::Post(request, data, reply);  if (request.code != PHTTP::RequestOK)    return FALSE;  PSecureConfig sconf(process.GetProductKey(), process.GetSecuredKeys());  switch (sconf.GetValidation()) {    case PSecureConfig::Defaults :      sconf.ResetPending();      break;    case PSecureConfig::IsValid :      break;    case PSecureConfig::Pending :      sconf.ValidatePending();      break;    default :      sconf.ResetPending();  }  RemoveAllFields();  LoadText(request);  OnLoadedText(request, reply);  return retval;}///////////////////////////////////////////////////////////////////static void DigestSecuredKeys(PHTTPServiceProcess & process,                              PString & reginfo,                              PHTML * html){  const PStringArray & securedKeys = process.GetSecuredKeys();  PSecureConfig sconf(process.GetProductKey(), securedKeys);  PString prefix;  if (sconf.GetValidation() != PSecureConfig::IsValid)     prefix = sconf.GetPendingPrefix();  PMessageDigest5 digestor;  PStringStream info;  info << '"' << process.GetName() << "\" ===";  PINDEX i;  for (i = 0; i < securedKeys.GetSize(); i++) {    PString val = sconf.GetString(prefix + securedKeys[i]).Trim();    info << " \"" << val << '"';    if (html != NULL)      *html << PHTML::HiddenField(securedKeys[i], val);    digestor.Process(val);  }  PString digest = digestor.Complete();  if (html != NULL)    *html << PHTML::HiddenField("digest", digest);  info.Replace("===", digest);  reginfo = info;}///////////////////////////////////////////////////////////////////PServiceHTML::PServiceHTML(const char * title, const char * help, const char * helpGif){  PHTTPServiceProcess::Current().GetPageHeader(*this, title);  ostream & this_stream = *this;  this_stream << PHTML::Heading(1) << title;    if (help != NULL)    this_stream << "&nbsp;"                << PHTML::HotLink(help)                << PHTML::Image(helpGif, "Help", 48, 23, "align=absmiddle")                << PHTML::HotLink();  this_stream << PHTML::Heading(1) << PHTML::Paragraph();}PString PServiceHTML::ExtractSignature(PString & out){  return ExtractSignature(*this, out);}PString PServiceHTML::ExtractSignature(const PString & html,                                       PString & out,                                       const char * keyword){  out = html;  PRegularExpression SignatureRegEx("<?!--" + PString(keyword) + "[ \t\r\n]+"                                     "signature[ \t\r\n]+(-?[^-])+-->?",                                     PRegularExpression::Extended|PRegularExpression::IgnoreCase);  PINDEX pos, len;  if (out.FindRegEx(SignatureRegEx, pos, len)) {    PString tag = out.Mid(pos, len);    out.Delete(pos, len);    return tag(tag.Find("signature")+10, tag.FindLast('-')-2).Trim();  }  return PString::Empty();}PString PServiceHTML::CalculateSignature(){  return CalculateSignature(*this);}PString PServiceHTML::CalculateSignature(const PString & out){  return CalculateSignature(out, PHTTPServiceProcess::Current().GetSignatureKey());}PString PServiceHTML::CalculateSignature(const PString & out,                                         const PTEACypher::Key & sig){  // calculate the MD5 digest of the HTML data  PMessageDigest5 digestor;  PINDEX p1 = 0;  PINDEX p2;  while ((p2 = out.FindOneOf("\r\n", p1)) != P_MAX_INDEX) {    if (p2 > p1)      digestor.Process(out(p1, p2-1));    digestor.Process("\r\n", 2);    p1 = p2 + 1;    if (out[p2] == '\r' && out[p1] == '\n') // CR LF pair      p1++;  }  digestor.Process(out(p1, P_MAX_INDEX));  PMessageDigest5::Code md5;  digestor.Complete(md5);  // encode it  PTEACypher cypher(sig);  BYTE buf[sizeof(md5)+7];  memcpy(buf, &md5, sizeof(md5));  memset(&buf[sizeof(md5)], 0, sizeof(buf)-sizeof(md5));  return cypher.Encode(buf, sizeof(buf));}BOOL PServiceHTML::CheckSignature(){  return CheckSignature(*this);}BOOL PServiceHTML::CheckSignature(const PString & html){  if (PHTTPServiceProcess::Current().ShouldIgnoreSignatures())    return TRUE;  // extract the signature from the file  PString out;  PString signature = ExtractSignature(html, out);  // calculate the signature on the data  PString checkSignature = CalculateSignature(out);  // return TRUE or FALSE  return checkSignature == signature;}static BOOL FindBrackets(const PString & args, PINDEX & open, PINDEX & close){  open = args.FindOneOf("[{(", close);  if (open == P_MAX_INDEX)    return FALSE;  switch (args[open]) {    case '[' :      close = args.Find(']', open+1);      break;    case '{' :      close = args.Find('}', open+1);      break;    case '(' :      close = args.Find(')', open+1);      break;  }  return close != P_MAX_INDEX;}static BOOL ExtractVariables(const PString & args,                             PString & variable,                             PString & value){  PINDEX open;  PINDEX close = 0;  if (FindBrackets(args, open, close))    variable = args(open+1, close-1);  else {    variable = args.Trim();    close = P_MAX_INDEX-1;  }  if (variable.IsEmpty())    return FALSE;  if (FindBrackets(args, open, close))    value = args(open+1, close-1);  return TRUE;}///////////////////////////////////////////////////////////////////////////////PServiceMacro * PServiceMacro::list;PServiceMacro::PServiceMacro(const char * name, BOOL isBlock){  macroName = name;  isMacroBlock = isBlock;  link = list;  list = this;}PServiceMacro::PServiceMacro(const PCaselessString & name, BOOL isBlock){  macroName = name;  isMacroBlock = isBlock;}PObject::Comparison PServiceMacro::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PServiceMacro), PInvalidCast);  const PServiceMacro & other = (const PServiceMacro &)obj;  if (isMacroBlock != other.isMacroBlock)    return isMacroBlock ? GreaterThan : LessThan;  int cmp = strcasecmp(macroName, other.macroName);  if (cmp < 0)    return LessThan;  if (cmp > 0)    return GreaterThan;  return EqualTo;}PString PServiceMacro::Translate(PHTTPRequest &, const PString &, const PString &) const{  return PString::Empty();};PServiceMacros_list::PServiceMacros_list(){  DisallowDeleteObjects();  PServiceMacro * macro = PServiceMacro::list;  while (macro != NULL) {    Append(macro);    macro = macro->link;  }}PCREATE_SERVICE_MACRO(Header,request,P_EMPTY){  PString hdr = PHTTPServiceProcess::Current().GetPageGraphic();  PServiceHTML::ProcessMacros(request, hdr, "header.html",                PServiceHTML::LoadFromFile|PServiceHTML::NoURLOverride);  return hdr;}PCREATE_SERVICE_MACRO(Copyright,P_EMPTY,P_EMPTY){  return PHTTPServiceProcess::Current().GetCopyrightText();}PCREATE_SERVICE_MACRO(ProductName,P_EMPTY,P_EMPTY){  return PHTTPServiceProcess::Current().GetProductName();}PCREATE_SERVICE_MACRO(Manufacturer,P_EMPTY,P_EMPTY){  return PHTTPServiceProcess::Current().GetManufacturer();}PCREATE_SERVICE_MACRO(Version,P_EMPTY,P_EMPTY){  return PHTTPServiceProcess::Current().GetVersion(TRUE);}PCREATE_SERVICE_MACRO(BuildDate,P_EMPTY,args){  const PTime & date = PHTTPServiceProcess::Current().GetCompilationDate();  if (args.IsEmpty())    return date.AsString("d MMMM yyyy");  return date.AsString(args);}PCREATE_SERVICE_MACRO(OS,P_EMPTY,P_EMPTY){  return PHTTPServiceProcess::Current().GetOSClass() &         PHTTPServiceProcess::Current().GetOSName();}PCREATE_SERVICE_MACRO(Machine,P_EMPTY,P_EMPTY){  return PHTTPServiceProcess::Current().GetOSVersion() + '-' +         PHTTPServiceProcess::Current().GetOSHardware();}PCREATE_SERVICE_MACRO(LongDateTime,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::LongDateTime);}PCREATE_SERVICE_MACRO(LongDate,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::LongDate);}PCREATE_SERVICE_MACRO(LongTime,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::LongTime);}PCREATE_SERVICE_MACRO(MediumDateTime,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::MediumDateTime);}PCREATE_SERVICE_MACRO(MediumDate,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::MediumDate);}PCREATE_SERVICE_MACRO(ShortDateTime,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::ShortDateTime);}PCREATE_SERVICE_MACRO(ShortDate,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::ShortDate);}PCREATE_SERVICE_MACRO(ShortTime,P_EMPTY,P_EMPTY){  return PTime().AsString(PTime::ShortTime);}PCREATE_SERVICE_MACRO(Time,P_EMPTY,args){  PTime now;  if (args.IsEmpty())    return now.AsString();  return now.AsString(args);}PCREATE_SERVICE_MACRO(StartTime,P_EMPTY,P_EMPTY){  return PProcess::Current().GetStartTime().AsString(PTime::MediumDateTime);}PCREATE_SERVICE_MACRO(UpTime,P_EMPTY,P_EMPTY){  PTimeInterval upTime = PTime() - PProcess::Current().GetStartTime();  return upTime.AsString(0, PTimeInterval::IncludeDays);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -