diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs (renamed from OpenSim/Region/Environment/Modules/AsteriskVoiceModule.cs) | 570 |
1 files changed, 285 insertions, 285 deletions
diff --git a/OpenSim/Region/Environment/Modules/AsteriskVoiceModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs index 38c0c1d..0d7de78 100644 --- a/OpenSim/Region/Environment/Modules/AsteriskVoiceModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Voice/AsterixVoice/AsteriskVoiceModule.cs | |||
@@ -1,285 +1,285 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using libsecondlife; | 31 | using libsecondlife; |
32 | using log4net; | 32 | using log4net; |
33 | using Nini.Config; | 33 | using Nini.Config; |
34 | using Nwc.XmlRpc; | 34 | using Nwc.XmlRpc; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Framework.Communications.Cache; | 36 | using OpenSim.Framework.Communications.Cache; |
37 | using OpenSim.Framework.Servers; | 37 | using OpenSim.Framework.Servers; |
38 | using OpenSim.Region.Capabilities; | 38 | using OpenSim.Region.Capabilities; |
39 | using OpenSim.Region.Environment.Interfaces; | 39 | using OpenSim.Region.Environment.Interfaces; |
40 | using OpenSim.Region.Environment.Scenes; | 40 | using OpenSim.Region.Environment.Scenes; |
41 | using Caps=OpenSim.Region.Capabilities.Caps; | 41 | using Caps=OpenSim.Region.Capabilities.Caps; |
42 | 42 | ||
43 | namespace OpenSim.Region.Environment.Modules | 43 | namespace OpenSim.Region.Environment.Modules.Avatar.Voice.AsterixVoice |
44 | { | 44 | { |
45 | public class AsteriskVoiceModule : IRegionModule | 45 | public class AsteriskVoiceModule : IRegionModule |
46 | { | 46 | { |
47 | private static readonly ILog m_log = | 47 | private static readonly ILog m_log = |
48 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 48 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
49 | 49 | ||
50 | private Scene m_scene; | 50 | private Scene m_scene; |
51 | private IConfig m_config; | 51 | private IConfig m_config; |
52 | private string m_asterisk; | 52 | private string m_asterisk; |
53 | private string m_asterisk_password; | 53 | private string m_asterisk_password; |
54 | private string m_asterisk_salt; | 54 | private string m_asterisk_salt; |
55 | private int m_asterisk_timeout; | 55 | private int m_asterisk_timeout; |
56 | private string m_sipDomain; | 56 | private string m_sipDomain; |
57 | private string m_confDomain; | 57 | private string m_confDomain; |
58 | 58 | ||
59 | private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; | 59 | private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; |
60 | private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; | 60 | private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; |
61 | 61 | ||
62 | public void Initialise(Scene scene, IConfigSource config) | 62 | public void Initialise(Scene scene, IConfigSource config) |
63 | { | 63 | { |
64 | m_scene = scene; | 64 | m_scene = scene; |
65 | m_config = config.Configs["AsteriskVoice"]; | 65 | m_config = config.Configs["AsteriskVoice"]; |
66 | 66 | ||
67 | if (null == m_config) | 67 | if (null == m_config) |
68 | { | 68 | { |
69 | m_log.Info("[ASTERISKVOICE] no config found, plugin disabled"); | 69 | m_log.Info("[ASTERISKVOICE] no config found, plugin disabled"); |
70 | return; | 70 | return; |
71 | } | 71 | } |
72 | 72 | ||
73 | if (!m_config.GetBoolean("enabled", false)) | 73 | if (!m_config.GetBoolean("enabled", false)) |
74 | { | 74 | { |
75 | m_log.Info("[ASTERISKVOICE] plugin disabled by configuration"); | 75 | m_log.Info("[ASTERISKVOICE] plugin disabled by configuration"); |
76 | return; | 76 | return; |
77 | } | 77 | } |
78 | m_log.Info("[ASTERISKVOICE] plugin enabled"); | 78 | m_log.Info("[ASTERISKVOICE] plugin enabled"); |
79 | 79 | ||
80 | try { | 80 | try { |
81 | m_sipDomain = m_config.GetString("sip_domain", String.Empty); | 81 | m_sipDomain = m_config.GetString("sip_domain", String.Empty); |
82 | m_log.InfoFormat("[ASTERISKVOICE] using SIP domain {0}", m_sipDomain); | 82 | m_log.InfoFormat("[ASTERISKVOICE] using SIP domain {0}", m_sipDomain); |
83 | 83 | ||
84 | m_confDomain = m_config.GetString("conf_domain", String.Empty); | 84 | m_confDomain = m_config.GetString("conf_domain", String.Empty); |
85 | m_log.InfoFormat("[ASTERISKVOICE] using conf domain {0}", m_confDomain); | 85 | m_log.InfoFormat("[ASTERISKVOICE] using conf domain {0}", m_confDomain); |
86 | 86 | ||
87 | m_asterisk = m_config.GetString("asterisk_frontend", String.Empty); | 87 | m_asterisk = m_config.GetString("asterisk_frontend", String.Empty); |
88 | m_asterisk_password = m_config.GetString("asterisk_password", String.Empty); | 88 | m_asterisk_password = m_config.GetString("asterisk_password", String.Empty); |
89 | m_asterisk_timeout = m_config.GetInt("asterisk_timeout", 3000); | 89 | m_asterisk_timeout = m_config.GetInt("asterisk_timeout", 3000); |
90 | m_asterisk_salt = m_config.GetString("asterisk_salt", "Wuffwuff"); | 90 | m_asterisk_salt = m_config.GetString("asterisk_salt", "Wuffwuff"); |
91 | if (String.IsNullOrEmpty(m_asterisk)) throw new Exception("missing asterisk_frontend config parameter"); | 91 | if (String.IsNullOrEmpty(m_asterisk)) throw new Exception("missing asterisk_frontend config parameter"); |
92 | if (String.IsNullOrEmpty(m_asterisk_password)) throw new Exception("missing asterisk_password config parameter"); | 92 | if (String.IsNullOrEmpty(m_asterisk_password)) throw new Exception("missing asterisk_password config parameter"); |
93 | m_log.InfoFormat("[ASTERISKVOICE] using asterisk front end {0}", m_asterisk); | 93 | m_log.InfoFormat("[ASTERISKVOICE] using asterisk front end {0}", m_asterisk); |
94 | 94 | ||
95 | scene.EventManager.OnRegisterCaps += OnRegisterCaps; | 95 | scene.EventManager.OnRegisterCaps += OnRegisterCaps; |
96 | } | 96 | } |
97 | catch (Exception e) | 97 | catch (Exception e) |
98 | { | 98 | { |
99 | m_log.ErrorFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.Message); | 99 | m_log.ErrorFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.Message); |
100 | m_log.DebugFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.ToString()); | 100 | m_log.DebugFormat("[ASTERISKVOICE] plugin initialization failed: {0}", e.ToString()); |
101 | return; | 101 | return; |
102 | } | 102 | } |
103 | } | 103 | } |
104 | 104 | ||
105 | public void PostInitialise() | 105 | public void PostInitialise() |
106 | { | 106 | { |
107 | } | 107 | } |
108 | 108 | ||
109 | public void Close() | 109 | public void Close() |
110 | { | 110 | { |
111 | } | 111 | } |
112 | 112 | ||
113 | public string Name | 113 | public string Name |
114 | { | 114 | { |
115 | get { return "AsteriskVoiceModule"; } | 115 | get { return "AsteriskVoiceModule"; } |
116 | } | 116 | } |
117 | 117 | ||
118 | public bool IsSharedModule | 118 | public bool IsSharedModule |
119 | { | 119 | { |
120 | get { return false; } | 120 | get { return false; } |
121 | } | 121 | } |
122 | 122 | ||
123 | public void OnRegisterCaps(LLUUID agentID, Caps caps) | 123 | public void OnRegisterCaps(LLUUID agentID, Caps caps) |
124 | { | 124 | { |
125 | m_log.DebugFormat("[ASTERISKVOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); | 125 | m_log.DebugFormat("[ASTERISKVOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); |
126 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 126 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
127 | caps.RegisterHandler("ParcelVoiceInfoRequest", | 127 | caps.RegisterHandler("ParcelVoiceInfoRequest", |
128 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, | 128 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, |
129 | delegate(string request, string path, string param) | 129 | delegate(string request, string path, string param) |
130 | { | 130 | { |
131 | return ParcelVoiceInfoRequest(request, path, param, | 131 | return ParcelVoiceInfoRequest(request, path, param, |
132 | agentID, caps); | 132 | agentID, caps); |
133 | })); | 133 | })); |
134 | caps.RegisterHandler("ProvisionVoiceAccountRequest", | 134 | caps.RegisterHandler("ProvisionVoiceAccountRequest", |
135 | new RestStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath, | 135 | new RestStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath, |
136 | delegate(string request, string path, string param) | 136 | delegate(string request, string path, string param) |
137 | { | 137 | { |
138 | return ProvisionVoiceAccountRequest(request, path, param, | 138 | return ProvisionVoiceAccountRequest(request, path, param, |
139 | agentID, caps); | 139 | agentID, caps); |
140 | })); | 140 | })); |
141 | } | 141 | } |
142 | 142 | ||
143 | /// <summary> | 143 | /// <summary> |
144 | /// Callback for a client request for ParcelVoiceInfo | 144 | /// Callback for a client request for ParcelVoiceInfo |
145 | /// </summary> | 145 | /// </summary> |
146 | /// <param name="request"></param> | 146 | /// <param name="request"></param> |
147 | /// <param name="path"></param> | 147 | /// <param name="path"></param> |
148 | /// <param name="param"></param> | 148 | /// <param name="param"></param> |
149 | /// <param name="agentID"></param> | 149 | /// <param name="agentID"></param> |
150 | /// <param name="caps"></param> | 150 | /// <param name="caps"></param> |
151 | /// <returns></returns> | 151 | /// <returns></returns> |
152 | public string ParcelVoiceInfoRequest(string request, string path, string param, | 152 | public string ParcelVoiceInfoRequest(string request, string path, string param, |
153 | LLUUID agentID, Caps caps) | 153 | LLUUID agentID, Caps caps) |
154 | { | 154 | { |
155 | // we need to do: | 155 | // we need to do: |
156 | // - send channel_uri: as "sip:regionID@m_sipDomain" | 156 | // - send channel_uri: as "sip:regionID@m_sipDomain" |
157 | try | 157 | try |
158 | { | 158 | { |
159 | m_log.DebugFormat("[ASTERISKVOICE][PARCELVOICE]: request: {0}, path: {1}, param: {2}", | 159 | m_log.DebugFormat("[ASTERISKVOICE][PARCELVOICE]: request: {0}, path: {1}, param: {2}", |
160 | request, path, param); | 160 | request, path, param); |
161 | 161 | ||
162 | 162 | ||
163 | // setup response to client | 163 | // setup response to client |
164 | Hashtable creds = new Hashtable(); | 164 | Hashtable creds = new Hashtable(); |
165 | creds["channel_uri"] = String.Format("sip:{0}@{1}", | 165 | creds["channel_uri"] = String.Format("sip:{0}@{1}", |
166 | m_scene.RegionInfo.RegionID, m_sipDomain); | 166 | m_scene.RegionInfo.RegionID, m_sipDomain); |
167 | 167 | ||
168 | string regionName = m_scene.RegionInfo.RegionName; | 168 | string regionName = m_scene.RegionInfo.RegionName; |
169 | ScenePresence avatar = m_scene.GetScenePresence(agentID); | 169 | ScenePresence avatar = m_scene.GetScenePresence(agentID); |
170 | if (null == m_scene.LandChannel) throw new Exception("land data not yet available"); | 170 | if (null == m_scene.LandChannel) throw new Exception("land data not yet available"); |
171 | LandData land = m_scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); | 171 | LandData land = m_scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); |
172 | 172 | ||
173 | LLSDParcelVoiceInfoResponse parcelVoiceInfo = | 173 | LLSDParcelVoiceInfoResponse parcelVoiceInfo = |
174 | new LLSDParcelVoiceInfoResponse(regionName, land.localID, creds); | 174 | new LLSDParcelVoiceInfoResponse(regionName, land.localID, creds); |
175 | 175 | ||
176 | string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo); | 176 | string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo); |
177 | 177 | ||
178 | 178 | ||
179 | // update region on asterisk-opensim frontend | 179 | // update region on asterisk-opensim frontend |
180 | Hashtable requestData = new Hashtable(); | 180 | Hashtable requestData = new Hashtable(); |
181 | requestData["admin_password"] = m_asterisk_password; | 181 | requestData["admin_password"] = m_asterisk_password; |
182 | requestData["region"] = m_scene.RegionInfo.RegionID.ToString(); | 182 | requestData["region"] = m_scene.RegionInfo.RegionID.ToString(); |
183 | if (!String.IsNullOrEmpty(m_confDomain)) | 183 | if (!String.IsNullOrEmpty(m_confDomain)) |
184 | { | 184 | { |
185 | requestData["region"] += String.Format("@{0}", m_confDomain); | 185 | requestData["region"] += String.Format("@{0}", m_confDomain); |
186 | } | 186 | } |
187 | 187 | ||
188 | ArrayList SendParams = new ArrayList(); | 188 | ArrayList SendParams = new ArrayList(); |
189 | SendParams.Add(requestData); | 189 | SendParams.Add(requestData); |
190 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("region_update", SendParams); | 190 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("region_update", SendParams); |
191 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); | 191 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); |
192 | Hashtable responseData = (Hashtable)updateAccountResponse.Value; | 192 | Hashtable responseData = (Hashtable)updateAccountResponse.Value; |
193 | 193 | ||
194 | if (!responseData.ContainsKey("success")) throw new Exception("region_update call failed"); | 194 | if (!responseData.ContainsKey("success")) throw new Exception("region_update call failed"); |
195 | 195 | ||
196 | bool success = Convert.ToBoolean((string)responseData["success"]); | 196 | bool success = Convert.ToBoolean((string)responseData["success"]); |
197 | if (!success) throw new Exception("region_update failed"); | 197 | if (!success) throw new Exception("region_update failed"); |
198 | 198 | ||
199 | 199 | ||
200 | m_log.DebugFormat("[ASTERISKVOICE][PARCELVOICE]: {0}", r); | 200 | m_log.DebugFormat("[ASTERISKVOICE][PARCELVOICE]: {0}", r); |
201 | return r; | 201 | return r; |
202 | } | 202 | } |
203 | catch (Exception e) | 203 | catch (Exception e) |
204 | { | 204 | { |
205 | m_log.ErrorFormat("[ASTERISKVOICE][CAPS][PARCELVOICE]: {0}, retry later", e.Message); | 205 | m_log.ErrorFormat("[ASTERISKVOICE][CAPS][PARCELVOICE]: {0}, retry later", e.Message); |
206 | m_log.DebugFormat("[ASTERISKVOICE][CAPS][PARCELVOICE]: {0} failed", e.ToString()); | 206 | m_log.DebugFormat("[ASTERISKVOICE][CAPS][PARCELVOICE]: {0} failed", e.ToString()); |
207 | 207 | ||
208 | return "<llsd>undef</llsd>"; | 208 | return "<llsd>undef</llsd>"; |
209 | } | 209 | } |
210 | } | 210 | } |
211 | 211 | ||
212 | /// <summary> | 212 | /// <summary> |
213 | /// Callback for a client request for Voice Account Details | 213 | /// Callback for a client request for Voice Account Details |
214 | /// </summary> | 214 | /// </summary> |
215 | /// <param name="request"></param> | 215 | /// <param name="request"></param> |
216 | /// <param name="path"></param> | 216 | /// <param name="path"></param> |
217 | /// <param name="param"></param> | 217 | /// <param name="param"></param> |
218 | /// <param name="agentID"></param> | 218 | /// <param name="agentID"></param> |
219 | /// <param name="caps"></param> | 219 | /// <param name="caps"></param> |
220 | /// <returns></returns> | 220 | /// <returns></returns> |
221 | public string ProvisionVoiceAccountRequest(string request, string path, string param, | 221 | public string ProvisionVoiceAccountRequest(string request, string path, string param, |
222 | LLUUID agentID, Caps caps) | 222 | LLUUID agentID, Caps caps) |
223 | { | 223 | { |
224 | // we need to | 224 | // we need to |
225 | // - get user data from UserProfileCacheService | 225 | // - get user data from UserProfileCacheService |
226 | // - generate nonce for user voice account password | 226 | // - generate nonce for user voice account password |
227 | // - issue XmlRpc request to asterisk opensim front end: | 227 | // - issue XmlRpc request to asterisk opensim front end: |
228 | // + user: base 64 encoded user name (otherwise SL | 228 | // + user: base 64 encoded user name (otherwise SL |
229 | // client is unhappy) | 229 | // client is unhappy) |
230 | // + password: nonce | 230 | // + password: nonce |
231 | // - the XmlRpc call to asteris-opensim was successful: | 231 | // - the XmlRpc call to asteris-opensim was successful: |
232 | // send account details back to client | 232 | // send account details back to client |
233 | try | 233 | try |
234 | { | 234 | { |
235 | m_log.DebugFormat("[ASTERISKVOICE][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", | 235 | m_log.DebugFormat("[ASTERISKVOICE][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", |
236 | request, path, param); | 236 | request, path, param); |
237 | 237 | ||
238 | // get user data & prepare voice account response | 238 | // get user data & prepare voice account response |
239 | string voiceUser = "x" + Convert.ToBase64String(agentID.GetBytes()); | 239 | string voiceUser = "x" + Convert.ToBase64String(agentID.GetBytes()); |
240 | voiceUser = voiceUser.Replace('+', '-').Replace('/', '_'); | 240 | voiceUser = voiceUser.Replace('+', '-').Replace('/', '_'); |
241 | 241 | ||
242 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); | 242 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); |
243 | if (null == userInfo) throw new Exception("cannot get user details"); | 243 | if (null == userInfo) throw new Exception("cannot get user details"); |
244 | 244 | ||
245 | // we generate a nonce everytime | 245 | // we generate a nonce everytime |
246 | string voicePassword = "$1$" + Util.Md5Hash(DateTime.UtcNow.ToLongTimeString() + m_asterisk_salt); | 246 | string voicePassword = "$1$" + Util.Md5Hash(DateTime.UtcNow.ToLongTimeString() + m_asterisk_salt); |
247 | LLSDVoiceAccountResponse voiceAccountResponse = | 247 | LLSDVoiceAccountResponse voiceAccountResponse = |
248 | new LLSDVoiceAccountResponse(voiceUser, voicePassword); | 248 | new LLSDVoiceAccountResponse(voiceUser, voicePassword); |
249 | string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse); | 249 | string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse); |
250 | m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r); | 250 | m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r); |
251 | 251 | ||
252 | 252 | ||
253 | // update user account on asterisk frontend | 253 | // update user account on asterisk frontend |
254 | Hashtable requestData = new Hashtable(); | 254 | Hashtable requestData = new Hashtable(); |
255 | requestData["admin_password"] = m_asterisk_password; | 255 | requestData["admin_password"] = m_asterisk_password; |
256 | requestData["username"] = voiceUser; | 256 | requestData["username"] = voiceUser; |
257 | if (!String.IsNullOrEmpty(m_sipDomain)) | 257 | if (!String.IsNullOrEmpty(m_sipDomain)) |
258 | { | 258 | { |
259 | requestData["username"] += String.Format("@{0}", m_sipDomain); | 259 | requestData["username"] += String.Format("@{0}", m_sipDomain); |
260 | } | 260 | } |
261 | requestData["password"] = voicePassword; | 261 | requestData["password"] = voicePassword; |
262 | 262 | ||
263 | ArrayList SendParams = new ArrayList(); | 263 | ArrayList SendParams = new ArrayList(); |
264 | SendParams.Add(requestData); | 264 | SendParams.Add(requestData); |
265 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("account_update", SendParams); | 265 | XmlRpcRequest updateAccountRequest = new XmlRpcRequest("account_update", SendParams); |
266 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); | 266 | XmlRpcResponse updateAccountResponse = updateAccountRequest.Send(m_asterisk, m_asterisk_timeout); |
267 | Hashtable responseData = (Hashtable)updateAccountResponse.Value; | 267 | Hashtable responseData = (Hashtable)updateAccountResponse.Value; |
268 | 268 | ||
269 | if (!responseData.ContainsKey("success")) throw new Exception("account_update call failed"); | 269 | if (!responseData.ContainsKey("success")) throw new Exception("account_update call failed"); |
270 | 270 | ||
271 | bool success = Convert.ToBoolean((string)responseData["success"]); | 271 | bool success = Convert.ToBoolean((string)responseData["success"]); |
272 | if (!success) throw new Exception("account_update failed"); | 272 | if (!success) throw new Exception("account_update failed"); |
273 | 273 | ||
274 | return r; | 274 | return r; |
275 | } | 275 | } |
276 | catch (Exception e) | 276 | catch (Exception e) |
277 | { | 277 | { |
278 | m_log.ErrorFormat("[ASTERISKVOICE][CAPS][PROVISIONVOICE]: {0}, retry later", e.Message); | 278 | m_log.ErrorFormat("[ASTERISKVOICE][CAPS][PROVISIONVOICE]: {0}, retry later", e.Message); |
279 | m_log.DebugFormat("[ASTERISKVOICE][CAPS][PROVISIONVOICE]: {0} failed", e.ToString()); | 279 | m_log.DebugFormat("[ASTERISKVOICE][CAPS][PROVISIONVOICE]: {0} failed", e.ToString()); |
280 | 280 | ||
281 | return "<llsd>undef</llsd>"; | 281 | return "<llsd>undef</llsd>"; |
282 | } | 282 | } |
283 | } | 283 | } |
284 | } | 284 | } |
285 | } | 285 | } \ No newline at end of file |