/*************************************************************************** * Copyright (c) 2019 Jean-Marie Verdun jmverdun3@gmail.com * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include XERCES_CPP_NAMESPACE_BEGIN class DOMNode; class DOMText; XERCES_CPP_NAMESPACE_END namespace Cloud { struct AmzData { std::string digest; char dateFormatted[256]; char ContentType[256]; char Host[256]; char *MD5; }; struct AmzDatav4 { std::string digest; char dateFormattedS[256]; char dateFormattedD[256]; char ContentType[256]; char Host[256]; std::string Region; char *MD5; char *SHA256Sum; }; std::string getHexValue(unsigned char *input, unsigned int HMACLength); void eraseSubStr(std::string & Str, const std::string & toErase); size_t CurlWrite_CallbackFunc_StdString(void *contents, size_t size, size_t nmemb, std::string *s); struct AmzData *ComputeDigestAmzS3v2(char *operation, char *data_type, const char *target, const char *Secret, const char *ptr, long size); struct AmzDatav4 *ComputeDigestAmzS3v4(char *operation, const char *server, char *data_type, const char *target, const char *Secret, const char *ptr, long size, char *parameters, std::string Region); struct curl_slist *BuildHeaderAmzS3v2(const char *URL, const char *TCPPort, const char *PublicKey, struct AmzData *Data); struct curl_slist *BuildHeaderAmzS3v4(const char *URL, const char *PublicKey, struct AmzDatav4 *Data); char *MD5Sum(const char *ptr, long size); char *SHA256Sum(const char *ptr, long size); class CloudAppExport CloudReader { public: CloudReader(const char* URL, const char* AccessKey, const char* SecretKey, const char* TCPPort, const char* Bucket,std::string ProtocolVersion, std::string Region); virtual ~CloudReader(); int file=0; int continuation=0; int truncated=0; struct FileEntry { char FileName[1024]; std::stringstream FileStream; int touch=0; }; void checkText(XERCES_CPP_NAMESPACE_QUALIFIER DOMText* text); void checkXML(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node); void checkElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* element); void addFile(struct Cloud::CloudReader::FileEntry *new_entry); struct FileEntry *GetEntry(std::string FileName); void DownloadFile(Cloud::CloudReader::FileEntry *entry); int isTouched(std::string FileName); protected: std::list FileList; char* NextFileName; const char* URL; const char* TCPPort; const char* TokenAuth; const char* TokenSecret; const char* Bucket; std::string ProtocolVersion; std::string Region; }; class Module : public Py::ExtensionModule { public: Module() : Py::ExtensionModule("Cloud") { add_varargs_method("URL",&Module::sCloudURL, "URL(string) -- Connect to a Cloud Storage service." ); add_varargs_method("TokenAuth",&Module::sCloudTokenAuth, "TokenAuth(string) -- Token Authorization string." ); add_varargs_method("TokenSecret",&Module::sCloudTokenSecret, "TokenSecret(string) -- Token Secret string." ); add_varargs_method("TCPPort",&Module::sCloudTCPPort, "TCPPort(string) -- Port number." ); add_varargs_method("Save",&Module::sCloudSave, "Save(string) -- Save the active document to the Cloud." ); add_varargs_method("Restore",&Module::sCloudRestore, "Restore(string) -- Restore to the active document from the Cloud." ); add_varargs_method("ProtocolVersion",&Module::sCloudProtocolVersion, "ProtocolVersion(string) -- Specify Amazon s3 protocol version (2 or 4)" ); add_varargs_method("Region",&Module::sCloudRegion, "Region(string) -- Specify Amazon s3 Region" ); initialize("This module is the Cloud module."); // register with Python } virtual ~Module() {} App::PropertyString URL; App::PropertyString TCPPort; App::PropertyString TokenAuth; App::PropertyString TokenSecret; App::PropertyString ProtocolVersion; App::PropertyString Region; bool cloudSave(const char* BucketName); bool cloudRestore(const char* BucketName); void LinkXSetValue(std::string filename); private: Py::Object sCloudURL (const Py::Tuple& args); Py::Object sCloudTokenAuth (const Py::Tuple& args); Py::Object sCloudTokenSecret (const Py::Tuple& args); Py::Object sCloudTCPPort (const Py::Tuple& args); Py::Object sCloudSave (const Py::Tuple& args); Py::Object sCloudRestore (const Py::Tuple& args); Py::Object sCloudProtocolVersion (const Py::Tuple& args); Py::Object sCloudRegion (const Py::Tuple& args); }; PyObject* initModule() { return Base::Interpreter().addModule(new Module); } // This class is writing files to an S3 cloud storage class class CloudAppExport CloudWriter : public Base::Writer { public: int print=0; char errorCode[1024]=""; CloudWriter(const char* URL, const char* TokenAuth, const char* TokenSecret, const char* TCPPort, const char* Bucket, std::string ProtocolVersion, std::string Region); virtual ~CloudWriter(); void pushCloud(const char *FileName, const char *data, long size); void putNextEntry(const char* file); void createBucket(); virtual void writeFiles(void); virtual std::ostream &Stream(void){return FileStream;} virtual bool shouldWrite(const std::string& name, const Base::Persistence *Object) const; void checkText(XERCES_CPP_NAMESPACE_QUALIFIER DOMText* text); void checkXML(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node); void checkElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* element); protected: std::string FileName; const char* URL; const char* TCPPort; const char* TokenAuth; const char* TokenSecret; const char* Bucket; std::string ProtocolVersion; std::string Region; std::stringstream FileStream; }; } void readFiles(Cloud::CloudReader reader, Base::XMLReader *xmlreader);