📄 httpsvc.cxx
字号:
}
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);
}
PCREATE_SERVICE_MACRO(LocalHost,request,P_EMPTY)
{
if (request.localAddr != 0)
return PIPSocket::GetHostName(request.localAddr);
else
return PIPSocket::GetHostName();
}
PCREATE_SERVICE_MACRO(LocalIP,request,P_EMPTY)
{
if (request.localAddr != 0)
return request.localAddr;
else
return "127.0.0.1";
}
PCREATE_SERVICE_MACRO(LocalPort,request,P_EMPTY)
{
if (request.localPort != 0)
return psprintf("%u", request.localPort);
else
return "80";
}
PCREATE_SERVICE_MACRO(PeerHost,request,P_EMPTY)
{
if (request.origin != 0)
return PIPSocket::GetHostName(request.origin);
else
return "N/A";
}
PCREATE_SERVICE_MACRO(PeerIP,request,P_EMPTY)
{
if (request.origin != 0)
return request.origin;
else
return "N/A";
}
PCREATE_SERVICE_MACRO(MonitorInfo,request,P_EMPTY)
{
const PTime & compilationDate = PHTTPServiceProcess::Current().GetCompilationDate();
PString peerAddr = "N/A";
if (request.origin != 0)
peerAddr = request.origin.AsString();
PString localAddr = "127.0.0.1";
if (request.localAddr != 0)
localAddr = request.localAddr.AsString();
WORD localPort = 80;
if (request.localPort != 0)
localPort = request.localPort;
PString timeFormat = "yyyyMMdd hhmmss z";
PTime now;
PTimeInterval upTime = now - PProcess::Current().GetStartTime();
PStringStream monitorText;
monitorText << "Program: " << PHTTPServiceProcess::Current().GetProductName() << "\n"
<< "Version: " << PHTTPServiceProcess::Current().GetVersion(TRUE) << "\n"
<< "Manufacturer: " << PHTTPServiceProcess::Current().GetManufacturer() << "\n"
<< "OS: " << PHTTPServiceProcess::Current().GetOSClass() << " " << PHTTPServiceProcess::Current().GetOSName() << "\n"
<< "OS Version: " << PHTTPServiceProcess::Current().GetOSVersion() << "\n"
<< "Hardware: " << PHTTPServiceProcess::Current().GetOSHardware() << "\n"
<< "Compilation date: " << compilationDate.AsString(timeFormat, PTime::GMT) << "\n"
<< "Start Date: " << PProcess::Current().GetStartTime().AsString(timeFormat, PTime::GMT) << "\n"
<< "Current Date: " << now.AsString(timeFormat, PTime::GMT) << "\n"
<< "Up time: " << upTime << "\n"
<< "Peer Addr: " << peerAddr << "\n"
<< "Local Host: " << PIPSocket::GetHostName() << "\n"
<< "Local Addr: " << localAddr << "\n"
<< "Local Port: " << localPort << "\n"
;
return monitorText;
}
PCREATE_SERVICE_MACRO(RegInfo,P_EMPTY,P_EMPTY)
{
PString subs;
DigestSecuredKeys(PHTTPServiceProcess::Current(), subs, NULL);
return subs;
}
static PString GetRegInfo(const char * info)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -