📄 httpsvc.cxx
字号:
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 << " " << 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 + -