18590a0fdSAndre Fischer /************************************************************** 28590a0fdSAndre Fischer * 38590a0fdSAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one 48590a0fdSAndre Fischer * or more contributor license agreements. See the NOTICE file 58590a0fdSAndre Fischer * distributed with this work for additional information 68590a0fdSAndre Fischer * regarding copyright ownership. The ASF licenses this file 78590a0fdSAndre Fischer * to you under the Apache License, Version 2.0 (the 88590a0fdSAndre Fischer * "License"); you may not use this file except in compliance 98590a0fdSAndre Fischer * with the License. You may obtain a copy of the License at 108590a0fdSAndre Fischer * 118590a0fdSAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0 128590a0fdSAndre Fischer * 138590a0fdSAndre Fischer * Unless required by applicable law or agreed to in writing, 148590a0fdSAndre Fischer * software distributed under the License is distributed on an 158590a0fdSAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 168590a0fdSAndre Fischer * KIND, either express or implied. See the License for the 178590a0fdSAndre Fischer * specific language governing permissions and limitations 188590a0fdSAndre Fischer * under the License. 198590a0fdSAndre Fischer * 208590a0fdSAndre Fischer *************************************************************/ 218590a0fdSAndre Fischer 228590a0fdSAndre Fischer 238590a0fdSAndre Fischer 248590a0fdSAndre Fischer #ifndef INCLUDED_SERFSESSION_HXX 258590a0fdSAndre Fischer #define INCLUDED_SERFSESSION_HXX 268590a0fdSAndre Fischer 278590a0fdSAndre Fischer #include <vector> 2849989859SOliver-Rainer Wittmann #include <boost/shared_ptr.hpp> 298590a0fdSAndre Fischer #include <osl/mutex.hxx> 30*3edf6992SAndrea Pescetti #include "DAVResource.hxx" 31c1c10f68SAriel Constenla-Haile #include "DAVSession.hxx" 32c1c10f68SAriel Constenla-Haile #include "SerfTypes.hxx" 33*3edf6992SAndrea Pescetti #include "SerfLockStore.hxx" 34c1c10f68SAriel Constenla-Haile #include "SerfUri.hxx" 358590a0fdSAndre Fischer #include <com/sun/star/lang/XMultiServiceFactory.hpp> 368590a0fdSAndre Fischer 378590a0fdSAndre Fischer namespace ucbhelper { class ProxyDecider; } 388590a0fdSAndre Fischer 398590a0fdSAndre Fischer namespace http_dav_ucp 408590a0fdSAndre Fischer { 418590a0fdSAndre Fischer 428590a0fdSAndre Fischer class SerfRequestProcessor; 438590a0fdSAndre Fischer 448590a0fdSAndre Fischer // ------------------------------------------------------------------- 458590a0fdSAndre Fischer // SerfSession 468590a0fdSAndre Fischer // A DAVSession implementation using the neon/expat library 478590a0fdSAndre Fischer // ------------------------------------------------------------------- 488590a0fdSAndre Fischer 498590a0fdSAndre Fischer class SerfSession : public DAVSession 508590a0fdSAndre Fischer { 518590a0fdSAndre Fischer private: 528590a0fdSAndre Fischer osl::Mutex m_aMutex; 538590a0fdSAndre Fischer 548590a0fdSAndre Fischer SerfUri m_aUri; 558590a0fdSAndre Fischer 568590a0fdSAndre Fischer rtl::OUString m_aProxyName; 578590a0fdSAndre Fischer sal_Int32 m_nProxyPort; 58*3edf6992SAndrea Pescetti // The server, according RFC7231 59*3edf6992SAndrea Pescetti // http://tools.ietf.org/html/rfc7231#section-7.4.2 60*3edf6992SAndrea Pescetti rtl::OUString m_aServerHeaderField; 618590a0fdSAndre Fischer 628590a0fdSAndre Fischer SerfConnection* m_pSerfConnection; 638590a0fdSAndre Fischer serf_context_t* m_pSerfContext; 648590a0fdSAndre Fischer serf_bucket_alloc_t* m_pSerfBucket_Alloc; 658590a0fdSAndre Fischer bool m_bIsHeadRequestInProgress; 6649989859SOliver-Rainer Wittmann bool m_bUseChunkedEncoding; 6749989859SOliver-Rainer Wittmann sal_Int16 m_bNoOfTransferEncodingSwitches; 688590a0fdSAndre Fischer 698590a0fdSAndre Fischer const ucbhelper::InternetProxyDecider & m_rProxyDecider; 708590a0fdSAndre Fischer 718590a0fdSAndre Fischer DAVRequestEnvironment m_aEnv; 728590a0fdSAndre Fischer 73*3edf6992SAndrea Pescetti static SerfLockStore m_aSerfLockStore; 748590a0fdSAndre Fischer 758590a0fdSAndre Fischer char* getHostinfo(); 768590a0fdSAndre Fischer bool isSSLNeeded(); 778590a0fdSAndre Fischer 7849989859SOliver-Rainer Wittmann SerfRequestProcessor* createReqProc( const rtl::OUString & inPath ); 7949989859SOliver-Rainer Wittmann 80*3edf6992SAndrea Pescetti rtl::OUString composeCurrentUri( const rtl::OUString & inPath ); 81*3edf6992SAndrea Pescetti 828590a0fdSAndre Fischer protected: 838590a0fdSAndre Fischer virtual ~SerfSession(); 848590a0fdSAndre Fischer 858590a0fdSAndre Fischer public: 868590a0fdSAndre Fischer SerfSession( const rtl::Reference< DAVSessionFactory > & rSessionFactory, 878590a0fdSAndre Fischer const rtl::OUString& inUri, 888590a0fdSAndre Fischer const ucbhelper::InternetProxyDecider & rProxyDecider ) 898590a0fdSAndre Fischer throw ( DAVException ); 908590a0fdSAndre Fischer 918590a0fdSAndre Fischer // Serf library callbacks 928590a0fdSAndre Fischer apr_status_t setupSerfConnection( apr_socket_t * inAprSocket, 938590a0fdSAndre Fischer serf_bucket_t **outSerfInputBucket, 948590a0fdSAndre Fischer serf_bucket_t **outSerfOutputBucket, 958590a0fdSAndre Fischer apr_pool_t* inAprPool ); 968590a0fdSAndre Fischer 97fb7f54d2SOliver-Rainer Wittmann apr_status_t provideSerfCredentials( bool bGiveProvidedCredentialsASecondTry, 98fb7f54d2SOliver-Rainer Wittmann char ** outUsername, 998590a0fdSAndre Fischer char ** outPassword, 1008590a0fdSAndre Fischer serf_request_t * inRequest, 1018590a0fdSAndre Fischer int inCode, 1028590a0fdSAndre Fischer const char *inAuthProtocol, 1038590a0fdSAndre Fischer const char *inRealm, 1048590a0fdSAndre Fischer apr_pool_t *inAprPool ); 1058590a0fdSAndre Fischer 106c58749d7SAndre Fischer apr_status_t verifySerfCertificateChain ( 107c58749d7SAndre Fischer int nFailures, 10810e20387SAndre Fischer const serf_ssl_certificate_t * const * pCertificateChainBase64Encoded, 109c58749d7SAndre Fischer int nCertificateChainLength); 1108590a0fdSAndre Fischer 1118590a0fdSAndre Fischer serf_bucket_t* acceptSerfResponse( serf_request_t * inSerfRequest, 1128590a0fdSAndre Fischer serf_bucket_t * inSerfStreamBucket, 1138590a0fdSAndre Fischer apr_pool_t* inAprPool ); 1148590a0fdSAndre Fischer 1158590a0fdSAndre Fischer // Serf-related data structures 1168590a0fdSAndre Fischer apr_pool_t* getAprPool(); 1178590a0fdSAndre Fischer serf_bucket_alloc_t* getSerfBktAlloc(); 1188590a0fdSAndre Fischer serf_context_t* getSerfContext(); 1198590a0fdSAndre Fischer SerfConnection* getSerfConnection(); 1208590a0fdSAndre Fischer 1218590a0fdSAndre Fischer // DAVSession methods 1228590a0fdSAndre Fischer virtual sal_Bool CanUse( const ::rtl::OUString & inUri ); 1238590a0fdSAndre Fischer 1248590a0fdSAndre Fischer virtual sal_Bool UsesProxy(); 1258590a0fdSAndre Fischer getRequestEnvironment() const1268590a0fdSAndre Fischer const DAVRequestEnvironment & getRequestEnvironment() const 1278590a0fdSAndre Fischer { return m_aEnv; } 1288590a0fdSAndre Fischer 1298590a0fdSAndre Fischer // allprop & named 1308590a0fdSAndre Fischer virtual void 1318590a0fdSAndre Fischer PROPFIND( const ::rtl::OUString & inPath, 1328590a0fdSAndre Fischer const Depth inDepth, 1338590a0fdSAndre Fischer const std::vector< ::rtl::OUString > & inPropNames, 1348590a0fdSAndre Fischer std::vector< DAVResource > & ioResources, 1358590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1368590a0fdSAndre Fischer throw ( DAVException ); 1378590a0fdSAndre Fischer 1388590a0fdSAndre Fischer // propnames 1398590a0fdSAndre Fischer virtual void 1408590a0fdSAndre Fischer PROPFIND( const ::rtl::OUString & inPath, 1418590a0fdSAndre Fischer const Depth inDepth, 1428590a0fdSAndre Fischer std::vector< DAVResourceInfo >& ioResInfo, 1438590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1448590a0fdSAndre Fischer throw ( DAVException ); 1458590a0fdSAndre Fischer 1468590a0fdSAndre Fischer virtual void 1478590a0fdSAndre Fischer PROPPATCH( const ::rtl::OUString & inPath, 1488590a0fdSAndre Fischer const std::vector< ProppatchValue > & inValues, 1498590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1508590a0fdSAndre Fischer throw ( DAVException ); 1518590a0fdSAndre Fischer 1528590a0fdSAndre Fischer virtual void 1538590a0fdSAndre Fischer HEAD( const ::rtl::OUString & inPath, 1548590a0fdSAndre Fischer const std::vector< ::rtl::OUString > & inHeaderNames, 1558590a0fdSAndre Fischer DAVResource & ioResource, 1568590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1578590a0fdSAndre Fischer throw ( DAVException ); 1588590a0fdSAndre Fischer 1598590a0fdSAndre Fischer bool isHeadRequestInProgress(); 1608590a0fdSAndre Fischer 1618590a0fdSAndre Fischer virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > 1628590a0fdSAndre Fischer GET( const ::rtl::OUString & inPath, 1638590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1648590a0fdSAndre Fischer throw ( DAVException ); 1658590a0fdSAndre Fischer 1668590a0fdSAndre Fischer virtual void 1678590a0fdSAndre Fischer GET( const ::rtl::OUString & inPath, 1688590a0fdSAndre Fischer com::sun::star::uno::Reference< 1698590a0fdSAndre Fischer com::sun::star::io::XOutputStream > & ioOutputStream, 1708590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1718590a0fdSAndre Fischer throw ( DAVException ); 1728590a0fdSAndre Fischer 1738590a0fdSAndre Fischer virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > 1748590a0fdSAndre Fischer GET( const ::rtl::OUString & inPath, 1758590a0fdSAndre Fischer const std::vector< ::rtl::OUString > & inHeaderNames, 1768590a0fdSAndre Fischer DAVResource & ioResource, 1778590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1788590a0fdSAndre Fischer throw ( DAVException ); 1798590a0fdSAndre Fischer 1808590a0fdSAndre Fischer virtual void 1818590a0fdSAndre Fischer GET( const ::rtl::OUString & inPath, 1828590a0fdSAndre Fischer com::sun::star::uno::Reference< 1838590a0fdSAndre Fischer com::sun::star::io::XOutputStream > & ioOutputStream, 1848590a0fdSAndre Fischer const std::vector< ::rtl::OUString > & inHeaderNames, 1858590a0fdSAndre Fischer DAVResource & ioResource, 1868590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1878590a0fdSAndre Fischer throw ( DAVException ); 1888590a0fdSAndre Fischer 1898590a0fdSAndre Fischer virtual void 1908590a0fdSAndre Fischer PUT( const ::rtl::OUString & inPath, 1918590a0fdSAndre Fischer const com::sun::star::uno::Reference< 1928590a0fdSAndre Fischer com::sun::star::io::XInputStream > & inInputStream, 1938590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 1948590a0fdSAndre Fischer throw ( DAVException ); 1958590a0fdSAndre Fischer 1968590a0fdSAndre Fischer virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > 1978590a0fdSAndre Fischer POST( const rtl::OUString & inPath, 1988590a0fdSAndre Fischer const rtl::OUString & rContentType, 1998590a0fdSAndre Fischer const rtl::OUString & rReferer, 2008590a0fdSAndre Fischer const com::sun::star::uno::Reference< 2018590a0fdSAndre Fischer com::sun::star::io::XInputStream > & inInputStream, 2028590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2038590a0fdSAndre Fischer throw ( DAVException ); 2048590a0fdSAndre Fischer 2058590a0fdSAndre Fischer virtual void 2068590a0fdSAndre Fischer POST( const rtl::OUString & inPath, 2078590a0fdSAndre Fischer const rtl::OUString & rContentType, 2088590a0fdSAndre Fischer const rtl::OUString & rReferer, 2098590a0fdSAndre Fischer const com::sun::star::uno::Reference< 2108590a0fdSAndre Fischer com::sun::star::io::XInputStream > & inInputStream, 2118590a0fdSAndre Fischer com::sun::star::uno::Reference< 2128590a0fdSAndre Fischer com::sun::star::io::XOutputStream > & oOutputStream, 2138590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2148590a0fdSAndre Fischer throw ( DAVException ); 2158590a0fdSAndre Fischer 2168590a0fdSAndre Fischer virtual void 2178590a0fdSAndre Fischer MKCOL( const ::rtl::OUString & inPath, 2188590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2198590a0fdSAndre Fischer throw ( DAVException ); 2208590a0fdSAndre Fischer 2218590a0fdSAndre Fischer virtual void 2228590a0fdSAndre Fischer COPY( const ::rtl::OUString & inSourceURL, 2238590a0fdSAndre Fischer const ::rtl::OUString & inDestinationURL, 2248590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv, 2258590a0fdSAndre Fischer sal_Bool inOverWrite ) 2268590a0fdSAndre Fischer throw ( DAVException ); 2278590a0fdSAndre Fischer 2288590a0fdSAndre Fischer virtual void 2298590a0fdSAndre Fischer MOVE( const ::rtl::OUString & inSourceURL, 2308590a0fdSAndre Fischer const ::rtl::OUString & inDestinationURL, 2318590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv, 2328590a0fdSAndre Fischer sal_Bool inOverWrite ) 2338590a0fdSAndre Fischer throw ( DAVException ); 2348590a0fdSAndre Fischer 2358590a0fdSAndre Fischer virtual void DESTROY( const ::rtl::OUString & inPath, 2368590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2378590a0fdSAndre Fischer throw ( DAVException ); 2388590a0fdSAndre Fischer 2398590a0fdSAndre Fischer // set new lock. 2408590a0fdSAndre Fischer virtual void LOCK( const ::rtl::OUString & inURL, 2418590a0fdSAndre Fischer com::sun::star::ucb::Lock & inLock, 2428590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2438590a0fdSAndre Fischer throw ( DAVException ); 2448590a0fdSAndre Fischer 2458590a0fdSAndre Fischer // refresh existing lock. 2468590a0fdSAndre Fischer virtual sal_Int64 LOCK( const ::rtl::OUString & inURL, 2478590a0fdSAndre Fischer sal_Int64 nTimeout, 2488590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2498590a0fdSAndre Fischer throw ( DAVException ); 2508590a0fdSAndre Fischer 2518590a0fdSAndre Fischer virtual void UNLOCK( const ::rtl::OUString & inURL, 2528590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ) 2538590a0fdSAndre Fischer throw ( DAVException ); 2548590a0fdSAndre Fischer 2558590a0fdSAndre Fischer // helpers 2568590a0fdSAndre Fischer virtual void abort() 2578590a0fdSAndre Fischer throw ( DAVException ); 2588590a0fdSAndre Fischer getHostName() const2598590a0fdSAndre Fischer const rtl::OUString & getHostName() const { return m_aUri.GetHost(); } getPort() const2608590a0fdSAndre Fischer int getPort() const { return m_aUri.GetPort(); } 2618590a0fdSAndre Fischer getMSF()2628590a0fdSAndre Fischer const ::uno::Reference< ::lang::XMultiServiceFactory > getMSF() 2638590a0fdSAndre Fischer { return m_xFactory->getServiceFactory(); } 2648590a0fdSAndre Fischer 2658590a0fdSAndre Fischer sal_Bool isDomainMatch( rtl::OUString certHostName ); 2668590a0fdSAndre Fischer getServerHeaderField()267*3edf6992SAndrea Pescetti const rtl::OUString & getServerHeaderField() { return m_aServerHeaderField; }; 268*3edf6992SAndrea Pescetti setServerHeaderField(rtl::OUString aServerHeaderField)269*3edf6992SAndrea Pescetti void setServerHeaderField( rtl::OUString aServerHeaderField ) { m_aServerHeaderField = aServerHeaderField; }; 270*3edf6992SAndrea Pescetti 2718590a0fdSAndre Fischer private: 2728590a0fdSAndre Fischer friend class SerfLockStore; 2738590a0fdSAndre Fischer 2748590a0fdSAndre Fischer void Init( void ) 2758590a0fdSAndre Fischer throw ( DAVException ); 2768590a0fdSAndre Fischer 2778590a0fdSAndre Fischer void Init( const DAVRequestEnvironment & rEnv ) 2788590a0fdSAndre Fischer throw ( DAVException ); 2798590a0fdSAndre Fischer 28049989859SOliver-Rainer Wittmann void HandleError( boost::shared_ptr<SerfRequestProcessor> rReqProc ) 2818590a0fdSAndre Fischer throw ( DAVException ); 2828590a0fdSAndre Fischer 2838590a0fdSAndre Fischer const ucbhelper::InternetProxyServer & getProxySettings() const; 2848590a0fdSAndre Fischer 2858590a0fdSAndre Fischer bool removeExpiredLocktoken( const rtl::OUString & inURL, 2868590a0fdSAndre Fischer const DAVRequestEnvironment & rEnv ); 2878590a0fdSAndre Fischer 2888590a0fdSAndre Fischer // refresh lock, called by SerfLockStore::refreshLocks 2898590a0fdSAndre Fischer bool LOCK( SerfLock * pLock, 2908590a0fdSAndre Fischer sal_Int32 & rlastChanceToSendRefreshRequest ); 2918590a0fdSAndre Fischer 2928590a0fdSAndre Fischer // unlock, called by SerfLockStore::~SerfLockStore 2938590a0fdSAndre Fischer bool UNLOCK( SerfLock * pLock ); 2948590a0fdSAndre Fischer 2958590a0fdSAndre Fischer /* 2968590a0fdSAndre Fischer // low level GET implementation, used by public GET implementations 2978590a0fdSAndre Fischer static int GET( SerfConnection * sess, 2988590a0fdSAndre Fischer const char * uri, 2998590a0fdSAndre Fischer //ne_block_reader reader, 3008590a0fdSAndre Fischer bool getheaders, 3018590a0fdSAndre Fischer void * userdata ); 3028590a0fdSAndre Fischer 3038590a0fdSAndre Fischer // Buffer-based PUT implementation. Serf only has file descriptor- 3048590a0fdSAndre Fischer // based API. 3058590a0fdSAndre Fischer static int PUT( SerfConnection * sess, 3068590a0fdSAndre Fischer const char * uri, 3078590a0fdSAndre Fischer const char * buffer, 3088590a0fdSAndre Fischer size_t size ); 3098590a0fdSAndre Fischer 3108590a0fdSAndre Fischer // Buffer-based POST implementation. Serf only has file descriptor- 3118590a0fdSAndre Fischer // based API. 3128590a0fdSAndre Fischer int POST( SerfConnection * sess, 3138590a0fdSAndre Fischer const char * uri, 3148590a0fdSAndre Fischer const char * buffer, 3158590a0fdSAndre Fischer //ne_block_reader reader, 3168590a0fdSAndre Fischer void * userdata, 3178590a0fdSAndre Fischer const rtl::OUString & rContentType, 3188590a0fdSAndre Fischer const rtl::OUString & rReferer ); 3198590a0fdSAndre Fischer */ 3208590a0fdSAndre Fischer 3218590a0fdSAndre Fischer // Helper: XInputStream -> Sequence< sal_Int8 > 3228590a0fdSAndre Fischer static bool getDataFromInputStream( 3238590a0fdSAndre Fischer const com::sun::star::uno::Reference< 3248590a0fdSAndre Fischer com::sun::star::io::XInputStream > & xStream, 3258590a0fdSAndre Fischer com::sun::star::uno::Sequence< sal_Int8 > & rData, 3268590a0fdSAndre Fischer bool bAppendTrailingZeroByte ); 3278590a0fdSAndre Fischer 3288590a0fdSAndre Fischer /* 3298590a0fdSAndre Fischer rtl::OUString makeAbsoluteURL( rtl::OUString const & rURL ) const; 3308590a0fdSAndre Fischer */ 3318590a0fdSAndre Fischer }; 3328590a0fdSAndre Fischer 3338590a0fdSAndre Fischer } // namespace http_dav_ucp 3348590a0fdSAndre Fischer 3358590a0fdSAndre Fischer #endif // INCLUDED_SERFSESSION_HXX 336