1 /********************************************************************** 2 * Project: CPL - Common Portability Library 3 * Purpose: Google Cloud Storage routines 4 * Author: Even Rouault <even.rouault at spatialys.com> 5 * 6 ********************************************************************** 7 * Copyright (c) 2017, Even Rouault <even.rouault at spatialys.com> 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included 17 * in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 * DEALINGS IN THE SOFTWARE. 26 ****************************************************************************/ 27 28 #ifndef CPL_GOOGLE_CLOUD_INCLUDED_H 29 #define CPL_GOOGLE_CLOUD_INCLUDED_H 30 31 #ifndef DOXYGEN_SKIP 32 33 #include <cstddef> 34 35 #include "cpl_string.h" 36 37 #ifdef HAVE_CURL 38 39 #include <curl/curl.h> 40 #include "cpl_http.h" 41 #include "cpl_aws.h" 42 #include <map> 43 44 class VSIGSHandleHelper final: public IVSIS3LikeHandleHelper 45 { 46 CPL_DISALLOW_COPY_ASSIGN(VSIGSHandleHelper) 47 48 CPLString m_osURL; 49 CPLString m_osEndpoint; 50 CPLString m_osBucketObjectKey; 51 CPLString m_osSecretAccessKey; 52 CPLString m_osAccessKeyId; 53 bool m_bUseHeaderFile; 54 GOA2Manager m_oManager; 55 56 static bool GetConfiguration(CSLConstList papszOptions, 57 CPLString& osSecretAccessKey, 58 CPLString& osAccessKeyId, 59 CPLString& osHeaderFile, 60 GOA2Manager& oManager); 61 62 static bool GetConfigurationFromConfigFile( 63 CPLString& osSecretAccessKey, 64 CPLString& osAccessKeyId, 65 CPLString& osOAuth2RefreshToken, 66 CPLString& osOAuth2ClientId, 67 CPLString& osOAuth2ClientSecret, 68 CPLString& osCredentials); 69 70 void RebuildURL() override; 71 72 public: 73 VSIGSHandleHelper(const CPLString& osEndpoint, 74 const CPLString& osBucketObjectKey, 75 const CPLString& osSecretAccessKey, 76 const CPLString& osAccessKeyId, 77 bool bUseHeaderFile, 78 const GOA2Manager& oManager); 79 ~VSIGSHandleHelper(); 80 81 static VSIGSHandleHelper* BuildFromURI(const char* pszURI, 82 const char* pszFSPrefix, 83 CSLConstList papszOptions = nullptr); 84 85 struct curl_slist* GetCurlHeaders( 86 const CPLString& osVerbosVerb, 87 const struct curl_slist* psExistingHeaders, 88 const void *pabyDataContent = nullptr, 89 size_t nBytesContent = 0) const override; 90 GetURL()91 const CPLString& GetURL() const override { return m_osURL; } 92 GetCopySourceHeader()93 CPLString GetCopySourceHeader() const override { return "x-goog-copy-source"; } 94 95 CPLString GetSignedURL(CSLConstList papszOptions); 96 97 static void CleanMutex(); 98 static void ClearCache(); 99 }; 100 101 #endif /* HAVE_CURL */ 102 103 #endif /* #ifndef DOXYGEN_SKIP */ 104 105 #endif /* CPL_GOOGLE_CLOUD_INCLUDED_H */ 106