In case an object was expected while another type was got RsSerializable
JSON deserialization code was crashing, this commit solve the crash in
this not so corner case
This was causing scary error message in RsGxsChannels with autodoanload
enabled, when all messages where already processed none matched the
filter so all messages where returned,
making p3GxsChannels::handleUnprocessedPost furious
more details into this forum post
retroshare://forum?name=Scary%20message%2C%20but%20which%20doesn%27t%20seem%20to%20be%20the%20source%20of%20the%20problems%20Was%3A%20More%20GXS%20strange%20messages&id=8fd22bd8f99754461e7ba1ca8a727995&msgid=04f10ff97f761c6840c33f1610cb050f0f73da8d
Deprecated old method which exposed interna async mechanism to the API
users, making their and out life difficult
Things that really need to be async like turtle search/requests now accept
callbacks, so the caller can be notified everytime some result is got
back
Implement RsThread::async commodity wrapper to execute blocking API
calls without blocking the caller, this could be optimized
trasparently using a thread pool if necessary
Added hints into some retroshare-gui files on how to use RsThread::async
thoghether with QMetaObject::invokeMethod and blocking RetroShare API
to simplyfy interaction between GUI and libretroshare
rsGetHostByName doesn't support IPv6 addresses.
Before this commit when
an hostname had both AAAA and A record rsGetHostByName retrurned success
but with 0.0.0.0 invalid address. As rsGetHostByName is not capable of
handling IPv6 (fixing it would require API change and a bunch of
refactors around) just avoid to receive IPv6 addresses on resolition, so
the correct IPv4 address is returned if present, otherwise fail
gracefully (A record not found).
Forging of BIO_METHOD may be the cause of the stack overflow as the
internal structure in openssl changed so the methods get assigned to
wrong pointer.
Kudos Cyril to notice newer openssl internal struct had one new pointer
inserted as second member
Caused by unneeded pointer usages + not enough careful IPv6 porting
I haven't managed to reproduce the crash nor to test the fix due it
happening only when UDP relayed connection happens (apparently never on
my nodes.
I have managed to discover where the bug comes from thanks to multiple
user reports, specially to Ilario report which documented 3 crashes
happening on 0.6.4 with complete log.
/retroshare-gui/src/gui/settings/MessagePage.cpp:62:19: warning:
deleting object of polymorphic class type 'Rs::Msgs::MsgTagType' which
has non-virtual destructor might cause undefined behavior [-Wdelete-non-
virtual-dtor]
/retroshare-gui/src/gui/settings/MessagePage.cpp:62: warning: delete
called on non-final 'Rs::Msgs::MsgTagType' that has virtual functions
but non-virtual destructor
/retroshare-gui/src/gui/settings/MessagePage.cpp:86: warning: use of
old-style cast
/retroshare-gui/src/gui/settings/MessagePage.cpp:172: warning: zero as
null pointer constant
/retroshare-gui/src/gui/settings/MessagePage.cpp:176: warning: implicit
conversion changes signedness: 'int' to 'uint32_t' (aka 'unsigned int')
/retroshare-gui/src/gui/settings/MessagePage.cpp:203: warning: zero as
null pointer constant
/retroshare-gui/src/gui/settings/MessagePage.cpp:207: warning: implicit
conversion changes signedness: 'int' to 'uint32_t' (aka 'unsigned int')
/retroshare-gui/src/gui/settings/MessagePage.cpp:261: warning: implicit
conversion changes signedness: 'int' to 'uint32_t' (aka 'unsigned int')
/libretroshare/src/retroshare/rsmsgs.h:168: warning:
'Rs::Msgs::MessageInfo' has virtual functions but non-virtual destructor
/libretroshare/src/retroshare/rsmsgs.h:168: warning: 'MessageInfo' has
no out-of-line virtual method definitions; its vtable will be emitted in
every translation unit
/libretroshare/src/retroshare/rsmsgs.h:234: warning:
'Rs::Msgs::MsgInfoSummary' has virtual functions but non-virtual
destructor
/libretroshare/src/retroshare/rsmsgs.h:234: warning: 'MsgInfoSummary'
has no out-of-line virtual method definitions; its vtable will be
emitted in every translation unit
/libretroshare/src/retroshare/rsmsgs.h:261: warning:
'Rs::Msgs::MsgTagInfo' has virtual functions but non-virtual destructor
/libretroshare/src/retroshare/rsmsgs.h:328: warning: 'ChatId' has
virtual functions but non-virtual destructor
/libretroshare/src/retroshare/rsmsgs.h:400: warning: 'ChatLobbyInvite'
has virtual functions but non-virtual destructor
/libretroshare/src/retroshare/rsmsgs.h:420: warning:
'VisibleChatLobbyRecord' has virtual functions but non-virtual
destructor
/libretroshare/src/retroshare/rsmsgs.h:420: warning:
'VisibleChatLobbyRecord' has no out-of-line virtual method definitions;
its vtable will be emitted in every translation unit
/libretroshare/src/retroshare/rsmsgs.h:449: warning: 'ChatLobbyInfo' has
virtual functions but non-virtual destructor
/libretroshare/src/retroshare/rsmsgs.h:486: warning: 'RsMsgs' has no
out-of-line virtual method definitions; its vtable will be emitted in
every translation unit
About vtable:
https://stackoverflow.com/questions/23746941/what-is-the-meaning-of-
clangs-wweak-vtables
https://stackoverflow.com/questions/50463374/avoid-weak-vtable-warnings-
for-classes-only-defined-in-a-source-file
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved1' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved2' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved3' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved4' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved5' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved6' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:122:2: warning: missing
initializer for member 'SecretSchema::reserved7' [-Wmissing-field-
initializers]
/libretroshare/src/rsserver/rsloginhandler.cc:34: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:55: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:120: warning: use of old-
style cast
/libretroshare/src/rsserver/rsloginhandler.cc:122: warning: missing
field 'reserved' initializer
/libretroshare/src/rsserver/rsloginhandler.cc:243: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:244: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:248: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:254: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:443: warning: 'return'
will never be executed
/libretroshare/src/rsserver/rsloginhandler.cc:270: warning: 'return'
will never be executed
/libretroshare/src/rsserver/rsloginhandler.cc:468: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:470: warning: use of old-
style cast
/libretroshare/src/rsserver/rsloginhandler.cc:470: warning: cast from
'const char *' to 'char *' drops const qualifier
/libretroshare/src/rsserver/rsloginhandler.cc:471: warning: use of old-
style cast
/libretroshare/src/rsserver/rsloginhandler.cc:471: warning: cast from
'const char *' to 'char *' drops const qualifier
/libretroshare/src/rsserver/rsloginhandler.cc:472: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:476: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:630: warning: 'return'
will never be executed
/libretroshare/src/rsserver/rsloginhandler.cc:650: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:651: warning: zero as null
pointer constant
/libretroshare/src/rsserver/rsloginhandler.cc:655: warning: zero as null
pointer constant
This function is part of the public API so it must be safe to call with
any input, before this commit if would crash if feeded with a broken or
empty certificate radix string.
Order of serialization doesn't matter ATM as we use those only for
JSON API.
Those classes should be rewritten anyway with proper naming of the
memebers and using std::uintptr_t instead of void* and rstime_t for
timestamps
Now the possible id of the cannel/post is returned and channel/post is
indexed on creation without having to wait for gxsutil scan to happen
Note that the id is correct in normal usage, but if one try to overload
the API per eventually get the id of another channel/post with same data
but created by a different call, it is not dangerous so one trying to
overload the API is just getting a possibly wrong but equivalent
channel/post id returned.
If the member was not present in the JSON it was zeroed while it should
be left untouched in that case.
This was discovered because in JSON API defualt argument value for
methods wasn't onored for t_RsFlags32 arguments.
Avoid problems to serialization on different platforms, without breaking
nested STL containers serialization.
The conversion have been made with sed, and checked with grep, plus
kdiff3 visual ispection, plus rutime tests, so it should be fine.
/libretroshare/src/pqi/authssl.cc:160: warning: ‘void
dyn_destroy_function(CRYPTO_dynlock_value*, const char*, int)’ defined
but not used [-Wunused-function]
static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const
char */*file*/, int /*line*/)
/libretroshare/src/pqi/authssl.cc:143: warning: ‘void
dyn_lock_function(int, CRYPTO_dynlock_value*, const char*, int)’ defined
but not used [-Wunused-function]
static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l,
const char */*file*/, int /*line*/)
/libretroshare/src/pqi/authssl.cc:121: warning: ‘CRYPTO_dynlock_value*
dyn_create_function(const char*, int)’ defined but not used [-Wunused-
function]
static struct CRYPTO_dynlock_value *dyn_create_function(const char */
*file*/, int /*line*/)
/libretroshare/src/pqi/authssl.cc:106: warning: ‘long unsigned int
id_function()’ defined but not used [-Wunused-function]
static unsigned long id_function(void)
/libretroshare/src/pqi/authssl.cc:92: warning: ‘void
locking_function(int, int, const char*, int)’ defined but not used [-
Wunused-function]
static void locking_function(int mode, int n, const char */*file*/, int
/*line*/)
This doesn't need any interacion of the user at startup, unlike
retroshare-nogui which requires the user to login on the shell this doesn't
even need a TTY.
At startup this just parse command line, read the PGP keyring, look for
available locations, and start listening for JSON API requests.
Another difference with retroshare-nogui is that this is capable to
generate/import PGP identities, generate locations, and in general anything
possible through the RetroShare API.
retroshare-service is suitable also to run it as a system service, even
in very constrained systems such as Android ot a Docker container.
retroshare-service drop support for libresapi so only the new JSON API
is exposed, it will completely obsolete retroshare-android-service once
retroshare-qml-app is ported to the new JSON API.
Makefile.libretroshare:3811: warning: overriding recipe for target
'temp/linux-g++/obj/hashstream.o'
Makefile.libretroshare:3772: warning: ignoring old recipe for target
'temp/linux-g++/obj/hashstream.o'
jsonapi-generator is now capable of generating API for headers outside
retroshare/ directory
jsonapi-generator do a bit of methods parameter sanity check
JsonApiServer is now integrated in the rsinit hell like other services
Add *::exportGPGKeyPairToString to a bunch of classes in cascade
RsControl is now capable of calling back a function when retroshare is almost
completely stopped, this is useful when running retroshare toghether with
externally managed runloop such as QCoreApplication
Expose a bunch of methods through JSON API
retroshare-nogui remove some dead code and fix stopping from the RetroShare API
Remove unnecessary dangerous method from RsLoginHelper
Fix documentation for RsServiceControl::getServiceName that was breaking
JSON API and causing compilation warning
Avoid the need of dirty patching to set the version at build time
In case RS version is not passed as argument attempt to determine it
using git describe, if unavailable use hardcoded default
Enforce it being 127.0.0.1 by default, I assumed 127.0.0.1 was restbed
default, but as reported by sehraf is not alwayd the case
JSON API bind address now is also configurable via commandline on
retroshare-android-service and retroshare-nogui, while it obey the
configuration of webui (execept for that port is incremented by 2)
in retroshare-gui
Added also new method for better usability via the API that allow to add
friend directly for RetroShare invitation (supports also URL) without
having to call to mulptiple metods to set IP etc.
RsPeers::acceptInvite
/rsPeers/acceptInvite
/rsLoginHelper/isLoggedIn to check if already logged in
/rsAccounts/getCurrentAccountId to get the id of current selected
account, beware that an account may be selected without actually logging in
Manually expose /rsFiles/getFileData to stream/preview files
Automatically expose a bunch of methods via JSON API
Implement serial_process for std::pair
Move JSON helpers to util/rsjson.* for better usability
Implement JSON ostream manipulator to print compact and pretty JSON
Use lambdas for API wrappers, integrate better and avoid namespace
pollution
Removed experimental JSON API for notify client wrapper, notifications
can be implemented automatically with moderns async API calls
Implement and automatically expose to JSON API
RsGxsChannels::turtleSearchRequest(
const std::string& matchString,
const std::function<void (const RsGxsGroupSummary&)>& multiCallback,
std::time_t maxWait )
Some modifications breaks retrocompatibility of GXS search:
remove horrible templated RsTypeSerializer::serial_process for
RsGxsGroupSummary with hardcoded member names
RsGxsGroupSummary doesn't use old TLV serialization format anymore
RsGxsGroupSummary remove unused description member
RsGxsGroupSummary derive from RsSerializable and use serialization
helper macro
Add autor id and signature flags to the index so there is no need to
retrive them from GXS, thus improving performances
RsGroupNetworkStats initialize members properly
RsGxsGroupSummary rename members to follow usual mMemberName convention
Implement a "normal" way to login RsLoginHelper::attemptLogin
Implement a way to get locations list RsLoginHelper::getLocations
Enable JSON API into retroshare-android-service
Thanks sehraf for reporting
retroshare://forum?name=fucking%20genius&id=8fd22bd8f99754461e7ba1ca8a727995&msgid=503d75bf7ed7fa7568eeae4db5c8d31a7e124c98
RsGxsIfaceHelper::requestStatus expose it to JSON API
Implemented RsGxsIfaceHelper::waitToken to wait for GXS operations
RsItem::serial_process fix doxygen warning as it's a comment not documentation
RsTypeSerializer add JSON conversion methods for double [de]serialization not
implemented yet
RsTypeSerializer_PRIVATE_{FROM,TO}_JSON_ARRAY fix doxygen warning as it's a
comment not documentation
make GxsChannels::ExtraFileHash a bit more reasonable
jsonapi-generator fix unused variable warning if there is no input or output
paramethers
jsonapi-generator fix generation for inerithed jsonapi methods
Convert to RsSerializable some Gxs structs for the JSON API
qmake file add jsonapi-generator target to compile JSON API generator
qmake files add rs_jsonapi CONFIG option to enable/disable JSON API at compile
time
RsTypeSerializer pass down same serialization flags when creating new context
for nested objects serial job
RsGxsChannels expose a few methods through JSON API as example
Derive a few GXS types (RsGxsChannelGroup, RsGxsChannelPost, RsGxsFile,
RsMsgMetaData) from RsSerializables so they can be used for the JSON API
Create RsGenericSerializer::SERIALIZATION_FLAG_YIELDING so JSON objects that
miss some fields can be still deserialized, this improve API usability
SerializeContext offer friendly constructor with default paramethers
Add restbed 4.6 library as git submodule as most systems doesn't have it yet
Add a bit of documentation about JSON API into jsonapi-generator/README.adoc
Add JsonApiServer class to expose the JSON API via HTTP protocol