Browse Source

Formatting only - K&R 1TBS is the standard here

PYADPT-96_init_version
heck 5 years ago
parent
commit
f40ca8d8e6
  1. 35
      setup.py
  2. 4
      src/pEp/__init__.py
  3. 295
      src/pEp/native_pEp/basic_api.cc
  4. 33
      src/pEp/native_pEp/basic_api.hh
  5. 488
      src/pEp/native_pEp/identity.cc
  6. 125
      src/pEp/native_pEp/identity.hh
  7. 708
      src/pEp/native_pEp/message.cc
  8. 224
      src/pEp/native_pEp/message.hh
  9. 301
      src/pEp/native_pEp/message_api.cc
  10. 27
      src/pEp/native_pEp/message_api.hh
  11. 1033
      src/pEp/native_pEp/pEpmodule.cc
  12. 31
      src/pEp/native_pEp/pEpmodule.hh
  13. 308
      src/pEp/native_pEp/str_attr.cc
  14. 133
      src/pEp/native_pEp/user_interface.cc
  15. 59
      src/pEp/native_pEp/user_interface.hh

35
setup.py

@ -27,10 +27,10 @@ def pEpLog(*msg):
msgstr += str(m) msgstr += str(m)
msgstr += separator msgstr += separator
func = inspect.currentframe().f_back.f_code func = inspect.currentframe().f_back.f_code
print(func.co_filename + " : " + func.co_name + " : " + msgstr) print(func.co_filename + " : " + func.co_name + " : " + msgstr)
class BuildExtCommand(build_ext):
class BuildExtCommand(build_ext):
user_options = build_ext.user_options + [ user_options = build_ext.user_options + [
('local', None, 'Use local pEp install in HOME/USERPROFILE for libs/includes'), ('local', None, 'Use local pEp install in HOME/USERPROFILE for libs/includes'),
('prefix=', None, 'Use local pEp install in prefix for libs/includes'), ('prefix=', None, 'Use local pEp install in prefix for libs/includes'),
@ -155,15 +155,15 @@ class BuildExtCommand(build_ext):
# Append home-dir # Append home-dir
if self.local: if self.local:
pEpLog("local mode") pEpLog("local mode")
home_include=[ join(home, 'include') ] home_include = [join(home, 'include')]
home_libdirs=[ join(home, 'lib') ] home_libdirs = [join(home, 'lib')]
includes += home_include includes += home_include
libdirs += home_libdirs libdirs += home_libdirs
# Append prefix-dir # Append prefix-dir
if self.prefix: if self.prefix:
prefix_include=[ join(self.prefix, 'include') ] prefix_include = [join(self.prefix, 'include')]
prefix_libdirs=[ join(self.prefix, 'lib') ] prefix_libdirs = [join(self.prefix, 'lib')]
includes += prefix_include includes += prefix_include
libdirs += prefix_libdirs libdirs += prefix_libdirs
@ -194,7 +194,7 @@ class BuildExtCommand(build_ext):
if sys.platform == 'winnt': if sys.platform == 'winnt':
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
import winreg import winreg
else: else:
import _winreg as winreg import _winreg as winreg
@ -202,18 +202,17 @@ if sys.platform == 'winnt':
if sys.version_info[0] < 3: if sys.version_info[0] < 3:
FileNotFoundError = EnvironmentError FileNotFoundError = EnvironmentError
module_pEp = Extension( module_pEp = Extension(
'native_pEp', 'native_pEp',
sources = [ sources=[
'src/pEp/native_pEp/pEpmodule.cc', 'src/pEp/native_pEp/pEpmodule.cc',
'src/pEp/native_pEp/basic_api.cc', 'src/pEp/native_pEp/basic_api.cc',
'src/pEp/native_pEp/identity.cc', 'src/pEp/native_pEp/identity.cc',
'src/pEp/native_pEp/message.cc', 'src/pEp/native_pEp/message.cc',
'src/pEp/native_pEp/message_api.cc', 'src/pEp/native_pEp/message_api.cc',
'src/pEp/native_pEp/str_attr.cc', 'src/pEp/native_pEp/str_attr.cc',
# 'src/pEp/native_pEp/user_interface.cc', # 'src/pEp/native_pEp/user_interface.cc',
], ],
) )
# "MAIN" Function # "MAIN" Function
@ -225,7 +224,7 @@ setup(
author_email="vb@pep-project.org", author_email="vb@pep-project.org",
maintainer="Heck", maintainer="Heck",
maintainer_email="heck@pep.foundation", maintainer_email="heck@pep.foundation",
package_dir={'':'src'}, package_dir={'': 'src'},
packages=['pEp'], packages=['pEp'],
ext_modules=[module_pEp], ext_modules=[module_pEp],
cmdclass={ cmdclass={

4
src/pEp/__init__.py

@ -11,6 +11,7 @@ from native_pEp import *
# import the module # import the module
import native_pEp import native_pEp
# Executed on module import # Executed on module import
def init(): def init():
print(init, "called") print(init, "called")
@ -45,8 +46,9 @@ def notify_handshake(me, partner, signal):
def main(): def main():
print("I am being run as a script") print("I am being run as a script")
# MAIN # MAIN
if __name__ == "__main__": if __name__ == "__main__":
main() main()
else: else:
init() init()

295
src/pEp/native_pEp/basic_api.cc

@ -13,160 +13,149 @@
#include "basic_api.hh" #include "basic_api.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using namespace std; using namespace std;
void update_identity(Identity& ident) void update_identity(Identity &ident) {
{ if (ident.address() == "")
if (ident.address() == "") throw invalid_argument("address needed");
throw invalid_argument("address needed"); if (ident.user_id() == PEP_OWN_USERID)
if (ident.user_id() == PEP_OWN_USERID) throw runtime_error("update_identity: '"
throw runtime_error("update_identity: '" PEP_OWN_USERID PEP_OWN_USERID
"' may only be used for own identities"); "' may only be used for own identities");
PEP_STATUS status = update_identity(Adapter::session(), ident); PEP_STATUS status = update_identity(Adapter::session(), ident);
_throw_status(status); _throw_status(status);
} }
void myself(Identity& ident) void myself(Identity &ident) {
{ if (ident.address() == "")
if (ident.address() == "") throw invalid_argument("address needed");
throw invalid_argument("address needed"); if (ident.username() == "")
if (ident.username() == "") throw invalid_argument("username needed");
throw invalid_argument("username needed");
if (ident.user_id() == "")
if (ident.user_id() == "") ident.user_id(ident.address());
ident.user_id(ident.address());
PEP_STATUS status = myself(Adapter::session(), ident);
PEP_STATUS status = myself(Adapter::session(), ident); _throw_status(status);
_throw_status(status); }
}
string _trustwords(Identity me, Identity partner, string lang, bool full) {
string _trustwords(Identity me, Identity partner, string lang, bool full) if (me.fpr() == "" || partner.fpr() == "")
{ throw invalid_argument("fingerprint needed in Identities");
if (me.fpr() == "" || partner.fpr() == "")
throw invalid_argument("fingerprint needed in Identities"); if (lang == "" && me.lang() == partner.lang())
lang = me.lang();
if (lang == "" && me.lang() == partner.lang())
lang = me.lang(); char *words = NULL;
size_t size = 0;
char *words = NULL; PEP_STATUS status = get_trustwords(Adapter::session(), me, partner,
size_t size = 0; lang.c_str(), &words, &size, full);
PEP_STATUS status = get_trustwords(Adapter::session(), me, partner, _throw_status(status);
lang.c_str(),&words, &size, full); return words;
_throw_status(status); }
return words;
} void trust_personal_key(Identity ident) {
if (ident.fpr() == "")
void trust_personal_key(Identity ident) throw invalid_argument("fingerprint needed in Identities");
{ if (ident.user_id() == "")
if (ident.fpr() == "") throw invalid_argument("user_id must be provided");
throw invalid_argument("fingerprint needed in Identities");
if (ident.user_id() == "") PEP_STATUS status = trust_personal_key(Adapter::session(), ident);
throw invalid_argument("user_id must be provided"); _throw_status(status);
}
PEP_STATUS status = trust_personal_key(Adapter::session(), ident);
_throw_status(status); void set_identity_flags(Identity ident, identity_flags_t flags) {
} if (ident.address() == "")
throw invalid_argument("address needed");
void set_identity_flags(Identity ident, identity_flags_t flags) if (ident.user_id() == "")
{ throw invalid_argument("user_id needed");
if (ident.address() == "")
throw invalid_argument("address needed"); PEP_STATUS status = set_identity_flags(Adapter::session(), ident, flags);
if (ident.user_id() == "") _throw_status(status);
throw invalid_argument("user_id needed"); }
PEP_STATUS status = set_identity_flags(Adapter::session(), ident, flags); void unset_identity_flags(Identity ident, identity_flags_t flags) {
_throw_status(status); if (ident.address() == "")
} throw invalid_argument("address needed");
if (ident.user_id() == "")
void unset_identity_flags(Identity ident, identity_flags_t flags) throw invalid_argument("user_id needed");
{
if (ident.address() == "") PEP_STATUS status = unset_identity_flags(Adapter::session(), ident, flags);
throw invalid_argument("address needed"); _throw_status(status);
if (ident.user_id() == "") }
throw invalid_argument("user_id needed");
void key_reset_trust(Identity ident) {
PEP_STATUS status = unset_identity_flags(Adapter::session(), ident, flags); if (ident.fpr() == "")
_throw_status(status); throw invalid_argument("fpr needed");
} if (ident.address() == "")
throw invalid_argument("address needed");
void key_reset_trust(Identity ident) if (ident.user_id() == "")
{ throw invalid_argument("user_id needed");
if (ident.fpr() == "")
throw invalid_argument("fpr needed"); PEP_STATUS status = key_reset_trust(Adapter::session(), ident);
if (ident.address() == "") _throw_status(status);
throw invalid_argument("address needed"); }
if (ident.user_id() == "")
throw invalid_argument("user_id needed");
boost::python::list import_key(string key_data) {
PEP_STATUS status = key_reset_trust(Adapter::session(), ident); ::identity_list *private_keys = NULL;
_throw_status(status); PEP_STATUS status = ::import_key(Adapter::session(), key_data.c_str(), key_data.size(), &private_keys);
} if (status && status != PEP_KEY_IMPORTED)
_throw_status(status);
auto result = boost::python::list();
boost::python::list import_key(string key_data) for (::identity_list *il = private_keys; il && il->ident; il = il->next) {
{ ::pEp_identity *ident = ::identity_dup(il->ident);
::identity_list *private_keys = NULL; if (!ident) {
PEP_STATUS status = ::import_key(Adapter::session(), key_data.c_str(), key_data.size(), &private_keys); free_identity_list(private_keys);
if (status && status != PEP_KEY_IMPORTED) throw bad_alloc();
_throw_status(status); }
result.append(Identity(ident));
auto result = boost::python::list(); }
for (::identity_list *il = private_keys; il && il->ident; il=il->next) {
::pEp_identity *ident = ::identity_dup(il->ident);
if (!ident) {
free_identity_list(private_keys); free_identity_list(private_keys);
throw bad_alloc(); return result;
}
string export_key(Identity ident) {
PEP_STATUS status = PEP_STATUS_OK;
char *key_data = NULL;
size_t size;
status = ::export_key(Adapter::session(), ident.fpr().c_str(), &key_data, &size);
_throw_status(status);
return key_data;
} }
result.append(Identity(ident));
} string export_secret_key(Identity ident) {
PEP_STATUS status = PEP_STATUS_OK;
free_identity_list(private_keys); char *key_data = NULL;
return result; size_t size;
} status = ::export_secret_key(Adapter::session(), ident.fpr().c_str(), &key_data, &size);
string export_key(Identity ident) _throw_status(status);
{ return key_data;
PEP_STATUS status = PEP_STATUS_OK; }
char* key_data = NULL;
size_t size; void set_own_key(Identity &ident, string fpr) {
status = ::export_key(Adapter::session(), ident.fpr().c_str(), &key_data, &size); if (ident.address() == "")
throw invalid_argument("address needed");
_throw_status(status); if (ident.username() == "")
return key_data; throw invalid_argument("username needed");
} if (ident.user_id() == "")
throw invalid_argument("user_id needed");
string export_secret_key(Identity ident) if (fpr == "")
{ throw invalid_argument("fpr needed");
PEP_STATUS status = PEP_STATUS_OK;
char* key_data = NULL;
size_t size; const char *fpr_c = fpr.c_str();
status = ::export_secret_key(Adapter::session(), ident.fpr().c_str(), &key_data, &size); PEP_STATUS status = set_own_key(Adapter::session(), ident, fpr_c);
_throw_status(status);
_throw_status(status); }
return key_data;
} } // namespace PythonAdapter
} // namespace pEp
void set_own_key(Identity& ident, string fpr)
{
if (ident.address() == "")
throw invalid_argument("address needed");
if (ident.username() == "")
throw invalid_argument("username needed");
if (ident.user_id() == "")
throw invalid_argument("user_id needed");
if (fpr == "")
throw invalid_argument("fpr needed");
const char* fpr_c = fpr.c_str();
PEP_STATUS status = set_own_key(Adapter::session(), ident, fpr_c);
_throw_status(status);
}
} // namespace PythonAdapter
} // namespace pEp {

33
src/pEp/native_pEp/basic_api.hh

@ -7,24 +7,31 @@
#include "pEpmodule.hh" #include "pEpmodule.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
void update_identity(Identity& ident); void update_identity(Identity &ident);
void myself(Identity& ident);
string _trustwords(Identity me, Identity partner, string lang, bool full);
void trust_personal_key(Identity ident);
void set_identity_flags(Identity ident, identity_flags_t flags); void myself(Identity &ident);
void unset_identity_flags(Identity ident, identity_flags_t flags);
void key_reset_trust(Identity ident); string _trustwords(Identity me, Identity partner, string lang, bool full);
boost::python::list import_key(string key_data); void trust_personal_key(Identity ident);
string export_key(Identity ident);
string export_secret_key(Identity ident);
void set_own_key(Identity& ident, string fpr);
} /* namespace PythonAdapter */ void set_identity_flags(Identity ident, identity_flags_t flags);
void unset_identity_flags(Identity ident, identity_flags_t flags);
void key_reset_trust(Identity ident);
boost::python::list import_key(string key_data);
string export_key(Identity ident);
string export_secret_key(Identity ident);
void set_own_key(Identity &ident, string fpr);
} /* namespace PythonAdapter */
} /* namespace pEp */ } /* namespace pEp */
#endif /* BASIC_API_HH */ #endif /* BASIC_API_HH */

