00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PTLIB_HTTPSVC_H
00032 #define PTLIB_HTTPSVC_H
00033
00034 #include <ptlib/svcproc.h>
00035 #include <ptlib/sockets.h>
00036 #include <ptclib/httpform.h>
00037 #include <ptclib/cypher.h>
00038
00039
00040 class PHTTPServiceProcess;
00041
00042
00044
00045 class PHTTPServiceThread : public PThread
00046 {
00047 PCLASSINFO(PHTTPServiceThread, PThread)
00048 public:
00049 PHTTPServiceThread(PINDEX stackSize,
00050 PHTTPServiceProcess & app);
00051 ~PHTTPServiceThread();
00052
00053 void Main();
00054 void Close();
00055
00056 protected:
00057 PINDEX myStackSize;
00058 PHTTPServiceProcess & process;
00059 PTCPSocket * socket;
00060 };
00061
00062
00064
00065 class PHTTPServiceProcess : public PServiceProcess
00066 {
00067 PCLASSINFO(PHTTPServiceProcess, PServiceProcess)
00068
00069 public:
00070 enum {
00071 MaxSecuredKeys = 10
00072 };
00073 struct Info {
00074 const char * productName;
00075 const char * manufacturerName;
00076
00077 WORD majorVersion;
00078 WORD minorVersion;
00079 CodeStatus buildStatus;
00080 WORD buildNumber;
00081 const char * compilationDate;
00082
00083 PTEACypher::Key productKey;
00084 const char * securedKeys[MaxSecuredKeys];
00085 PINDEX securedKeyCount;
00086
00087 PTEACypher::Key signatureKey;
00088
00089 const char * manufHomePage;
00090 const char * email;
00091 const char * productHTML;
00092
00093 const char * gifHTML;
00094
00095 const char * gifFilename;
00096 int gifWidth;
00097 int gifHeight;
00098
00099 const char * copyrightHolder;
00100 const char * copyrightHomePage;
00101 const char * copyrightEmail;
00102 };
00103
00104 PHTTPServiceProcess(const Info & inf);
00105 ~PHTTPServiceProcess();
00106
00107 PBoolean OnStart();
00108 void OnStop();
00109 PBoolean OnPause();
00110 void OnContinue();
00111 const char * GetServiceDependencies() const;
00112
00113 virtual void OnConfigChanged() = 0;
00114 virtual PBoolean Initialise(const char * initMsg) = 0;
00115
00116 PBoolean ListenForHTTP(
00117 WORD port,
00118 PSocket::Reusability reuse = PSocket::CanReuseAddress,
00119 PINDEX stackSize = 0x4000
00120 );
00121 PBoolean ListenForHTTP(
00122 PSocket * listener,
00123 PSocket::Reusability reuse = PSocket::CanReuseAddress,
00124 PINDEX stackSize = 0x4000
00125 );
00126
00127 virtual PString GetPageGraphic();
00128 void GetPageHeader(PHTML &);
00129 void GetPageHeader(PHTML &, const PString & title);
00130
00131 virtual PString GetCopyrightText();
00132
00133 const PString & GetMacroKeyword() const { return macroKeyword; }
00134 const PTime & GetCompilationDate() const { return compilationDate; }
00135 const PString & GetHomePage() const { return manufacturersHomePage; }
00136 const PString & GetEMailAddress() const { return manufacturersEmail; }
00137 const PString & GetProductName() const { return productNameHTML; }
00138 const PTEACypher::Key & GetProductKey() const { return productKey; }
00139 const PStringArray & GetSecuredKeys() const { return securedKeys; }
00140 const PTEACypher::Key & GetSignatureKey() const { return signatureKey; }
00141 PBoolean ShouldIgnoreSignatures() const { return ignoreSignatures; }
00142 void SetIgnoreSignatures(PBoolean ig) { ignoreSignatures = ig; }
00143
00144 static PHTTPServiceProcess & Current();
00145
00146 virtual void AddRegisteredText(PHTML & html);
00147 virtual void AddUnregisteredText(PHTML & html);
00148 virtual PBoolean SubstituteEquivalSequence(PHTTPRequest & request, const PString &, PString &);
00149 virtual PHTTPServer * CreateHTTPServer(PTCPSocket & socket);
00150 virtual PHTTPServer * OnCreateHTTPServer(const PHTTPSpace & urlSpace);
00151 PTCPSocket * AcceptHTTP();
00152 PBoolean ProcessHTTP(PTCPSocket & socket);
00153
00154 protected:
00155 PSocket * httpListeningSocket;
00156 PHTTPSpace httpNameSpace;
00157 PString macroKeyword;
00158
00159 PTEACypher::Key productKey;
00160 PStringArray securedKeys;
00161 PTEACypher::Key signatureKey;
00162 PBoolean ignoreSignatures;
00163
00164 PTime compilationDate;
00165 PString manufacturersHomePage;
00166 PString manufacturersEmail;
00167 PString productNameHTML;
00168 PString gifHTML;
00169 PString copyrightHolder;
00170 PString copyrightHomePage;
00171 PString copyrightEmail;
00172
00173 void ShutdownListener();
00174 void BeginRestartSystem();
00175 void CompleteRestartSystem();
00176
00177 PThread * restartThread;
00178
00179 PLIST(ThreadList, PHTTPServiceThread);
00180 ThreadList httpThreads;
00181 PMutex httpThreadsMutex;
00182
00183 friend class PConfigPage;
00184 friend class PConfigSectionsPage;
00185 friend class PHTTPServiceThread;
00186 };
00187
00188
00190
00191 class PConfigPage : public PHTTPConfig
00192 {
00193 PCLASSINFO(PConfigPage, PHTTPConfig)
00194 public:
00195 PConfigPage(
00196 PHTTPServiceProcess & app,
00197 const PString & section,
00198 const PHTTPAuthority & auth
00199 );
00200 PConfigPage(
00201 PHTTPServiceProcess & app,
00202 const PString & title,
00203 const PString & section,
00204 const PHTTPAuthority & auth
00205 );
00206
00207 void OnLoadedText(PHTTPRequest &, PString & text);
00208
00209 PBoolean OnPOST(
00210 PHTTPServer & server,
00211 const PURL & url,
00212 const PMIMEInfo & info,
00213 const PStringToString & data,
00214 const PHTTPConnectionInfo & connectInfo
00215 );
00216
00217 virtual PBoolean Post(
00218 PHTTPRequest & request,
00219 const PStringToString & data,
00220 PHTML & replyMessage
00221 );
00222
00223 protected:
00224 virtual PBoolean GetExpirationDate(
00225 PTime & when
00226 );
00227
00228 PHTTPServiceProcess & process;
00229 };
00230
00231
00233
00234 class PConfigSectionsPage : public PHTTPConfigSectionList
00235 {
00236 PCLASSINFO(PConfigSectionsPage, PHTTPConfigSectionList)
00237 public:
00238 PConfigSectionsPage(
00239 PHTTPServiceProcess & app,
00240 const PURL & url,
00241 const PHTTPAuthority & auth,
00242 const PString & prefix,
00243 const PString & valueName,
00244 const PURL & editSection,
00245 const PURL & newSection,
00246 const PString & newTitle,
00247 PHTML & heading
00248 );
00249
00250 void OnLoadedText(PHTTPRequest &, PString & text);
00251
00252 PBoolean OnPOST(
00253 PHTTPServer & server,
00254 const PURL & url,
00255 const PMIMEInfo & info,
00256 const PStringToString & data,
00257 const PHTTPConnectionInfo & connectInfo
00258 );
00259
00260 virtual PBoolean Post(
00261 PHTTPRequest & request,
00262 const PStringToString & data,
00263 PHTML & replyMessage
00264 );
00265
00266 protected:
00267 virtual PBoolean GetExpirationDate(
00268 PTime & when
00269 );
00270
00271 PHTTPServiceProcess & process;
00272 };
00273
00274
00276
00277 class PRegisterPage : public PConfigPage
00278 {
00279 PCLASSINFO(PRegisterPage, PConfigPage)
00280 public:
00281 PRegisterPage(
00282 PHTTPServiceProcess & app,
00283 const PHTTPAuthority & auth
00284 );
00285
00286 PString LoadText(
00287 PHTTPRequest & request
00288 );
00289 void OnLoadedText(PHTTPRequest & request, PString & text);
00290
00291 virtual PBoolean Post(
00292 PHTTPRequest & request,
00293 const PStringToString & data,
00294 PHTML & replyMessage
00295 );
00296
00297 virtual void AddFields(
00298 const PString & prefix
00299 ) = 0;
00300
00301 protected:
00302 PHTTPServiceProcess & process;
00303 };
00304
00305
00307
00308 class PServiceHTML : public PHTML
00309 {
00310 PCLASSINFO(PServiceHTML, PHTML)
00311 public:
00312 PServiceHTML(const char * title,
00313 const char * help = NULL,
00314 const char * helpGif = "help.gif");
00315
00316 PString ExtractSignature(PString & out);
00317 static PString ExtractSignature(const PString & html,
00318 PString & out,
00319 const char * keyword = "#equival");
00320
00321 PString CalculateSignature();
00322 static PString CalculateSignature(const PString & out);
00323 static PString CalculateSignature(const PString & out, const PTEACypher::Key & sig);
00324
00325 PBoolean CheckSignature();
00326 static PBoolean CheckSignature(const PString & html);
00327
00328 enum MacroOptions {
00329 NoOptions = 0,
00330 NeedSignature = 1,
00331 LoadFromFile = 2,
00332 NoURLOverride = 4,
00333 NoSignatureForFile = 8
00334 };
00335 static bool ProcessMacros(
00336 PHTTPRequest & request,
00337 PString & text,
00338 const PString & filename,
00339 unsigned options
00340 );
00341 static bool SpliceMacro(
00342 PString & text,
00343 const PString & tokens,
00344 const PString & value
00345 );
00346 };
00347
00348
00350
00351 class PServiceMacro : public PObject
00352 {
00353 public:
00354 PServiceMacro(const char * name, PBoolean isBlock);
00355 PServiceMacro(const PCaselessString & name, PBoolean isBlock);
00356 Comparison Compare(const PObject & obj) const;
00357 virtual PString Translate(
00358 PHTTPRequest & request,
00359 const PString & args,
00360 const PString & block
00361 ) const;
00362 protected:
00363 const char * macroName;
00364 PBoolean isMacroBlock;
00365 PServiceMacro * link;
00366 static PServiceMacro * list;
00367 friend class PServiceMacros_list;
00368 };
00369
00370
00371 #define P_EMPTY
00372
00373 #define PCREATE_SERVICE_MACRO(name, request, args) \
00374 class PServiceMacro_##name : public PServiceMacro { \
00375 public: \
00376 PServiceMacro_##name() : PServiceMacro(#name, false) { } \
00377 PString Translate(PHTTPRequest &, const PString &, const PString &) const; \
00378 }; \
00379 static const PServiceMacro_##name serviceMacro_##name; \
00380 PString PServiceMacro_##name::Translate(PHTTPRequest & request, const PString & args, const PString &) const
00381
00382
00383
00384 #define PCREATE_SERVICE_MACRO_BLOCK(name, request, args, block) \
00385 class PServiceMacro_##name : public PServiceMacro { \
00386 public: \
00387 PServiceMacro_##name() : PServiceMacro(#name, true) { } \
00388 PString Translate(PHTTPRequest &, const PString &, const PString &) const; \
00389 }; \
00390 static const PServiceMacro_##name serviceMacro_##name; \
00391 PString PServiceMacro_##name::Translate(PHTTPRequest & request, const PString & args, const PString & block) const
00392
00393
00394
00396
00397 class PServiceHTTPString : public PHTTPString
00398 {
00399 PCLASSINFO(PServiceHTTPString, PHTTPString)
00400 public:
00401 PServiceHTTPString(const PURL & url, const PString & string)
00402 : PHTTPString(url, string) { }
00403
00404 PServiceHTTPString(const PURL & url, const PHTTPAuthority & auth)
00405 : PHTTPString(url, auth) { }
00406
00407 PServiceHTTPString(const PURL & url, const PString & string, const PHTTPAuthority & auth)
00408 : PHTTPString(url, string, auth) { }
00409
00410 PServiceHTTPString(const PURL & url, const PString & string, const PString & contentType)
00411 : PHTTPString(url, string, contentType) { }
00412
00413 PServiceHTTPString(const PURL & url, const PString & string, const PString & contentType, const PHTTPAuthority & auth)
00414 : PHTTPString(url, string, contentType, auth) { }
00415
00416 PString LoadText(PHTTPRequest &);
00417
00418 protected:
00419 virtual PBoolean GetExpirationDate(
00420 PTime & when
00421 );
00422 };
00423
00424
00425 class PServiceHTTPFile : public PHTTPFile
00426 {
00427 PCLASSINFO(PServiceHTTPFile, PHTTPFile)
00428 public:
00429 PServiceHTTPFile(const PString & filename, PBoolean needSig = false)
00430 : PHTTPFile(filename) { needSignature = needSig; }
00431 PServiceHTTPFile(const PString & filename, const PFilePath & file, PBoolean needSig = false)
00432 : PHTTPFile(filename, file) { needSignature = needSig; }
00433 PServiceHTTPFile(const PString & filename, const PString & file, PBoolean needSig = false)
00434 : PHTTPFile(filename, file) { needSignature = needSig; }
00435 PServiceHTTPFile(const PString & filename, const PHTTPAuthority & auth, PBoolean needSig = false)
00436 : PHTTPFile(filename, auth) { needSignature = needSig; }
00437 PServiceHTTPFile(const PString & filename, const PFilePath & file, const PHTTPAuthority & auth, PBoolean needSig = false)
00438 : PHTTPFile(filename, file, auth) { needSignature = needSig; }
00439
00440 void OnLoadedText(PHTTPRequest &, PString & text);
00441
00442 protected:
00443 virtual PBoolean GetExpirationDate(
00444 PTime & when
00445 );
00446
00447 PBoolean needSignature;
00448 };
00449
00450 class PServiceHTTPDirectory : public PHTTPDirectory
00451 {
00452 PCLASSINFO(PServiceHTTPDirectory, PHTTPDirectory)
00453 public:
00454 PServiceHTTPDirectory(const PURL & url, const PDirectory & dirname, PBoolean needSig = false)
00455 : PHTTPDirectory(url, dirname) { needSignature = needSig; }
00456
00457 PServiceHTTPDirectory(const PURL & url, const PDirectory & dirname, const PHTTPAuthority & auth, PBoolean needSig = false)
00458 : PHTTPDirectory(url, dirname, auth) { needSignature = needSig; }
00459
00460 void OnLoadedText(PHTTPRequest &, PString & text);
00461
00462 protected:
00463 virtual PBoolean GetExpirationDate(
00464 PTime & when
00465 );
00466
00467 PBoolean needSignature;
00468 };
00469
00470
00471 #endif // PTLIB_HTTPSVC_H
00472
00473
00474