xref: /AOO41X/main/ucb/source/ucp/webdav/SerfSession.hxx (revision 3edf699282957a8d2e0e344ed73ba96dfb5a45a4)
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