diff --git a/RC b/RC
new file mode 100755
index 0000000000..8b432ad36b
--- /dev/null
+++ b/RC
@@ -0,0 +1,43 @@
+#!/bin/bash
+export JAVA_HOME=/opt/java/jdk1.7.0_80
+export PATH=$JAVA_HOME/bin:$PATH
+
+export RC_HOME=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+export RC_RELEASE=$RC_HOME/release/target-as7
+export RC_CONFIGURATION=$RC_HOME/configurations
+export RC_DEPENDENCIES=$RC_HOME/dependencies
+
+export MAVEN_OPTS="-Xms1024m -Xmx2048m -XX:MaxPermSize=1024m"
+
+rc_build()
+{
+ export MAJOR_VERSION_NUMBER=8.2
+ export BUILD_NUMBER=0
+ mkdir -p $RC_DEPENDENCIES
+ ant release -f $RC_HOME/release/build.xml -Drestcomm.release.version=$MAJOR_VERSION_NUMBER.$BUILD_NUMBER -Drestcomm.branch.name=restcomm-release-$MAJOR_VERSION_NUMBER.$BUILD_NUMBER -Dcheckout.restcomm.dir=$RC_HOME -Dworkspace.restcomm.dir=$RC_HOME/restcomm -Dcheckout.dir=$RC_DEPENDENCIES
+}
+
+rc_start()
+{
+ cp -rf $RC_CONFIGURATION/* $RC_RELEASE/
+ $RC_RELEASE/bin/restcomm/start-restcomm.sh
+}
+
+rc_stop()
+{
+ $RC_RELEASE/bin/restcomm/stop-restcomm.sh
+}
+
+case "$@" in
+ "build")
+ build_restcomm
+ ;;
+ "start")
+ start_restcomm
+ ;;
+ "stop")
+ stop_restcomm
+ ;;
+ *)
+ ;;
+esac
diff --git a/configurations/modules/org/mysql/jdbc/main/module.xml b/configurations/modules/org/mysql/jdbc/main/module.xml
new file mode 100644
index 0000000000..4eb5e601ed
--- /dev/null
+++ b/configurations/modules/org/mysql/jdbc/main/module.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/configurations/modules/org/mysql/jdbc/main/mysql-connector-java-5.1.40.jar b/configurations/modules/org/mysql/jdbc/main/mysql-connector-java-5.1.40.jar
new file mode 100644
index 0000000000..327c32d0a5
Binary files /dev/null and b/configurations/modules/org/mysql/jdbc/main/mysql-connector-java-5.1.40.jar differ
diff --git a/configurations/standalone/configuration/standalone-sip.xml b/configurations/standalone/configuration/standalone-sip.xml
new file mode 100644
index 0000000000..71830c437e
--- /dev/null
+++ b/configurations/standalone/configuration/standalone-sip.xml
@@ -0,0 +1,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ jdbc:mysql://127.0.0.1:3306/restcomm
+ mysqlDriver
+ TRANSACTION_READ_COMMITTED
+
+ 100
+ 200
+
+
+ root
+ root
+
+
+ 100
+
+
+
+
+
+ jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
+ h2
+
+ root
+ root
+
+
+
+
+ com.mysql.jdbc.Driver
+
+
+ org.h2.jdbcx.JdbcDataSource
+
+
+
+
+
+
+
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ ${jboss.bind.address:127.0.0.1}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/configurations/standalone/deployments/restcomm.war/WEB-INF/conf/dao-manager.xml b/configurations/standalone/deployments/restcomm.war/WEB-INF/conf/dao-manager.xml
new file mode 100644
index 0000000000..afb2bfe33d
--- /dev/null
+++ b/configurations/standalone/deployments/restcomm.war/WEB-INF/conf/dao-manager.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ ${restcomm:home}/WEB-INF/conf/mybatis.xml
+
+ ${restcomm:home}/WEB-INF/scripts/mariadb/sql
+
+
\ No newline at end of file
diff --git a/configurations/standalone/deployments/restcomm.war/WEB-INF/conf/mybatis.xml b/configurations/standalone/deployments/restcomm.war/WEB-INF/conf/mybatis.xml
new file mode 100644
index 0000000000..d89e5ef6c6
--- /dev/null
+++ b/configurations/standalone/deployments/restcomm.war/WEB-INF/conf/mybatis.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/security/SecurityFilter.java b/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/security/SecurityFilter.java
index bcec397b4b..038946e36c 100644
--- a/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/security/SecurityFilter.java
+++ b/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/security/SecurityFilter.java
@@ -96,15 +96,32 @@ protected void checkAuthenticatedAccount(UserIdentityContext userIdentityContext
/**
* filter out accounts that are not active
+ * filter out accounts that have parent is not active
*
* @param userIdentityContext
*/
protected void filterClosedAccounts(UserIdentityContext userIdentityContext, String path) {
- if (userIdentityContext.getEffectiveAccount() != null && !userIdentityContext.getEffectiveAccount().getStatus().equals(Account.Status.ACTIVE)) {
- if (userIdentityContext.getEffectiveAccount().getStatus().equals(Account.Status.UNINITIALIZED) && path.startsWith("Accounts")) {
- return;
+ Account account = userIdentityContext.getEffectiveAccount();
+
+ if (account != null) {
+ if (!account.getStatus().equals(Account.Status.ACTIVE)) {
+ if (account.getStatus().equals(Account.Status.UNINITIALIZED) && path.startsWith("Accounts")) {
+ return;
+ }
+ throw new WebApplicationException(status(Status.FORBIDDEN).entity("Provided Account is not active").build());
+ } else {
+ Account parentAccount = userIdentityContext.getParrentAccount();
+ if (parentAccount != null) {
+ if (parentAccount.getStatus() != Account.Status.ACTIVE && parentAccount.getStatus() != Account.Status.UNINITIALIZED) {
+ throw new WebApplicationException(status(Status.FORBIDDEN).entity("Parent Account is not active").build());
+ }
+ } else {
+ // Parent account is null -> this could be administrator.
+ // Administrator account should not be closed/inactive.
+ }
}
- throw new WebApplicationException(status(Status.FORBIDDEN).entity("Provided Account is not active").build());
+ } else {
+ throw new WebApplicationException(status(Status.NOT_FOUND).entity("Provided Account is not found").build());
}
}
}
diff --git a/restcomm/restcomm.identity/src/main/java/org/restcomm/connect/identity/UserIdentityContext.java b/restcomm/restcomm.identity/src/main/java/org/restcomm/connect/identity/UserIdentityContext.java
index f10d38803b..208ee0f176 100644
--- a/restcomm/restcomm.identity/src/main/java/org/restcomm/connect/identity/UserIdentityContext.java
+++ b/restcomm/restcomm.identity/src/main/java/org/restcomm/connect/identity/UserIdentityContext.java
@@ -30,6 +30,7 @@
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.restcomm.connect.dao.exceptions.AccountHierarchyDepthCrossed;
+import org.restcomm.connect.commons.dao.Sid;
import org.restcomm.connect.dao.AccountsDao;
import org.restcomm.connect.dao.entities.Account;
@@ -132,4 +133,10 @@ public List getEffectiveAccountLineage() {
return accountLineage;
}
+ public Account getParrentAccount ( ) {
+ Sid parentSid = this.effectiveAccount.getParentSid();
+ if (parentSid != null)
+ return this.accountsDao.getAccount(parentSid);
+ return null;
+ }
}
diff --git a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/CreateClientsTool.java b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/CreateClientsTool.java
index 4072e44083..b7a2758e62 100644
--- a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/CreateClientsTool.java
+++ b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/CreateClientsTool.java
@@ -7,6 +7,10 @@
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
@@ -24,6 +28,12 @@
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
/**
* @author gvagenas
* @author Thinh Ly
@@ -113,6 +123,14 @@ public JsonObject getClientOfAccount(String deploymentUrl, JsonObject account, S
return jsonResponse;
}
+ public ClientResponse getClientsResponse ( String deploymentUrl, JsonObject account ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(account.get("email_address").getAsString(), account.get("auth_token").getAsString()));
+ WebResource webResource = jerseyClient.resource(getClientUrl(deploymentUrl, account));
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ return response;
+ }
+
public void updateClientVoiceUrl(String deploymentUrl, JsonObject account, String clientSid, String voiceUrl,
String credentialUsername, String credentialPassword) throws IOException {
String url = getClientUrl(deploymentUrl, account);
@@ -190,4 +208,51 @@ public String createClient(String deploymentUrl, String accountSid, String authT
return clientSid;
}
+
+ public ClientResponse createClientResponse ( String deploymentUrl, String accountUsername, String accountAuthToken,
+ String accountSid, String clientUsername, String clientPassword,
+ String clientVoiceUrl ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(accountUsername, accountAuthToken));
+ String url = getEndpoint(deploymentUrl) + "/2012-04-24/Accounts/" + accountSid + "/Clients.json";
+ WebResource webResource = jerseyClient.resource(url);
+ MultivaluedMap params = new MultivaluedMapImpl();
+ if (clientUsername != null)
+ params.add("Login", clientUsername);
+ if (clientPassword != null)
+ params.add("Password", clientPassword);
+ if (clientVoiceUrl != null)
+ params.add("VoiceUrl", clientVoiceUrl);
+ System.out.println("[createClientResponse]" + url);
+ System.out.println("[createClientResponse]" + params.toString());
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, params);
+ return response;
+ }
+
+ public ClientResponse updateClientResponse ( String deploymentUrl, String accountUsername, String accountAuthToken,
+ String accountSid, String clientSid, String clientPassword,
+ String clientVoiceUrl ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(accountUsername, accountAuthToken));
+ String url = getEndpoint(deploymentUrl) + "/2012-04-24/Accounts/" + accountSid + "/Clients/" + clientSid;
+ WebResource webResource = jerseyClient.resource(url);
+ MultivaluedMap params = new MultivaluedMapImpl();
+ if (clientPassword != null)
+ params.add("Password", clientPassword);
+ if (clientVoiceUrl != null)
+ params.add("VoiceUrl", clientVoiceUrl);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, params);
+ return response;
+ }
+
+ public ClientResponse deleteClientResponse ( String deploymentUrl, String accountUsername, String accountAuthToken,
+ String accountSid, String clientSid ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(accountUsername, accountAuthToken));
+ String url = getEndpoint(deploymentUrl) + "/2012-04-24/Accounts/" + accountSid + "/Clients/" + clientSid;
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).delete(ClientResponse.class);
+ return response;
+ }
+
}
diff --git a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/NotificationEndpointTool.java b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/NotificationEndpointTool.java
index 67dbc6095d..935fe4b3a7 100644
--- a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/NotificationEndpointTool.java
+++ b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/NotificationEndpointTool.java
@@ -22,6 +22,7 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.core.util.MultivaluedMapImpl;
@@ -48,15 +49,11 @@ public static NotificationEndpointTool getInstance() {
return instance;
}
- private String getAccountsUrl(String deploymentUrl, String username, Boolean json) {
- if (accountsUrl == null) {
- if (deploymentUrl.endsWith("/")) {
- deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
- }
-
- accountsUrl = deploymentUrl + "/2012-04-24/Accounts/" + username + "/Notifications" + ((json) ? ".json" : "");
+ private String getAccountsUrl ( String deploymentUrl, String username, Boolean json ) {
+ if (deploymentUrl.endsWith("/")) {
+ deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
}
-
+ accountsUrl = deploymentUrl + "/2012-04-24/Accounts/" + username + "/Notifications" + ((json) ? ".json" : "");
return accountsUrl;
}
@@ -71,8 +68,16 @@ public JsonObject getNotificationList(String deploymentUrl, String username, Str
return jsonObject;
}
- public JsonObject getNotificationList(String deploymentUrl, String username, String authToken, Integer page, Integer pageSize, Boolean json) {
+ public ClientResponse getNotificationListResponse ( String deploymentUrl, String username, String authToken ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(username, authToken));
+ String url = getAccountsUrl(deploymentUrl, username, true);
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ return response;
+ }
+ public JsonObject getNotificationList(String deploymentUrl, String username, String authToken, Integer page, Integer pageSize, Boolean json) {
Client jerseyClient = Client.create();
jerseyClient.addFilter(new HTTPBasicAuthFilter(username, authToken));
String url = getAccountsUrl(deploymentUrl, username, true);
diff --git a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RecordingEndpointTool.java b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RecordingEndpointTool.java
index 40e200f776..bf39476e51 100644
--- a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RecordingEndpointTool.java
+++ b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RecordingEndpointTool.java
@@ -22,6 +22,7 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.core.util.MultivaluedMapImpl;
@@ -49,14 +50,10 @@ public static RecordingEndpointTool getInstance() {
}
private String getAccountsUrl(String deploymentUrl, String username, Boolean json) {
- if (accountsUrl == null) {
- if (deploymentUrl.endsWith("/")) {
- deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
- }
-
- accountsUrl = deploymentUrl + "/2012-04-24/Accounts/" + username + "/Recordings" + ((json) ? ".json" : "");
+ if (deploymentUrl.endsWith("/")) {
+ deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
}
-
+ accountsUrl = deploymentUrl + "/2012-04-24/Accounts/" + username + "/Recordings" + ((json) ? ".json" : "");
return accountsUrl;
}
@@ -71,6 +68,15 @@ public JsonObject getRecordingList(String deploymentUrl, String username, String
return jsonObject;
}
+ public ClientResponse getRecordingListResponse ( String deploymentUrl, String username, String authToken ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(username, authToken));
+ String url = getAccountsUrl(deploymentUrl, username, true);
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ return response;
+ }
+
public JsonObject getRecordingList(String deploymentUrl, String username, String authToken, Integer page, Integer pageSize, Boolean json) {
Client jerseyClient = Client.create();
diff --git a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommAccountsTool.java b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommAccountsTool.java
index ca695f13b0..add87635fa 100644
--- a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommAccountsTool.java
+++ b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommAccountsTool.java
@@ -42,7 +42,6 @@ private String getAccountsUrl(String deploymentUrl) {
}
private String getAccountsUrl(String deploymentUrl, Boolean xml) {
-// if (accountsUrl == null) {
if (deploymentUrl.endsWith("/")) {
deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
}
@@ -51,7 +50,6 @@ private String getAccountsUrl(String deploymentUrl, Boolean xml) {
} else {
accountsUrl = deploymentUrl + "/2012-04-24/Accounts.json";
}
-// }
return accountsUrl;
}
@@ -170,7 +168,7 @@ public ClientResponse createAccountResponse(String deploymentUrl, String operato
MultivaluedMap params = new MultivaluedMapImpl();
params.add("EmailAddress", emailAddress);
params.add("Password", password);
- params.add("Role", "Administartor");
+ params.add("Role", "Developer");
if (friendlyName != null) {
params.add("FriendlyName", friendlyName);
}
diff --git a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommApplicationsTool.java b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommApplicationsTool.java
index fd809d0d7d..bdf052244f 100644
--- a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommApplicationsTool.java
+++ b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/RestcommApplicationsTool.java
@@ -24,6 +24,7 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import java.io.IOException;
@@ -87,6 +88,18 @@ public JsonObject createApplication(String deploymentUrl, String adminAccountSid
return jsonResponse;
}
+ public ClientResponse createApplicationResponse ( String deploymentUrl, String accountSid, String accountUsername,
+ String accountAuthToken,
+ MultivaluedMap applicationParams ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(accountUsername, accountAuthToken));
+ String url = getApplicationsUrl(deploymentUrl, accountSid, false);
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class,
+ applicationParams);
+ return response;
+ }
+
public JsonObject getApplication(String deploymentUrl, String adminUsername, String adminAuthToken, String adminAccountSid,
String applicationSid) {
Client jerseyClient = Client.create();
@@ -123,6 +136,15 @@ public JsonArray getApplications(String deploymentUrl, String adminUsername, Str
return jsonResponse;
}
+ public ClientResponse getApplicationsResponse ( String deploymentUrl, String adminUsername, String adminAuthToken, String adminAccountSid ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(adminUsername, adminAuthToken));
+ String url = getApplicationsUrl(deploymentUrl, adminAccountSid, false);
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ return response;
+ }
+
public JsonObject updateApplication(String deploymentUrl, String adminUsername, String adminAuthToken,
String adminAccountSid, String applicationSid, MultivaluedMap applicationParams, boolean usePut) {
Client jerseyClient = Client.create();
@@ -140,6 +162,23 @@ public JsonObject updateApplication(String deploymentUrl, String adminUsername,
return jsonResponse;
}
+ public ClientResponse updateApplicationResponse ( String deploymentUrl, String adminUsername, String adminAuthToken,
+ String adminAccountSid, String applicationSid,
+ MultivaluedMap applicationParams,
+ boolean usePut ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(adminUsername, adminAuthToken));
+ String url = getApplicationUrl(deploymentUrl, adminAccountSid, applicationSid, false);
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response;
+ if (usePut) {
+ response = webResource.accept(MediaType.APPLICATION_JSON).put(ClientResponse.class, applicationParams);
+ } else {
+ response = webResource.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, applicationParams);
+ }
+ return response;
+ }
+
public void deleteApplication(String deploymentUrl, String adminUsername, String adminAuthToken, String adminAccountSid,
String applicationSid) throws IOException {
String endpoint = getEndpoint(deploymentUrl).replaceAll("http://", "");
@@ -150,4 +189,17 @@ public void deleteApplication(String deploymentUrl, String adminUsername, String
WebResource webResource = jerseyClient.resource(url);
webResource.accept(MediaType.APPLICATION_JSON).delete();
}
+
+ public ClientResponse deleteApplicationResponse ( String deploymentUrl, String adminUsername, String adminAuthToken,
+ String adminAccountSid, String applicationSid ) throws IOException {
+ String endpoint = getEndpoint(deploymentUrl).replaceAll("http://", "");
+ String url = getApplicationUrl("http://" + adminAccountSid + ":" + adminAuthToken + "@" + endpoint,
+ adminAccountSid, applicationSid, false);
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(adminAccountSid, adminAuthToken));
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).delete(ClientResponse.class);
+ return response;
+ }
+
}
diff --git a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/TranscriptionEndpointTool.java b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/TranscriptionEndpointTool.java
index 3ed45e151f..2e620a2434 100644
--- a/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/TranscriptionEndpointTool.java
+++ b/restcomm/restcomm.testsuite/src/main/java/org/restcomm/connect/testsuite/http/TranscriptionEndpointTool.java
@@ -22,6 +22,7 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.core.util.MultivaluedMapImpl;
@@ -49,14 +50,10 @@ public static TranscriptionEndpointTool getInstance() {
}
private String getAccountsUrl(String deploymentUrl, String username, Boolean json) {
- if (accountsUrl == null) {
- if (deploymentUrl.endsWith("/")) {
- deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
- }
-
- accountsUrl = deploymentUrl + "/2012-04-24/Accounts/" + username + "/Transcriptions" + ((json) ? ".json" : "");
+ if (deploymentUrl.endsWith("/")) {
+ deploymentUrl = deploymentUrl.substring(0, deploymentUrl.length() - 1);
}
-
+ accountsUrl = deploymentUrl + "/2012-04-24/Accounts/" + username + "/Transcriptions" + ((json) ? ".json" : "");
return accountsUrl;
}
@@ -71,6 +68,15 @@ public JsonObject getTranscriptionList(String deploymentUrl, String username, St
return jsonObject;
}
+ public ClientResponse getTranscriptionListResponse ( String deploymentUrl, String username, String authToken ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(username, authToken));
+ String url = getAccountsUrl(deploymentUrl, username, true);
+ WebResource webResource = jerseyClient.resource(url);
+ ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ return response;
+ }
+
public JsonObject getTranscriptionList(String deploymentUrl, String username, String authToken, Integer page, Integer pageSize, Boolean json) {
Client jerseyClient = Client.create();
diff --git a/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointClosingTest.java b/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointClosingTest.java
index e1a1a76c34..7c5c006197 100644
--- a/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointClosingTest.java
+++ b/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointClosingTest.java
@@ -82,7 +82,7 @@ public void before() {
stubFor(post(urlMatching("/restcomm-rvd/services/notifications")).willReturn(aResponse().withStatus(200)));
}
- // verify that acount-removal notifications are sent to the application server (RVD)
+ // verify that account-removal notifications are sent to the application server (RVD)
@Test
public void removeAccountAndSendNotifications() throws InterruptedException {
@@ -131,16 +131,17 @@ public void removeAccountAndReleaseProvidedNumbers() {
}
@Deployment(name = "AccountsEndpointClosingTest", managed = true, testable = false)
- public static WebArchive createWebArchiveNoGw() {
+ public static WebArchive createWebArchiveNoGw ( ) {
logger.info("Packaging Test App");
logger.info("version");
WebArchive archive = ShrinkWrap.create(WebArchive.class, "restcomm.war");
final WebArchive restcommArchive = Maven.resolver()
- .resolve("org.restcomm:restcomm-connect.application:war:" + version).withoutTransitivity()
- .asSingle(WebArchive.class);
+ .resolve("org.restcomm:restcomm-connect.application:war:" + version)
+ .withoutTransitivity()
+ .asSingle(WebArchive.class);
archive = archive.merge(restcommArchive);
archive.delete("/WEB-INF/sip.xml");
-archive.delete("/WEB-INF/web.xml");
+ archive.delete("/WEB-INF/web.xml");
archive.delete("/WEB-INF/conf/restcomm.xml");
archive.delete("/WEB-INF/data/hsql/restcomm.script");
archive.addAsWebInfResource("sip.xml");
diff --git a/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointSuspendTest.java b/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointSuspendTest.java
new file mode 100644
index 0000000000..a5ab617219
--- /dev/null
+++ b/restcomm/restcomm.testsuite/src/test/java/org/restcomm/connect/testsuite/http/AccountsEndpointSuspendTest.java
@@ -0,0 +1,530 @@
+/*
+ * TeleStax, Open Source Cloud Communications
+ * Copyright 2011-2014, Telestax Inc and individual contributors
+ * by the @authors tag.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ *
+ */
+
+package org.restcomm.connect.testsuite.http;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.apache.log4j.Logger;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.resolver.api.maven.archive.ShrinkWrapMaven;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.restcomm.connect.dao.entities.Account;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
+import junit.framework.Assert;
+
+/**
+ * @author ddh.huy@gmail.com - Huy Dang
+ */
+@RunWith(Arquillian.class)
+public class AccountsEndpointSuspendTest extends EndpointTest {
+
+ private static class TestAccount {
+ private String Username;
+ private String Password;
+ private String FriendlyName;
+ private String AuthToken;
+ private String Sid;
+
+ public TestAccount ( String username, String password, String friendlyName, String authToken, String sid ) {
+ this.setUsername(username);
+ this.setPassword(password);
+ this.setFriendlyName(friendlyName);
+ this.setAuthToken(authToken);
+ this.setSid(sid);
+ }
+
+ public String getUsername ( ) {
+ return Username;
+ }
+
+ public void setUsername ( String username ) {
+ Username = username;
+ }
+
+ public String getPassword ( ) {
+ return Password;
+ }
+
+ public void setPassword ( String password ) {
+ Password = password;
+ }
+
+ public String getFriendlyName ( ) {
+ return FriendlyName;
+ }
+
+ public void setFriendlyName ( String friendlyName ) {
+ FriendlyName = friendlyName;
+ }
+
+ public String getAuthToken ( ) {
+ return AuthToken;
+ }
+
+ public void setAuthToken ( String authToken ) {
+ AuthToken = authToken;
+ }
+
+ public String getSid ( ) {
+ return Sid;
+ }
+
+ public void setSid ( String sid ) {
+ Sid = sid;
+ }
+
+ }
+
+ @ArquillianResource
+ URL deploymentUrl;
+
+ private final static Logger logger = Logger.getLogger(AccountsEndpointSuspendTest.class);
+
+ /*
+ * Accounts tree for testing: administrator |-- SolarSystem |-- Mercury |--
+ * Venus |-- Earth |-- Mars
+ */
+ private static String adminUsername = "administrator@company.com";
+ private static String adminAuthToken = "77f8c12cc7b8f8423e5c38b035249166";
+ private static String adminSid = "ACae6e420f425248d6a26948c17a9e2acf";
+ /* Parent accounts */
+ private static TestAccount parentAccount;
+ /* Child accounts */
+ private static List subAccounts;
+ /* Applications */
+ private static String applicationSid = "AP00000000000000000000000000000001";
+
+ @BeforeClass
+ public static void createAccountsTree ( ) {
+ // create parent account
+ parentAccount = new TestAccount("solarsystem@email.com", "abcd@1234", "Solar System",
+ "e0a8aa81eb1762d529783cf587f6f422", "AC12300000000000000000000000000217");
+ // create sub-accounts
+ subAccounts = new ArrayList();
+ subAccounts.add(new TestAccount("mercury@solar.system", "abcd@1234", "Mercury planet",
+ "e0a8aa81eb1762d529783cf587f6f422", "AC12300000000000000000000000000130"));
+ subAccounts.add(new TestAccount("venus@solar.system", "abcd@1234", "Venus planet",
+ "e0a8aa81eb1762d529783cf587f6f422", "AC12300000000000000000000000000131"));
+ subAccounts.add(new TestAccount("earth@solar.system", "abcd@1234", "Earth planet",
+ "e0a8aa81eb1762d529783cf587f6f422", "AC12300000000000000000000000000132"));
+ subAccounts.add(new TestAccount("mars@solar.system", "abcd@1234", "Mars planet",
+ "e0a8aa81eb1762d529783cf587f6f422", "AC12300000000000000000000000000133"));
+ }
+
+ ClientResponse clientResponse;
+ JsonObject accountJson;
+
+ private JsonObject getAsJsonObject ( ClientResponse clientResponse ) {
+ JsonParser parser = new JsonParser();
+ JsonObject object = null;
+ try {
+ object = parser.parse(clientResponse.getEntity(String.class)).getAsJsonObject();
+ } catch (Exception ex) {
+ logger.info(ex);
+ }
+ return object;
+ }
+
+ private JsonArray getAsJsonArray ( ClientResponse clientResponse ) {
+ JsonParser parser = new JsonParser();
+ JsonArray array = null;
+ try {
+ array = parser.parse(clientResponse.getEntity(String.class)).getAsJsonArray();
+ } catch (Exception ex) {
+ logger.info("getAsJsonArray: ");
+ logger.info(ex);
+ }
+ return array;
+ }
+
+ private JsonObject testGetAccount ( String operatorUsername, String operatorAuthToken, String accountUsername,
+ int expectedHttpCode ) {
+ clientResponse = RestcommAccountsTool.getInstance().getAccountResponse(deploymentUrl.toString(),
+ operatorUsername, operatorAuthToken,
+ accountUsername);
+ logger.info("[AccountsEndpointSuspendTest] testGetAccount(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testStatus ( String operatorUsername, String operatorAuthToken, String accountUsername,
+ String expectedStatus ) {
+ accountJson = RestcommAccountsTool.getInstance().getAccount(deploymentUrl.toString(), operatorUsername,
+ operatorAuthToken, accountUsername);
+ logger.info("[AccountsEndpointSuspendTest] testStatus: " + accountJson.get("status").getAsString());
+ Assert.assertEquals(expectedStatus, accountJson.get("status").getAsString());
+ return accountJson;
+ }
+
+ private JsonObject testUpdateStatus ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ String newStatus ) {
+ accountJson = RestcommAccountsTool.getInstance().updateAccount(deploymentUrl.toString(), operatorUsername,
+ operatorAuthToken, operatorSid, null, null, null,
+ null, newStatus);
+ logger.info("[AccountsEndpointSuspendTest] testUpdateStatus: " + accountJson.toString());
+ Assert.assertEquals(operatorSid, accountJson.get("sid").getAsString());
+ Assert.assertEquals(newStatus, accountJson.get("status").getAsString());
+ return accountJson;
+ }
+
+ private JsonObject testCreateAccount ( String operatorUsername, String operatorAuthToken, String accountUsername,
+ String accountPassword, int expectedHttpCode ) {
+ clientResponse = RestcommAccountsTool.getInstance().createAccountResponse(deploymentUrl.toString(),
+ operatorUsername, operatorAuthToken,
+ accountUsername, accountPassword);
+ logger.info("[AccountsEndpointSuspendTest] testCreateAccount(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testUpdateAccount ( String operatorUsername, String operatorAuthToken, String accountUsername,
+ String accountPassword, String accountAuthToken, String accountFriendlyName,
+ String accountRole, String accountStatus, int expectedHttpCode ) {
+ clientResponse = RestcommAccountsTool.getInstance().updateAccountResponse(deploymentUrl.toString(),
+ operatorUsername, operatorAuthToken,
+ accountUsername, accountFriendlyName,
+ accountPassword, accountAuthToken,
+ accountRole, accountStatus);
+ logger.info("[AccountsEndpointSuspendTest] testUpdateAccount(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonArray testGetApplications ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ int expectedHttpCode ) {
+ clientResponse = RestcommApplicationsTool.getInstance().getApplicationsResponse(deploymentUrl.toString(),
+ operatorUsername,
+ operatorAuthToken, operatorSid);
+ logger.info("[AccountsEndpointSuspendTest] testGetApplications(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonArray(clientResponse);
+ }
+
+ private JsonObject testCreateApplication ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ int expectedHttpCode ) {
+ MultivaluedMap applicationParams = new MultivaluedMapImpl();
+ applicationParams.add("FriendlyName", "APPCreateGet");
+ applicationParams.add("VoiceCallerIdLookup", "true");
+ applicationParams.add("RcmlUrl", "/restcomm/rcmlurl/test");
+ applicationParams.add("Kind", "voice");
+ clientResponse = RestcommApplicationsTool.getInstance().createApplicationResponse(deploymentUrl.toString(),
+ operatorSid, operatorUsername,
+ operatorAuthToken,
+ applicationParams);
+ logger.info("[AccountsEndpointSuspendTest] testCreateApplication(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testUpdateApplication ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ String applicationSid, int expectedHttpCode ) {
+ MultivaluedMap applicationParamsUpdate = new MultivaluedMapImpl();
+ applicationParamsUpdate.add("FriendlyName", "APPUpdate2");
+ applicationParamsUpdate.add("VoiceCallerIdLookup", "false");
+ applicationParamsUpdate.add("RcmlUrl", "/restcomm/rcmlurl/test2");
+ applicationParamsUpdate.add("Kind", "voice");
+ clientResponse = RestcommApplicationsTool.getInstance()
+ .updateApplicationResponse(deploymentUrl.toString(), operatorUsername,
+ operatorAuthToken, operatorSid,
+ applicationSid, applicationParamsUpdate,
+ false);
+ logger.info("[AccountsEndpointSuspendTest] testUpdateApplication(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testDeleteApplication ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ String applicationSid, int expectedHttpCode ) throws IOException {
+ clientResponse = RestcommApplicationsTool.getInstance().deleteApplicationResponse(deploymentUrl.toString(),
+ operatorUsername,
+ operatorAuthToken,
+ operatorSid, applicationSid);
+ logger.info("[AccountsEndpointSuspendTest] testDeleteApplication(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonArray testGetClients ( String operatorUsername, String operatorAuthToken, int expectedHttpCode ) {
+ clientResponse = CreateClientsTool.getInstance().getClientsResponse(deploymentUrl.toString(), accountJson);
+ logger.info("[AccountsEndpointSuspendTest] testGetClients(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonArray(clientResponse);
+ }
+
+ private JsonObject testCreateClient ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ String clientUsername, String clientPassword, String clientVoiceUrl,
+ int expectedHttpCode ) {
+ clientResponse = CreateClientsTool.getInstance().createClientResponse(deploymentUrl.toString(),
+ operatorUsername, operatorAuthToken,
+ operatorSid, clientUsername,
+ clientPassword, clientVoiceUrl);
+ logger.info("[AccountsEndpointSuspendTest] testCreateClient(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testUpdateClient ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ String clientSid, String clientPassword, String clientVoiceUrl,
+ int expectedHttpCode ) {
+ clientResponse = CreateClientsTool.getInstance().updateClientResponse(deploymentUrl.toString(),
+ operatorUsername, operatorAuthToken, operatorSid,
+ clientSid, clientPassword, clientVoiceUrl);
+ logger.info("[AccountsEndpointSuspendTest] testUpdateClient(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testDeleteClient ( String operatorUsername, String operatorAuthToken, String operatorSid,
+ String clientSid, int expectedHttpCode ) {
+ clientResponse = CreateClientsTool.getInstance().deleteClientResponse(deploymentUrl.toString(),
+ operatorUsername, operatorAuthToken,
+ operatorSid, clientSid);
+ logger.info("[AccountsEndpointSuspendTest] testDeleteClient(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testGetNotificationList ( String operatorUsername, String operatorAuthToken,
+ int expectedHttpCode ) {
+ clientResponse = NotificationEndpointTool.getInstance().getNotificationListResponse(deploymentUrl.toString(),
+ operatorUsername,
+ operatorAuthToken);
+ logger.info("[AccountsEndpointSuspendTest] testGetNotificationList(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testGetRecordingList ( String operatorUsername, String operatorAuthToken,
+ int expectedHttpCode ) {
+ clientResponse = RecordingEndpointTool.getInstance().getRecordingListResponse(deploymentUrl.toString(),
+ operatorUsername,
+ operatorAuthToken);
+ logger.info("[AccountsEndpointSuspendTest] testGetRecordingList(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonObject testGetTranscriptionList ( String operatorUsername, String operatorAuthToken,
+ int expectedHttpCode ) {
+ clientResponse = TranscriptionEndpointTool.getInstance().getTranscriptionListResponse(deploymentUrl.toString(),
+ operatorUsername,
+ operatorAuthToken);
+ logger.info("[AccountsEndpointSuspendTest] testGetTranscriptionList(): " + clientResponse.getStatus());
+ Assert.assertTrue(expectedHttpCode == clientResponse.getStatus());
+ return this.getAsJsonObject(clientResponse);
+ }
+
+ private JsonArray testGetIncomingPhoneNumbers ( String operatorUsername, String operatorAuthToken,
+ int expectedHttpCode ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(operatorUsername, operatorAuthToken));
+ String url = getResourceUrl("/2012-04-24/Accounts/" + operatorUsername + "/IncomingPhoneNumbers");
+ WebResource webResource = jerseyClient.resource(url);
+ clientResponse = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ logger.info("[AccountsEndpointSuspendTest] testGetIncomingPhoneNumbers(): " + clientResponse.getStatus());
+ return this.getAsJsonArray(clientResponse);
+ }
+
+ private JsonArray testGetOutgoingCallerIds ( String operatorUsername, String operatorAuthToken,
+ int expectedHttpCode ) {
+ Client jerseyClient = Client.create();
+ jerseyClient.addFilter(new HTTPBasicAuthFilter(operatorUsername, operatorAuthToken));
+ String url = getResourceUrl("/2012-04-24/Accounts/" + operatorUsername + "/OutgoingCallerIds");
+ WebResource webResource = jerseyClient.resource(url);
+ clientResponse = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ logger.info("[AccountsEndpointSuspendTest] testGetOutgoingCallerIds(): " + clientResponse.getStatus());
+ return this.getAsJsonArray(clientResponse);
+ }
+ @Test
+ public void testSuspendAccount ( ) throws IOException {
+ // test an account can be "suspended" or not
+ this.testUpdateStatus(adminUsername, adminAuthToken, parentAccount.getSid(), Account.Status.SUSPENDED.toString());
+ this.testStatus(adminUsername, adminAuthToken, parentAccount.getSid(), Account.Status.SUSPENDED.toString());
+
+ /***
+ * No REST API request is allowed for a SUSPENDED account. Account cannot login,
+ * create calls, search DID etc.
+ */
+ this.testCreateAccount(parentAccount.getUsername(), parentAccount.getAuthToken(),
+ UUID.randomUUID().toString().replace("-", "") + "@email.com", "5tr0n9P@ssw0rd", 403);
+ this.testGetAccount(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(), 403);
+ this.testUpdateAccount(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getUsername(),
+ parentAccount.getPassword(), parentAccount.getAuthToken(),
+ parentAccount.getFriendlyName(), "administrator", Account.Status.ACTIVE.toString(), 403);
+ this.testCreateApplication(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ 403);
+ this.testGetApplications(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ 403);
+ this.testUpdateApplication(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ applicationSid, 403);
+ this.testDeleteApplication(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ applicationSid, 403);
+ this.testCreateClient(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ "any_name", "5tr0n9P@ssw0rd", null, 403);
+ this.testGetClients(parentAccount.getUsername(), parentAccount.getAuthToken(), 403);
+ this.testUpdateClient(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ "any_name", "NEW5tr0n9P@ssw0rd", null, 403);
+ this.testDeleteClient(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ "any_name", 403);
+ this.testGetNotificationList(parentAccount.getUsername(), parentAccount.getAuthToken(), 403);
+ this.testGetOutgoingCallerIds(parentAccount.getUsername(), parentAccount.getAuthToken(), 403);
+ this.testGetTranscriptionList(parentAccount.getUsername(), parentAccount.getAuthToken(), 403);
+ this.testGetRecordingList(parentAccount.getUsername(), parentAccount.getAuthToken(), 403);
+ this.testGetIncomingPhoneNumbers(parentAccount.getUsername(), parentAccount.getAuthToken(), 403);
+
+ /***
+ * Check if all sub-accounts of suspended account cannot log-in, access
+ * resource...
+ */
+ for (TestAccount account : subAccounts) {
+ this.testCreateAccount(account.getUsername(), account.getAuthToken(),
+ UUID.randomUUID().toString().replace("-", "") + "@email.com", "5tr0n9P@ssw0rd", 403);
+ this.testGetAccount(account.getUsername(), account.getAuthToken(), account.getSid(), 403);
+ this.testUpdateAccount(account.getUsername(), account.getAuthToken(), null, null, null, "new friendly name",
+ null, Account.Status.ACTIVE.toString(), 403);
+ this.testCreateApplication(account.getUsername(), account.getAuthToken(), account.getSid(), 403);
+ this.testGetApplications(account.getUsername(), account.getAuthToken(), account.getSid(), 403);
+ this.testUpdateApplication(account.getUsername(), account.getAuthToken(), account.getSid(), "Sid", 403);
+ this.testDeleteApplication(account.getUsername(), account.getAuthToken(), account.getSid(), "Sid", 403);
+ this.testCreateClient(account.getUsername(), account.getAuthToken(), account.getSid(), "any_name",
+ "5tr0n9P@ssw0rd", null, 403);
+ this.testGetClients(account.getUsername(), account.getAuthToken(), 403);
+ this.testUpdateClient(account.getUsername(), account.getAuthToken(), account.getSid(), "any_name",
+ "NEW5tr0n9P@ssw0rd", null, 403);
+ this.testDeleteClient(account.getUsername(), account.getAuthToken(), account.getSid(), "any_name", 403);
+ this.testGetNotificationList(account.getUsername(), account.getAuthToken(), 403);
+ this.testGetOutgoingCallerIds(account.getUsername(), account.getAuthToken(), 403);
+ this.testGetTranscriptionList(account.getUsername(), account.getAuthToken(), 403);
+ this.testGetRecordingList(account.getUsername(), account.getAuthToken(), 403);
+ this.testGetIncomingPhoneNumbers(account.getUsername(), account.getAuthToken(), 403);
+ }
+ }
+
+ @Test
+ public void testActivateAccount ( ) throws IOException {
+ JsonObject jsonObj = null;
+
+ // suspend account first then activate it
+ this.testUpdateStatus(adminUsername, adminAuthToken, parentAccount.getSid(), Account.Status.SUSPENDED.toString());
+ this.testUpdateStatus(adminUsername, adminAuthToken, parentAccount.getSid(), Account.Status.ACTIVE.toString());
+ this.testStatus(adminUsername, adminAuthToken, parentAccount.getSid(), Account.Status.ACTIVE.toString());
+ /***
+ * Moving to ACTIVE state means that Account and sub-accounts are active and can
+ * be used again, same for all related resources
+ */
+ this.testCreateAccount(parentAccount.getUsername(), parentAccount.getAuthToken(),
+ UUID.randomUUID().toString().replace("-", "") + "@email.com", "5tr0n9P@ssw0rd", 200);
+ this.testGetAccount(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(), 200);
+ this.testUpdateAccount(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getUsername(),
+ null, null, parentAccount.getFriendlyName() + " New", null, null, 200);
+ jsonObj = this.testCreateApplication(parentAccount.getUsername(), parentAccount.getAuthToken(),
+ parentAccount.getSid(), 200);
+ this.testGetApplications(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ 200);
+ this.testUpdateApplication(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ jsonObj.get("sid").getAsString(), 200);
+ this.testDeleteApplication(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ jsonObj.get("sid").getAsString(), 200);
+ jsonObj = this.testCreateClient(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ "client01", "5tr0n9P@ssw0rd", null, 200);
+ this.testGetClients(parentAccount.getUsername(), parentAccount.getAuthToken(), 200);
+ this.testUpdateClient(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ jsonObj.get("sid").getAsString(), "NEW5tr0n9P@ssw0rd", null, 200);
+ this.testDeleteClient(parentAccount.getUsername(), parentAccount.getAuthToken(), parentAccount.getSid(),
+ jsonObj.get("sid").getAsString(), 200);
+ this.testGetNotificationList(parentAccount.getUsername(), parentAccount.getAuthToken(), 200);
+ this.testGetOutgoingCallerIds(parentAccount.getUsername(), parentAccount.getAuthToken(), 200);
+ this.testGetTranscriptionList(parentAccount.getUsername(), parentAccount.getAuthToken(), 200);
+ this.testGetRecordingList(parentAccount.getUsername(), parentAccount.getAuthToken(), 200);
+ this.testGetIncomingPhoneNumbers(parentAccount.getUsername(), parentAccount.getAuthToken(), 200);
+
+ /***
+ * Check if all sub-accounts are back to normal operations
+ */
+ for (TestAccount account : subAccounts) {
+// this.testCreateAccount(account.getUsername(), account.getAuthToken(),
+// UUID.randomUUID().toString().replace("-", "") + "@email.com", "5tr0n9P@ssw0rd", 200);
+ this.testGetAccount(account.getUsername(), account.getAuthToken(), account.getSid(), 200);
+ this.testUpdateAccount(account.getUsername(), account.getAuthToken(), account.getUsername(), null, null,
+ "new friendly name", null, Account.Status.ACTIVE.toString(), 200);
+ jsonObj = this.testCreateApplication(account.getUsername(), account.getAuthToken(), account.getSid(), 200);
+ this.testGetApplications(account.getUsername(), account.getAuthToken(), account.getSid(), 200);
+ this.testUpdateApplication(account.getUsername(), account.getAuthToken(), account.getSid(),
+ jsonObj.get("sid").getAsString(), 200);
+ this.testDeleteApplication(account.getUsername(), account.getAuthToken(), account.getSid(),
+ jsonObj.get("sid").getAsString(), 200);
+ jsonObj = this.testCreateClient(account.getUsername(), account.getAuthToken(), account.getSid(),
+ UUID.randomUUID().toString().replace("-", ""), "5tr0n9P@ssw0rd", null, 200);
+ this.testGetClients(account.getUsername(), account.getAuthToken(), 200);
+ this.testUpdateClient(account.getUsername(), account.getAuthToken(), account.getSid(),
+ jsonObj.get("sid").getAsString(), "NEW5tr0n9P@ssw0rd", null, 200);
+ this.testDeleteClient(account.getUsername(), account.getAuthToken(), account.getSid(),
+ jsonObj.get("sid").getAsString(), 200);
+ this.testGetNotificationList(account.getUsername(), account.getAuthToken(), 200);
+ this.testGetOutgoingCallerIds(account.getUsername(), account.getAuthToken(), 200);
+ this.testGetTranscriptionList(account.getUsername(), account.getAuthToken(), 200);
+ this.testGetRecordingList(account.getUsername(), account.getAuthToken(), 200);
+ this.testGetIncomingPhoneNumbers(account.getUsername(), account.getAuthToken(), 200);
+
+ }
+ }
+
+ @Deployment(name = "AccountEndpointSuspendTest", managed = true, testable = false)
+ public static WebArchive createWebArchiveNoGw ( ) {
+ logger.info("Packaging Test App version " + version);
+ WebArchive archive = ShrinkWrap.create(WebArchive.class, "restcomm.war");
+ final WebArchive restcommArchive = ShrinkWrapMaven.resolver()
+ .resolve("org.restcomm:restcomm-connect.application:war:"
+ + version)
+ .withoutTransitivity().asSingle(WebArchive.class);
+ archive = archive.merge(restcommArchive);
+ archive.delete("/WEB-INF/sip.xml");
+ archive.delete("/WEB-INF/conf/restcomm.xml");
+ archive.delete("/WEB-INF/data/hsql/restcomm.script");
+ archive.addAsWebInfResource("sip.xml");
+ archive.addAsWebInfResource("restcomm.xml", "conf/restcomm.xml");
+ archive.addAsWebInfResource("restcomm.script_accounts_test", "data/hsql/restcomm.script");
+ logger.info("AccountEndpointSuspendTest created");
+ return archive;
+ }
+}
diff --git a/restcomm/restcomm.testsuite/src/test/resources/restcomm.script_accounts_test b/restcomm/restcomm.testsuite/src/test/resources/restcomm.script_accounts_test
index daf183b1ab..993f9298eb 100644
--- a/restcomm/restcomm.testsuite/src/test/resources/restcomm.script_accounts_test
+++ b/restcomm/restcomm.testsuite/src/test/resources/restcomm.script_accounts_test
@@ -59,6 +59,11 @@ INSERT INTO "restcomm_accounts" VALUES('ACbdf00000000000000000000000000011','201
INSERT INTO "restcomm_accounts" VALUES('ACbdf00000000000000000000000000012','2012-04-24 22:51:29.372000000','2012-04-24 22:51:29.372000000','suspendgchild2@company.com','SuspendGChild2','ACbdf00000000000000000000000000001','Full','active','77f8c12cc7b8f8423e5c38b035249166','Administrator','/2012-04-24/Accounts/ACbdf00000000000000000000000000012','ORafbe225ad37541eba518a74248f0ac4c')
INSERT INTO "restcomm_accounts" VALUES('ACbdf00000000000000000000000000111','2012-04-24 22:51:29.372000000','2012-04-24 22:51:29.372000000','suspendggchild1@company.com','SuspendGGChild1','ACbdf00000000000000000000000000011','Full','active','77f8c12cc7b8f8423e5c38b035249166','Administrator','/2012-04-24/Accounts/ACbdf00000000000000000000000000111','ORafbe225ad37541eba518a74248f0ac4c')
INSERT INTO "restcomm_accounts" VALUES('ACbdf00000000000000000000000000112','2012-04-24 22:51:29.372000000','2012-04-24 22:51:29.372000000','suspendggchild2@company.com','SuspendGGChild2','ACbdf00000000000000000000000000011','Full','active','77f8c12cc7b8f8423e5c38b035249166','Administrator','/2012-04-24/Accounts/ACbdf00000000000000000000000000112','ORafbe225ad37541eba518a74248f0ac4c')
+INSERT INTO "restcomm_accounts" VALUES('AC12300000000000000000000000000217','2017-12-22 01:25:29.372000000','2017-12-22 01:25:29.372000000','solarsystem@email.com','Solar System','ACae6e420f425248d6a26948c17a9e2acf','Full','active','e0a8aa81eb1762d529783cf587f6f422','Administrator','/2012-04-24/Accounts/AC12300000000000000000000000000217','ORafbe225ad37541eba518a74248f0ac4c')
+INSERT INTO "restcomm_accounts" VALUES('AC12300000000000000000000000000130','2017-12-22 01:25:29.372000000','2017-12-22 01:25:29.372000000','mercury@solar.system','Mercury planet','AC12300000000000000000000000000217','Full','active','e0a8aa81eb1762d529783cf587f6f422','Administrator','/2012-04-24/Accounts/AC12300000000000000000000000000130','ORafbe225ad37541eba518a74248f0ac4c')
+INSERT INTO "restcomm_accounts" VALUES('AC12300000000000000000000000000131','2017-12-22 01:25:29.372000000','2017-12-22 01:25:29.372000000','venus@solar.system','Venus planet','AC12300000000000000000000000000217','Full','active','e0a8aa81eb1762d529783cf587f6f422','Administrator','/2012-04-24/Accounts/AC12300000000000000000000000000131','ORafbe225ad37541eba518a74248f0ac4c')
+INSERT INTO "restcomm_accounts" VALUES('AC12300000000000000000000000000132','2017-12-22 01:25:29.372000000','2017-12-22 01:25:29.372000000','earth@solar.system','Earth planet','AC12300000000000000000000000000217','Full','active','e0a8aa81eb1762d529783cf587f6f422','Administrator','/2012-04-24/Accounts/AC12300000000000000000000000000132','ORafbe225ad37541eba518a74248f0ac4c')
+INSERT INTO "restcomm_accounts" VALUES('AC12300000000000000000000000000133','2017-12-22 01:25:29.372000000','2017-12-22 01:25:29.372000000','mars@solar.system','Mars planet','AC12300000000000000000000000000217','Full','active','e0a8aa81eb1762d529783cf587f6f422','Administrator','/2012-04-24/Accounts/AC12300000000000000000000000000133','ORafbe225ad37541eba518a74248f0ac4c')
INSERT INTO "restcomm_applications" VALUES('AP00000000000000000000000000000001','2015-09-23 06:56:04.108000','2015-09-23 06:56:04.108000','rvdCollectVerbDemo','AC12300000000000000000000000000001','2012-04-24',FALSE,'/restcomm/2012-04-24/Accounts/ACae6e420f425248d6a26948c17a9e2acf/Applications/AP73926e7113fa4d95981aa96b76eca854','/restcomm-rvd/services/apps/AP73926e7113fa4d95981aa96b76eca854/controller','voice')
INSERT INTO "restcomm_incoming_phone_numbers" VALUES('PN00000000000000000000000000000001','2013-10-11 14:56:08.549000000','2013-10-11 14:56:08.549000000','This app plays the Hello World msg and requires Text-to-speech ','AC12300000000000000000000000000001','+1235','2012-04-24',FALSE,'/restcomm/demos/hello-world.xml','POST',NULL,'POST',NULL,'POST',NULL,NULL,'POST',NULL,'POST',NULL,'/restcomm/2012-04-24/Accounts/ACae6e420f425248d6a26948c17a9e2acf/IncomingPhoneNumbers/PN146638eec1e2415d832785e30d227598',NULL,NULL,NULL,NULL, TRUE,'0.0','http://127.0.0.1:8080/restcomm/ussd-rcml.xml','GET', NULL, NULL, NULL, NULL, NULL, NULL, 'ORafbe225ad37541eba518a74248f0ac4c')
INSERT INTO "restcomm_notifications" VALUES('NO00000000000000000000000000000001','2016-09-23 10:23:29.166000','2016-09-23 10:23:29.166000','AC12300000000000000000000000000001',NULL,'2012-04-24',1,0,'http://docs.telestax.com/rvd-workspace-upgrade','Workspace migration skipped in 2016-09-23 10:23:28.935','2016-09-23 10:23:29.164000','','','',NULL,NULL,'/2012-04-24/Accounts/ACae6e420f425248d6a26948c17a9e2acf/Notifications/NO890d8e7e48f244a8be432d53b007ffd1')