WebDAVFileSystem.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. //------------------------------------------------------------------------------
  2. #ifndef WebDavFileSystemH
  3. #define WebDavFileSystemH
  4. //------------------------------------------------------------------------------
  5. #include <ne_uri.h>
  6. #include <ne_utils.h>
  7. #include <ne_string.h>
  8. #include <ne_request.h>
  9. #include <FileSystems.h>
  10. //------------------------------------------------------------------------------
  11. struct TNeonCertificateData;
  12. struct ne_ssl_certificate_s;
  13. struct ne_session_s;
  14. struct ne_prop_result_set_s;
  15. struct ne_lock_store_s;
  16. struct TOverwriteFileParams;
  17. struct ssl_st;
  18. struct ne_lock;
  19. //------------------------------------------------------------------------------
  20. class TWebDAVFileSystem : public TCustomFileSystem
  21. {
  22. public:
  23. explicit TWebDAVFileSystem(TTerminal * ATerminal);
  24. virtual __fastcall ~TWebDAVFileSystem();
  25. virtual void __fastcall Open();
  26. virtual void __fastcall Close();
  27. virtual bool __fastcall GetActive();
  28. virtual void __fastcall CollectUsage();
  29. virtual void __fastcall Idle();
  30. virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
  31. virtual void __fastcall AnyCommand(const UnicodeString Command,
  32. TCaptureOutputEvent OutputEvent);
  33. virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
  34. virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
  35. virtual void __fastcall AnnounceFileListOperation();
  36. virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
  37. const TRemoteFile * File, const TRemoteProperties * Properties,
  38. TChmodSessionAction & Action);
  39. virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
  40. virtual void __fastcall CalculateFilesChecksum(
  41. const UnicodeString & Alg, TStrings * FileList, TCalculatedChecksumEvent OnCalculatedChecksum,
  42. TFileOperationProgressType * OperationProgress, bool FirstLevel);
  43. virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
  44. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  45. int Params, TFileOperationProgressType * OperationProgress,
  46. TOnceDoneOperation & OnceDoneOperation);
  47. virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
  48. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  49. int Params, TFileOperationProgressType * OperationProgress,
  50. TOnceDoneOperation & OnceDoneOperation);
  51. virtual void __fastcall Source(
  52. TLocalFileHandle & Handle, const UnicodeString & TargetDir, UnicodeString & DestFileName,
  53. const TCopyParamType * CopyParam, int Params,
  54. TFileOperationProgressType * OperationProgress, unsigned int Flags,
  55. TUploadSessionAction & Action, bool & ChildError);
  56. virtual void __fastcall CreateDirectory(const UnicodeString & DirName, bool Encrypt);
  57. virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
  58. virtual void __fastcall DeleteFile(const UnicodeString FileName,
  59. const TRemoteFile * File, int Params, TRmSessionAction & Action);
  60. virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
  61. const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
  62. virtual void __fastcall DoStartup();
  63. virtual void __fastcall HomeDirectory();
  64. virtual bool __fastcall IsCapable(int Capability) const;
  65. virtual void __fastcall LookupUsersGroups();
  66. virtual void __fastcall ReadCurrentDirectory();
  67. virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
  68. virtual void __fastcall ReadFile(const UnicodeString FileName,
  69. TRemoteFile *& File);
  70. virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
  71. TRemoteFile *& File);
  72. virtual void __fastcall RenameFile(
  73. const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
  74. virtual void __fastcall CopyFile(
  75. const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
  76. virtual TStrings * __fastcall GetFixedPaths();
  77. virtual void __fastcall SpaceAvailable(const UnicodeString Path,
  78. TSpaceAvailable & ASpaceAvailable);
  79. virtual const TSessionInfo & __fastcall GetSessionInfo();
  80. virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
  81. virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
  82. virtual bool __fastcall GetStoredCredentialsTried();
  83. virtual UnicodeString __fastcall GetUserName();
  84. virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
  85. virtual void __fastcall LockFile(const UnicodeString & FileName, const TRemoteFile * File);
  86. virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
  87. virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
  88. virtual void __fastcall ClearCaches();
  89. protected:
  90. virtual UnicodeString __fastcall GetCurrentDirectory();
  91. virtual void __fastcall Sink(
  92. const UnicodeString & FileName, const TRemoteFile * File,
  93. const UnicodeString & TargetDir, UnicodeString & DestFileName, int Attrs,
  94. const TCopyParamType * CopyParam, int Params, TFileOperationProgressType * OperationProgress,
  95. unsigned int Flags, TDownloadSessionAction & Action);
  96. void __fastcall ConfirmOverwrite(
  97. const UnicodeString & SourceFullFileName, UnicodeString & DestFileName,
  98. TFileOperationProgressType * OperationProgress,
  99. const TOverwriteFileParams * FileParams, const TCopyParamType * CopyParam,
  100. int Params);
  101. void CheckStatus(int NeonStatus);
  102. struct TSessionContext;
  103. void CheckStatus(TSessionContext * SessionContext, int NeonStatus);
  104. void __fastcall ClearNeonError();
  105. static void NeonPropsResult(
  106. void * UserData, const ne_uri * Uri, const ne_prop_result_set_s * Results);
  107. void __fastcall ParsePropResultSet(TRemoteFile * File,
  108. const UnicodeString & Path, const ne_prop_result_set_s * Results);
  109. void __fastcall TryOpenDirectory(UnicodeString Directory);
  110. static int NeonBodyReader(void * UserData, const char * Buf, size_t Len);
  111. static void NeonPreSend(ne_request * Request, void * UserData, ne_buffer * Header);
  112. static int NeonBodyAccepter(void * UserData, ne_request * Request, const ne_status * Status);
  113. static void NeonCreateRequest(ne_request * Request, void * UserData, const char * Method, const char * Uri);
  114. static int NeonRequestAuth(void * UserData, const char * Realm, int Attempt, char * UserName, char * Password);
  115. TSessionContext * NeonOpen(const UnicodeString & Url, UTF8String & Path, UTF8String & Query);
  116. void NeonClientOpenSessionInternal(UnicodeString & CorrectedUrl, UnicodeString Url);
  117. static void NeonNotifier(void * UserData, ne_session_status Status, const ne_session_status_info * StatusInfo);
  118. static ssize_t NeonUploadBodyProvider(void * UserData, char * Buffer, size_t BufLen);
  119. static int NeonPostSend(ne_request * Req, void * UserData, const ne_status * Status);
  120. static void NeonPostHeaders(ne_request * Req, void * UserData, const ne_status * Status);
  121. void ExchangeCapabilities(const char * Path, UnicodeString & CorrectedUrl);
  122. static int DoNeonServerSSLCallback(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate, bool Aux);
  123. static int NeonServerSSLCallbackMain(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate);
  124. static int NeonServerSSLCallbackAux(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate);
  125. static void NeonProvideClientCert(void * UserData, ne_session * Sess, const ne_ssl_dname * const * DNames, int DNCount);
  126. void __fastcall CloseNeonSession();
  127. bool __fastcall CancelTransfer();
  128. UnicodeString __fastcall GetNeonError();
  129. static void NeonQuotaResult(void * UserData, const ne_uri * Uri, const ne_prop_result_set_s * Results);
  130. static const char * __fastcall GetProp(const ne_prop_result_set_s * Results,
  131. const char * Name, const char * NameSpace = NULL);
  132. static void LockResult(void * UserData, const struct ne_lock * Lock,
  133. const ne_uri * Uri, const ne_status * Status);
  134. void __fastcall RequireLockStore();
  135. void InitSslSession(ssl_st * Ssl, ne_session * Session);
  136. void __fastcall NeonAddAuthentication(TSessionContext * SessionContext, bool UseNegotiate);
  137. void __fastcall HttpAuthenticationFailed(TSessionContext * SessionContext);
  138. private:
  139. TFileSystemInfo FFileSystemInfo;
  140. UnicodeString FCurrentDirectory;
  141. UnicodeString FCachedDirectoryChange;
  142. TSessionInfo FSessionInfo;
  143. UnicodeString FUserName;
  144. bool FActive;
  145. bool FHasTrailingSlash;
  146. bool FSkipped;
  147. bool FCancelled;
  148. bool FStoredPasswordTried;
  149. bool FUploading;
  150. bool FDownloading;
  151. UnicodeString FUploadMimeType;
  152. ne_lock_store_s * FNeonLockStore;
  153. TCriticalSection * FNeonLockStoreSection;
  154. bool FInitialHandshake;
  155. bool FAuthenticationRequested;
  156. UnicodeString FResponse;
  157. RawByteString FPassword;
  158. UnicodeString FTlsVersionStr;
  159. unsigned int FCapabilities;
  160. struct TSessionContext
  161. {
  162. TSessionContext();
  163. ~TSessionContext();
  164. TWebDAVFileSystem * FileSystem;
  165. ne_session_s * NeonSession; // The main one (there might be aux session for the same context)
  166. UnicodeString HostName;
  167. int PortNumber;
  168. bool NtlmAuthenticationFailed;
  169. UnicodeString AuthorizationProtocol;
  170. };
  171. TSessionContext * FSessionContext;
  172. enum TIgnoreAuthenticationFailure { iafNo, iafWaiting, iafPasswordFailed } FIgnoreAuthenticationFailure;
  173. UnicodeString FAuthorizationProtocol;
  174. UnicodeString FLastAuthorizationProtocol;
  175. bool FAuthenticationRetry;
  176. bool FOneDrive;
  177. enum { odiUnknown, odiUpperCase, odiLowerCase } FOneDriveInterface;
  178. void __fastcall CustomReadFile(UnicodeString FileName,
  179. TRemoteFile *& File, TRemoteFile * ALinkedByFile);
  180. int __fastcall CustomReadFileInternal(const UnicodeString FileName,
  181. TRemoteFile *& File, TRemoteFile * ALinkedByFile);
  182. bool VerifyCertificate(TSessionContext * SessionContext, TNeonCertificateData Data, bool Aux);
  183. void OpenUrl(const UnicodeString & Url);
  184. void __fastcall CollectTLSSessionInfo();
  185. UnicodeString __fastcall GetRedirectUrl();
  186. UnicodeString __fastcall ParsePathFromUrl(const UnicodeString & Url);
  187. int __fastcall ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList);
  188. int __fastcall RenameFileInternal(const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite);
  189. int __fastcall CopyFileInternal(const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite);
  190. bool IsRedirect(int NeonStatus);
  191. bool __fastcall IsValidRedirect(int NeonStatus, UnicodeString & Path);
  192. UnicodeString __fastcall DirectoryPath(UnicodeString Path);
  193. UnicodeString __fastcall FilePath(const TRemoteFile * File);
  194. struct ne_lock * __fastcall FindLock(const RawByteString & Path);
  195. void __fastcall DiscardLock(const RawByteString & Path);
  196. bool __fastcall IsNtlmAuthentication(TSessionContext * SessionContext);
  197. static void NeonAuxRequestInit(ne_session_s * Session, ne_request * Request, void * UserData);
  198. void __fastcall SetSessionTls(TSessionContext * SessionContext, ne_session_s * Session, bool Aux);
  199. void __fastcall InitSession(TSessionContext * SessionContext, ne_session_s * Session);
  200. bool IsTlsSession(ne_session * Session);
  201. };
  202. //------------------------------------------------------------------------------
  203. #endif