123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- //------------------------------------------------------------------------------
- #ifndef WebDavFileSystemH
- #define WebDavFileSystemH
- //------------------------------------------------------------------------------
- #include <ne_uri.h>
- #include <ne_utils.h>
- #include <ne_string.h>
- #include <ne_request.h>
- #include <FileSystems.h>
- //------------------------------------------------------------------------------
- struct TNeonCertificateData;
- struct ne_ssl_certificate_s;
- struct ne_session_s;
- struct ne_prop_result_set_s;
- struct ne_lock_store_s;
- struct TOverwriteFileParams;
- struct ssl_st;
- struct ne_lock;
- //------------------------------------------------------------------------------
- class TWebDAVFileSystem : public TCustomFileSystem
- {
- public:
- explicit TWebDAVFileSystem(TTerminal * ATerminal);
- virtual __fastcall ~TWebDAVFileSystem();
- virtual void __fastcall Open();
- virtual void __fastcall Close();
- virtual bool __fastcall GetActive();
- virtual void __fastcall CollectUsage();
- virtual void __fastcall Idle();
- virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
- virtual void __fastcall AnyCommand(const UnicodeString Command,
- TCaptureOutputEvent OutputEvent);
- virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
- virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
- virtual void __fastcall AnnounceFileListOperation();
- virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
- const TRemoteFile * File, const TRemoteProperties * Properties,
- TChmodSessionAction & Action);
- virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
- virtual void __fastcall CalculateFilesChecksum(
- const UnicodeString & Alg, TStrings * FileList, TCalculatedChecksumEvent OnCalculatedChecksum,
- TFileOperationProgressType * OperationProgress, bool FirstLevel);
- virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
- const UnicodeString TargetDir, const TCopyParamType * CopyParam,
- int Params, TFileOperationProgressType * OperationProgress,
- TOnceDoneOperation & OnceDoneOperation);
- virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
- const UnicodeString TargetDir, const TCopyParamType * CopyParam,
- int Params, TFileOperationProgressType * OperationProgress,
- TOnceDoneOperation & OnceDoneOperation);
- virtual void __fastcall Source(
- TLocalFileHandle & Handle, const UnicodeString & TargetDir, UnicodeString & DestFileName,
- const TCopyParamType * CopyParam, int Params,
- TFileOperationProgressType * OperationProgress, unsigned int Flags,
- TUploadSessionAction & Action, bool & ChildError);
- virtual void __fastcall CreateDirectory(const UnicodeString & DirName, bool Encrypt);
- virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
- virtual void __fastcall DeleteFile(const UnicodeString FileName,
- const TRemoteFile * File, int Params, TRmSessionAction & Action);
- virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
- const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
- virtual void __fastcall DoStartup();
- virtual void __fastcall HomeDirectory();
- virtual bool __fastcall IsCapable(int Capability) const;
- virtual void __fastcall LookupUsersGroups();
- virtual void __fastcall ReadCurrentDirectory();
- virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
- virtual void __fastcall ReadFile(const UnicodeString FileName,
- TRemoteFile *& File);
- virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
- TRemoteFile *& File);
- virtual void __fastcall RenameFile(
- const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
- virtual void __fastcall CopyFile(
- const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
- virtual TStrings * __fastcall GetFixedPaths();
- virtual void __fastcall SpaceAvailable(const UnicodeString Path,
- TSpaceAvailable & ASpaceAvailable);
- virtual const TSessionInfo & __fastcall GetSessionInfo();
- virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
- virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
- virtual bool __fastcall GetStoredCredentialsTried();
- virtual UnicodeString __fastcall GetUserName();
- virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
- virtual void __fastcall LockFile(const UnicodeString & FileName, const TRemoteFile * File);
- virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
- virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
- virtual void __fastcall ClearCaches();
- protected:
- virtual UnicodeString __fastcall GetCurrentDirectory();
- virtual void __fastcall Sink(
- const UnicodeString & FileName, const TRemoteFile * File,
- const UnicodeString & TargetDir, UnicodeString & DestFileName, int Attrs,
- const TCopyParamType * CopyParam, int Params, TFileOperationProgressType * OperationProgress,
- unsigned int Flags, TDownloadSessionAction & Action);
- void __fastcall ConfirmOverwrite(
- const UnicodeString & SourceFullFileName, UnicodeString & DestFileName,
- TFileOperationProgressType * OperationProgress,
- const TOverwriteFileParams * FileParams, const TCopyParamType * CopyParam,
- int Params);
- void CheckStatus(int NeonStatus);
- struct TSessionContext;
- void CheckStatus(TSessionContext * SessionContext, int NeonStatus);
- void __fastcall ClearNeonError();
- static void NeonPropsResult(
- void * UserData, const ne_uri * Uri, const ne_prop_result_set_s * Results);
- void __fastcall ParsePropResultSet(TRemoteFile * File,
- const UnicodeString & Path, const ne_prop_result_set_s * Results);
- void __fastcall TryOpenDirectory(UnicodeString Directory);
- static int NeonBodyReader(void * UserData, const char * Buf, size_t Len);
- static void NeonPreSend(ne_request * Request, void * UserData, ne_buffer * Header);
- static int NeonBodyAccepter(void * UserData, ne_request * Request, const ne_status * Status);
- static void NeonCreateRequest(ne_request * Request, void * UserData, const char * Method, const char * Uri);
- static int NeonRequestAuth(void * UserData, const char * Realm, int Attempt, char * UserName, char * Password);
- TSessionContext * NeonOpen(const UnicodeString & Url, UTF8String & Path, UTF8String & Query);
- void NeonClientOpenSessionInternal(UnicodeString & CorrectedUrl, UnicodeString Url);
- static void NeonNotifier(void * UserData, ne_session_status Status, const ne_session_status_info * StatusInfo);
- static ssize_t NeonUploadBodyProvider(void * UserData, char * Buffer, size_t BufLen);
- static int NeonPostSend(ne_request * Req, void * UserData, const ne_status * Status);
- static void NeonPostHeaders(ne_request * Req, void * UserData, const ne_status * Status);
- void ExchangeCapabilities(const char * Path, UnicodeString & CorrectedUrl);
- static int DoNeonServerSSLCallback(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate, bool Aux);
- static int NeonServerSSLCallbackMain(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate);
- static int NeonServerSSLCallbackAux(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate);
- static void NeonProvideClientCert(void * UserData, ne_session * Sess, const ne_ssl_dname * const * DNames, int DNCount);
- void __fastcall CloseNeonSession();
- bool __fastcall CancelTransfer();
- UnicodeString __fastcall GetNeonError();
- static void NeonQuotaResult(void * UserData, const ne_uri * Uri, const ne_prop_result_set_s * Results);
- static const char * __fastcall GetProp(const ne_prop_result_set_s * Results,
- const char * Name, const char * NameSpace = NULL);
- static void LockResult(void * UserData, const struct ne_lock * Lock,
- const ne_uri * Uri, const ne_status * Status);
- void __fastcall RequireLockStore();
- void InitSslSession(ssl_st * Ssl, ne_session * Session);
- void __fastcall NeonAddAuthentication(TSessionContext * SessionContext, bool UseNegotiate);
- void __fastcall HttpAuthenticationFailed(TSessionContext * SessionContext);
- private:
- TFileSystemInfo FFileSystemInfo;
- UnicodeString FCurrentDirectory;
- UnicodeString FCachedDirectoryChange;
- TSessionInfo FSessionInfo;
- UnicodeString FUserName;
- bool FActive;
- bool FHasTrailingSlash;
- bool FSkipped;
- bool FCancelled;
- bool FStoredPasswordTried;
- bool FUploading;
- bool FDownloading;
- UnicodeString FUploadMimeType;
- ne_lock_store_s * FNeonLockStore;
- TCriticalSection * FNeonLockStoreSection;
- bool FInitialHandshake;
- bool FAuthenticationRequested;
- UnicodeString FResponse;
- RawByteString FPassword;
- UnicodeString FTlsVersionStr;
- unsigned int FCapabilities;
- struct TSessionContext
- {
- TSessionContext();
- ~TSessionContext();
- TWebDAVFileSystem * FileSystem;
- ne_session_s * NeonSession; // The main one (there might be aux session for the same context)
- UnicodeString HostName;
- int PortNumber;
- bool NtlmAuthenticationFailed;
- UnicodeString AuthorizationProtocol;
- };
- TSessionContext * FSessionContext;
- enum TIgnoreAuthenticationFailure { iafNo, iafWaiting, iafPasswordFailed } FIgnoreAuthenticationFailure;
- UnicodeString FAuthorizationProtocol;
- UnicodeString FLastAuthorizationProtocol;
- bool FAuthenticationRetry;
- bool FOneDrive;
- enum { odiUnknown, odiUpperCase, odiLowerCase } FOneDriveInterface;
- void __fastcall CustomReadFile(UnicodeString FileName,
- TRemoteFile *& File, TRemoteFile * ALinkedByFile);
- int __fastcall CustomReadFileInternal(const UnicodeString FileName,
- TRemoteFile *& File, TRemoteFile * ALinkedByFile);
- bool VerifyCertificate(TSessionContext * SessionContext, TNeonCertificateData Data, bool Aux);
- void OpenUrl(const UnicodeString & Url);
- void __fastcall CollectTLSSessionInfo();
- UnicodeString __fastcall GetRedirectUrl();
- UnicodeString __fastcall ParsePathFromUrl(const UnicodeString & Url);
- int __fastcall ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList);
- int __fastcall RenameFileInternal(const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite);
- int __fastcall CopyFileInternal(const UnicodeString & FileName, const UnicodeString & NewName, bool Overwrite);
- bool IsRedirect(int NeonStatus);
- bool __fastcall IsValidRedirect(int NeonStatus, UnicodeString & Path);
- UnicodeString __fastcall DirectoryPath(UnicodeString Path);
- UnicodeString __fastcall FilePath(const TRemoteFile * File);
- struct ne_lock * __fastcall FindLock(const RawByteString & Path);
- void __fastcall DiscardLock(const RawByteString & Path);
- bool __fastcall IsNtlmAuthentication(TSessionContext * SessionContext);
- static void NeonAuxRequestInit(ne_session_s * Session, ne_request * Request, void * UserData);
- void __fastcall SetSessionTls(TSessionContext * SessionContext, ne_session_s * Session, bool Aux);
- void __fastcall InitSession(TSessionContext * SessionContext, ne_session_s * Session);
- bool IsTlsSession(ne_session * Session);
- };
- //------------------------------------------------------------------------------
- #endif
|