PageRenderTime 57ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/sipsorcery-core/SIPSorcery.SIP.App/SIPAssets/SIPProvider.cs

https://github.com/thecc4re/sipsorcery-mono
C# | 679 lines | 571 code | 59 blank | 49 comment | 110 complexity | 4cc7caa3f5865c32f2aeb22b78e3f841 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. // ============================================================================
  2. // FileName: SIPProvider.cs
  3. //
  4. // Description:
  5. // Represents a SIP provider (or SIP trunk) that can be used in the dial plan.
  6. //
  7. // Author(s):
  8. // Aaron Clauson
  9. //
  10. // History:
  11. // 06 Feb 2008 Aaron Clauson Created.
  12. //
  13. // License:
  14. // This software is licensed under the BSD License http://www.opensource.org/licenses/bsd-license.php
  15. //
  16. // Copyright (c) 2008 Aaron Clauson (aaronc@blueface.ie), Blue Face Ltd, Dublin, Ireland (www.blueface.ie)
  17. // All rights reserved.
  18. //
  19. // Redistribution and use in source and binary forms, with or without modification, are permitted provided that
  20. // the following conditions are met:
  21. //
  22. // Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  23. // Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
  24. // disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Blue Face Ltd.
  25. // nor the names of its contributors may be used to endorse or promote products derived from this software without specific
  26. // prior written permission.
  27. //
  28. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
  29. // BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  30. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
  31. // OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  32. // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  33. // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  34. // POSSIBILITY OF SUCH DAMAGE.
  35. // ============================================================================
  36. using System;
  37. using System.Collections.Generic;
  38. using System.ComponentModel;
  39. using System.Net;
  40. using System.Runtime.Serialization;
  41. using System.Text;
  42. using System.Text.RegularExpressions;
  43. using System.Xml;
  44. using SIPSorcery.Persistence;
  45. using SIPSorcery.Sys;
  46. using log4net;
  47. #if !SILVERLIGHT
  48. using System.Data;
  49. using System.Data.Linq;
  50. using System.Data.Linq.Mapping;
  51. #endif
  52. #if UNITTEST
  53. using NUnit.Framework;
  54. #endif
  55. namespace SIPSorcery.SIP.App
  56. {
  57. public enum ProviderTypes
  58. {
  59. SIP = 0,
  60. GoogleVoice = 1,
  61. }
  62. public enum GoogleVoiceCallbackTypes
  63. {
  64. Home = 1,
  65. Mobile = 2,
  66. Work = 3,
  67. Gizmo = 7,
  68. }
  69. [Table(Name = "sipproviders")]
  70. [DataContractAttribute]
  71. public class SIPProvider : INotifyPropertyChanged, ISIPAsset
  72. {
  73. public const string XML_DOCUMENT_ELEMENT_NAME = "sipproviders";
  74. public const string XML_ELEMENT_NAME = "sipprovider";
  75. public const char CUSTOM_HEADERS_SEPARATOR = '|';
  76. public const int REGISTER_DEFAULT_EXPIRY = 3600;
  77. public const int REGISTER_MINIMUM_EXPIRY = 60; // The minimum interval a registration will be accepted for. Anything less than this interval will use this minimum value.
  78. public const int REGISTER_MAXIMUM_EXPIRY = 3600;
  79. //public static string SelectProvider = "select * from sipproviders where id = ?1";
  80. public static string DisallowedServerPatterns; // If set will be used as a regex pattern to prevent certain strings being used in the Provider Server and RegisterServer fields.
  81. private static string m_newLine = AppState.NewLine;
  82. private static ILog logger = AppState.logger;
  83. private ProviderTypes m_providerType; // Identifies whether the provider entry is a SIP or Google Voice entry.
  84. [Column(Name = "providertype", DbType = "varchar(16)", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  85. [DataMember]
  86. public ProviderTypes ProviderType
  87. {
  88. get { return m_providerType; }
  89. set
  90. {
  91. m_providerType = value;
  92. NotifyPropertyChanged("ProviderType");
  93. }
  94. }
  95. private Guid m_id;
  96. [Column(Name = "id", DbType = "varchar(36)", IsPrimaryKey = true, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  97. [DataMember]
  98. public Guid Id
  99. {
  100. get { return m_id; }
  101. set { m_id = value; }
  102. }
  103. private string m_owner; // The username of the account that owns this SIP provider configuration.
  104. [Column(Name = "owner", DbType = "varchar(32)", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  105. [DataMember]
  106. public string Owner
  107. {
  108. get { return m_owner; }
  109. set
  110. {
  111. m_owner = value;
  112. NotifyPropertyChanged("Owner");
  113. }
  114. }
  115. [Column(Name = "adminmemberid", DbType = "varchar(32)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  116. public string AdminMemberId { get; set; } // If set it designates this asset as a belonging to a user with the matching adminid.
  117. private string m_providerName;
  118. [Column(Name = "providername", DbType = "varchar(50)", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  119. [DataMember]
  120. public string ProviderName
  121. {
  122. get { return m_providerName; }
  123. set
  124. {
  125. m_providerName = value;
  126. NotifyPropertyChanged("ProviderName");
  127. }
  128. }
  129. private string m_providerUsername;
  130. [Column(Name = "providerusername", DbType = "varchar(32)", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  131. [DataMember]
  132. public string ProviderUsername
  133. {
  134. get { return m_providerUsername; }
  135. set
  136. {
  137. m_providerUsername = value;
  138. NotifyPropertyChanged("ProviderUsername");
  139. }
  140. }
  141. private string m_providerPassword;
  142. [Column(Name = "providerpassword", DbType = "varchar(32)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  143. [DataMember]
  144. public string ProviderPassword
  145. {
  146. get { return m_providerPassword; }
  147. set
  148. {
  149. m_providerPassword = value;
  150. NotifyPropertyChanged("ProviderPassword");
  151. }
  152. }
  153. private SIPURI m_providerServer;
  154. [Column(Name = "providerserver", DbType = "varchar(256)", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  155. [DataMember]
  156. public string ProviderServer
  157. {
  158. get { return (m_providerServer != null) ? m_providerServer.ToString() : null; }
  159. set
  160. {
  161. m_providerServer = (!value.IsNullOrBlank()) ? SIPURI.ParseSIPURIRelaxed(value) : null;
  162. NotifyPropertyChanged("ProviderServer");
  163. }
  164. }
  165. private string m_providerAuthUsername; // An optional setting if authusername differs from username for authentication.
  166. [Column(Name = "providerauthusername", DbType = "varchar(32)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  167. [DataMember]
  168. public string ProviderAuthUsername
  169. {
  170. get { return m_providerAuthUsername; }
  171. set
  172. {
  173. m_providerAuthUsername = value;
  174. NotifyPropertyChanged("ProviderAuthUsername");
  175. }
  176. }
  177. private string m_providerOutboundProxy;
  178. [Column(Name = "provideroutboundproxy", DbType = "varchar(256)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  179. [DataMember]
  180. public string ProviderOutboundProxy
  181. {
  182. get { return m_providerOutboundProxy; }
  183. set
  184. {
  185. m_providerOutboundProxy = value;
  186. NotifyPropertyChanged("ProviderOutboundProxy");
  187. }
  188. }
  189. private string m_providerFrom; // If set determines how the From header will be set for calls to the SIP provider.
  190. [Column(Name = "providerfrom", DbType = "varchar(256)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  191. [DataMember]
  192. public string ProviderFrom
  193. {
  194. get { return m_providerFrom; }
  195. set
  196. {
  197. m_providerFrom = value;
  198. NotifyPropertyChanged("ProviderFrom");
  199. }
  200. }
  201. private string m_customHeaders; // An optional list of custom SIP headers that will be added to calls to the SIP provider.
  202. [Column(Name = "customheaders", DbType = "varchar(1024)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  203. [DataMember]
  204. public string CustomHeaders
  205. {
  206. get { return m_customHeaders; }
  207. set
  208. {
  209. m_customHeaders = value;
  210. NotifyPropertyChanged("CustomHeaders");
  211. }
  212. }
  213. private SIPURI m_registerContact;
  214. [Column(Name = "registercontact", DbType = "varchar(256)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  215. [DataMember]
  216. public string RegisterContact
  217. {
  218. get { return (m_registerContact != null) ? m_registerContact.ToString() : null; }
  219. set
  220. {
  221. m_registerContact = (!value.IsNullOrBlank()) ? SIPURI.ParseSIPURIRelaxed(value) : null;
  222. NotifyPropertyChanged("RegisterContact");
  223. }
  224. }
  225. private int m_registerExpiry = REGISTER_DEFAULT_EXPIRY;
  226. [Column(Name = "registerexpiry", DbType = "int", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  227. [DataMember]
  228. public int RegisterExpiry
  229. {
  230. get { return m_registerExpiry; }
  231. set
  232. {
  233. m_registerExpiry = (value < REGISTER_MINIMUM_EXPIRY) ? REGISTER_MINIMUM_EXPIRY : value;
  234. NotifyPropertyChanged("RegisterExpiry");
  235. }
  236. }
  237. private SIPURI m_registerServer; // If set this host address will be used for the Registrar server, if not set the ProviderServer is used.
  238. [Column(Name = "registerserver", DbType = "varchar(256)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  239. [DataMember]
  240. public string RegisterServer
  241. {
  242. get { return (m_registerServer != null) ? m_registerServer.ToString() : null; }
  243. set
  244. {
  245. m_registerServer = (!value.IsNullOrBlank()) ? SIPURI.ParseSIPURIRelaxed(value) : null;
  246. NotifyPropertyChanged("RegisterServer");
  247. }
  248. }
  249. private string m_registerRealm; // An optional setting if the register realm differs from the provider server.
  250. [Column(Name = "registerrealm", DbType = "varchar(256)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  251. [DataMember]
  252. public string RegisterRealm
  253. {
  254. get { return m_registerRealm; }
  255. set
  256. {
  257. m_registerRealm = value;
  258. NotifyPropertyChanged("RegisterRealm");
  259. }
  260. }
  261. private bool m_registerEnabled; // If the registration has been disabled this will be set to false.
  262. [Column(Name = "registerenabled", DbType = "bit", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  263. [DataMember]
  264. public bool RegisterEnabled
  265. {
  266. get { return m_registerEnabled; }
  267. set
  268. {
  269. m_registerEnabled = value;
  270. NotifyPropertyChanged("RegisterEnabled");
  271. }
  272. }
  273. private bool m_registerAdminEnabled; // This setting allows and administrator to override the user setting and disable a registration.
  274. [Column(Name = "registeradminenabled", DbType = "bit", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  275. [DataMember]
  276. public bool RegisterAdminEnabled
  277. {
  278. get { return m_registerAdminEnabled; }
  279. set
  280. {
  281. m_registerAdminEnabled = value;
  282. NotifyPropertyChanged("RegisterAdminEnabled");
  283. }
  284. }
  285. public bool RegisterActive
  286. {
  287. get { return RegisterEnabled && RegisterAdminEnabled; }
  288. }
  289. private string m_registerDisabledReason; // If the registration agent disabled the registration it will set a reason.
  290. [Column(Name = "registerdisabledreason", DbType = "varchar(256)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  291. [DataMember]
  292. public string RegisterDisabledReason
  293. {
  294. get { return m_registerDisabledReason; }
  295. set
  296. {
  297. m_registerDisabledReason = value;
  298. NotifyPropertyChanged("RegisterDisabledReason");
  299. }
  300. }
  301. private string m_gvCallbackNumber; // The callback number for Google Voice calls.
  302. [Column(Name = "gvcallbacknumber", DbType = "varchar(16)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  303. [DataMember]
  304. public string GVCallbackNumber
  305. {
  306. get { return m_gvCallbackNumber; }
  307. set
  308. {
  309. m_gvCallbackNumber = value;
  310. NotifyPropertyChanged("GVCallbackNumber");
  311. }
  312. }
  313. private string m_gvCallbackPattern; // The callback number for Google Voice calls.
  314. [Column(Name = "gvcallbackpattern", DbType = "varchar(32)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  315. [DataMember]
  316. public string GVCallbackPattern
  317. {
  318. get { return m_gvCallbackPattern; }
  319. set
  320. {
  321. m_gvCallbackPattern = value;
  322. NotifyPropertyChanged("GVCallbackPattern");
  323. }
  324. }
  325. private GoogleVoiceCallbackTypes? m_gvCallbackType;
  326. [Column(Name = "gvcallbacktype", DbType = "varchar(16)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  327. [DataMember]
  328. public GoogleVoiceCallbackTypes? GVCallbackType
  329. {
  330. get { return m_gvCallbackType; }
  331. set
  332. {
  333. m_gvCallbackType = value;
  334. NotifyPropertyChanged("GVCallbackType");
  335. }
  336. }
  337. private DateTimeOffset m_lastUpdate;
  338. [Column(Name = "lastupdate", DbType = "datetimeoffset", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  339. [DataMember]
  340. public DateTimeOffset LastUpdate
  341. {
  342. get { return m_lastUpdate; }
  343. set
  344. {
  345. m_lastUpdate = value.ToUniversalTime();
  346. NotifyPropertyChanged("LastUpdate");
  347. }
  348. }
  349. private DateTimeOffset m_inserted;
  350. [Column(Name = "inserted", DbType = "datetimeoffset", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  351. [DataMember]
  352. public DateTimeOffset Inserted
  353. {
  354. get { return m_inserted; }
  355. set { m_inserted = value.ToUniversalTime(); }
  356. }
  357. /// <summary>
  358. /// Normally the registrar server will just be the main Provider server however in some cases they will be different.
  359. /// </summary>
  360. public SIPURI Registrar
  361. {
  362. get { return (m_registerServer != null) ? m_registerServer : m_providerServer; }
  363. }
  364. public event PropertyChangedEventHandler PropertyChanged;
  365. public SIPProvider()
  366. { }
  367. public SIPProvider(
  368. ProviderTypes providerType,
  369. string owner,
  370. string name,
  371. string username,
  372. string password,
  373. SIPURI server,
  374. string outboundProxy,
  375. string from,
  376. string custom,
  377. SIPURI registerContact,
  378. int registerExpiry,
  379. SIPURI registerServer,
  380. string authUsername,
  381. string registerRealm,
  382. bool registerEnabled,
  383. bool registerEnabledAdmin,
  384. string gvCallbackNumber,
  385. string gvCallbackPattern,
  386. GoogleVoiceCallbackTypes? gvCallbackType)
  387. {
  388. m_providerType = providerType;
  389. m_owner = owner;
  390. m_id = Guid.NewGuid();
  391. m_providerName = name;
  392. m_providerUsername = username;
  393. m_providerPassword = password;
  394. m_providerServer = server;
  395. m_providerOutboundProxy = outboundProxy;
  396. m_providerFrom = from;
  397. m_customHeaders = custom;
  398. m_registerContact = registerContact;
  399. m_registerExpiry = (registerExpiry < REGISTER_MINIMUM_EXPIRY) ? REGISTER_MINIMUM_EXPIRY : registerExpiry;
  400. m_registerServer = registerServer;
  401. m_providerAuthUsername = authUsername;
  402. m_registerRealm = registerRealm;
  403. m_registerEnabled = registerEnabled;
  404. m_registerAdminEnabled = registerEnabledAdmin;
  405. m_gvCallbackNumber = gvCallbackNumber;
  406. m_gvCallbackPattern = gvCallbackPattern;
  407. m_gvCallbackType = gvCallbackType;
  408. Inserted = DateTimeOffset.UtcNow;
  409. LastUpdate = DateTimeOffset.UtcNow;
  410. //if (m_registerContact != null)
  411. //{
  412. // m_registerContact.Parameters.Set(CONTACT_ID_KEY, Crypto.GetRandomString(6));
  413. //}
  414. //if (m_registerContact == null && m_registerEnabled)
  415. //{
  416. // m_registerEnabled = false;
  417. // m_registerDisabledReason = "No Contact URI was specified for the registration.";
  418. // logger.Warn("Registrations for provider " + m_providerName + " owned by " + m_owner + " have been disabled due to an empty or invalid Contact URI.");
  419. //}
  420. }
  421. public static string ValidateAndClean(SIPProvider sipProvider)
  422. {
  423. if (sipProvider.ProviderName.IsNullOrBlank())
  424. {
  425. return "A value for Provider Name must be specified.";
  426. }
  427. else if (sipProvider.ProviderName.Contains("."))
  428. {
  429. return "The Provider Name cannot contain a full stop '.' in order to avoid ambiguity with DNS host names, please remove the '.'.";
  430. }
  431. if (sipProvider.ProviderType == ProviderTypes.SIP)
  432. {
  433. if (sipProvider.ProviderServer.IsNullOrBlank())
  434. {
  435. return "A value for Server must be specified.";
  436. }
  437. if (sipProvider.RegisterEnabled && sipProvider.m_registerContact == null)
  438. {
  439. return "A valid contact must be supplied to enable a provider registration.";
  440. }
  441. else if (sipProvider.m_providerServer.Host.IndexOf('.') == -1)
  442. {
  443. return "Your provider server entry appears to be invalid. A valid hostname or IP address should contain at least one '.'.";
  444. }
  445. else if (sipProvider.m_registerServer != null && sipProvider.m_registerServer.Host.IndexOf('.') == -1)
  446. {
  447. return "Your register server entry appears to be invalid. A valid hostname or IP address should contain at least one '.'.";
  448. }
  449. else if (sipProvider.m_registerContact != null && sipProvider.m_registerContact.Host.IndexOf('.') == -1)
  450. {
  451. return "Your register contact entry appears to be invalid. A valid hostname or IP address should contain at least one '.'.";
  452. }
  453. else if (sipProvider.m_registerContact != null && sipProvider.m_registerContact.User.IsNullOrBlank())
  454. {
  455. return "Your register contact entry appears to be invalid, the user portion was missing. Contacts must be of the form user@host.com, e.g. joe@sipsorcery.com.";
  456. }
  457. else if (DisallowedServerPatterns != null && Regex.Match(sipProvider.m_providerServer.Host, DisallowedServerPatterns).Success)
  458. {
  459. return "The Provider Server contains a disallowed string. If you are trying to create a Provider entry pointing to sipsorcery.com it is not permitted.";
  460. }
  461. else if (DisallowedServerPatterns != null && sipProvider.m_registerServer != null && Regex.Match(sipProvider.m_registerServer.Host, DisallowedServerPatterns).Success)
  462. {
  463. return "The Provider Register Server contains a disallowed string. If you are trying to create a Provider entry pointing to sipsorcery.com it is not permitted.";
  464. }
  465. }
  466. else
  467. {
  468. if (sipProvider.ProviderUsername.IsNullOrBlank())
  469. {
  470. return "A username is required for Google Voice entries.";
  471. }
  472. else if (sipProvider.ProviderPassword.IsNullOrBlank())
  473. {
  474. return "A password is required for Google Voice entries.";
  475. }
  476. else if (sipProvider.GVCallbackNumber.IsNullOrBlank())
  477. {
  478. return "A callback number is required for Google Voice entries.";
  479. }
  480. else if (Regex.Match(sipProvider.GVCallbackNumber, @"\D").Success)
  481. {
  482. return "The callback number contains an invalid character. Only digits are permitted.";
  483. }
  484. }
  485. return null;
  486. }
  487. #if !SILVERLIGHT
  488. public SIPProvider(DataRow bindingRow)
  489. {
  490. Load(bindingRow);
  491. }
  492. public DataTable GetTable()
  493. {
  494. DataTable table = new DataTable();
  495. table.Columns.Add(new DataColumn("id", typeof(String)));
  496. table.Columns.Add(new DataColumn("providertype", typeof(String)));
  497. table.Columns.Add(new DataColumn("owner", typeof(String)));
  498. table.Columns.Add(new DataColumn("adminmemberid", typeof(String)));
  499. table.Columns.Add(new DataColumn("providername", typeof(String)));
  500. table.Columns.Add(new DataColumn("providerusername", typeof(String)));
  501. table.Columns.Add(new DataColumn("providerpassword", typeof(String)));
  502. table.Columns.Add(new DataColumn("providerserver", typeof(String)));
  503. table.Columns.Add(new DataColumn("providerauthusername", typeof(String)));
  504. table.Columns.Add(new DataColumn("provideroutboundproxy", typeof(String)));
  505. table.Columns.Add(new DataColumn("providerfrom", typeof(String)));
  506. table.Columns.Add(new DataColumn("customheaders", typeof(String)));
  507. table.Columns.Add(new DataColumn("registercontact", typeof(String)));
  508. table.Columns.Add(new DataColumn("registerexpiry", typeof(Int32)));
  509. table.Columns.Add(new DataColumn("registerserver", typeof(String)));
  510. table.Columns.Add(new DataColumn("registerrealm", typeof(String)));
  511. table.Columns.Add(new DataColumn("registerenabled", typeof(Boolean)));
  512. table.Columns.Add(new DataColumn("registeradminenabled", typeof(Boolean)));
  513. table.Columns.Add(new DataColumn("registerdisabledreason", typeof(String)));
  514. table.Columns.Add(new DataColumn("maxexecutioncount", typeof(Int32)));
  515. table.Columns.Add(new DataColumn("gvcallbacknumber", typeof(String)));
  516. table.Columns.Add(new DataColumn("gvcallbackpattern", typeof(String)));
  517. table.Columns.Add(new DataColumn("gvcallbacktype", typeof(String)));
  518. table.Columns.Add(new DataColumn("inserted", typeof(DateTimeOffset)));
  519. table.Columns.Add(new DataColumn("lastupdate", typeof(DateTimeOffset)));
  520. return table;
  521. }
  522. public void Load(DataRow providerRow)
  523. {
  524. try
  525. {
  526. m_id = (providerRow.Table.Columns.Contains("id") && providerRow["id"] != DBNull.Value && providerRow["id"] != null) ? new Guid(providerRow["id"] as string) : Guid.NewGuid();
  527. m_providerType = (ProviderTypes)Enum.Parse(typeof(ProviderTypes), providerRow["providertype"] as string, true);
  528. m_owner = providerRow["owner"] as string;
  529. AdminMemberId = (providerRow.Table.Columns.Contains("adminmemberid") && providerRow["adminmemberid"] != null) ? providerRow["adminmemberid"] as string : null;
  530. m_providerName = providerRow["providername"] as string;
  531. m_providerUsername = providerRow["providerusername"] as string;
  532. m_providerPassword = providerRow["providerpassword"] as string;
  533. m_providerServer = SIPURI.ParseSIPURIRelaxed(providerRow["providerserver"] as string);
  534. m_providerAuthUsername = (providerRow.Table.Columns.Contains("providerauthusername") && providerRow["providerauthusername"] != null) ? providerRow["providerauthusername"] as string : null;
  535. m_providerOutboundProxy = (providerRow.Table.Columns.Contains("provideroutboundproxy") && providerRow["provideroutboundproxy"] != null) ? providerRow["provideroutboundproxy"] as string : null;
  536. m_providerFrom = (providerRow.Table.Columns.Contains("providerfrom") && providerRow["providerfrom"] != null) ? providerRow["providerfrom"] as string : null;
  537. m_customHeaders = (providerRow.Table.Columns.Contains("customheaders") && providerRow["customheaders"] != null) ? providerRow["customheaders"] as string : null;
  538. m_registerContact = (providerRow.Table.Columns.Contains("registercontact") && providerRow["registercontact"] != DBNull.Value && providerRow["registercontact"] != null && providerRow["registercontact"].ToString().Length > 0) ? SIPURI.ParseSIPURIRelaxed(providerRow["registercontact"] as string) : null;
  539. m_registerExpiry = (providerRow.Table.Columns.Contains("registerexpiry") && providerRow["registerexpiry"] != DBNull.Value && providerRow["registerexpiry"] != null) ? Convert.ToInt32(providerRow["registerexpiry"]) : REGISTER_DEFAULT_EXPIRY;
  540. m_registerServer = (providerRow.Table.Columns.Contains("registerserver") && providerRow["registerserver"] != null) ? SIPURI.ParseSIPURIRelaxed(providerRow["registerserver"] as string) : null;
  541. m_registerRealm = (providerRow.Table.Columns.Contains("registerrealm") && providerRow["registerrealm"] != null) ? providerRow["registerrealm"] as string : null;
  542. m_registerEnabled = (providerRow.Table.Columns.Contains("registerenabled") && providerRow["registerenabled"] != DBNull.Value && providerRow["registerenabled"] != null) ? StorageLayer.ConvertToBoolean(providerRow["registerenabled"]) : false;
  543. m_registerAdminEnabled = (providerRow.Table.Columns.Contains("registeradminenabled") && providerRow["registeradminenabled"] != DBNull.Value && providerRow["registeradminenabled"] != null) ? StorageLayer.ConvertToBoolean(providerRow["registeradminenabled"]) : true;
  544. m_registerDisabledReason = (providerRow.Table.Columns.Contains("registerdisabledreason") && providerRow["registerdisabledreason"] != DBNull.Value && providerRow["registerdisabledreason"] != null) ? providerRow["registerdisabledreason"] as string : null;
  545. m_gvCallbackNumber = (providerRow.Table.Columns.Contains("gvcallbacknumber") && providerRow["gvcallbacknumber"] != null) ? providerRow["gvcallbacknumber"] as string : null;
  546. m_gvCallbackPattern = (providerRow.Table.Columns.Contains("gvcallbackpattern") && providerRow["gvcallbackpattern"] != null) ? providerRow["gvcallbackpattern"] as string : null;
  547. m_gvCallbackType = (providerRow.Table.Columns.Contains("gvcallbacktype") && providerRow["gvcallbacktype"] != DBNull.Value && providerRow["gvcallbacktype"] != null) ? (GoogleVoiceCallbackTypes)Enum.Parse(typeof(GoogleVoiceCallbackTypes), providerRow["gvcallbacktype"] as string, true) : (GoogleVoiceCallbackTypes?)null;
  548. LastUpdate = (providerRow.Table.Columns.Contains("lastupdate") && providerRow["lastupdate"] != DBNull.Value && providerRow["lastupdate"] != null) ? DateTimeOffset.Parse(providerRow["lastupdate"] as string) : DateTimeOffset.UtcNow;
  549. Inserted = (providerRow.Table.Columns.Contains("inserted") && providerRow["inserted"] != DBNull.Value && providerRow["inserted"] != null) ? DateTimeOffset.Parse(providerRow["inserted"] as string) : DateTimeOffset.UtcNow;
  550. if (m_registerContact == null && m_registerEnabled)
  551. {
  552. m_registerEnabled = false;
  553. m_registerDisabledReason = "No Contact URI was specified for the registration.";
  554. logger.Warn("Registrations for provider " + m_providerName + " owned by " + m_owner + " have been disabled due to an empty or invalid Contact URI.");
  555. }
  556. }
  557. catch (Exception excp)
  558. {
  559. logger.Error("Exception SIPProvider Load. " + excp.Message);
  560. throw;
  561. }
  562. }
  563. public Dictionary<Guid, object> Load(XmlDocument dom)
  564. {
  565. return SIPAssetXMLPersistor<SIPProvider>.LoadAssetsFromXMLRecordSet(dom);
  566. }
  567. #endif
  568. public string ToXML()
  569. {
  570. string providerXML =
  571. " <" + XML_ELEMENT_NAME + ">" + m_newLine +
  572. ToXMLNoParent() +
  573. " </" + XML_ELEMENT_NAME + ">" + m_newLine;
  574. return providerXML;
  575. }
  576. public string ToXMLNoParent()
  577. {
  578. string registrarStr = (m_registerServer != null) ? m_registerServer.ToString() : null;
  579. string registerContactStr = (m_registerContact != null) ? SafeXML.MakeSafeXML(m_registerContact.ToString()) : null;
  580. string providerXML =
  581. " <id>" + m_id + "</id>" + m_newLine +
  582. " <providertype>" + m_providerType + "<providertype>" + m_newLine +
  583. " <owner>" + m_owner + "</owner>" + m_newLine +
  584. " <adminmemberid>" + AdminMemberId + "</adminmemberid>" + m_newLine +
  585. " <providername>" + m_providerName + "</providername>" + m_newLine +
  586. " <providerusername>" + m_providerUsername + "</providerusername>" + m_newLine +
  587. " <providerpassword>" + m_providerPassword + "</providerpassword>" + m_newLine +
  588. " <providerserver>" + SafeXML.MakeSafeXML(m_providerServer.ToString()) + "</providerserver>" + m_newLine +
  589. " <providerauthusername>" + m_providerAuthUsername + "</providerauthusername>" + m_newLine +
  590. " <provideroutboundproxy>" + SafeXML.MakeSafeXML(m_providerOutboundProxy) + "</provideroutboundproxy>" + m_newLine +
  591. " <providerfrom>" + SafeXML.MakeSafeXML(m_providerFrom) + "</providerfrom>" + m_newLine +
  592. " <customheaders>" + SafeXML.MakeSafeXML(m_customHeaders) + "</customheaders>" + m_newLine +
  593. " <registercontact>" + registerContactStr + "</registercontact>" + m_newLine +
  594. " <registerexpiry>" + m_registerExpiry + "</registerexpiry>" + m_newLine +
  595. " <registerserver>" + registrarStr + "</registerserver>" + m_newLine +
  596. " <registerrealm>" + SafeXML.MakeSafeXML(m_registerRealm) + "</registerrealm>" + m_newLine +
  597. " <registerenabled>" + m_registerEnabled + "</registerenabled>" + m_newLine +
  598. " <registerenabledadmin>" + m_registerAdminEnabled + "</registerenabledadmin>" + m_newLine +
  599. " <registerdisabledreason>" + SafeXML.MakeSafeXML(m_registerDisabledReason) + "</registerdisabledreason>" + m_newLine +
  600. " <inserted>" + m_inserted.ToString("o") + "</inserted>" + m_newLine +
  601. " <lastupdate>" + m_lastUpdate.ToString("o") + "</lastupdate>" + m_newLine;
  602. return providerXML;
  603. }
  604. public string GetXMLElementName()
  605. {
  606. return XML_ELEMENT_NAME;
  607. }
  608. public string GetXMLDocumentElementName()
  609. {
  610. return XML_DOCUMENT_ELEMENT_NAME;
  611. }
  612. private void NotifyPropertyChanged(string propertyName)
  613. {
  614. if (PropertyChanged != null)
  615. {
  616. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  617. }
  618. }
  619. }
  620. }