488
src/pEp/native_pEp/identity.cc

@ -17,269 +17,241 @@
#include "message_api.hh" #include "message_api.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using namespace std; using namespace std;
using namespace boost::python; using namespace boost::python;
Identity::Identity(string address, string username, string user_id, Identity::Identity(string address, string username, string user_id,
string fpr, int comm_type, string lang, identity_flags_t flags) string fpr, int comm_type, string lang, identity_flags_t flags)
: _ident(new_identity(address.c_str(), fpr.c_str(), user_id.c_str(), : _ident(new_identity(address.c_str(), fpr.c_str(), user_id.c_str(),
username.c_str()), &::free_identity) username.c_str()), &::free_identity) {
{ if (!_ident)
if (!_ident) throw bad_alloc();
throw bad_alloc(); _ident->comm_type = (PEP_comm_type) comm_type;
_ident->comm_type = (PEP_comm_type) comm_type; _ident->flags = (identity_flags_t) flags;
_ident->flags = (identity_flags_t) flags; this->lang(lang);
this->lang(lang);
}
Identity::Identity(const Identity& second)
: _ident(second._ident)
{
}
Identity::Identity(pEp_identity *ident)
: _ident(ident, &::free_identity)
{
}
Identity::~Identity()
{
}
Identity::operator pEp_identity *()
{
return _ident.get();
}
Identity::operator const pEp_identity *() const
{
return _ident.get();
}
string Identity::_repr()
{
stringstream build;
build << "Identity(";
string address;
if (_ident->address)
address = string(_ident->address);
build << repr(address) << ", ";
string username;
if (_ident->username)
username = string(_ident->username);
build << repr(username) << ", ";
string user_id;
if (_ident->user_id)
user_id = string(_ident->user_id);
build << repr(user_id) << ", ";
string fpr;
if (_ident->fpr)
fpr = string(_ident->fpr);
build << repr(fpr) << ", ";
build << (int) _ident->comm_type << ", ";
string lang = _ident->lang;
build << repr(lang) << ")";
return build.str();
}
string Identity::_str()
{
if (!(_ident->address && _ident->address[0]))
return "";
if (!(_ident->username && _ident->username[0]))
return _ident->address;
return string(_ident->username) + " <" + _ident->address + ">";
}
void Identity::username(string value)
{
if (value.length() && value.length() < 5)
throw length_error("username must be at least 5 characters");
str_attr(_ident->username, value);
}
void Identity::lang(string value)
{
if (value == "")
memset(_ident->lang, 0, 3);
else if (value.length() != 2)
throw length_error("length of lang must be 2");
else
memcpy(_ident->lang, value.c_str(), 3);
}
string Identity::lang()
{
return _ident->lang;
}
int Identity::rating()
{
if (!(_ident->address))
throw invalid_argument("address must be given");
PEP_rating rating = PEP_rating_undefined;
PEP_STATUS status = ::identity_rating(Adapter::session(), _ident.get(), &rating);
_throw_status(status);
return (int) rating;
}
PEP_color Identity::color()
{
return _color(rating());
}
Identity Identity::copy()
{
pEp_identity *dup = ::identity_dup(*this);
if (!dup)
throw bad_alloc();
return Identity(dup);
}
Identity Identity::deepcopy(dict&)
{
return copy();
}
void Identity::update()
{
update_identity(*this);
}
void Identity::key_reset(string fpr)
{
PEP_STATUS status = ::key_reset_identity(Adapter::session(), *this,
fpr != "" ? fpr.c_str() : nullptr);
_throw_status(status);
}
void Identity::key_mistrusted()
{
PEP_STATUS status = ::key_mistrusted(Adapter::session(), *this);
_throw_status(status);
}
bool Identity::is_pEp_user()
{
bool result;
PEP_STATUS status = ::is_pEp_user(Adapter::session(), *this, &result);
_throw_status(status);
return result;
}
void Identity::enable_for_sync()
{
PEP_STATUS status = ::enable_identity_for_sync(Adapter::session(), *this);
_throw_status(status);
}
void Identity::disable_for_sync()
{
PEP_STATUS status = ::disable_identity_for_sync(Adapter::session(), *this);
_throw_status(status);
}
Myself::Myself(string address, string username, string user_id, string lang)
: Identity(address, username, user_id, "", 0, lang)
{
if (!(address.length() && username.length()))
throw invalid_argument("address and username must be set");
if (lang.length() && lang.length() != 2)
throw length_error("lang must be an ISO 639-1 language code or empty");
// FIXME: should set .me
// _ident->me = true;
if (user_id.length())
throw runtime_error("user_id feature not yet implemented for Myself");
}
void Myself::update()
{
pEp::PythonAdapter::myself(*this);
}
Identity identity_attr(pEp_identity *&ident)
{
if (!ident)
throw out_of_range("no identity assigned");
pEp_identity *_dup = identity_dup(ident);
if (!_dup)
throw bad_alloc();
Identity _ident(_dup);
return _ident;
}
void identity_attr(pEp_identity *&ident, object value)
{
Identity& _ident = extract< Identity& >(value);
pEp_identity *_dup = ::identity_dup(_ident);
if (!_dup)
throw bad_alloc();
PEP_STATUS status = update_identity(Adapter::session(), _dup);
_throw_status(status);
free_identity(ident);
ident = _dup;
}
boost::python::list identitylist_attr(identity_list *&il)
{
boost::python::list result;
for (identity_list *_il = il; _il && _il->ident; _il = _il->next) {
pEp_identity *ident = ::identity_dup(_il->ident);
if (!ident)
throw bad_alloc();
result.append(object(Identity(ident)));
}
return result;
}
void identitylist_attr(identity_list *&il, boost::python::list value)
{
identity_list *_il = new_identity_list(NULL);
if (!_il)
throw bad_alloc();
identity_list *_i = _il;
for (int i=0; i<len(value); i++) {
extract< Identity& > extract_identity(value[i]);
if (!extract_identity.check()) {
free_identity_list(_il);
} }
pEp_identity *_ident = extract_identity();
pEp_identity *_dup = ::identity_dup(_ident); Identity::Identity(const Identity &second)
if (!_dup) { : _ident(second._ident) {
free_identity_list(_il);
throw bad_alloc(); }
Identity::Identity(pEp_identity *ident)
: _ident(ident, &::free_identity) {
} }
PEP_STATUS status = update_identity(Adapter::session(), _dup);
if (status != PEP_STATUS_OK) { Identity::~Identity() {
free_identity_list(_il);
}
Identity::operator pEp_identity *() {
return _ident.get();
}
Identity::operator const pEp_identity *() const {
return _ident.get();
}
string Identity::_repr() {
stringstream build;
build << "Identity(";
string address;
if (_ident->address)
address = string(_ident->address);
build << repr(address) << ", ";
string username;
if (_ident->username)
username = string(_ident->username);
build << repr(username) << ", ";
string user_id;
if (_ident->user_id)
user_id = string(_ident->user_id);
build << repr(user_id) << ", ";
string fpr;
if (_ident->fpr)
fpr = string(_ident->fpr);
build << repr(fpr) << ", ";
build << (int) _ident->comm_type << ", ";
string lang = _ident->lang;
build << repr(lang) << ")";
return build.str();
}
string Identity::_str() {
if (!(_ident->address && _ident->address[0]))
return "";
if (!(_ident->username && _ident->username[0]))
return _ident->address;
return string(_ident->username) + " <" + _ident->address + ">";
}
void Identity::username(string value) {
if (value.length() && value.length() < 5)
throw length_error("username must be at least 5 characters");
str_attr(_ident->username, value);
}
void Identity::lang(string value) {
if (value == "")
memset(_ident->lang, 0, 3);
else if (value.length() != 2)
throw length_error("length of lang must be 2");
else
memcpy(_ident->lang, value.c_str(), 3);
}
string Identity::lang() {
return _ident->lang;
}
int Identity::rating() {
if (!(_ident->address))
throw invalid_argument("address must be given");
PEP_rating rating = PEP_rating_undefined;
PEP_STATUS status = ::identity_rating(Adapter::session(), _ident.get(), &rating);
_throw_status(status); _throw_status(status);
return (int) rating;
}
PEP_color Identity::color() {
return _color(rating());
}
Identity Identity::copy() {
pEp_identity *dup = ::identity_dup(*this);
if (!dup)
throw bad_alloc();
return Identity(dup);
} }
_i = identity_list_add(_i, _dup);
if (!_i) { Identity Identity::deepcopy(dict &) {
free_identity_list(_il); return copy();
throw bad_alloc();
} }
}
free_identity_list(il); void Identity::update() {
il = _il; update_identity(*this);
} }
void Identity::key_reset(string fpr) {
PEP_STATUS status = ::key_reset_identity(Adapter::session(), *this,
fpr != "" ? fpr.c_str() : nullptr);
_throw_status(status);
}
void Identity::key_mistrusted() {
PEP_STATUS status = ::key_mistrusted(Adapter::session(), *this);
_throw_status(status);
}
bool Identity::is_pEp_user() {
bool result;
PEP_STATUS status = ::is_pEp_user(Adapter::session(), *this, &result);
_throw_status(status);
return result;
}
void Identity::enable_for_sync() {
PEP_STATUS status = ::enable_identity_for_sync(Adapter::session(), *this);
_throw_status(status);
}
void Identity::disable_for_sync() {
PEP_STATUS status = ::disable_identity_for_sync(Adapter::session(), *this);
_throw_status(status);
}
Myself::Myself(string address, string username, string user_id, string lang)
: Identity(address, username, user_id, "", 0, lang) {
if (!(address.length() && username.length()))
throw invalid_argument("address and username must be set");
if (lang.length() && lang.length() != 2)
throw length_error("lang must be an ISO 639-1 language code or empty");
// FIXME: should set .me
// _ident->me = true;
if (user_id.length())
throw runtime_error("user_id feature not yet implemented for Myself");
}
void Myself::update() {
pEp::PythonAdapter::myself(*this);
}
Identity identity_attr(pEp_identity *&ident) {
if (!ident)
throw out_of_range("no identity assigned");
pEp_identity *_dup = identity_dup(ident);
if (!_dup)
throw bad_alloc();
Identity _ident(_dup);
return _ident;
}
void identity_attr(pEp_identity *&ident, object value) {
Identity &_ident = extract<Identity &>(value);
pEp_identity *_dup = ::identity_dup(_ident);
if (!_dup)
throw bad_alloc();
PEP_STATUS status = update_identity(Adapter::session(), _dup);
_throw_status(status);
free_identity(ident);
ident = _dup;
}
boost::python::list identitylist_attr(identity_list *&il) {
boost::python::list result;
for (identity_list *_il = il; _il && _il->ident; _il = _il->next) {
pEp_identity *ident = ::identity_dup(_il->ident);
if (!ident)
throw bad_alloc();
result.append(object(Identity(ident)));
}
return result;
}
void identitylist_attr(identity_list *&il, boost::python::list value) {
identity_list *_il = new_identity_list(NULL);
if (!_il)
throw bad_alloc();
identity_list *_i = _il;
for (int i = 0; i < len(value); i++) {
extract < Identity & > extract_identity(value[i]);
if (!extract_identity.check()) {
free_identity_list(_il);
}
pEp_identity *_ident = extract_identity();
pEp_identity *_dup = ::identity_dup(_ident);
if (!_dup) {
free_identity_list(_il);
throw bad_alloc();
}
PEP_STATUS status = update_identity(Adapter::session(), _dup);
if (status != PEP_STATUS_OK) {
free_identity_list(_il);
_throw_status(status);
}
_i = identity_list_add(_i, _dup);
if (!_i) {
free_identity_list(_il);
throw bad_alloc();
}
}
free_identity_list(il);
il = _il;
}
} // namespace PythonAdapter } // namespace PythonAdapter
} // namespace pEp { } // namespace pEp

125
src/pEp/native_pEp/identity.hh

@ -21,82 +21,101 @@
#include "str_attr.hh" #include "str_attr.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using std::string; using std::string;
using std::shared_ptr; using std::shared_ptr;
// Identity is owning a pEp_identity // Identity is owning a pEp_identity
class Identity { class Identity {
protected: protected:
shared_ptr< pEp_identity > _ident; shared_ptr <pEp_identity> _ident;
public: public:
Identity(string address = "", string username = "", Identity(string address = "", string username = "",
string user_id = "", string fpr = "", int comm_type = 0, string user_id = "", string fpr = "", int comm_type = 0,
string lang = "", identity_flags_t flags = 0); string lang = "", identity_flags_t flags = 0);
Identity(const Identity& second); Identity(const Identity &second);
Identity(pEp_identity *ident);
virtual ~Identity();
operator pEp_identity *();
operator const pEp_identity *() const;
string _repr(); Identity(pEp_identity *ident);
string _str();
string address() { return str_attr(_ident->address); } virtual ~Identity();
void address(string value) { str_attr(_ident->address, value); }
string fpr() { return str_attr(_ident->fpr); } operator pEp_identity *();
void fpr(string value) { str_attr(_ident->fpr, value); }
string user_id() { return str_attr(_ident->user_id); } operator const pEp_identity *() const;
void user_id(string value) { str_attr(_ident->user_id, value); }
string username() { return str_attr(_ident->username); } string _repr();
void username(string value);
PEP_comm_type comm_type() { return _ident->comm_type; } string _str();
void comm_type(PEP_comm_type value) { _ident->comm_type = value; };
std::string lang(); string address() { return str_attr(_ident->address); }
void lang(std::string value);
identity_flags_t flags() { return _ident->flags; } void address(string value) { str_attr(_ident->address, value); }
void flags(identity_flags_t flags) { _ident->flags = flags; }
int rating(); string fpr() { return str_attr(_ident->fpr); }
PEP_color color();
Identity copy(); void fpr(string value) { str_attr(_ident->fpr, value); }
Identity deepcopy(dict& memo);
virtual void update(); string user_id() { return str_attr(_ident->user_id); }
void key_reset(string fpr=""); void user_id(string value) { str_attr(_ident->user_id, value); }
void key_mistrusted();
bool is_pEp_user(); string username() { return str_attr(_ident->username); }
void enable_for_sync(); void username(string value);
void disable_for_sync();
};
class Myself : public Identity { PEP_comm_type comm_type() { return _ident->comm_type; }
public:
Myself(string address, string username, string user_id="", string lang="");
virtual void update();
};
Identity identity_attr(pEp_identity *&ident); void comm_type(PEP_comm_type value) { _ident->comm_type = value; };
void identity_attr(pEp_identity *&ident, object value);
boost::python::list identitylist_attr(identity_list *&il); std::string lang();
void identitylist_attr(identity_list *&il, boost::python::list value);
} /* namespace PythonAdapter */ void lang(std::string value);
} /* namespace pEp */
identity_flags_t flags() { return _ident->flags; }
void flags(identity_flags_t flags) { _ident->flags = flags; }
int rating();
PEP_color color();
Identity copy();
Identity deepcopy(dict &memo);
virtual void update();
void key_reset(string fpr = "");
void key_mistrusted();
bool is_pEp_user();
void enable_for_sync();
void disable_for_sync();
};
class Myself : public Identity {
public:
Myself(string address, string username, string user_id = "", string lang = "");
virtual void update();
};
Identity identity_attr(pEp_identity *&ident);
void identity_attr(pEp_identity *&ident, object value);
boost::python::list identitylist_attr(identity_list *&il);
void identitylist_attr(identity_list *&il, boost::python::list value);
} // namespace PythonAdapter
} // namespace pEp
#endif /* IDENTITY_HH */ #endif /* IDENTITY_HH */

708
src/pEp/native_pEp/message.cc

@ -19,395 +19,367 @@
#include "message_api.hh" #include "message_api.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using namespace std; using namespace std;
using namespace boost::python; using namespace boost::python;
Message::Blob::Blob(bloblist_t *bl, bool chained) : Message::Blob::Blob(bloblist_t *bl, bool chained) :
_bl(bl), part_of_chain(chained) _bl(bl), part_of_chain(chained) {
{ if (!_bl)
if (!_bl)
throw bad_alloc();
}
Message::Blob::Blob(object data, string mime_type, string filename) :
_bl(new_bloblist(NULL, 0, NULL, NULL)), part_of_chain(false)
{
if (!_bl)
throw bad_alloc();
Py_buffer src;
int result = PyObject_GetBuffer(data.ptr(), &src, PyBUF_CONTIG_RO);
if (result)
throw invalid_argument("need a contiguous buffer to read");
char *mem = (char *)malloc(src.len);
if (!mem) {
PyBuffer_Release(&src);
throw bad_alloc();
}
memcpy(mem, src.buf, src.len);
free(_bl->value);
_bl->size = src.len;
_bl->value = mem;
PyBuffer_Release(&src);
this->mime_type(mime_type);
this->filename(filename);
}
Message::Blob::Blob(const Message::Blob& second) :
_bl(second._bl), part_of_chain(true)
{
}
Message::Blob::~Blob()
{
if (!part_of_chain) {
free(_bl->value);
free(_bl);
}
}
string Message::Blob::_repr()
{
stringstream build;
build << "Blob(";
if (!_bl) {
build << "b'', '', ''";
}
else {
build << "bytes(" << _bl->size << "), ";
string mime_type;
if (_bl->mime_type)
mime_type = string(_bl->mime_type);
string filename;
if (_bl->filename)
filename = string(_bl->filename);
build << repr(mime_type) << ", ";
build << repr(filename);
}
build << ")";
return build.str();
}
int Message::Blob::getbuffer(PyObject *self, Py_buffer *view, int flags) {
bloblist_t *bl = NULL;
try {
Message::Blob& blob = extract< Message::Blob& >(self);
bl = blob._bl;
}
catch (exception& e) {
PyErr_SetString(PyExc_RuntimeError, "extract not possible");
view->obj = NULL;
return -1;
}
if (!(bl && bl->value)) {
PyErr_SetString(PyExc_RuntimeError, "no data available");
view->obj = NULL;
return -1;
}
return PyBuffer_FillInfo(view, self, bl->value, bl->size, 0, flags);
}
string Message::Blob::decode(string encoding)
{
if (encoding == "") {
string _mime_type = _bl->mime_type ? _bl->mime_type : "";
encoding = "ascii";
if (_mime_type == "application/pEp.sync")
encoding = "pep.sync";
if (_mime_type == "application/pEp.keyreset")
encoding = "pep.distribution";
}
object codecs = import("codecs");
object _decode = codecs.attr("decode");
return call< string >(_decode.ptr(), this, encoding);
}
PyBufferProcs Message::Blob::bp = { getbuffer, NULL };
Message::Message(int dir, Identity *from)
: _msg(new_message((PEP_msg_direction) dir), &free_message)
{
if (!_msg)
throw bad_alloc();
if (from) {
_msg->from = ::identity_dup(*from);
if (!_msg->from)
throw bad_alloc();
_msg->dir = (PEP_msg_direction) dir;
}
}
Message::Message(string mimetext)
: _msg(NULL, &free_message)
{
message *_cpy;
PEP_STATUS status = mime_decode_message(mimetext.c_str(),
mimetext.size(), &_cpy, NULL);
switch (status) {
case PEP_STATUS_OK:
if (_cpy)
_cpy->dir = PEP_dir_outgoing;
else
_cpy = new_message(PEP_dir_outgoing);
if (!_cpy)
throw bad_alloc(); throw bad_alloc();
}
_msg = shared_ptr< message >(_cpy); Message::Blob::Blob(object data, string mime_type, string filename) :
break; _bl(new_bloblist(NULL, 0, NULL, NULL)), part_of_chain(false) {
if (!_bl)
throw bad_alloc();
case PEP_BUFFER_TOO_SMALL: Py_buffer src;
throw runtime_error("mime_decode_message: buffer too small"); int result = PyObject_GetBuffer(data.ptr(), &src, PyBUF_CONTIG_RO);
if (result)
throw invalid_argument("need a contiguous buffer to read");
case PEP_CANNOT_CREATE_TEMP_FILE: char *mem = (char *) malloc(src.len);
throw runtime_error("mime_decode_message: cannot create temp file"); if (!mem) {
PyBuffer_Release(&src);
throw bad_alloc();
}
memcpy(mem, src.buf, src.len);
free(_bl->value);
_bl->size = src.len;
_bl->value = mem;
case PEP_OUT_OF_MEMORY: PyBuffer_Release(&src);
throw bad_alloc();
default: this->mime_type(mime_type);
this->filename(filename);
}
Message::Blob::Blob(const Message::Blob &second) :
_bl(second._bl), part_of_chain(true) {
}
Message::Blob::~Blob() {
if (!part_of_chain) {
free(_bl->value);
free(_bl);
}
}
string Message::Blob::_repr() {
stringstream build; stringstream build;
build << "mime_decode_message: unknown error (" << (int) status << ")"; build << "Blob(";
throw runtime_error(build.str()); if (!_bl) {
} build << "b'', '', ''";
} } else {
build << "bytes(" << _bl->size << "), ";
string mime_type;
if (_bl->mime_type)
mime_type = string(_bl->mime_type);
string filename;
if (_bl->filename)
filename = string(_bl->filename);
build << repr(mime_type) << ", ";
build << repr(filename);
}
build << ")";
return build.str();
}
int Message::Blob::getbuffer(PyObject *self, Py_buffer *view, int flags) {
bloblist_t *bl = NULL;
try {
Message::Blob &blob = extract<Message::Blob &>(self);
bl = blob._bl;
}
catch (exception &e) {
PyErr_SetString(PyExc_RuntimeError, "extract not possible");
view->obj = NULL;
return -1;
}
if (!(bl && bl->value)) {
PyErr_SetString(PyExc_RuntimeError, "no data available");
view->obj = NULL;
return -1;
}
return PyBuffer_FillInfo(view, self, bl->value, bl->size, 0, flags);
}
string Message::Blob::decode(string encoding) {
if (encoding == "") {
string _mime_type = _bl->mime_type ? _bl->mime_type : "";
encoding = "ascii";
Message::Message(const Message& second) if (_mime_type == "application/pEp.sync")
: _msg(second._msg) encoding = "pep.sync";
{
if (!_msg.get())
throw bad_alloc();
}
Message::Message(message *msg) if (_mime_type == "application/pEp.keyreset")
: _msg(::message_dup(msg), &free_message) encoding = "pep.distribution";
{
} }
object codecs = import("codecs");
object _decode = codecs.attr("decode");
return call<string>(_decode.ptr(), this, encoding);
}
Message::~Message() PyBufferProcs Message::Blob::bp = {getbuffer, NULL};
{
} Message::Message(int dir, Identity *from)
: _msg(new_message((PEP_msg_direction) dir), &free_message) {
if (!_msg)
throw bad_alloc();
Message::operator message *() if (from) {
{ _msg->from = ::identity_dup(*from);
return _msg.get(); if (!_msg->from)
} throw bad_alloc();
_msg->dir = (PEP_msg_direction) dir;
}
}
Message::operator const message *() const Message::Message(string mimetext)
{ : _msg(NULL, &free_message) {
return _msg.get(); message *_cpy;
} PEP_STATUS status = mime_decode_message(mimetext.c_str(),
mimetext.size(), &_cpy, NULL);
switch (status) {
case PEP_STATUS_OK:
if (_cpy)
_cpy->dir = PEP_dir_outgoing;
else
_cpy = new_message(PEP_dir_outgoing);
if (!_cpy)
throw bad_alloc();
_msg = shared_ptr<message>(_cpy);
break;
case PEP_BUFFER_TOO_SMALL:
throw runtime_error("mime_decode_message: buffer too small");
case PEP_CANNOT_CREATE_TEMP_FILE:
throw runtime_error("mime_decode_message: cannot create temp file");
case PEP_OUT_OF_MEMORY:
throw bad_alloc();
default:
stringstream build;
build << "mime_decode_message: unknown error (" << (int) status << ")";
throw runtime_error(build.str());
}
}
string Message::_str() Message::Message(const Message &second)
{ : _msg(second._msg) {
if (!(_msg->from && _msg->from->address && _msg->from->address[0])) if (!_msg.get())
throw out_of_range(".from_.address missing"); throw bad_alloc();
}
char *mimetext; Message::Message(message *msg)
string result; : _msg(::message_dup(msg), &free_message) {
PEP_STATUS status = mime_encode_message(*this, false, &mimetext, false); }
switch (status) {
case PEP_STATUS_OK:
result = mimetext;
free(mimetext);
break;
case PEP_BUFFER_TOO_SMALL: Message::~Message() {
throw runtime_error("mime_encode_message: buffer too small");
case PEP_CANNOT_CREATE_TEMP_FILE: }
throw runtime_error("mime_encode_message: cannot create temp file");
case PEP_OUT_OF_MEMORY: Message::operator message *() {
throw bad_alloc(); return _msg.get();
}
default: Message::operator const message *() const {
return _msg.get();
}
string Message::_str() {
if (!(_msg->from && _msg->from->address && _msg->from->address[0]))
throw out_of_range(".from_.address missing");
char *mimetext;
string result;
PEP_STATUS status = mime_encode_message(*this, false, &mimetext, false);
switch (status) {
case PEP_STATUS_OK:
result = mimetext;
free(mimetext);
break;
case PEP_BUFFER_TOO_SMALL:
throw runtime_error("mime_encode_message: buffer too small");
case PEP_CANNOT_CREATE_TEMP_FILE:
throw runtime_error("mime_encode_message: cannot create temp file");
case PEP_OUT_OF_MEMORY:
throw bad_alloc();
default:
stringstream build;
build << "mime_encode_message: unknown error (" << (int) status << ")";
throw runtime_error(build.str());
}
return result;
}
string Message::_repr() {
stringstream build; stringstream build;
build << "mime_encode_message: unknown error (" << (int) status << ")"; build << "Message(" << repr(_str()) << ")";
throw runtime_error(build.str()); return build.str();
} }
return result; boost::python::tuple Message::attachments() {
} boost::python::list l;
string Message::_repr() for (bloblist_t *bl = _msg->attachments; bl && bl->value; bl =
{ bl->next) {
stringstream build; l.append(Blob(bl, true));
build << "Message(" << repr(_str()) << ")";
return build.str();
}
boost::python::tuple Message::attachments()
{
boost::python::list l;
for (bloblist_t *bl = _msg->attachments; bl && bl->value; bl =
bl->next) {
l.append(Blob(bl, true));
}
return boost::python::tuple(l);
}
void Message::attachments(boost::python::list value)
{
bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL);
if (!bl)
throw bad_alloc();
bloblist_t *_l = bl;
for (int i=0; i<len(value); i++) {
Message::Blob& blob = extract< Message::Blob& >(value[i]);
_l = bloblist_add(_l, blob._bl->value, blob._bl->size,
blob._bl->mime_type, blob._bl->filename);
if (!_l) {
for (_l = bl; _l && _l->value; ) {
free(_l->mime_type);
free(_l->filename);
bloblist_t *_ll = _l;
_l = _l->next;
free(_ll);
} }
throw bad_alloc();
return boost::python::tuple(l);
}
void Message::attachments(boost::python::list value) {
bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL);
if (!bl)
throw bad_alloc();
bloblist_t *_l = bl;
for (int i = 0; i < len(value); i++) {
Message::Blob &blob = extract<Message::Blob &>(value[i]);
_l = bloblist_add(_l, blob._bl->value, blob._bl->size,
blob._bl->mime_type, blob._bl->filename);
if (!_l) {
for (_l = bl; _l && _l->value;) {
free(_l->mime_type);
free(_l->filename);
bloblist_t *_ll = _l;
_l = _l->next;
free(_ll);
}
throw bad_alloc();
}
}
for (int i = 0; i < len(value); i++) {
Message::Blob &blob = extract<Message::Blob &>(value[i]);
blob._bl->value = NULL;
blob._bl->size = 0;
free(blob._bl->mime_type);
blob._bl->mime_type = NULL;
free(blob._bl->filename);
blob._bl->filename = NULL;
}
free_bloblist(_msg->attachments);
_msg->attachments = bl;
}
Message Message::encrypt() {
boost::python::list extra;
return encrypt_message(*this, extra, PEP_enc_PGP_MIME, 0);
} }
}
Message Message::_encrypt(boost::python::list extra, int enc_format, int flags) {
for (int i=0; i<len(value); i++) { if (!enc_format)
Message::Blob& blob = extract< Message::Blob& >(value[i]); enc_format = PEP_enc_PGP_MIME;
blob._bl->value = NULL; return encrypt_message(*this, extra, enc_format, flags);
blob._bl->size = 0; }
free(blob._bl->mime_type);
blob._bl->mime_type = NULL; boost::python::tuple Message::decrypt(int flags) {
free(blob._bl->filename); return pEp::PythonAdapter::decrypt_message(*this, flags);
blob._bl->filename = NULL; }
}
PEP_rating Message::outgoing_rating() {
free_bloblist(_msg->attachments); if (_msg->dir != PEP_dir_outgoing)
_msg->attachments = bl; throw invalid_argument("Message.dir must be outgoing");
}
if (from().address() == "")
Message Message::encrypt() throw invalid_argument("from.address needed");
{ if (from().username() == "")
boost::python::list extra; throw invalid_argument("from.username needed");
return encrypt_message(*this, extra, PEP_enc_PGP_MIME, 0);
} if (len(to()) + len(cc()) == 0)
throw invalid_argument("either to or cc needed");
Message Message::_encrypt(boost::python::list extra, int enc_format, int flags)
{ PEP_STATUS status = myself(Adapter::session(), _msg->from);
if (!enc_format) _throw_status(status);
enc_format = PEP_enc_PGP_MIME;
return encrypt_message(*this, extra, enc_format, flags); PEP_rating rating = PEP_rating_undefined;
} status = outgoing_message_rating(Adapter::session(), *this, &rating);
_throw_status(status);
boost::python::tuple Message::decrypt(int flags) {
return pEp::PythonAdapter::decrypt_message(*this, flags); return rating;
} }
PEP_rating Message::outgoing_rating() PEP_color Message::outgoing_color() {
{ return _color(outgoing_rating());
if (_msg->dir != PEP_dir_outgoing) }
throw invalid_argument("Message.dir must be outgoing");
Message Message::copy() {
if (from().address() == "") message *dup = message_dup(*this);
throw invalid_argument("from.address needed"); if (!dup)
if (from().username() == "") throw bad_alloc();
throw invalid_argument("from.username needed"); return Message(dup);
}
if (len(to()) + len(cc()) == 0)
throw invalid_argument("either to or cc needed"); Message Message::deepcopy(dict &) {
return copy();
PEP_STATUS status = myself(Adapter::session(), _msg->from); }
_throw_status(status);
Message outgoing_message(Identity me) {
PEP_rating rating = PEP_rating_undefined; if (me.address().empty() || me.user_id().empty())
status = outgoing_message_rating(Adapter::session(), *this, &rating); throw runtime_error("at least address and user_id of own user needed");
_throw_status(status);
::myself(Adapter::session(), me);
return rating; auto m = Message(PEP_dir_outgoing, &me);
} return m;
}
PEP_color Message::outgoing_color()
{ static object update(Identity ident) {
return _color(outgoing_rating()); if (ident.address().empty())
} throw runtime_error("at least address needed");
update_identity(Adapter::session(), ident);
Message Message::copy() return object(ident);
{ }
message *dup = message_dup(*this);
if (!dup) static boost::python::list update(boost::python::list il) {
throw bad_alloc(); for (int i = 0; i < len(il); i++) {
return Message(dup); update(extract<Identity>(il[i]));
} }
Message Message::deepcopy(dict&) return il;
{ }
return copy();
} Message incoming_message(string mime_text) {
auto m = Message(mime_text);
Message outgoing_message(Identity me) m.dir(PEP_dir_incoming);
{
if (me.address().empty() || me.user_id().empty()) try {
throw runtime_error("at least address and user_id of own user needed"); m.from(update(m.from()));
}
::myself(Adapter::session(), me); catch (out_of_range &) {}
auto m = Message(PEP_dir_outgoing, &me);
return m; try {
} m.recv_by(update(m.recv_by()));
}
static object update(Identity ident) catch (out_of_range &) {}
{
if (ident.address().empty()) m.to(update(m.to()));
throw runtime_error("at least address needed"); m.cc(update(m.cc()));
update_identity(Adapter::session(), ident); m.reply_to(update(m.reply_to()));
return object(ident);
} return m;
}
static boost::python::list update(boost::python::list il)
{ } // namespace PythonAdapter
for (int i=0; i<len(il); i++) { } // namespace pEp
update(extract< Identity >(il[i]));
}
return il;
}
Message incoming_message(string mime_text)
{
auto m = Message(mime_text);
m.dir(PEP_dir_incoming);
try {
m.from(update(m.from()));
}
catch (out_of_range&) { }
try {
m.recv_by(update(m.recv_by()));
}
catch (out_of_range&) { }
m.to(update(m.to()));
m.cc(update(m.cc()));
m.reply_to(update(m.reply_to()));
return m;
}
} // namespace PythonAdapter
} // namespace pEp {

