jami-daemon issueshttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues2021-08-18T19:43:04Zhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/611Reorder video tiles via drag and drop2021-08-18T19:43:04ZovariReorder video tiles via drag and dropReorder video tiles via drag and drop.
https://jitsi-hacks.cketti.eu/hacks/reorder/
![image](/uploads/90539430a84e1b31e755b4b68f3d3e0a/image.png)
# Installation
Drag the following link into your browser’s bookmark bar: [Reorder video...Reorder video tiles via drag and drop.
https://jitsi-hacks.cketti.eu/hacks/reorder/
![image](/uploads/90539430a84e1b31e755b4b68f3d3e0a/image.png)
# Installation
Drag the following link into your browser’s bookmark bar: [Reorder video tiles](javascript:(function()%7Bfunction%20callback()%7B%7Dvar%20s%3Ddocument.createElement(%22script%22)%3Bs.src%3D%22https%3A%2F%2Fjitsi-hacks.cketti.eu%2Freorder.js%22%3Bif(s.addEventListener)%7Bs.addEventListener(%22load%22%2Ccallback%2Cfalse)%7Delse%20if(s.readyState)%7Bs.onreadystatechange%3Dcallback%7Ddocument.body.appendChild(s)%3B%7D)())
If the link doesn't work, here is the code:<br>
`javascript:(function()%7Bfunction%20callback()%7B%7Dvar%20s%3Ddocument.createElement(%22script%22)%3Bs.src%3D%22https%3A%2F%2Fjitsi-hacks.cketti.eu%2Freorder.js%22%3Bif(s.addEventListener)%7Bs.addEventListener(%22load%22%2Ccallback%2Cfalse)%7Delse%20if(s.readyState)%7Bs.onreadystatechange%3Dcallback%7Ddocument.body.appendChild(s)%3B%7D)()`
To inject the script click the link in the bookmark bar while the Jitsi Meet tab is active. The effects only last until the next page reload.
# Usage
Once the hack is loaded you can reorder videos in tile view via drag and drop.
How does it work?
The script utilizes the [Dragula](https://bevacqua.github.io/dragula/) library to allow reordering video tiles via drag and drop.
# Source Code
Find [reorder.js](https://github.com/cketti/jitsi-hacks/blob/main/docs/reorder.js) on GitHub.https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/610ICE/SIPCall - possible race condition in ICE initialization2021-09-15T14:23:37ZMohamed ChibaniICE/SIPCall - possible race condition in ICE initializationPossible race condition between JamiAccount::SIPStartCall() and SIPCall::initIceMediaTransport(). SIPCall::addLocalIceAttributes() is called by SIPStartCall() before the ice session is fully setup.
```
[1628703709.408|52540|ice_transpor...Possible race condition between JamiAccount::SIPStartCall() and SIPCall::initIceMediaTransport(). SIPCall::addLocalIceAttributes() is called by SIPStartCall() before the ice session is fully setup.
```
[1628703709.408|52540|ice_transport.cpp :791 ] [ice:0x7fff99480f00] added host stun config for UDP transport
[1628703709.422|52540|ice_transport.cpp :566 ] [ice:0x7fff99480f00] UDP initialization success
[1628703709.422|52540|ice_transport.cpp :630 ] [ice:0x7fff99480f00] as master
[1628703709.426|52540|ice_transport.cpp :766 ] [ice:0x7fff99480f00] (local) ufrag=132de820, pwd=057ba91211155276119d9083
[1628703709.430|52686|sipcall.cpp :1642 ] [call:438314284593258] no media ICE transport, SDP not changed
[1628703709.432|52686|sipcall.cpp :686 ] [call:438314284593258] Set new invite session [0x7fff94133328]
[1628703709.436|52540|sipcall.cpp :2935 ] [call:438314284593258] Successfully created media ICE transport
```Mohamed ChibaniSébastien BlinMohamed Chibanihttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/609Device info isCurrent issue2022-01-24T16:44:22ZMing Rui ZhangDevice info isCurrent issueWhen an account is created initially, the device info from the only device (current device) has the isCurrent set to false.When an account is created initially, the device info from the only device (current device) has the isCurrent set to false.https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/608ICE - add generic srflx candidates only if UPNP candidates are not available2021-08-17T20:05:30ZMohamed ChibaniICE - add generic srflx candidates only if UPNP candidates are not availableCurrently, (generic) srflx candidates generated using the account public address are always added regardless if UPNP candidates are available or not. Having duplicate srflx candidates is not useful, and even worse, it may reduce the chan...Currently, (generic) srflx candidates generated using the account public address are always added regardless if UPNP candidates are available or not. Having duplicate srflx candidates is not useful, and even worse, it may reduce the chance of UPNP candidates to succeed.Mohamed ChibaniMohamed Chibanihttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/607ICE - missing srflx candidates in answer2021-08-17T20:05:31ZMohamed ChibaniICE - missing srflx candidates in answerServer reflexive candidates are not added in call answer if UPNP is disabled. This can cause ICE media negotiation failure if the peer is behind a NAT with TURN enabled, and UPNP disabled/unavailable.
Setup:
Endpoint A
TURN enabled
UPNP...Server reflexive candidates are not added in call answer if UPNP is disabled. This can cause ICE media negotiation failure if the peer is behind a NAT with TURN enabled, and UPNP disabled/unavailable.
Setup:
Endpoint A
TURN enabled
UPNP disabled
Endpoint B
TURN disabled
UPNP disabled
A calls B.
Results: failed (notice the absence of srflx cand in B's SDP answer)
Expected: success (connection pair A:relay <-> B:prflx
ICE fails because the TURN server does not authorize connection from prflx candidates because they are unknown to it (they be authorized if the B add the address as a srflx canddiate).
Note that the call is successful if B calls A (because the srflx are included in the offer).Mohamed ChibaniMohamed Chibanihttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/606Split JamiAccount: rewrite setAccountDetails.2021-12-29T17:09:32ZSébastien BlinSplit JamiAccount: rewrite setAccountDetails.Account's config should be in a separated class
setAccountDetails should only change what is in the map, not all settings.Account's config should be in a separated class
setAccountDetails should only change what is in the map, not all settings.Backloghttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/605ICE/PJNATH - use different Ta timer for TCP candidates2021-09-08T14:05:59ZMohamed ChibaniICE/PJNATH - use different Ta timer for TCP candidatesThe current Ta timer (interval between two connectivity checks, see RFC-5245 for details) is set to 20ms and used for UDP and TCP candidates alike. RFC-5245 (section recommends using a less a higher value for non-real-time application (T...The current Ta timer (interval between two connectivity checks, see RFC-5245 for details) is set to 20ms and used for UDP and TCP candidates alike. RFC-5245 (section recommends using a less a higher value for non-real-time application (TCP/TLS connections in our case). Furthermore, newer ICE spec (RFC-8445), recommends a min value of 50ms for real-time applications.
The advantage of using a low Ta value (20ms) is to start the connectivity checks, but the drawback is a abrupt increase in bandwidth (as described in RFC-5245 and RFC-8445). The peak in bandwidth usage may be significant if the candidate list is large. The goal is to find a better trade-off between connection speed and bandwidth usage.Mohamed ChibaniMohamed Chibanihttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/604Video conf: bad mute status2021-08-05T19:41:06ZSébastien BlinVideo conf: bad mute status+ Alice is a rendez-vous
+ Bob joins
+ Carla joins
+ Bob is muted by a moderator
+ Bob leaves
+ Bob joins
# Expected result
+ Bob should not be shown as muted because it's not anymore
# Current
Bob is shown as muted+ Alice is a rendez-vous
+ Bob joins
+ Carla joins
+ Bob is muted by a moderator
+ Bob leaves
+ Bob joins
# Expected result
+ Bob should not be shown as muted because it's not anymore
# Current
Bob is shown as mutedAline Gondim SantosAline Gondim Santoshttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/603Extract conversation's code from jamiaccount2021-09-13T17:03:00ZSébastien BlinExtract conversation's code from jamiaccountJamiAccount is too big. Split this classJamiAccount is too big. Split this classSébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/602Deadlock with sendBeacon2021-08-17T20:19:30ZSébastien BlinDeadlock with sendBeacon[gdb.txt](/uploads/e9900d59f519af011c3af4eec22deb0c/gdb.txt)[gdb.txt](/uploads/e9900d59f519af011c3af4eec22deb0c/gdb.txt)Sébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/601ICE - disable aggressive nomination2021-09-02T15:00:33ZMohamed ChibaniICE - disable aggressive nominationMohamed ChibaniMohamed Chibanihttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/600TrustRequest: add signal for conversationRequest removed, and ensure it's cor...2021-08-09T14:35:49ZSébastien BlinTrustRequest: add signal for conversationRequest removed, and ensure it's correctly syncedRelated to https://git.jami.net/savoirfairelinux/ring-project/-/issues/1282Related to https://git.jami.net/savoirfairelinux/ring-project/-/issues/1282Swarm-chatSébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/599Account preferences: add preferences to send or not displayed status2021-08-09T13:30:43ZSébastien BlinAccount preferences: add preferences to send or not displayed statusFor now clients are doing their own logic. This should be moved into the daemon. This allow us to group code from differnt clients.For now clients are doing their own logic. This should be moved into the daemon. This allow us to group code from differnt clients.Sébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/598jamiaccount: SHA256 regression2021-08-18T20:29:23ZOlivier Dionjamiaccount: SHA256 regressionStore on misaligned address of type `uint16_t`
See [backtrace](/uploads/d4f3ad2b7b84544a4ca1313db2a1e0e4/bt.txt).
Git bisect shows that commit 95280b19b88ae5c13e5dfa318d38feeef408ae82 introduced the bug.
To find the regression on your...Store on misaligned address of type `uint16_t`
See [backtrace](/uploads/d4f3ad2b7b84544a4ca1313db2a1e0e4/bt.txt).
Git bisect shows that commit 95280b19b88ae5c13e5dfa318d38feeef408ae82 introduced the bug.
To find the regression on your own, run [this](/uploads/97df2ce05ff2f310893ff244cfb2e79b/find-regression) script.https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/597Regression 2.11 - should stop in less than 30 secs if turn fails2021-07-30T20:03:34ZSébastien BlinRegression 2.11 - should stop in less than 30 secs if turn fails```cpp
void
IceTest::testFail()
{
const auto& addr4 = dht_->getPublicAddress(AF_INET);
CPPUNIT_ASSERT(addr4.size() != 0);
CPPUNIT_ASSERT(turnV4_);
IceTransportOptions ice_config;
ice_config.upnpEnable = true;
ice_...```cpp
void
IceTest::testFail()
{
const auto& addr4 = dht_->getPublicAddress(AF_INET);
CPPUNIT_ASSERT(addr4.size() != 0);
CPPUNIT_ASSERT(turnV4_);
IceTransportOptions ice_config;
ice_config.upnpEnable = true;
ice_config.tcpEnable = true;
std::shared_ptr<IceTransport> ice_master, ice_slave;
std::mutex mtx, mtx_create, mtx_resp, mtx_init;
std::unique_lock<std::mutex> lk {mtx}, lk_create {mtx_create}, lk_resp {mtx_resp},
lk_init {mtx_init};
std::condition_variable cv, cv_create, cv_resp, cv_init;
std::string init = {};
std::string response = {};
bool iceMasterNotReady = false, iceSlaveNotReady = false;
ice_config.onInitDone = [&](bool ok) {
CPPUNIT_ASSERT(ok);
dht::ThreadPool::io().run([&] {
CPPUNIT_ASSERT(cv_create.wait_for(lk_create, std::chrono::seconds(10), [&] {
return ice_master != nullptr;
}));
auto iceAttributes = ice_master->getLocalAttributes();
std::stringstream icemsg;
icemsg << iceAttributes.ufrag << "\n";
icemsg << iceAttributes.pwd << "\n";
for (const auto& addr : ice_master->getLocalCandidates(1)) {
if (addr.find("relay") != std::string::npos) {
// We only want to add relayed + public ip
icemsg << addr << "\n";
JAMI_DBG() << "Added local ICE candidate " << addr;
} else {
// Replace host by non existing IP (we still need host to not fail the start)
std::regex e("((?:[0-9]{1,3}\\.){3}[0-9]{1,3})");
auto newaddr = std::regex_replace(addr, e, "100.100.100.100");
if (newaddr != addr)
icemsg << newaddr << "\n";
}
}
init = icemsg.str();
cv_init.notify_one();
CPPUNIT_ASSERT(cv_resp.wait_for(lk_resp, std::chrono::seconds(10), [&] {
return !response.empty();
}));
auto sdp = ice_master->parseIceCandidates(response);
CPPUNIT_ASSERT(
ice_master->startIce({sdp.rem_ufrag, sdp.rem_pwd}, std::move(sdp.rem_candidates)));
});
};
ice_config.onNegoDone = [&](bool ok) {
iceMasterNotReady = !ok;
cv.notify_one();
};
ice_config.accountPublicAddr = IpAddr(*addr4[0].get());
ice_config.accountLocalAddr = ip_utils::getLocalAddr(AF_INET);
ice_config.master = true;
ice_config.streamsCount = 1;
ice_config.compCountPerStream = 1;
ice_master = Manager::instance().getIceTransportFactory().createTransport("master ICE",
ice_config);
cv_create.notify_all();
ice_config.onInitDone = [&](bool ok) {
CPPUNIT_ASSERT(ok);
dht::ThreadPool::io().run([&] {
CPPUNIT_ASSERT(cv_create.wait_for(lk_create, std::chrono::seconds(10), [&] {
return ice_slave != nullptr;
}));
auto iceAttributes = ice_slave->getLocalAttributes();
std::stringstream icemsg;
icemsg << iceAttributes.ufrag << "\n";
icemsg << iceAttributes.pwd << "\n";
for (const auto& addr : ice_slave->getLocalCandidates(1)) {
if (addr.find("relay") != std::string::npos) {
// We only want to add relayed + public ip
icemsg << addr << "\n";
JAMI_DBG() << "Added local ICE candidate " << addr;
} else {
// Replace host by non existing IP (we still need host to not fail the start)
std::regex e("((?:[0-9]{1,3}\\.){3}[0-9]{1,3})");
auto newaddr = std::regex_replace(addr, e, "100.100.100.100");
if (newaddr != addr)
icemsg << newaddr << "\n";
}
}
response = icemsg.str();
cv_resp.notify_one();
CPPUNIT_ASSERT(
cv_init.wait_for(lk_resp, std::chrono::seconds(10), [&] { return !init.empty(); }));
auto sdp = ice_slave->parseIceCandidates(init);
CPPUNIT_ASSERT(
ice_slave->startIce({sdp.rem_ufrag, sdp.rem_pwd}, std::move(sdp.rem_candidates)));
});
};
ice_config.onNegoDone = [&](bool ok) {
iceSlaveNotReady = !ok;
cv.notify_one();
};
ice_config.turnServers.emplace_back(TurnServerInfo()
.setUri(turnV4_->toString(true))
.setUsername("ring")
.setPassword("ring")
.setRealm("ring"));
ice_config.master = false;
ice_config.streamsCount = 1;
ice_config.compCountPerStream = 1;
ice_slave = Manager::instance().getIceTransportFactory().createTransport("slave ICE",
ice_config);
cv_create.notify_all();
CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(120), [&] {
return iceMasterNotReady && iceSlaveNotReady;
}));
}
```
This should succeed. However seems not the case seems 2.11
Also we can change a bit the busy loop to test every 100 ms for TURN if refused instead of each 20msSébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/596Swarm: removeContact should remove syncing conversations2021-07-28T21:14:57ZSébastien BlinSwarm: removeContact should remove syncing conversations+ Fix bug
+ Add test+ Fix bug
+ Add testSwarm-chatSébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/595Swarm 1:1 detect contact left2021-07-28T16:05:38ZSébastien BlinSwarm 1:1 detect contact left+ Change repo to include /invited
+ "Contact left" should be visible in getConversationMembers()
+ Add test
+ DO client changes+ Change repo to include /invited
+ "Contact left" should be visible in getConversationMembers()
+ Add test
+ DO client changesSwarm-chatSébastien BlinAndreas TraczykSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/594videoinput: API refactoring2021-11-26T15:10:28ZAdrien Béraudvideoinput: API refactoring* add new daemon APIs
* SIPCall refactoring to use new VideoInput
(To be detailed)* add new daemon APIs
* SIPCall refactoring to use new VideoInput
(To be detailed)Aline Gondim SantosAdrien BéraudAline Gondim Santoshttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/593Monitoring: add redirection to file2021-08-20T21:11:54ZSébastien BlinMonitoring: add redirection to fileOlivier DionOlivier Dionhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/592Swarm: move last read per participant daemon' side2021-07-28T17:15:46ZSébastien BlinSwarm: move last read per participant daemon' side+ getMembers() should return last read
+ react to messageDisplayed/setMessageDisplayed
+ Add test
+ Add method to compute how many messages between two interactions
+ Update LRC
+ Update doc+ getMembers() should return last read
+ react to messageDisplayed/setMessageDisplayed
+ Add test
+ Add method to compute how many messages between two interactions
+ Update LRC
+ Update docSwarm-chatSébastien BlinSébastien Blin