Files
create/src/Mod/Cloud/App/AppCloud.h
2022-03-21 00:13:22 +01:00

215 lines
7.8 KiB
C++

/***************************************************************************
* 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 <App/Document.h>
#include <Base/Base64.h>
#include <Base/Interpreter.h>
#include <Base/Reader.h>
#include <Base/Writer.h>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/framework/XMLPScanToken.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
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<Cloud::CloudReader::FileEntry*> 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<Module>
{
public:
Module() : Py::ExtensionModule<Module>("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);