224
src/pEp/native_pEp/message.hh

@ -18,137 +18,177 @@
#include "identity.hh" #include "identity.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using std::string; using std::string;
using std::runtime_error; using std::runtime_error;
using std::invalid_argument; using std::invalid_argument;
using boost::lexical_cast; using boost::lexical_cast;
// Message is owning a message struct // Message is owning a message struct
class Message { class Message {
shared_ptr< ::message > _msg; shared_ptr<::message> _msg;
public: public:
// Blob is owning a bloblist_t struct - or not and just managing // Blob is owning a bloblist_t struct - or not and just managing
// one depending on part_of_chain // one depending on part_of_chain
class Blob { class Blob {
bloblist_t *_bl; bloblist_t *_bl;
bool part_of_chain; bool part_of_chain;
public: public:
Blob(bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL), Blob(bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL),
bool chained = false); bool chained = false);
Blob(object data, string mime_type = "", string filename = "");
Blob(const Blob& second);
~Blob();
string _repr(); Blob(object data, string mime_type = "", string filename = "");
string mime_type() { return _bl ? str_attr(_bl->mime_type) : ""; } Blob(const Blob &second);
void mime_type(string value) { str_attr(_bl->mime_type, value); }
string filename() { return str_attr(_bl->filename); } ~Blob();
void filename(string value) { str_attr(_bl->filename, value); }
size_t size() { return _bl->size; } string _repr();
string decode(string encoding);
string decode() { return decode(""); }
static PyBufferProcs bp; string mime_type() { return _bl ? str_attr(_bl->mime_type) : ""; }
friend class Message; void mime_type(string value) { str_attr(_bl->mime_type, value); }
protected: string filename() { return str_attr(_bl->filename); }
static int getbuffer(PyObject *self, Py_buffer *view, int flags);
};
Message(int dir = PEP_dir_outgoing, Identity *from = NULL); void filename(string value) { str_attr(_bl->filename, value); }
Message(string mimetext);
Message(const Message& second);
Message(message *msg);
~Message();
operator message *();
operator const message *() const;
string _str(); size_t size() { return _bl->size; }
string _repr();
PEP_msg_direction dir() { return _msg->dir; } string decode(string encoding);
void dir(PEP_msg_direction value) { _msg->dir = value; }
string id() { return str_attr(_msg->id); } string decode() { return decode(""); }
void id(string value) { str_attr(_msg->id, value); }
string shortmsg() { return str_attr(_msg->shortmsg); } static PyBufferProcs bp;
void shortmsg(string value) { str_attr(_msg->shortmsg, value); }
string longmsg() { return str_attr(_msg->longmsg); } friend class Message;
void longmsg(string value) { str_attr(_msg->longmsg, value); }
string longmsg_formatted() { return str_attr(_msg->longmsg_formatted); } protected:
void longmsg_formatted(string value) { str_attr(_msg->longmsg_formatted, value); } static int getbuffer(PyObject *self, Py_buffer *view, int flags);
};
boost::python::tuple attachments(); Message(int dir = PEP_dir_outgoing, Identity *from = NULL);
void attachments(boost::python::list value);
time_t sent() { return timestamp_attr(_msg->sent); } Message(string mimetext);
void sent(time_t value) { timestamp_attr(_msg->sent, value); }
time_t recv() { return timestamp_attr(_msg->recv); } Message(const Message &second);
void recv(time_t value) { timestamp_attr(_msg->recv, value); }
Identity from() { return identity_attr(_msg->from); } Message(message *msg);
void from(object value) { identity_attr(_msg->from, value); }
boost::python::list to() { return identitylist_attr(_msg->to); } ~Message();
void to(boost::python::list value) { identitylist_attr(_msg->to, value); }
Identity recv_by() { return identity_attr(_msg->recv_by); } operator message *();
void recv_by(object value) { identity_attr(_msg->recv_by, value); }
boost::python::list cc() { return identitylist_attr(_msg->cc); } operator const message *() const;
void cc(boost::python::list value) { identitylist_attr(_msg->cc, value); }
boost::python::list bcc() { return identitylist_attr(_msg->bcc); } string _str();
void bcc(boost::python::list value) { identitylist_attr(_msg->bcc, value); }
boost::python::list reply_to() { return identitylist_attr(_msg->reply_to); } string _repr();
void reply_to(boost::python::list value) { identitylist_attr(_msg->reply_to, value); }
boost::python::list in_reply_to() { return strlist_attr(_msg->in_reply_to); } PEP_msg_direction dir() { return _msg->dir; }
void in_reply_to(boost::python::list value) { strlist_attr(_msg->in_reply_to, value); }
boost::python::list references() { return strlist_attr(_msg->references); } void dir(PEP_msg_direction value) { _msg->dir = value; }
void references(boost::python::list value) { strlist_attr(_msg->references, value); }
boost::python::list keywords() { return strlist_attr(_msg->keywords); } string id() { return str_attr(_msg->id); }
void keywords(boost::python::list value) { strlist_attr(_msg->keywords, value); }
string comments() { return str_attr(_msg->comments); } void id(string value) { str_attr(_msg->id, value); }
void comments(string value) { str_attr(_msg->comments, value); }
dict opt_fields() { return strdict_attr(_msg->opt_fields); } string shortmsg() { return str_attr(_msg->shortmsg); }
void opt_fields(dict value) { return strdict_attr(_msg->opt_fields, value); }
PEP_enc_format enc_format() { return _msg->enc_format; } void shortmsg(string value) { str_attr(_msg->shortmsg, value); }
void enc_format(PEP_enc_format value) { _msg->enc_format = value; }
Message encrypt(); string longmsg() { return str_attr(_msg->longmsg); }
Message _encrypt(boost::python::list extra, int enc_format=4, int flags=0);
boost::python::tuple decrypt(int flags=0); void longmsg(string value) { str_attr(_msg->longmsg, value); }
PEP_rating outgoing_rating();
PEP_color outgoing_color();
Message deepcopy(dict& memo);
Message copy();
};
Message outgoing_message(Identity me); string longmsg_formatted() { return str_attr(_msg->longmsg_formatted); }
Message incoming_message(string mime_text);
} /* namespace PythonAdapter */ void longmsg_formatted(string value) { str_attr(_msg->longmsg_formatted, value); }
boost::python::tuple attachments();
void attachments(boost::python::list value);
time_t sent() { return timestamp_attr(_msg->sent); }
void sent(time_t value) { timestamp_attr(_msg->sent, value); }
time_t recv() { return timestamp_attr(_msg->recv); }
void recv(time_t value) { timestamp_attr(_msg->recv, value); }
Identity from() { return identity_attr(_msg->from); }
void from(object value) { identity_attr(_msg->from, value); }
boost::python::list to() { return identitylist_attr(_msg->to); }
void to(boost::python::list value) { identitylist_attr(_msg->to, value); }
Identity recv_by() { return identity_attr(_msg->recv_by); }
void recv_by(object value) { identity_attr(_msg->recv_by, value); }
boost::python::list cc() { return identitylist_attr(_msg->cc); }
void cc(boost::python::list value) { identitylist_attr(_msg->cc, value); }
boost::python::list bcc() { return identitylist_attr(_msg->bcc); }
void bcc(boost::python::list value) { identitylist_attr(_msg->bcc, value); }
boost::python::list reply_to() { return identitylist_attr(_msg->reply_to); }
void reply_to(boost::python::list value) { identitylist_attr(_msg->reply_to, value); }
boost::python::list in_reply_to() { return strlist_attr(_msg->in_reply_to); }
void in_reply_to(boost::python::list value) { strlist_attr(_msg->in_reply_to, value); }
boost::python::list references() { return strlist_attr(_msg->references); }
void references(boost::python::list value) { strlist_attr(_msg->references, value); }
boost::python::list keywords() { return strlist_attr(_msg->keywords); }
void keywords(boost::python::list value) { strlist_attr(_msg->keywords, value); }
string comments() { return str_attr(_msg->comments); }
void comments(string value) { str_attr(_msg->comments, value); }
dict opt_fields() { return strdict_attr(_msg->opt_fields); }
void opt_fields(dict value) { return strdict_attr(_msg->opt_fields, value); }
PEP_enc_format enc_format() { return _msg->enc_format; }
void enc_format(PEP_enc_format value) { _msg->enc_format = value; }
Message encrypt();
Message _encrypt(boost::python::list extra, int enc_format = 4, int flags = 0);
boost::python::tuple decrypt(int flags = 0);
PEP_rating outgoing_rating();
PEP_color outgoing_color();
Message deepcopy(dict &memo);
Message copy();
};
Message outgoing_message(Identity me);
Message incoming_message(string mime_text);
} /* namespace PythonAdapter */
} /* namespace pEp */ } /* namespace pEp */
#endif /* MESSAGE_HH */ #endif /* MESSAGE_HH */

301
src/pEp/native_pEp/message_api.cc

@ -13,160 +13,149 @@
#include "basic_api.hh" #include "basic_api.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using namespace std; using namespace std;
using namespace boost::python; using namespace boost::python;
Message encrypt_message(Message src, boost::python::list extra, int enc_format, int flags) Message encrypt_message(Message src, boost::python::list extra, int enc_format, int flags) {
{ Identity _from = src.from();
Identity _from = src.from(); if (_from.address() == "")
if (_from.address() == "") throw invalid_argument("encrypt_message: src.from_.address empty");
throw invalid_argument("encrypt_message: src.from_.address empty"); if (_from.username() == "")
if (_from.username() == "") throw invalid_argument("encrypt_message: src.from_.username empty");
throw invalid_argument("encrypt_message: src.from_.username empty");
if (_from.user_id() == "")
if (_from.user_id() == "") src.from().user_id(_from.address());
src.from().user_id(_from.address());
stringlist_t *_extra = to_stringlist(extra);
stringlist_t *_extra = to_stringlist(extra); PEP_enc_format _enc_format = (PEP_enc_format) enc_format;
PEP_enc_format _enc_format = (PEP_enc_format) enc_format; PEP_encrypt_flags_t _flags = (PEP_encrypt_flags_t) flags;
PEP_encrypt_flags_t _flags = (PEP_encrypt_flags_t) flags; message *_dst = NULL;
message *_dst = NULL;
message *_src = src;
message *_src = src; PEP_STATUS status = encrypt_message(Adapter::session(), _src, _extra, &_dst,
PEP_STATUS status = encrypt_message(Adapter::session(), _src, _extra, &_dst, _enc_format, _flags);
_enc_format, _flags); free_stringlist(_extra);
free_stringlist(_extra); _throw_status(status);
_throw_status(status);
if (!_dst || _dst == _src)
if (!_dst || _dst == _src) return Message(_src);
return Message(_src);
return Message(_dst);
return Message(_dst); }
}
boost::python::tuple decrypt_message(Message src, int flags) {
boost::python::tuple decrypt_message(Message src, int flags) message *_dst = NULL;
{ stringlist_t *_keylist = NULL;
message *_dst = NULL; PEP_rating _rating = PEP_rating_undefined;
stringlist_t *_keylist = NULL; PEP_decrypt_flags_t _flags = (PEP_decrypt_flags_t) flags;
PEP_rating _rating = PEP_rating_undefined; message *_src = src;
PEP_decrypt_flags_t _flags = (PEP_decrypt_flags_t) flags;
message *_src = src; PEP_STATUS status = ::decrypt_message(Adapter::session(), _src, &_dst, &_keylist,
&_rating, &_flags);
PEP_STATUS status = ::decrypt_message(Adapter::session(), _src, &_dst, &_keylist, _throw_status(status);
&_rating, &_flags);
_throw_status(status); boost::python::list keylist;
if (_keylist) {
boost::python::list keylist; keylist = from_stringlist(_keylist);
if (_keylist) { free_stringlist(_keylist);
keylist = from_stringlist(_keylist); }
free_stringlist(_keylist);
} Message dst = _dst ? Message(_dst) : Message(src);
return boost::python::make_tuple(dst, keylist, _rating, _flags);
Message dst = _dst ? Message(_dst) : Message(src); }
return boost::python::make_tuple(dst, keylist, _rating, _flags);
} PEP_color _color(int rating) {
return ::color_from_rating((PEP_rating) rating);
PEP_color _color(int rating) }
{
return ::color_from_rating((PEP_rating) rating); boost::python::tuple sync_decode(object buffer) {
} Py_buffer src;
int result = PyObject_GetBuffer(buffer.ptr(), &src, PyBUF_CONTIG_RO);
boost::python::tuple sync_decode(object buffer) if (result)
{ throw invalid_argument("need a contiguous buffer to read");
Py_buffer src;
int result = PyObject_GetBuffer(buffer.ptr(), &src, PyBUF_CONTIG_RO); char *dst = NULL;
if (result) PEP_STATUS status = PER_to_XER_Sync_msg((char *) src.buf, src.len, &dst);
throw invalid_argument("need a contiguous buffer to read"); PyBuffer_Release(&src);
_throw_status(status);
char *dst = NULL;
PEP_STATUS status = PER_to_XER_Sync_msg((char *) src.buf, src.len, &dst); string _dst(dst);
PyBuffer_Release(&src); free(dst);
_throw_status(status); return boost::python::make_tuple(_dst, 0);
}
string _dst(dst);
free(dst); static boost::python::tuple sync_encode(string text) {
return boost::python::make_tuple(_dst, 0); char *data = NULL;
} size_t size = 0;
PEP_STATUS status = XER_to_PER_Sync_msg(text.c_str(), &data, &size);
static boost::python::tuple sync_encode(string text) _throw_status(status);
{
char *data = NULL; PyObject *ba = PyBytes_FromStringAndSize(data, size);
size_t size = 0; free(data);
PEP_STATUS status = XER_to_PER_Sync_msg(text.c_str(), &data, &size); if (!ba)
_throw_status(status); throw bad_alloc();
PyObject *ba = PyBytes_FromStringAndSize(data, size); return boost::python::make_tuple(object(handle<>(ba)), 0);
free(data); }
if (!ba)
throw bad_alloc(); boost::python::tuple Distribution_decode(object buffer) {
Py_buffer src;
return boost::python::make_tuple(object(handle<>(ba)), 0); int result = PyObject_GetBuffer(buffer.ptr(), &src, PyBUF_CONTIG_RO);
} if (result)
throw invalid_argument("need a contiguous buffer to read");
boost::python::tuple Distribution_decode(object buffer)
{ char *dst = NULL;
Py_buffer src; PEP_STATUS status = PER_to_XER_Distribution_msg((char *) src.buf, src.len, &dst);
int result = PyObject_GetBuffer(buffer.ptr(), &src, PyBUF_CONTIG_RO); PyBuffer_Release(&src);
if (result) _throw_status(status);
throw invalid_argument("need a contiguous buffer to read");
string _dst(dst);
char *dst = NULL; free(dst);
PEP_STATUS status = PER_to_XER_Distribution_msg((char *) src.buf, src.len, &dst); return boost::python::make_tuple(_dst, 0);
PyBuffer_Release(&src); }
_throw_status(status);
static boost::python::tuple Distribution_encode(string text) {
string _dst(dst); char *data = NULL;
free(dst); size_t size = 0;
return boost::python::make_tuple(_dst, 0); PEP_STATUS status = XER_to_PER_Distribution_msg(text.c_str(), &data, &size);
} _throw_status(status);
static boost::python::tuple Distribution_encode(string text) PyObject *ba = PyBytes_FromStringAndSize(data, size);
{ free(data);
char *data = NULL; if (!ba)
size_t size = 0; throw bad_alloc();
PEP_STATUS status = XER_to_PER_Distribution_msg(text.c_str(), &data, &size);
_throw_status(status); return boost::python::make_tuple(object(handle<>(ba)), 0);
}
PyObject *ba = PyBytes_FromStringAndSize(data, size);
free(data); object sync_search(string name) {
if (!ba) if (name != "pep.sync") {
throw bad_alloc(); return object();
} else {
return boost::python::make_tuple(object(handle<>(ba)), 0); object codecs = import("codecs");
} object CodecInfo = codecs.attr("CodecInfo");
object sync_search(string name) object _sync_decode = make_function(sync_decode);
{ object _sync_encode = make_function(sync_encode);
if (name != "pep.sync") {
return object(); return call<object>(CodecInfo.ptr(), _sync_encode, _sync_decode);
} }
else { }
object codecs = import("codecs");
object CodecInfo = codecs.attr("CodecInfo"); object distribution_search(string name) {
if (name != "pep.distribution") {
object _sync_decode = make_function(sync_decode); return object();
object _sync_encode = make_function(sync_encode); } else {
object codecs = import("codecs");
return call< object >(CodecInfo.ptr(), _sync_encode, _sync_decode); object CodecInfo = codecs.attr("CodecInfo");
}
} object _distribution_decode = make_function(Distribution_decode);
object _distribution_encode = make_function(Distribution_encode);
object distribution_search(string name)
{ return call<object>(CodecInfo.ptr(), _distribution_encode, _distribution_decode);
if (name != "pep.distribution") { }
return object(); }
}
else { } // namespace PythonAdapter
object codecs = import("codecs");
object CodecInfo = codecs.attr("CodecInfo");
object _distribution_decode = make_function(Distribution_decode);
object _distribution_encode = make_function(Distribution_encode);
return call< object >(CodecInfo.ptr(), _distribution_encode, _distribution_decode);
}
}
} // namespace PythonAdapter
} // namespace pEp { } // namespace pEp {

27
src/pEp/native_pEp/message_api.hh

@ -7,21 +7,24 @@
#include "pEpmodule.hh" #include "pEpmodule.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
Message encrypt_message( Message encrypt_message(
Message src, Message src,
boost::python::list extra = boost::python::list(), boost::python::list extra = boost::python::list(),
int enc_format = 4, int enc_format = 4,
int flags = 0 int flags = 0
); );
boost::python::tuple decrypt_message(Message src, int flags=0); boost::python::tuple decrypt_message(Message src, int flags = 0);
PEP_color _color(int rating);
object sync_search(string name);
object distribution_search(string name);
} /* namespace PythonAdapter */ PEP_color _color(int rating);
object sync_search(string name);
object distribution_search(string name);
} /* namespace PythonAdapter */
} /* namespace pEp */ } /* namespace pEp */
#endif /* MESSAGE_API_HH */ #endif /* MESSAGE_API_HH */

1033
src/pEp/native_pEp/pEpmodule.cc

File diff suppressed because it is too large

31
src/pEp/native_pEp/pEpmodule.hh

@ -11,18 +11,25 @@
#include "message.hh" #include "message.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
extern string device_name; extern string device_name;
void config_passive_mode(bool enable);
void config_unencrypted_subject(bool enable); void config_passive_mode(bool enable);
void key_reset_user(string user_id, string fpr);
void key_reset_all_own_keys(); void config_unencrypted_subject(bool enable);
void _throw_status(PEP_STATUS status);
PEP_STATUS _messageToSend(::message *msg); void key_reset_user(string user_id, string fpr);
PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handshake_signal signal);
void key_reset_all_own_keys();
} /* namespace PythonAdapter */
void _throw_status(PEP_STATUS status);
PEP_STATUS _messageToSend(::message *msg);
PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handshake_signal signal);
} /* namespace PythonAdapter */
} /* namespace pEp */ } /* namespace pEp */
#endif /* PEPMODULE_HH */ #endif /* PEPMODULE_HH */

308
src/pEp/native_pEp/str_attr.cc

@ -10,175 +10,163 @@
#include "str_attr.hh" #include "str_attr.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using namespace std; using namespace std;
using namespace boost::python; using namespace boost::python;
using namespace boost::locale; using namespace boost::locale;
object repr(object s) object repr(object s) {
{ return s.attr("__repr__")();
return s.attr("__repr__")();
}
string repr(string s)
{
str _s = s.c_str();
object _r = _s.attr("__repr__")();
string r = extract< string >(_r);
return r;
}
string str_attr(char *&str)
{
if (!str)
return string("");
return string(str);
}
void str_attr(char *&str, string value)
{
string normalized = normalize(value, norm_nfc);
free(str);
str = strdup(normalized.c_str());
if (!str)
throw bad_alloc();
}
time_t timestamp_attr(timestamp *&ts)
{
if (!ts)
return 0;
return timegm(ts);
}
void timestamp_attr(timestamp *&ts, time_t value)
{
free_timestamp(ts);
ts = new_timestamp(value);
}
boost::python::list strlist_attr(stringlist_t *&sl)
{
boost::python::list result;
for (stringlist_t *_sl = sl; _sl && _sl->value; _sl = _sl->next) {
string s(_sl->value);
result.append(object(s));
}
return result;
}
void strlist_attr(stringlist_t *&sl, boost::python::list value)
{
stringlist_t *_sl = new_stringlist(NULL);
if (!_sl)
throw bad_alloc();
stringlist_t *_s = _sl;
for (int i=0; i<len(value); i++) {
extract< string > extract_string(value[i]);
if (!extract_string.check()) {
free_stringlist(_sl);
} }
string s = extract_string();
s = normalize(s, norm_nfc); string repr(string s) {
_s = stringlist_add(_s, s.c_str()); str _s = s.c_str();
if (!_s) { object _r = _s.attr("__repr__")();
free_stringlist(_sl); string r = extract<string>(_r);
throw bad_alloc(); return r;
} }
}
free_stringlist(sl); string str_attr(char *&str) {
sl = _sl; if (!str)
} return string("");
return string(str);
}
dict strdict_attr(stringpair_list_t *&spl) void str_attr(char *&str, string value) {
{ string normalized = normalize(value, norm_nfc);
dict result; free(str);
str = strdup(normalized.c_str());
if (!str)
throw bad_alloc();
}
for (stringpair_list_t *_spl = spl; _spl && _spl->value; _spl = time_t timestamp_attr(timestamp *&ts) {
_spl->next) { if (!ts)
stringpair_t *p = _spl->value; return 0;
if (p->key && p->value) {
string key(p->key);
string value(p->value);
result[key] = value; return timegm(ts);
} }
}
void timestamp_attr(timestamp *&ts, time_t value) {
return result; free_timestamp(ts);
} ts = new_timestamp(value);
void strdict_attr(stringpair_list_t *&spl, dict value)
{
stringpair_list_t *_spl = new_stringpair_list(NULL);
if (!_spl)
throw bad_alloc();
stringpair_list_t *_s = _spl;
for (int i=0; i<len(value); i++) {
extract< string > extract_key(value.keys()[i]);
extract< string > extract_value(value.values()[i]);
if (!(extract_key.check() && extract_value.check()))
free_stringpair_list(_spl);
string key = extract_key();
key = normalize(key, norm_nfc);
string _value = extract_value();
_value = normalize(_value, norm_nfc);
stringpair_t *pair = new_stringpair(key.c_str(), _value.c_str());
if (!pair) {
free_stringpair_list(_spl);
throw bad_alloc();
} }
_s = stringpair_list_add(_s, pair);
if (!_s) { boost::python::list strlist_attr(stringlist_t *&sl) {
free_stringpair_list(_spl); boost::python::list result;
throw bad_alloc();
for (stringlist_t *_sl = sl; _sl && _sl->value; _sl = _sl->next) {
string s(_sl->value);
result.append(object(s));
}
return result;
} }
}
void strlist_attr(stringlist_t *&sl, boost::python::list value) {
free_stringpair_list(spl); stringlist_t *_sl = new_stringlist(NULL);
spl = _spl; if (!_sl)
} throw bad_alloc();
stringlist_t *to_stringlist(boost::python::list l) stringlist_t *_s = _sl;
{ for (int i = 0; i < len(value); i++) {
stringlist_t *result = new_stringlist(NULL); extract <string> extract_string(value[i]);
if (!result) if (!extract_string.check()) {
throw bad_alloc(); free_stringlist(_sl);
}
stringlist_t *_s = result; string s = extract_string();
for (int i=0; i<len(l); i++) { s = normalize(s, norm_nfc);
extract< string > extract_string(l[i]); _s = stringlist_add(_s, s.c_str());
if (!extract_string.check()) if (!_s) {
free_stringlist(result); free_stringlist(_sl);
string s = extract_string(); throw bad_alloc();
_s = stringlist_add(_s, s.c_str()); }
if (!_s) { }
free_stringlist(result);
throw bad_alloc(); free_stringlist(sl);
sl = _sl;
} }
}
dict strdict_attr(stringpair_list_t *&spl) {
return result; dict result;
}
for (stringpair_list_t *_spl = spl; _spl && _spl->value; _spl =
boost::python::list from_stringlist(const stringlist_t *sl) _spl->next) {
{ stringpair_t *p = _spl->value;
boost::python::list result; if (p->key && p->value) {
for (const stringlist_t *_sl = sl; _sl && _sl->value; _sl = _sl->next) { string key(p->key);
string s = _sl->value; string value(p->value);
result.append(s);
} result[key] = value;
return result; }
} }
} // namespace PythonAdapter return result;
}
void strdict_attr(stringpair_list_t *&spl, dict value) {
stringpair_list_t *_spl = new_stringpair_list(NULL);
if (!_spl)
throw bad_alloc();
stringpair_list_t *_s = _spl;
for (int i = 0; i < len(value); i++) {
extract <string> extract_key(value.keys()[i]);
extract <string> extract_value(value.values()[i]);
if (!(extract_key.check() && extract_value.check()))
free_stringpair_list(_spl);
string key = extract_key();
key = normalize(key, norm_nfc);
string _value = extract_value();
_value = normalize(_value, norm_nfc);
stringpair_t *pair = new_stringpair(key.c_str(), _value.c_str());
if (!pair) {
free_stringpair_list(_spl);
throw bad_alloc();
}
_s = stringpair_list_add(_s, pair);
if (!_s) {
free_stringpair_list(_spl);
throw bad_alloc();
}
}
free_stringpair_list(spl);
spl = _spl;
}
stringlist_t *to_stringlist(boost::python::list l) {
stringlist_t *result = new_stringlist(NULL);
if (!result)
throw bad_alloc();
stringlist_t *_s = result;
for (int i = 0; i < len(l); i++) {
extract <string> extract_string(l[i]);
if (!extract_string.check())
free_stringlist(result);
string s = extract_string();
_s = stringlist_add(_s, s.c_str());
if (!_s) {
free_stringlist(result);
throw bad_alloc();
}
}
return result;
}
boost::python::list from_stringlist(const stringlist_t *sl) {
boost::python::list result;
for (const stringlist_t *_sl = sl; _sl && _sl->value; _sl = _sl->next) {
string s = _sl->value;
result.append(s);
}
return result;
}
} // namespace PythonAdapter
} // namespace pEp { } // namespace pEp {

133
src/pEp/native_pEp/user_interface.cc

@ -8,82 +8,76 @@
#include "user_interface.hh" #include "user_interface.hh"
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
using namespace std; using namespace std;
using namespace boost::python; using namespace boost::python;
UserInterface *UserInterface::_ui = nullptr; UserInterface *UserInterface::_ui = nullptr;
UserInterface::UserInterface() UserInterface::UserInterface() {
{ if (_ui)
if (_ui) throw runtime_error("only one UserInterface thread allowed");
throw runtime_error("only one UserInterface thread allowed"); _ui = this;
_ui = this; }
}
UserInterface::~UserInterface() {
UserInterface::~UserInterface() _ui = nullptr;
{ }
_ui = nullptr;
} UserInterface_callback::UserInterface_callback(PyObject *self) :
UserInterface(), _self(self) {
UserInterface_callback::UserInterface_callback(PyObject *self) :
UserInterface(), _self(self)
{
// adapter.ui_object(self); // adapter.ui_object(self);
// PEP_STATUS status = ::register_sync_callbacks(Adapter::session(), // PEP_STATUS status = ::register_sync_callbacks(Adapter::session(),
// (void *) this, _notifyHandshake, retrieve_next_sync_event); // (void *) this, _notifyHandshake, retrieve_next_sync_event);
// assert(status == PEP_STATUS_OK); // assert(status == PEP_STATUS_OK);
// if (status) // if (status)
// _throw_status(status); // _throw_status(status);
} }
UserInterface_callback::~UserInterface_callback() UserInterface_callback::~UserInterface_callback() {
{
// ::unregister_sync_callbacks(Adapter::session()); // ::unregister_sync_callbacks(Adapter::session());
} }
PEP_STATUS UserInterface::_notifyHandshake( PEP_STATUS UserInterface::_notifyHandshake(
pEp_identity *me, pEp_identity *partner, pEp_identity *me, pEp_identity *partner,
sync_handshake_signal signal sync_handshake_signal signal
) ) {
{ if (!(me && partner))
if (!(me && partner)) return PEP_ILLEGAL_VALUE;
return PEP_ILLEGAL_VALUE;
auto that = dynamic_cast< UserInterface_callback * >(_ui);
auto that = dynamic_cast< UserInterface_callback * >(_ui); that->notifyHandshake(Identity(me), Identity(partner), signal);
that->notifyHandshake(Identity(me), Identity(partner), signal);
return PEP_STATUS_OK;
return PEP_STATUS_OK; }
}
void UserInterface::deliverHandshakeResult(int result, object identities) {
void UserInterface::deliverHandshakeResult(int result, object identities) identity_list *shared_identities = nullptr;
{ if (identities != boost::python::api::object() && boost::python::len(identities)) {
identity_list *shared_identities = nullptr; shared_identities = new_identity_list(nullptr);
if (identities != boost::python::api::object() && boost::python::len(identities)) { if (!shared_identities)
shared_identities = new_identity_list(nullptr);
if (!shared_identities)
throw bad_alloc();
try {
identity_list *si = shared_identities;
for (int i=0; i < boost::python::len(identities); ++i) {
Identity ident = extract< Identity >(identities[i]);
si = identity_list_add(si, ident);
if (!si)
throw bad_alloc(); throw bad_alloc();
try {
identity_list *si = shared_identities;
for (int i = 0; i < boost::python::len(identities); ++i) {
Identity ident = extract<Identity>(identities[i]);
si = identity_list_add(si, ident);
if (!si)
throw bad_alloc();
}
}
catch (exception &ex) {
free_identity_list(shared_identities);
throw ex;
}
} }
}
catch (exception& ex) { PEP_STATUS status = ::deliverHandshakeResult(Adapter::session(),
(sync_handshake_result) result, shared_identities);
free_identity_list(shared_identities); free_identity_list(shared_identities);
throw ex; _throw_status(status);
} }
}
PEP_STATUS status = ::deliverHandshakeResult(Adapter::session(),
(sync_handshake_result) result, shared_identities);
free_identity_list(shared_identities);
_throw_status(status);
}
//PEP_rating UserInterface::get_key_rating_for_user(string user_id, string fpr) //PEP_rating UserInterface::get_key_rating_for_user(string user_id, string fpr)
//{ //{
@ -119,12 +113,11 @@ void UserInterface::deliverHandshakeResult(int result, object identities)
// return adapter.queue().pop_front(); // return adapter.queue().pop_front();
//} //}
void UserInterface_callback::notifyHandshake( void UserInterface_callback::notifyHandshake(
Identity me, Identity partner, sync_handshake_signal signal) Identity me, Identity partner, sync_handshake_signal signal) {
{ call_method<void>(_self, "notifyHandshake", me, partner, signal);
call_method< void >(_self, "notifyHandshake", me, partner, signal); }
}
} // namespace PythonAdapter } // namespace PythonAdapter
} // namespace pEp { } // namespace pEp {

59
src/pEp/native_pEp/user_interface.hh

@ -16,44 +16,45 @@
namespace pEp { namespace pEp {
namespace PythonAdapter { namespace PythonAdapter {
class UserInterface { class UserInterface {
static UserInterface *_ui; static UserInterface *_ui;
public: public:
UserInterface(); UserInterface();
virtual ~UserInterface();
virtual void notifyHandshake( virtual ~UserInterface();
Identity me,
Identity partner,
sync_handshake_signal signal)
{
throw runtime_error("override this method");
}
virtual void deliverHandshakeResult(int result, object identities); virtual void notifyHandshake(
Identity me,
Identity partner,
sync_handshake_signal signal) {
throw runtime_error("override this method");
}
virtual void deliverHandshakeResult(int result, object identities);
// PEP_rating get_key_rating_for_user(string user_id, string fpr); // PEP_rating get_key_rating_for_user(string user_id, string fpr);
protected: protected:
static PEP_STATUS _notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handshake_signal signal); static PEP_STATUS _notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handshake_signal signal);
}; };
class UserInterface_callback : public UserInterface {
PyObject *_self;
public:
UserInterface_callback(PyObject *self);
class UserInterface_callback : public UserInterface { ~UserInterface_callback();
PyObject *_self;
public:
UserInterface_callback(PyObject *self);
~UserInterface_callback();
void notifyHandshake( void notifyHandshake(
Identity me, Identity me,
Identity partner, Identity partner,
sync_handshake_signal signal sync_handshake_signal signal
); );
}; };
} /* namespace PythonAdapter */ } /* namespace PythonAdapter */
} /* namespace pEp */ } /* namespace pEp */
#endif /* USER_INTERFACE_HH */ #endif /* USER_INTERFACE_HH */

Loading…
Cancel
Save