Commit 49187f96 authored by Nicolas Michon's avatar Nicolas Michon

Lime api changes

parent c1d4e387
......@@ -82,4 +82,6 @@ Encrypted chat rooms only allow encrypted messages and files to transit (except
LinphoneChatRoomSecurityLevel securityLevel = linphone_chat_room_get_security_level(securedChatRoom);
.. seealso:: <point to basic LIME X3DH test and LIME helloworld test>.
\ No newline at end of file
.. seealso:: <point to basic LIME X3DH test and LIME helloworld test>.
.. warning:: LIME X3DH encryption activation at linphone core level requires a server. Make sure the configuration entry `lime/x3dh_server_url` is defined or call :cpp:func:`linphone_core_set_lime_x3dh_server_url()` after core initialisation.
......@@ -107,7 +107,6 @@ LINPHONE_PUBLIC int lime_setCachedKey(void *cachedb, limeKey_t *associatedKey, u
* This does not free the memory area pointed by associatedKeys.
*
* @param[in,out] associatedKeys The structure to be cleaned
*
*/
LINPHONE_PUBLIC void lime_freeKeys(limeURIKeys_t *associatedKeys);
......@@ -122,10 +121,35 @@ LINPHONE_PUBLIC void lime_freeKeys(limeURIKeys_t *associatedKeys);
* Authentication tag is set at the begining of the encrypted Message
*
* @return 0 on success, error code otherwise
*
*/
LINPHONE_PUBLIC int lime_encryptMessage(limeKey_t *key, const uint8_t *plainMessage, uint32_t messageLength, uint8_t selfZID[12], uint8_t *encryptedMessage);
/**
* @brief Encrypt a file before transfering it to the server, encryption is done in several call, first one will be done with cryptoContext null, last one with length = 0
*
* @param[in,out] cryptoContext The context used to encrypt the file using AES-GCM. Is created at first call(if null)
* @param[in] key 256 bits : 192 bits of key || 64 bits of Initial Vector
* @param[in] length Length of data to be encrypted, if 0 it will conclude the encryption
* @param[in] plain Plain data to be encrypted (length bytes)
* @param[out] cipher Output to a buffer allocated by caller, at least length bytes available
*
* @return 0 on success, error code otherwise
*/
LINPHONE_PUBLIC int lime_encryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher);
/**
* @brief Decrypt a file retrieved from server, decryption is done in several call, first one will be done with cryptoContext null, last one with length = 0
*
* @param[in,out] cryptoContext The context used to decrypt the file using AES-GCM. Is created at first call(if null)
* @param[in] key 256 bits : 192 bits of key || 64 bits of Initial Vector
* @param[in] length Length of data to be decrypted, if 0 it will conclude the decryption
* @param[out] plain Output to a buffer allocated by caller, at least length bytes available
* @param[in] cipher Cipher text to be decrypted(length bytes)
*
* @return 0 on success, error code otherwise
*/
LINPHONE_PUBLIC int lime_decryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher);
/**
* @brief decrypt and authentify a message with the given key
*
......@@ -137,7 +161,6 @@ LINPHONE_PUBLIC int lime_encryptMessage(limeKey_t *key, const uint8_t *plainMess
* Authentication tag is retrieved at the begining of the encrypted Message
*
* @return 0 on success, error code otherwise
*
*/
LINPHONE_PUBLIC int lime_decryptMessage(limeKey_t *key, uint8_t *encryptedMessage, uint32_t messageLength, uint8_t selfZID[12], uint8_t *plainMessage);
......@@ -152,7 +175,6 @@ LINPHONE_PUBLIC int lime_decryptMessage(limeKey_t *key, uint8_t *encryptedMessag
* @param[in] selfURI The source URI
* @param[in] peerURI The destination URI, associated keys will be found in cache
* @param[out] output The output buffer, allocated and set with the encrypted message xml body(null terminated string). Must be freed by caller
*
* @return 0 on success, error code otherwise
*/
LINPHONE_PUBLIC int lime_createMultipartMessage(void *cachedb, const char *contentType, uint8_t *message, const char *selfURI, const char *peerURI, uint8_t **output);
......
......@@ -1424,6 +1424,11 @@ static void sip_config_read(LinphoneCore *lc) {
tmp=lp_config_get_int(lc->config,"sip","lime",LinphoneLimeDisabled);
linphone_core_enable_lime(lc,static_cast<LinphoneLimeState>(tmp));
if (linphone_core_lime_x3dh_available(lc)) {
//Always try to enable x3dh. Will actually be enabled only if there is a server url configured
linphone_core_enable_lime_x3dh(lc, true);
}
tmp=lp_config_get_int(lc->config,"sip","inc_timeout",30);
linphone_core_set_inc_timeout(lc,tmp);
......@@ -2426,10 +2431,6 @@ static void linphone_core_init(LinphoneCore * lc, LinphoneCoreCbs *cbs, LpConfig
if (automatically_start) {
linphone_core_start(lc);
}
LinphoneConfig *lpconfig = linphone_core_get_config(lc);
bool enableLime = linphone_config_get_bool(lpconfig, "lime", "enable_lime_x3dh", TRUE);
linphone_core_enable_lime_x3dh(lc, enableLime);
}
void linphone_core_start (LinphoneCore *lc) {
......@@ -2644,6 +2645,7 @@ bool_t linphone_core_get_guess_hostname(LinphoneCore *lc){
return lc->sip_conf.guess_hostname;
}
//Deprecated
void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val){
LinphoneImEncryptionEngine *imee = linphone_im_encryption_engine_new();
LinphoneImEncryptionEngineCbs *cbs = linphone_im_encryption_engine_get_callbacks(imee);
......@@ -2673,14 +2675,17 @@ void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val){
linphone_im_encryption_engine_unref(imee);
}
//Deprecated
bool_t linphone_core_lime_available(const LinphoneCore *lc){
return lime_is_available();
}
//Deprecated
LinphoneLimeState linphone_core_lime_enabled(const LinphoneCore *lc){
return linphone_core_lime_available(lc) ? static_cast<LinphoneLimeState>(lp_config_get_int(lc->config,"sip", "lime", LinphoneLimeDisabled)) : LinphoneLimeDisabled;
}
//Deprecated
LinphoneLimeState linphone_core_lime_for_file_sharing_enabled(const LinphoneCore *lc){
LinphoneLimeState s = linphone_core_lime_enabled(lc);
if (s != LinphoneLimeDisabled) {
......
......@@ -144,10 +144,6 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *cf
cfg->avpf_rr_interval = lc ? !!lp_config_get_default_int(lc->config, "proxy", "avpf_rr_interval", 5) : 5;
cfg->publish_expires= lc ? lp_config_get_default_int(lc->config, "proxy", "publish_expires", -1) : -1;
cfg->publish = lc ? !!lp_config_get_default_int(lc->config, "proxy", "publish", FALSE) : FALSE;
cfg->lime_x3dh = lc ? !!lp_config_get_int(lc->config, "lime", "lime_x3dh", FALSE) : FALSE;
if (!cfg->lime_x3dh) {
cfg->lime_x3dh = lc ? !!lp_config_get_int(lc->config, "lime", "lime_v2", FALSE) : FALSE;
}
cfg->push_notification_allowed = lc ? !!lp_config_get_default_int(lc->config, "proxy", "push_notification_allowed", TRUE) : TRUE;
cfg->refkey = refkey ? ms_strdup(refkey) : NULL;
if (nat_policy_ref) {
......@@ -1039,14 +1035,6 @@ const char *linphone_proxy_config_get_contact_uri_parameters(const LinphoneProxy
return cfg->contact_uri_params;
}
bool_t linphone_proxy_config_lime_x3dh_enabled(const LinphoneProxyConfig *cfg){
return cfg->lime_x3dh;
}
void linphone_proxy_config_enable_lime_x3dh(LinphoneProxyConfig *cfg, const bool_t val){
cfg->lime_x3dh=val;
}
struct _LinphoneCore * linphone_proxy_config_get_core(const LinphoneProxyConfig *cfg){
return cfg->lc;
}
......@@ -1199,7 +1187,6 @@ void linphone_proxy_config_write_to_config_file(LpConfig *config, LinphoneProxyC
lp_config_set_int(config, key, "push_notification_allowed", (int)cfg->push_notification_allowed);
if (cfg->refkey) lp_config_set_string(config, key, "refkey", cfg->refkey);
lp_config_set_int(config, key, "publish_expires", cfg->publish_expires);
lp_config_set_int(config, key, "lime_x3dh", cfg->lime_x3dh);
if (cfg->nat_policy != NULL) {
lp_config_set_string(config, key, "nat_policy_ref", cfg->nat_policy->ref);
......@@ -1271,10 +1258,6 @@ LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore* lc
CONFIGURE_STRING_VALUE(cfg, config, key, ref_key, "refkey")
CONFIGURE_INT_VALUE(cfg, config, key, publish_expires, "publish_expires", int)
CONFIGURE_BOOL_VALUE(cfg, config, key, lime_x3dh, "lime_x3dh")
if (!cfg->lime_x3dh) {
CONFIGURE_BOOL_VALUE(cfg, config, key, lime_x3dh, "lime_v2")
}
nat_policy_ref = lp_config_get_string(config, key, "nat_policy_ref", NULL);
if (nat_policy_ref != NULL) {
......
......@@ -1515,23 +1515,26 @@ LINPHONE_PUBLIC bool_t linphone_core_get_guess_hostname(LinphoneCore *lc);
* @param[in] lc #LinphoneCore object
* @param[in] val The new lime state
* @ingroup network_parameters
* @deprecated Use linphone_core_enable_lime_x3dh instead. Depreacted since 2019-02-04
*/
LINPHONE_PUBLIC void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val);
LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val);
/**
* Returns the lime state
* @param[in] lc #LinphoneCore object
* @return The current lime state
* @ingroup network_parameters
* @deprecated Use linphone_core_lime_x3dh_enabled instead. Depreacted since 2019-02-04
**/
LINPHONE_PUBLIC LinphoneLimeState linphone_core_lime_enabled(const LinphoneCore *lc);
LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneLimeState linphone_core_lime_enabled(const LinphoneCore *lc);
/**
* Tells if lime is available
* @param[in] lc #LinphoneCore object
* @ingroup network_parameters
* @deprecated Use linphone_core_lime_x3dh_available instead. Depreacted since 2019-02-04
**/
LINPHONE_PUBLIC bool_t linphone_core_lime_available(const LinphoneCore *lc);
LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_lime_available(const LinphoneCore *lc);
/**
* Tells to LinphoneCore to use LIME X3DH
......@@ -1549,6 +1552,16 @@ LINPHONE_PUBLIC void linphone_core_enable_lime_x3dh(LinphoneCore *lc, bool_t ena
**/
LINPHONE_PUBLIC bool_t linphone_core_lime_x3dh_enabled(const LinphoneCore *lc);
/**
* Set the x3dh server url.
* If empty, this function will disable LIME X3DH from core.
* Otherwise, or if different from the existing value, this will (re-)initialize the LIME X3DH engine.
* @param[in] lc LinphoneCore object
* @param[in] url The x3dh server url
* @ingroup misc
**/
LINPHONE_PUBLIC void linphone_core_set_lime_x3dh_server_url(LinphoneCore *lc, const char *url);
/**
* Tells if LIME X3DH is available
* @param[in] lc LinphoneCore object
......
......@@ -360,22 +360,11 @@ LINPHONE_PUBLIC void linphone_proxy_config_set_contact_parameters(LinphoneProxyC
**/
LINPHONE_PUBLIC void linphone_proxy_config_set_contact_uri_parameters(LinphoneProxyConfig *cfg, const char *contact_uri_params);
/**
* @return TRUE if LIME X3DH is enabled.
**/
LINPHONE_PUBLIC bool_t linphone_proxy_config_lime_x3dh_enabled(const LinphoneProxyConfig *cfg);
/**
* @return previously set contact URI parameters.
**/
LINPHONE_PUBLIC const char* linphone_proxy_config_get_contact_uri_parameters(const LinphoneProxyConfig *cfg);
/**
* @param[in] cfg #LinphoneProxyConfig object.
* @param val if TRUE LIME X3DH will be enabled for this proxy config
**/
LINPHONE_PUBLIC void linphone_proxy_config_enable_lime_x3dh(LinphoneProxyConfig *cfg, const bool_t val);
/**
* Get the #LinphoneCore object to which is associated the #LinphoneProxyConfig.
* @param[in] cfg #LinphoneProxyConfig object.
......
......@@ -74,6 +74,10 @@ bool_t linphone_core_lime_x3dh_available (const LinphoneCore *lc) {
return L_GET_CPP_PTR_FROM_C_OBJECT(lc)->limeX3dhAvailable();
}
void linphone_core_set_lime_x3dh_server_url(LinphoneCore *lc, const char *url) {
L_GET_CPP_PTR_FROM_C_OBJECT(lc)->setX3dhServerUrl(url);
}
void linphone_core_delete_local_encryption_db (const LinphoneCore *lc) {
auto encryptionEngine = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->getEncryptionEngine();
if (encryptionEngine)
......
......@@ -120,21 +120,17 @@ LimeManager::LimeManager (
LimeX3dhEncryptionEngine::LimeX3dhEncryptionEngine (
const std::string &dbAccess,
const std::string &serverUrl,
belle_http_provider_t *prov,
const shared_ptr<Core> core
) : EncryptionEngine(core) {
engineType = EncryptionEngine::EngineType::LimeX3dh;
curve = lime::CurveId::c25519; // c448
_dbAccess = dbAccess;
x3dhServerUrl = serverUrl;
auto cCore = core->getCCore();
limeManager = unique_ptr<LimeManager>(new LimeManager(dbAccess, prov, core));
lastLimeUpdate = linphone_config_get_int(cCore->config, "lime", "last_update_time", 0);
x3dhServerUrl = linphone_config_get_string(
linphone_core_get_config(cCore),
"lime",
"x3dh_server_url",
""
);
if (x3dhServerUrl.empty())
lError() << "LIME X3DH server URL unavailable for encryption engine";
}
......
......@@ -69,6 +69,7 @@ class LimeX3dhEncryptionEngine : public EncryptionEngine, public CoreListener {
public:
LimeX3dhEncryptionEngine (
const std::string &db_access,
const std::string &server_url,
belle_http_provider_t *prov,
const std::shared_ptr<Core> core
);
......
......@@ -230,14 +230,17 @@ void Core::enableLimeX3dh (bool enable) {
d->imee.release();
if (d->imee == nullptr) {
LimeX3dhEncryptionEngine *engine;
LinphoneConfig *lpconfig = linphone_core_get_config(getCCore());
string serverUrl = lp_config_get_string(lpconfig, "lime", "x3dh_server_url", "");
if (serverUrl.empty()) {
//Do not enable encryption engine if url is undefined
return;
}
string filename = lp_config_get_string(lpconfig, "lime", "x3dh_db_path", "x3dh.c25519.sqlite3");
string dbAccess = getDataPath() + filename;
belle_http_provider_t *prov = linphone_core_get_http_provider(getCCore());
engine = new LimeX3dhEncryptionEngine(dbAccess, prov, getSharedFromThis());
LimeX3dhEncryptionEngine *engine = new LimeX3dhEncryptionEngine(dbAccess, serverUrl, prov, getSharedFromThis());
setEncryptionEngine(engine);
d->registerListener(engine);
}
......@@ -246,6 +249,23 @@ void Core::enableLimeX3dh (bool enable) {
#endif
}
//Note: this will re-initialise or start x3dh encryption engine if url is different from existing one
void Core::setX3dhServerUrl(const std::string &url) {
if (!limeX3dhAvailable()) {
return;
}
LinphoneConfig *lpconfig = linphone_core_get_config(getCCore());
string prevUrl = lp_config_get_string(lpconfig, "lime", "x3dh_server_url", "");
lp_config_set_string(lpconfig, "lime", "x3dh_server_url", url.c_str());
if (url.empty()) {
enableLimeX3dh(false);
} else if (url.compare(prevUrl)) {
//Force re-initialisation
enableLimeX3dh(false);
enableLimeX3dh(true);
}
}
bool Core::limeX3dhEnabled () const {
#ifdef HAVE_LIME_X3DH
L_D();
......
......@@ -142,6 +142,7 @@ public:
EncryptionEngine *getEncryptionEngine () const;
void setEncryptionEngine (EncryptionEngine *imee);
void enableLimeX3dh (bool enable);
void setX3dhServerUrl (const std::string &url);
bool limeX3dhEnabled () const;
bool limeX3dhAvailable () const;
......
......@@ -100,6 +100,7 @@ set(RC_FILES
rcfiles/marie_early_rc
rcfiles/marie_h264_rc
rcfiles/marie_lime_x3dh_rc
rcfiles/marie_lime_x3dh_no_server_rc
rcfiles/marie_nat64_rc
rcfiles/marie_quality_reporting_rc
rcfiles/marie_rc
......
......@@ -244,7 +244,6 @@ bctbx_list_t *create_conference_cores(bctbx_list_t *participantsAddresses) {
linphone_proxy_config_set_identity_address(proxy_config, addr);
linphone_proxy_config_set_server_addr(proxy_config, "sip:sip.example.org;transport=tcp");
linphone_proxy_config_enable_register(proxy_config, TRUE);
linphone_proxy_config_enable_lime_x3dh(proxy_config, enable_limex3dh);
BC_ASSERT_EQUAL(linphone_core_add_proxy_config(mgr->lc, proxy_config), 0, int, "%d");
if (i == 0) {
......
......@@ -75,6 +75,63 @@ static void group_chat_lime_x3dh_create_lime_user (void) {
linphone_core_manager_destroy(marie);
}
static void group_chat_lime_x3dh_change_server_url(void) {
LinphoneCoreManager *marie = linphone_core_manager_create("marie_lime_x3dh_no_server_rc");
LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_lime_x3dh_rc");
bctbx_list_t *coresManagerList = NULL;
bctbx_list_t *participantsAddresses = NULL;
coresManagerList = bctbx_list_append(coresManagerList, marie);
coresManagerList = bctbx_list_append(coresManagerList, pauline);
LinphoneChatRoom *marieEncryptedCr = NULL;
LinphoneChatRoom *paulineEncryptedCr = NULL;
int dummy = 0;
bctbx_list_t *coresList = init_core_for_conference(coresManagerList);
start_core_for_conference(coresManagerList);
stats initialMarieStats = marie->stat;
stats initialPaulineStats = pauline->stat;
//Check encryption status for both participants
BC_ASSERT_FALSE(linphone_core_lime_x3dh_enabled(marie->lc)); //should be false if no x3dh server defined
BC_ASSERT_TRUE(linphone_core_lime_x3dh_enabled(pauline->lc));
participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc)));
linphone_core_set_lime_x3dh_server_url(marie->lc, "http://x3dh.example.org:8082/flexisip-account-manager/x3dh-25519.php");
BC_ASSERT_TRUE(linphone_core_lime_x3dh_enabled(marie->lc)); //should be true now
//Wait for lime users to be created on X3DH server
wait_for_list(coresList, &dummy, 1, x3dhServerDelay);
//Now create an encrypted chatroom to check that marie can
// Marie creates an encrypted chatroom
const char *initialSubject = "Encrypted Friends";
participantsAddresses = bctbx_list_append(NULL, linphone_address_new(linphone_core_get_identity(pauline->lc)));
marieEncryptedCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, TRUE);
LinphoneAddress *encryptedConfAddr = linphone_address_clone(linphone_chat_room_get_conference_address(marieEncryptedCr));
BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieEncryptedCr) & LinphoneChatRoomCapabilitiesEncrypted);
// Check that the chat room is correctly created on Pauline's side and that the participants are added
paulineEncryptedCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, encryptedConfAddr, initialSubject, 1, 0);
BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineEncryptedCr) & LinphoneChatRoomCapabilitiesEncrypted);
// Clean local LIME X3DH databases
linphone_core_delete_local_encryption_db(marie->lc);
linphone_core_delete_local_encryption_db(pauline->lc);
// Clean db from chat room
if (marieEncryptedCr) linphone_core_manager_delete_chat_room(marie, marieEncryptedCr, coresList);
if (paulineEncryptedCr) linphone_core_manager_delete_chat_room(pauline, paulineEncryptedCr, coresList);
bctbx_list_free(coresList);
bctbx_list_free(coresManagerList);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
static void group_chat_lime_x3dh_encrypted_chatrooms (void) {
LinphoneCoreManager *marie = linphone_core_manager_create("marie_lime_x3dh_rc");
LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_lime_x3dh_rc");
......@@ -2320,6 +2377,7 @@ end:
test_t secure_group_chat_tests[] = {
TEST_ONE_TAG("LIME X3DH create lime user", group_chat_lime_x3dh_create_lime_user, "LimeX3DH"),
TEST_TWO_TAGS("LIME X3DH change server url", group_chat_lime_x3dh_change_server_url, "LimeX3DH", "LeaksMemory"),
TEST_TWO_TAGS("LIME X3DH encrypted chatrooms", group_chat_lime_x3dh_encrypted_chatrooms, "LimeX3DH", "LeaksMemory"),
TEST_TWO_TAGS("LIME X3DH basic chatrooms", group_chat_lime_x3dh_basic_chat_rooms, "LimeX3DH", "LeaksMemory"),
TEST_TWO_TAGS("LIME X3DH message", group_chat_lime_x3dh_send_encrypted_message, "LimeX3DH", "LeaksMemory"),
......
[lime]
lime_v2=1
x3dh_db_path=chloe.x3dh.sqlite3
lime_update_threshold=86400
max_nb_device_per_participant=1
......
[lime]
lime_x3dh=1
#x3dh_db_path=groupchat.x3dh.sqlite3
lime_update_threshold=86400
max_nb_device_per_participant=10
max_nb_device_per_participant=1000
allow_message_in_unsafe_chatroom=0
unsafe_if_sas_refused=1
x3dh_server_url=http://x3dh.example.org:8082/flexisip-account-manager/x3dh-25519.php
[sip]
sip_port=-1
......
[lime]
lime_v2=1
x3dh_db_path=laure.x3dh.sqlite3
lime_update_threshold=86400
max_nb_device_per_participant=1
......
[lime]
lime_v2=0
[sip]
sip_port=-1
sip_tcp_port=-1
......
[misc]
enable_basic_to_client_group_chat_room_migration=1
basic_to_client_group_chat_room_migration_timer=180
[lime]
x3dh_db_path=noserver.x3dh.sqlite3
lime_update_threshold=86400
max_nb_device_per_participant=1
allow_message_in_unsafe_chatroom=0
unsafe_if_sas_refused=1
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
composing_idle_timeout=1
store_ha1_passwd=0 #used for sipp
zrtp_cache_migration_done=1
[auth_info_0]
username=marie
userid=marie
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip.example.org;transport=tcp
reg_route=sip.example.org;transport=tcp;lr
reg_identity="Super Marie" <sip:marie@sip.example.org>
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
[friend_0]
url="Paupoche" <sip:pauline@sip.example.org>
pol=accept
subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=28070-38000
text_rtp_port=39000-49000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general
stun_server=stun.linphone.org
#leave this section, which is used by "Codec setup" test of "Setup" suite.
[video_codec_0]
mime=VP8
rate=90000
enabled=1
......@@ -3,7 +3,6 @@ enable_basic_to_client_group_chat_room_migration=1
basic_to_client_group_chat_room_migration_timer=180
[lime]
lime_v2=1
x3dh_db_path=marie.x3dh.sqlite3
lime_update_threshold=86400
max_nb_device_per_participant=1
......
[lime]
lime_v2=1
x3dh_db_path=pauline.x3dh.sqlite3
lime_update_threshold=86400
max_nb_device_per_participant=1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment