Add dynamic loading of config file for proxy config

This commit is contained in:
Erwan Croze 2017-04-18 17:21:56 +02:00
parent 718d4c20e6
commit 928247b158
6 changed files with 112 additions and 74 deletions

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.linphone.org/xsds/lpconfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.linphone.org/xsds/lpconfig.xsd lpconfig.xsd">
<section name="proxy_default_values">
<entry name="avpf" overwrite="true">1</entry>
<entry name="dial_escape_plus" overwrite="true">0</entry>
<entry name="publish" overwrite="true">0</entry>
<entry name="quality_reporting_collector" overwrite="true">sip:voip-metrics@sip.linphone.org;transport=tls</entry>
<entry name="quality_reporting_enabled" overwrite="true">1</entry>
<entry name="quality_reporting_interval" overwrite="true">180</entry>
<entry name="reg_expires" overwrite="true">31536000</entry>
<entry name="reg_identity" overwrite="true">sip:?@sip.linphone.org</entry>
<entry name="reg_proxy" overwrite="true">&lt;sip:sip.linphone.org;transport=tls&gt;</entry>
<entry name="reg_sendregister" overwrite="true">1</entry>
<entry name="refkey" overwrite="true">push_notification</entry>
<entry name="realm" overwrite="true">sip.linphone.org</entry>
</section>
<section name="sip">
<entry name="rls_uri" overwrite="true">sips:rls@sip.linphone.org</entry>
</section>
<section name="assistant">
<entry name="domain" overwrite="true">sip.linphone.org</entry>
<entry name="password_max_length" overwrite="true">-1</entry>
<entry name="password_min_length" overwrite="true">1</entry>
<entry name="username_length" overwrite="true">-1</entry>
<entry name="username_max_length" overwrite="true">64</entry>
<entry name="username_min_length" overwrite="true">1</entry>
<entry name="username_regex" overwrite="true">^[a-z0-9+_.\-]*$</entry>
<entry name="xmlrpc_url" overwrite="true">https://sip3.linphone.org:444/wizard.php</entry>
</section>
</config>

View file

@ -185,6 +185,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mLinphoneFactoryConfigFile = basePath + "/linphonerc"; mLinphoneFactoryConfigFile = basePath + "/linphonerc";
mLinphoneConfigFile = basePath + "/.linphonerc"; mLinphoneConfigFile = basePath + "/.linphonerc";
mLinphoneRootCaFile = basePath + "/rootca.pem"; mLinphoneRootCaFile = basePath + "/rootca.pem";
mDynamicConfigFile = basePath + "/assistant_create.rc";
mRingSoundFile = basePath + "/ringtone.mkv"; mRingSoundFile = basePath + "/ringtone.mkv";
mRingbackSoundFile = basePath + "/ringback.wav"; mRingbackSoundFile = basePath + "/ringback.wav";
mPauseSoundFile = basePath + "/hold.mkv"; mPauseSoundFile = basePath + "/hold.mkv";
@ -217,6 +218,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
private final String mLPConfigXsd; private final String mLPConfigXsd;
private final String mLinphoneFactoryConfigFile; private final String mLinphoneFactoryConfigFile;
private final String mLinphoneRootCaFile; private final String mLinphoneRootCaFile;
private final String mDynamicConfigFile;
public final String mLinphoneConfigFile; public final String mLinphoneConfigFile;
private final String mRingSoundFile; private final String mRingSoundFile;
private final String mRingbackSoundFile; private final String mRingbackSoundFile;
@ -873,6 +875,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
copyFromPackage(R.raw.linphonerc_factory, new File(mLinphoneFactoryConfigFile).getName()); copyFromPackage(R.raw.linphonerc_factory, new File(mLinphoneFactoryConfigFile).getName());
copyIfNotExist(R.raw.lpconfig, mLPConfigXsd); copyIfNotExist(R.raw.lpconfig, mLPConfigXsd);
copyFromPackage(R.raw.rootca, new File(mLinphoneRootCaFile).getName()); copyFromPackage(R.raw.rootca, new File(mLinphoneRootCaFile).getName());
copyFromPackage(R.raw.assistant_create, new File(mDynamicConfigFile).getName());
} }
public void copyIfNotExist(int ressourceId, String target) throws IOException { public void copyIfNotExist(int ressourceId, String target) throws IOException {
@ -1719,6 +1722,10 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mLc.setDnsServers(servers); mLc.setDnsServers(servers);
} }
public String getmDynamicConfigFile() {
return mDynamicConfigFile;
}
@SuppressWarnings("serial") @SuppressWarnings("serial")
public static class LinphoneConfigException extends LinphoneException { public static class LinphoneConfigException extends LinphoneException {

View file

@ -35,6 +35,7 @@ import org.linphone.core.DialPlan;
import org.linphone.core.LinphoneAccountCreator; import org.linphone.core.LinphoneAccountCreator;
import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneAddress.TransportType; import org.linphone.core.LinphoneAddress.TransportType;
import org.linphone.core.LinphoneAuthInfo;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.RegistrationState; import org.linphone.core.LinphoneCore.RegistrationState;
import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreException;
@ -104,7 +105,6 @@ private static AssistantActivity instance;
public DialPlan country; public DialPlan country;
public String phone_number; public String phone_number;
public String email; public String email;
public String activation_code;
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -345,31 +345,63 @@ private static AssistantActivity instance;
} }
} }
private void logIn(String username, String password, String ha1, String prefix, String domain, TransportType transport, boolean sendEcCalibrationResult) { private void logIn(String username, String password, String ha1, String prefix, String domain, TransportType transport) {
saveCreatedAccount(username, password, ha1, prefix, domain, transport); saveCreatedAccount(username, password, ha1, prefix, domain, transport);
} }
public void checkAccount(String username, String password, String prefix, String domain) { public void configureLinphoneProxyConfig(LinphoneAccountCreator accountCreator) {
saveCreatedAccount(username, password, null, prefix, domain, null); LinphoneCore lc = LinphoneManager.getLc();
LinphoneProxyConfig proxyConfig = lc.createProxyConfig();
LinphoneAddress addr;
LinphoneAuthInfo authInfo;
try {
String identity = proxyConfig.getIdentity();
identity = identity.replace("?", accountCreator.getUsername());
addr = LinphoneCoreFactory.instance().createLinphoneAddress(identity);
addr.setDisplayName(accountCreator.getUsername());
address = addr;
proxyConfig.edit();
proxyConfig.setIdentity(addr.asString());
proxyConfig.done();
authInfo = LinphoneCoreFactory.instance().createAuthInfo(
accountCreator.getUsername(),
null,
accountCreator.getPassword(),
accountCreator.getHa1(),
proxyConfig.getRealm(),
proxyConfig.getDomain());
lc.addProxyConfig(proxyConfig);
lc.addAuthInfo(authInfo);
lc.setDefaultProxyConfig(proxyConfig);
if (!newAccount) {
displayRegistrationInProgressDialog();
}
accountCreated = true;
} catch (LinphoneCoreException e) {
Log.e("Canno't configure proxy config ", e);
}
} }
public void linphoneLogIn(String username, String password, String ha1, String prefix, boolean validate) { public void linphoneLogIn(LinphoneAccountCreator accountCreator) {
if (validate) { LinphoneManager.getLc().getConfig().loadXmlFile(LinphoneManager.getInstance().getmDynamicConfigFile());
checkAccount(username, password, prefix, getString(R.string.default_domain)); configureLinphoneProxyConfig(accountCreator);
} else {
if(accountCreated) {
retryLogin(username, password, prefix, getString(R.string.default_domain), null);
} else {
logIn(username, password, ha1, prefix, getString(R.string.default_domain), null, true);
}
}
} }
public void genericLogIn(String username, String password, String prefix, String domain, TransportType transport) { public void genericLogIn(String username, String password, String prefix, String domain, TransportType transport) {
if (accountCreated) { if (accountCreated) {
retryLogin(username, password, prefix, domain, transport); retryLogin(username, password, prefix, domain, transport);
} else { } else {
logIn(username, password, null, prefix, domain, transport, false); logIn(username, password, null, prefix, domain, transport);
} }
} }
@ -483,56 +515,24 @@ private static AssistantActivity instance;
Log.e(e); Log.e(e);
} }
boolean isMainAccountLinphoneDotOrg = domain.equals(getString(R.string.default_domain));
AccountBuilder builder = new AccountBuilder(LinphoneManager.getLc()) AccountBuilder builder = new AccountBuilder(LinphoneManager.getLc())
.setUsername(username) .setUsername(username)
.setDomain(domain) .setDomain(domain)
.setHa1(ha1) .setHa1(ha1)
.setPassword(password); .setPassword(password);
if(prefix != null){ if (prefix != null) {
builder.setPrefix(prefix); builder.setPrefix(prefix);
} }
if (isMainAccountLinphoneDotOrg) { String forcedProxy = "";
if (getResources().getBoolean(R.bool.disable_all_security_features_for_markets)) { if (!TextUtils.isEmpty(forcedProxy)) {
builder.setProxy(domain) builder.setProxy(forcedProxy)
.setTransport(TransportType.LinphoneTransportTcp); .setOutboundProxyEnabled(true)
} .setAvpfRRInterval(5);
else { }
builder.setProxy(domain) if (transport != null) {
.setTransport(TransportType.LinphoneTransportTls); builder.setTransport(transport);
}
builder.setExpires("604800")
.setAvpfEnabled(true)
.setAvpfRRInterval(3)
.setQualityReportingCollector("sip:voip-metrics@sip.linphone.org")
.setQualityReportingEnabled(true)
.setQualityReportingInterval(180)
.setRealm("sip.linphone.org")
.setNoDefault(false);
mPrefs.enabledFriendlistSubscription(getResources().getBoolean(R.bool.use_friendlist_subscription));
LinphoneManager.getInstance().subscribeFriendList(getResources().getBoolean(R.bool.use_friendlist_subscription));
mPrefs.setStunServer(getString(R.string.default_stun));
mPrefs.setIceEnabled(true);
accountCreator.setPassword(password);
accountCreator.setHa1(ha1);
accountCreator.setUsername(username);
} else {
String forcedProxy = "";
if (!TextUtils.isEmpty(forcedProxy)) {
builder.setProxy(forcedProxy)
.setOutboundProxyEnabled(true)
.setAvpfRRInterval(5);
}
if(transport != null) {
builder.setTransport(transport);
}
} }
if (getResources().getBoolean(R.bool.enable_push_id)) { if (getResources().getBoolean(R.bool.enable_push_id)) {
@ -542,16 +542,16 @@ private static AssistantActivity instance;
String contactInfos = "app-id=" + appId + ";pn-type=google;pn-tok=" + regId; String contactInfos = "app-id=" + appId + ";pn-type=google;pn-tok=" + regId;
builder.setContactParameters(contactInfos); builder.setContactParameters(contactInfos);
} }
}
try { try {
builder.saveNewAccount(); builder.saveNewAccount();
if(!newAccount) { if (!newAccount) {
displayRegistrationInProgressDialog(); displayRegistrationInProgressDialog();
}
accountCreated = true;
} catch (LinphoneCoreException e) {
Log.e(e);
} }
accountCreated = true;
} catch (LinphoneCoreException e) {
Log.e(e);
} }
} }

View file

@ -102,7 +102,7 @@ public class CreateAccountActivationFragment extends Fragment implements OnClick
if (status.equals(LinphoneAccountCreator.RequestStatus.AccountNotActivated)) { if (status.equals(LinphoneAccountCreator.RequestStatus.AccountNotActivated)) {
Toast.makeText(getActivity(), getString(R.string.assistant_account_not_validated), Toast.LENGTH_LONG).show(); Toast.makeText(getActivity(), getString(R.string.assistant_account_not_validated), Toast.LENGTH_LONG).show();
} else if (status.equals(LinphoneAccountCreator.RequestStatus.AccountActivated)) { } else if (status.equals(LinphoneAccountCreator.RequestStatus.AccountActivated)) {
AssistantActivity.instance().saveCreatedAccount(username, password, null, null, getString(R.string.default_domain), null); AssistantActivity.instance().linphoneLogIn(accountCreator);
AssistantActivity.instance().isAccountVerified(username); AssistantActivity.instance().isAccountVerified(username);
} else { } else {
Toast.makeText(getActivity(), getString(R.string.wizard_server_unavailable), Toast.LENGTH_LONG).show(); Toast.makeText(getActivity(), getString(R.string.wizard_server_unavailable), Toast.LENGTH_LONG).show();

View file

@ -146,14 +146,14 @@ public class CreateAccountCodeActivationFragment extends Fragment implements Lin
if (status.equals(LinphoneAccountCreator.RequestStatus.AccountActivated)) { if (status.equals(LinphoneAccountCreator.RequestStatus.AccountActivated)) {
checkAccount.setEnabled(true); checkAccount.setEnabled(true);
if (accountCreator.getUsername() != null) { if (accountCreator.getUsername() != null) {
AssistantActivity.instance().saveCreatedAccount(accountCreator.getUsername(), null , accountCreator.getHa1(), dialcode, getString(R.string.default_domain), null); AssistantActivity.instance().linphoneLogIn(accountCreator);
if(!recoverAccount){ if(!recoverAccount){
AssistantActivity.instance().isAccountVerified(accountCreator.getUsername()); AssistantActivity.instance().isAccountVerified(accountCreator.getUsername());
} else { } else {
AssistantActivity.instance().success(); AssistantActivity.instance().success();
} }
} else { } else {
AssistantActivity.instance().saveCreatedAccount(accountCreator.getPhoneNumber(), null, accountCreator.getHa1(), dialcode, getString(R.string.default_domain), null); AssistantActivity.instance().linphoneLogIn(accountCreator);
if(!recoverAccount) { if(!recoverAccount) {
AssistantActivity.instance().isAccountVerified(accountCreator.getPhoneNumber()); AssistantActivity.instance().isAccountVerified(accountCreator.getPhoneNumber());
} else { } else {

View file

@ -328,10 +328,8 @@ public class LinphoneLoginFragment extends Fragment implements CompoundButton.On
} }
if (status.equals(LinphoneAccountCreator.RequestStatus.AccountExist) || status.equals(LinphoneAccountCreator.RequestStatus.AccountExistWithAlias)) { if (status.equals(LinphoneAccountCreator.RequestStatus.AccountExist) || status.equals(LinphoneAccountCreator.RequestStatus.AccountExistWithAlias)) {
String phone = accountCreator.getPhoneNumber(); String phone = accountCreator.getPhoneNumber();
String dial = null;
if (phone != null && phone.length() > 0) if (phone != null && phone.length() > 0)
dial = accountCreator.getPrefix(phone); AssistantActivity.instance().linphoneLogIn(accountCreator);
AssistantActivity.instance().linphoneLogIn(login.getText().toString(), password.getText().toString(), null, dial, getResources().getBoolean(R.bool.assistant_account_validation_mandatory));
} else { } else {
LinphoneUtils.displayErrorAlert(LinphoneUtils.errorForRequestStatus(status), AssistantActivity.instance()); LinphoneUtils.displayErrorAlert(LinphoneUtils.errorForRequestStatus(status), AssistantActivity.instance());
} }