APPLEMAIL-24
Volker Birk 5 years ago
parent 4ee02a75cf
commit e9e2e0a396

@ -151,7 +151,8 @@ namespace pEp {
http::read(*_stream, b, _parser);
auto cl = header()["Content-Disposition"];
static auto filename_pattern = "attachment;\\s*filename..(?<filename>[^\"]+).";
static auto filename_pattern =
"attachment;\\s*filename=\"(?<filename>([^\"\\/:.]+\\.?)+)\"";
static boost::regex e(filename_pattern);
boost::match_results<string::const_iterator> what;
if (cl.size() && boost::regex_match(string(cl.data(), cl.size()), what, e))

@ -26,13 +26,13 @@ namespace pEp {
UpdateDevice::UpdateDevice(const product p)
: _https({HTTPSDevice()}, ios::binary), _p(p),
_key(32), _src(nullptr)
_key(32), _src(nullptr), _str(nullptr)
{
}
UpdateDevice::UpdateDevice(const UpdateDevice& second)
: _https({HTTPSDevice()}, ios::binary), _p(second._p),
_key(32), _src(nullptr)
_key(32), _src(nullptr), _str(nullptr)
{
}
@ -40,6 +40,7 @@ namespace pEp {
{
close();
delete _src;
delete _str;
}
void UpdateDevice::open(CryptoPP::RSA::PublicKey update_key)
@ -79,15 +80,29 @@ namespace pEp {
byte iv[12];
_https->read((char *) iv, sizeof(iv));
string snk;
_delivery_decryptor.SetKeyWithIV(_key, _key.size(), iv, sizeof(iv));
_src = new CryptoPP::FileSource(_https, true,
new CryptoPP::AuthenticatedDecryptionFilter(
_delivery_decryptor,
new CryptoPP::StringSink(snk)
)
);
_str = stringstream(snk);
if (filename() == "") {
string snk;
_delivery_decryptor.SetKeyWithIV(_key, _key.size(), iv, sizeof(iv));
_src = new CryptoPP::FileSource(_https, true,
new CryptoPP::AuthenticatedDecryptionFilter(
_delivery_decryptor,
new CryptoPP::StringSink(snk)
)
);
delete _str;
_str = new stringstream(snk);
}
else {
_delivery_decryptor.SetKeyWithIV(_key, _key.size(), iv, sizeof(iv));
_src = new CryptoPP::FileSource(_https, true,
new CryptoPP::AuthenticatedDecryptionFilter(
_delivery_decryptor,
new CryptoPP::FileSink(filename().c_str(), true)
)
);
delete _str;
_str = nullptr;
}
}
void UpdateDevice::close()
@ -95,15 +110,17 @@ namespace pEp {
_https->close();
delete _src;
_src = nullptr;
delete _str;
_str = nullptr;
}
streamsize UpdateDevice::read(char* s, streamsize n)
{
if (_str.eof())
if (!_str || _str->eof())
return -1;
_str.read(s, n);
return _str.gcount();
_str->read(s, n);
return _str->gcount();
}
}
}

@ -35,7 +35,7 @@ namespace pEp {
CryptoPP::GCM< CryptoPP::AES >::Decryption _delivery_decryptor;
CryptoPP::SecByteBlock _key;
CryptoPP::FileSource *_src;
stringstream _str;
iostream *_str;
public:
UpdateDevice(const product p);

@ -17,12 +17,19 @@ int main()
cout << "downloading...\n";
PublicKey update_key = load_key("public.der");
us->open(update_key);
cout << "downloaded " << us->filename() << "\n";
ofstream of(us->filename());
of << us.rdbuf();
try {
us->open(update_key);
}
catch (exception&) { }
if (us->filename() != "") {
cout << "downloaded " << us->filename() << "\n";
}
else {
stringstream str;
str << us.rdbuf();
cout << str.str() << "\n";
}
return 0;
}

Loading…
Cancel
Save