| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License") + you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.openmeetings.app.sip.xmlrpc; |
| |
| import java.io.InputStream; |
| import java.nio.charset.Charset; |
| import java.util.Date; |
| |
| import javax.net.ssl.SSLContext; |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| |
| import org.apache.http.HttpEntity; |
| import org.apache.http.HttpResponse; |
| import org.apache.http.HttpVersion; |
| import org.apache.http.client.HttpClient; |
| import org.apache.http.client.methods.HttpPost; |
| import org.apache.http.conn.ClientConnectionManager; |
| import org.apache.http.conn.scheme.PlainSocketFactory; |
| import org.apache.http.conn.scheme.Scheme; |
| import org.apache.http.conn.scheme.SchemeRegistry; |
| import org.apache.http.conn.ssl.SSLSocketFactory; |
| import org.apache.http.entity.AbstractHttpEntity; |
| import org.apache.http.entity.ByteArrayEntity; |
| import org.apache.http.impl.client.DefaultHttpClient; |
| import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; |
| import org.apache.http.params.BasicHttpParams; |
| import org.apache.http.params.HttpParams; |
| import org.apache.http.params.HttpProtocolParams; |
| import org.apache.http.protocol.HTTP; |
| import org.apache.http.util.EntityUtils; |
| import org.openmeetings.app.OpenmeetingsVariables; |
| import org.openmeetings.app.data.basic.Configurationmanagement; |
| import org.openmeetings.app.persistence.beans.basic.Configuration; |
| import org.openmeetings.app.persistence.beans.sip.OpenXGReturnObject; |
| import org.openmeetings.app.persistence.beans.user.UserSipData; |
| import org.openmeetings.app.sip.xmlrpc.custom.OpenXGCustomXMLMarshall; |
| import org.openmeetings.app.sip.xmlrpc.custom.dao.OpenXGReturnObjectDaoImpl; |
| import org.openmeetings.utils.crypt.MD5; |
| import org.red5.logging.Red5LoggerFactory; |
| import org.slf4j.Logger; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| |
| public class OpenXGHttpClient { |
| |
| private static final Logger log = Red5LoggerFactory.getLogger( |
| OpenXGHttpClient.class, OpenmeetingsVariables.webAppRootKey); |
| @Autowired |
| private Configurationmanagement cfgManagement; |
| @Autowired |
| private OpenXGReturnObjectDaoImpl openXGReturnObjectDao; |
| |
| public String digest_calculate(Object[] params) throws Exception { |
| String stringToMd5 = ""; |
| |
| for (int i = 0; i < params.length; i++) { |
| stringToMd5 += params[i]; |
| } |
| |
| return MD5.do_checksum(stringToMd5); |
| |
| } |
| |
| public void openSIPgUserCreateTest() { |
| try { |
| |
| String first_name = "Matti"; |
| String middle_i = "X"; |
| String last_name = "Virtanen"; |
| String email = "test@test.de"; |
| String password = "password"; |
| |
| this.openSIPgUserCreateUser(first_name, |
| middle_i, last_name, email, password, "test"); |
| |
| } catch (Exception err) { |
| |
| log.error("[openSIPgUserCreateTest]", err); |
| |
| } |
| } |
| |
| /** |
| * |
| * Creates a SIP User using the RPC Methods of openXG |
| * |
| * @param first_name |
| * @param middle_i |
| * @param last_name |
| * @param email |
| * @param password |
| * @return |
| */ |
| public UserSipData openSIPgUserCreateUser(String first_name, |
| String middle_i, String last_name, String email, String login, |
| String password) { |
| try { |
| |
| // Check if the OpenXG Gateway is enabled in general |
| Configuration sip_openxg_enable = cfgManagement.getConfKey(3L, |
| "sip.openxg.enable"); |
| |
| if (sip_openxg_enable == null |
| || !sip_openxg_enable.getConf_value().equals("yes")) { |
| log.debug("SIP is disabled"); |
| return null; |
| } |
| |
| // client_id and client_secret |
| Configuration openxg_client_id = cfgManagement.getConfKey(3L, |
| "openxg.client.id"); |
| Configuration openxg_client_secret = cfgManagement.getConfKey(3L, |
| "openxg.client.secret"); |
| if (openxg_client_id == null || openxg_client_secret == null) { |
| throw new Exception( |
| "openxg.client.id or openxg.client.secret missing in Configuration table"); |
| } |
| String client_id = openxg_client_id.getConf_value(); |
| String client_secret = openxg_client_secret.getConf_value(); |
| |
| // domain |
| Configuration openxg_client_domain = cfgManagement.getConfKey(3L, |
| "openxg.client.domain"); |
| if (openxg_client_domain == null) { |
| throw new Exception( |
| "openxg.client.domain missing in Configuration table"); |
| } |
| String domain = openxg_client_domain.getConf_value(); |
| |
| // openxg_community_code |
| Configuration openxg_community_code = cfgManagement.getConfKey(3L, |
| "openxg.community.code"); |
| if (openxg_community_code == null) { |
| throw new Exception( |
| "openxg.community.code missing in Configuration table"); |
| } |
| String community_code = openxg_community_code.getConf_value(); |
| |
| // language_code |
| Configuration openxg_language_code = cfgManagement.getConfKey(3L, |
| "openxg.language.code"); |
| if (openxg_language_code == null) { |
| throw new Exception( |
| "openxg.language.code missing in Configuration table"); |
| } |
| String language_code = openxg_language_code.getConf_value(); |
| |
| // adminid |
| Configuration openxg_adminid = cfgManagement.getConfKey(3L, |
| "openxg.adminid"); |
| if (openxg_adminid == null) { |
| throw new Exception( |
| "openxg.adminid missing in Configuration table"); |
| } |
| String adminid = openxg_adminid.getConf_value(); |
| |
| // sip_language_phonecode, for example +358, is important as port of |
| // the |
| // number/login for the SIP-User via the applet |
| Configuration sip_language_phonecode = cfgManagement.getConfKey(3L, |
| "sip.language.phonecode"); |
| |
| if (sip_language_phonecode == null) { |
| throw new Exception( |
| "No sip.language.phonecode set in Configuration"); |
| } |
| |
| // Calculate the number in national format |
| Configuration sip_phonerange_start = cfgManagement.getConfKey(3L, |
| "sip.phonerange.start"); |
| Configuration sip_phonerange = cfgManagement.getConfKey(3L, |
| "sip.phonerange"); |
| Configuration sip_phonerange_currentindex = cfgManagement |
| .getConfKey(3L, "sip.phonerange.currentindex"); |
| if (sip_phonerange_start == null || sip_phonerange == null |
| || sip_phonerange_currentindex == null) { |
| throw new Exception( |
| "sip.phonerange.start, sip.phonerange or sip.phonerange.currentindex missing in Configuration table"); |
| } |
| |
| // Long sipPhoneRangeStart = |
| // Long.parseLong(sip_phonerange_start.getConf_value()); |
| // Long sipPhoneRange = |
| // Long.parseLong(sip_phonerange.getConf_value()); |
| // Long sipPhoneRangeCurrentIndex = |
| // Long.parseLong(sip_phonerange_currentindex.getConf_value()); |
| |
| // Not sure anymore if this is really needed, we don't need a number |
| // in national format |
| // if (sipPhoneRangeCurrentIndex >= sipPhoneRange) { |
| // throw new |
| // Exception("You have no more numbers, you need to allocate more numbers and alter the Configuration value sip.phonerange"); |
| // } |
| |
| // Long useridAsNumber = sipPhoneRangeStart + |
| // sipPhoneRangeCurrentIndex; |
| // |
| // log.debug("(sip_phonerange_start.getConf_value().length()) "+(sip_phonerange_start.getConf_value().length()+1)); |
| // |
| // //The userid == the Number allocated in National Format! |
| // //The userid is calculated on the number of available numbers in |
| // the range |
| // String userid = |
| // String.format("%0"+(sip_phonerange_start.getConf_value().length())+"d", |
| // useridAsNumber); |
| |
| String userid = login; |
| |
| // sipPhoneRangeCurrentIndex++; |
| // sip_phonerange_currentindex.setConf_value(""+sipPhoneRangeCurrentIndex); |
| |
| // cfgManagement.updateConfig(sip_phonerange_currentindex); |
| |
| String digest = this.digest_calculate(new Object[] { client_id, |
| userid, domain, first_name, middle_i, last_name, password, |
| community_code, language_code, email, adminid, |
| client_secret }); |
| |
| // Get the XML-String representative |
| String stringToPost = OpenXGCustomXMLMarshall.getInstance() |
| .openSIPgUserCreate(client_id, digest, userid, domain, |
| first_name, middle_i, last_name, password, |
| community_code, language_code, email, adminid); |
| |
| OpenXGReturnObject openXGReturnObject = this |
| .openSIPgPost(stringToPost); |
| |
| openXGReturnObject.setMethodName("OpenSIPg.UserCreate"); |
| |
| openXGReturnObjectDao.addOpenXGReturnObject( |
| openXGReturnObject); |
| |
| log.debug(" Status_code " + openXGReturnObject.getStatus_code()); |
| log.debug(" Status_string " + openXGReturnObject.getStatus_string()); |
| |
| if (openXGReturnObject.getStatus_code().equals("200")) { |
| |
| // Add User URI |
| String digestURI = this.digest_calculate(new Object[] { |
| client_id, userid, domain, adminid, client_secret }); |
| |
| // Get the XML-String representative |
| String stringToPostURI = OpenXGCustomXMLMarshall.getInstance() |
| .openSIPgURIUserIDAdd(client_id, digestURI, userid, |
| domain, adminid); |
| |
| OpenXGReturnObject openXGReturnObjectURI = this |
| .openSIPgPost(stringToPostURI); |
| |
| openXGReturnObjectURI.setMethodName("OpenSIPg.URIUserIDAdd"); |
| |
| openXGReturnObjectDao.addOpenXGReturnObject( |
| openXGReturnObjectURI); |
| |
| log.debug(" openXGReturnObjectURI Status Code " |
| + openXGReturnObjectURI.getStatus_code()); |
| log.debug(" openXGReturnObjectURI Status String " |
| + openXGReturnObjectURI.getStatus_string()); |
| |
| UserSipData userSipData = new UserSipData(); |
| |
| // userSipData.setUsername(sip_language_phonecode.getConf_value() |
| // + useridAsNumber); |
| userSipData.setUsername(userid); |
| userSipData.setUserpass(password); |
| userSipData.setAuthId(userid); |
| |
| return userSipData; |
| |
| } else { |
| |
| throw new Exception( |
| "Could not add SIP User - Gateway response Error Code: " |
| + openXGReturnObject.getStatus_code() |
| + " Message: " |
| + openXGReturnObject.getStatus_string()); |
| |
| } |
| |
| } catch (Exception err) { |
| |
| log.error("[openSIPgUserCreateTest]", err); |
| |
| } |
| |
| return null; |
| } |
| |
| public OpenXGReturnObject openSIPgCreateConference() { |
| try { |
| |
| // Check if the OpenXG Gateway is enabled in general |
| Configuration sip_openxg_enable = cfgManagement.getConfKey(3L, |
| "sip.openxg.enable"); |
| |
| if (sip_openxg_enable == null |
| || !sip_openxg_enable.getConf_value().equals("yes")) { |
| log.debug("SIP is disabled"); |
| return null; |
| } |
| |
| // client_id and client_secret |
| Configuration openxg_client_id = cfgManagement.getConfKey(3L, |
| "openxg.client.id"); |
| Configuration openxg_client_secret = cfgManagement.getConfKey(3L, |
| "openxg.client.secret"); |
| if (openxg_client_id == null || openxg_client_secret == null) { |
| throw new Exception( |
| "openxg.client.id or openxg.client.secret missing in Configuration table"); |
| } |
| String client_id = openxg_client_id.getConf_value(); |
| String client_secret = openxg_client_secret.getConf_value(); |
| |
| // domain |
| Configuration openxg_client_domain = cfgManagement.getConfKey(3L, |
| "openxg.client.domain"); |
| if (openxg_client_domain == null) { |
| throw new Exception( |
| "openxg.client.domain missing in Configuration table"); |
| } |
| String domain = openxg_client_domain.getConf_value(); |
| |
| // language_code |
| Configuration openxg_language_code = cfgManagement.getConfKey(3L, |
| "openxg.language.code"); |
| if (openxg_language_code == null) { |
| throw new Exception( |
| "openxg.language.code missing in Configuration table"); |
| } |
| String language_code = openxg_language_code.getConf_value(); |
| |
| // adminid |
| Configuration openxg_adminid = cfgManagement.getConfKey(3L, |
| "openxg.adminid"); |
| if (openxg_adminid == null) { |
| throw new Exception( |
| "openxg.adminid missing in Configuration table"); |
| } |
| String adminid = openxg_adminid.getConf_value(); |
| |
| Date d = new Date(); |
| long starttime = d.getTime() / 1000; |
| |
| long endTime = (d.getTime() / 1000) + (60 * 60); |
| |
| // "0", "2147483647", |
| |
| // permanent conferences |
| starttime = 0; |
| endTime = 2147483647; |
| |
| String digest = this.digest_calculate(new Object[] { client_id, |
| "067201101", domain, "" + starttime, "" + endTime, |
| language_code, adminid, client_secret }); |
| |
| Configuration openxg_wrapper_url = cfgManagement.getConfKey(3L, |
| "openxg.wrapper.url"); |
| |
| if (openxg_wrapper_url == null) { |
| throw new Exception( |
| "No openxg.wrapper.url set in Configuration"); |
| } |
| |
| String strURL = openxg_wrapper_url.getConf_value(); |
| |
| // Prepare HTTP post |
| HttpPost post = new HttpPost(strURL); |
| post.addHeader("User-Agent", "OpenSIPg XML_RPC Client"); |
| |
| // Get the XML-String representative |
| String stringToPost = OpenXGCustomXMLMarshall.getInstance() |
| .openSIPgCreateConference(client_id, digest, "067201101", |
| domain, "" + starttime, "" + endTime, |
| language_code, adminid); |
| |
| OpenXGReturnObject openXGReturnObject = this |
| .openSIPgPost(stringToPost); |
| |
| openXGReturnObject.setMethodName("OpenSIPg.UserConferenceAdd"); |
| |
| openXGReturnObjectDao.addOpenXGReturnObject( |
| openXGReturnObject); |
| |
| return openXGReturnObject; |
| |
| } catch (Exception err) { |
| |
| log.error("[openSIPgUserCreate]", err); |
| |
| } |
| |
| return null; |
| } |
| |
| public OpenXGReturnObject openSIPgPost(String stringToPost) { |
| try { |
| |
| Configuration openxg_wrapper_url = cfgManagement.getConfKey(3L, |
| "openxg.wrapper.url"); |
| |
| if (openxg_wrapper_url == null) { |
| throw new Exception( |
| "No openxg.wrapper.url set in Configuration"); |
| } |
| |
| String strURL = openxg_wrapper_url.getConf_value(); |
| |
| // Prepare HTTP post |
| HttpPost post = new HttpPost(strURL); |
| post.addHeader("User-Agent", "OpenSIPg XML_RPC Client"); |
| |
| // log.debug(stringToPost); |
| |
| AbstractHttpEntity entity = new ByteArrayEntity( |
| stringToPost.getBytes(Charset.forName("ISO-8859-1"))); |
| |
| // Prepare HTTP post |
| HttpParams params = post.getParams(); |
| HttpProtocolParams.setContentCharset(params, "utf-8"); |
| HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); |
| post.setParams(params); |
| |
| // Request content will be retrieved directly |
| // from the input stream |
| post.setEntity(entity); |
| |
| // Get HTTP client |
| HttpClient httpclient = getHttpClient(); |
| |
| // Execute request |
| HttpResponse response = httpclient.execute(post); |
| int resCode = response.getStatusLine().getStatusCode(); |
| |
| // Display status code |
| log.debug("Response status code: " + response); |
| |
| if (resCode == 200) { |
| HttpEntity ent = response.getEntity(); |
| String responseBody = (ent != null) ? EntityUtils.toString(ent) : ""; |
| log.debug("parseReturnBody " + responseBody); |
| |
| OpenXGReturnObject oIG = this.parseOpenXGReturnBody(ent.getContent()); |
| |
| log.debug("oIG 1 " + oIG.getStatus_code()); |
| log.debug("oIG 2 " + oIG.getStatus_string()); |
| |
| return oIG; |
| |
| } else { |
| |
| throw new Exception( |
| "Could not connect to OpenXG, check the URL for the Configuration"); |
| |
| } |
| |
| } catch (Exception err) { |
| |
| log.error("[openSIPgUserCreate]", err); |
| |
| } |
| |
| return null; |
| } |
| |
| /** |
| * |
| * @param inputStream |
| * @return |
| */ |
| public OpenXGReturnObject parseOpenXGReturnBody(InputStream inputStream) { |
| try { |
| |
| OpenXGReturnObject openXGReturnObject = new OpenXGReturnObject(); |
| |
| // log.debug("parseReturnBody "+inputStream); |
| |
| DocumentBuilderFactory factory = DocumentBuilderFactory |
| .newInstance(); |
| factory.setValidating(false); |
| factory.setNamespaceAware(false); |
| |
| // get a builder to create a DOM document |
| DocumentBuilder builder = factory.newDocumentBuilder(); |
| |
| Document document = builder.parse(inputStream); |
| |
| NodeList members = document.getElementsByTagName("member"); |
| |
| // log.debug("members LENGTH "+members.getLength()); |
| |
| for (int i = 0; i < members.getLength(); i++) { |
| Element member = (Element) members.item(i); |
| |
| NodeList name = member.getElementsByTagName("name"); |
| |
| // log.debug("Name "+name.item(0).getNodeName()); |
| |
| Node nameTextNode = name.item(0).getFirstChild(); |
| |
| log.debug("getNodeValue " + nameTextNode.getNodeValue()); |
| |
| if (nameTextNode.getNodeValue().equals("status_code")) { |
| |
| NodeList string = member.getElementsByTagName("string"); |
| |
| // log.debug("Value "+string.item(0).getNodeName()); |
| |
| Node valueTextNode = string.item(0).getFirstChild(); |
| |
| // log.debug("Value "+valueTextNode.getNodeValue()); |
| |
| openXGReturnObject.setStatus_code(valueTextNode |
| .getNodeValue()); |
| |
| } else if (nameTextNode.getNodeValue().equals("status_string")) { |
| |
| NodeList string = member.getElementsByTagName("string"); |
| |
| // log.debug("Value "+string.item(0).getNodeName()); |
| |
| Node valueTextNode = string.item(0).getFirstChild(); |
| |
| // log.debug("Value "+valueTextNode.getNodeValue()); |
| |
| openXGReturnObject.setStatus_string(valueTextNode |
| .getNodeValue()); |
| |
| } else if (nameTextNode.getNodeValue().equals( |
| "conference_number")) { |
| |
| NodeList string = member.getElementsByTagName("string"); |
| |
| // log.debug("Value "+string.item(0).getNodeName()); |
| |
| Node valueTextNode = string.item(0).getFirstChild(); |
| |
| // log.debug("Value "+valueTextNode.getNodeValue()); |
| |
| openXGReturnObject.setConferenceNumber(valueTextNode |
| .getNodeValue()); |
| |
| } else if (nameTextNode.getNodeValue().equals("conference_pin")) { |
| |
| NodeList string = member.getElementsByTagName("string"); |
| |
| // log.debug("Value "+string.item(0).getNodeName()); |
| |
| Node valueTextNode = string.item(0).getFirstChild(); |
| |
| // log.debug("Value "+valueTextNode.getNodeValue()); |
| |
| openXGReturnObject.setConferencePin(valueTextNode |
| .getNodeValue()); |
| |
| } |
| |
| } |
| |
| return openXGReturnObject; |
| |
| } catch (Exception err) { |
| |
| log.error("[parseOpenXGReturnBody]", err); |
| |
| } |
| return null; |
| } |
| |
| public HttpClient getHttpClient() { |
| try { |
| SSLSocketFactory sf = new SSLSocketFactory(SSLContext.getInstance("TLS"), SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); |
| |
| HttpParams params = new BasicHttpParams(); |
| HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); |
| HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); |
| |
| SchemeRegistry registry = new SchemeRegistry(); |
| registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); |
| registry.register(new Scheme("https", 443, sf)); |
| |
| ClientConnectionManager ccm = new ThreadSafeClientConnManager(registry); |
| |
| return new DefaultHttpClient(ccm, params); |
| } catch (Exception e) { |
| return new DefaultHttpClient(); |
| } |
| } |
| } |