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')