Package org.openmeetings.app.sip.xmlrpc

Source Code of org.openmeetings.app.sip.xmlrpc.OpenXGHttpClient

/*
* 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();
      }
  }
}
TOP

Related Classes of org.openmeetings.app.sip.xmlrpc.OpenXGHttpClient

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.