OF-1194: New SMS service

This commit introduces a new SMS service that takes after the
existing email service. The new service utilizes SMPP to allow
for messages to be sent to a suitable service provider.
parent 0b0dc85e
......@@ -54,6 +54,7 @@ jmdns.jar | PRE 1.0, patched
jmock.jar | 2.1.0 |
jmock-junit4.jar | 2.1.0 |
jmock-legacy.jar | 2.1.0 |
jsmpp | 2.2.4 | Apache 2.0
jtds.jar | 1.3.1 | LGPL
junit.jar | 4.11 | EPL 1.0
hamcrest-core.jar | 1.3 (required by junit) | new BSD licence
......
......@@ -496,6 +496,8 @@ tab.server.descr=Click to manage server settings
sidebar.manage-updates.descr=Click to manage server or plugins updates
sidebar.server-email=Email Settings
sidebar.server-email.descr=Click to configure email settings
sidebar.server-sms=SMS Settings
sidebar.server-sms.descr=Click to configure SMS settings
sidebar.security-audit-viewer=Security Audit Viewer
sidebar.security-audit-viewer.descr=Click to view the security audit logs
sidebar.sidebar-server-settings=Server Settings
......@@ -2650,6 +2652,43 @@ system.emailtest.body=Body
system.emailtest.send=Send
system.emailtest.cancel=Cancel/Go Back
# System SMS
system.sms.title=SMS Settings
system.sms.info=Use the form below to configure the connection to your SMS server. The SMPP protocol will be used to \
establish a connection. At a minimum, you should provide the host address of the SMPP server, your systemId \
(which can be thought of as your username) the corresponding password and an optional system type, all of \
which should be supplied to you by your SMPP service provider.
system.sms.update_success=Settings updated successfully.
system.sms.config_failure=Configuration failure. Please verify that you have filled out all required fields \
correctly and try again.
system.sms.name=SMPP Settings
system.sms.host=Host Address
system.sms.valid_host=Please enter a valid host address.
system.sms.port=Port (Optional)
system.sms.valid_port=Please enter a valid port number (between 1 and 65535).
system.sms.systemId=SystemId (username)
system.sms.valid_systemId=Please enter a valid systemId value.
system.sms.password=Password
system.sms.valid_password=Please enter a valid password.
system.sms.systemType=System Type (Optional)
system.sms.valid_systemType=Please enter a valid system type.
system.sms.save=Save Changes
system.sms.send_test=Send Test SMS...
system.smstest.title=SMS Settings
system.smstest.success=SMS was successfully sent. Verify it was sent by checking the SMS inbox of the recipient.
system.smstest.failure=An error occurred while trying to send the SMS message. The error message: <i>{0}</i>.
system.smstest.info=Use the form below to send a test message. Note that SMS does not guarantee speedy delivery, but \
generally, your message should arrive within moments.
system.smstest.invalid-service-config=The SMS service has not been configured properly. Please go back to the {0}SMS \
settings page{1} and address all issues presented there.
system.smstest.recipient=Recipient
system.smstest.valid_recipient=Please enter a recipient (phone number)
system.smstest.message=Message
system.smstest.valid_message=Please provide a short message.
system.smstest.send=Send
system.smstest.cancel=Cancel/Go Back
# File Transfer Proxy
filetransferproxy.settings.title=File Transfer Proxy Settings
......
This diff is collapsed.
......@@ -53,6 +53,11 @@
url="system-email.jsp"
description="${sidebar.server-email.descr}"/>
<!-- SMS -->
<item id="system-sms" name="${sidebar.server-sms}"
url="system-sms.jsp"
description="${sidebar.server-sms.descr}"/>
<!-- Security Audit Viewer -->
<item id="security-audit-viewer" name="${sidebar.security-audit-viewer}"
url="security-audit-viewer.jsp"
......
<%@ page import="java.util.*,
org.jivesoftware.util.*"
errorPage="error.jsp"
%>
<%@ taglib uri="admin" prefix="admin" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<% webManager.init(request, response, session, application, out ); %>
<%
// get parameters
String host = ParamUtils.getParameter(request,"host");
int port = ParamUtils.getIntParameter(request,"port",0);
String systemId = ParamUtils.getParameter(request,"systemId");
String password = ParamUtils.getParameter(request,"password");
String systemType = ParamUtils.getParameter(request,"systemType");
boolean save = request.getParameter("save") != null;
boolean test = request.getParameter("test") != null;
Cookie csrfCookie = CookieUtils.getCookie(request, "csrf");
String csrfParam = ParamUtils.getParameter(request, "csrf");
final Map<String,String> errors = new HashMap<String,String>();
if (save) {
if (csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam)) {
errors.put("csrf", "CSRF Failure!");
}
}
csrfParam = StringUtils.randomString(15);
CookieUtils.setCookie(request, response, "csrf", csrfParam, -1);
pageContext.setAttribute("csrf", csrfParam);
// Handle a test request
if (test) {
response.sendRedirect("system-smstest.jsp");
return;
}
if ( !save )
{
// Not trying to save new values? Use the existing values.
host = JiveGlobals.getProperty( "sms.smpp.host", "localhost" );
port = JiveGlobals.getIntProperty( "sms.smpp.port", 2775 );
systemId = JiveGlobals.getProperty( "sms.smpp.systemId" );
password = JiveGlobals.getProperty( "sms.smpp.password" );
systemType = JiveGlobals.getProperty( "sms.smpp.systemType" );
}
if ( host == null || host.isEmpty() )
{
errors.put( "host", "cannot be missing or empty." );
}
if ( port < 0 || port > 65535 )
{
errors.put( "port", "must be a number between 0 and 65535." );
}
if ( systemId == null || systemId.isEmpty() )
{
errors.put( "systemId", "cannot be missing or empty." );
}
if ( password == null || password.isEmpty() )
{
errors.put( "password", "cannot be missing or empty." );
}
if (errors.isEmpty() && save)
{
JiveGlobals.setProperty( "sms.smpp.host", host );
JiveGlobals.setProperty( "sms.smpp.port", Integer.toString(port) );
JiveGlobals.setProperty( "sms.smpp.systemId", systemId );
JiveGlobals.setProperty( "sms.smpp.password", password );
JiveGlobals.setProperty( "sms.smpp.systemType", systemType );
// Log the event
webManager.logEvent("updated sms service settings", "host = "+host+"\nport = "+port+"\nusername = "+ systemId +"\nsystemType = "+systemType);
JiveGlobals.setProperty("sms.configured", "true");
response.sendRedirect("system-sms.jsp?success=true");
}
pageContext.setAttribute( "errors", errors );
pageContext.setAttribute( "host", host );
pageContext.setAttribute( "port", port);
pageContext.setAttribute( "systemId", systemId );
pageContext.setAttribute( "password", password );
pageContext.setAttribute( "systemType", systemType );
%>
<html>
<head>
<title><fmt:message key="system.sms.title"/></title>
<meta name="pageID" content="system-sms"/>
</head>
<body>
<c:if test="${not empty errors}">
<admin:infobox type="error">
<fmt:message key="system.sms.config_failure" />
</admin:infobox>
</c:if>
<c:if test="${empty errors and param.success}">
<admin:infobox type="success"><fmt:message key="system.sms.update_success" /></admin:infobox>
</c:if>
<p>
<fmt:message key="system.sms.info" />
</p>
<form action="system-sms.jsp" method="post">
<fmt:message key="system.sms.name" var="plaintextboxtitle"/>
<admin:contentBox title="${plaintextboxtitle}">
<table width="80%" cellpadding="3" cellspacing="0" border="0">
<tr>
<td width="30%" nowrap>
<fmt:message key="system.sms.host" />:
</td>
<td nowrap>
<input type="text" name="host" value="${fn:escapeXml(host)}" size="40" maxlength="150">
</td>
</tr>
<c:if test="${ not empty errors['host']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.sms.valid_host" />
</td>
</tr>
</c:if>
<tr>
<td nowrap>
<fmt:message key="system.sms.port" />:
</td>
<td nowrap>
<input type="text" name="port" value="${fn:escapeXml(port)}" size="10" maxlength="15">
</td>
</tr>
<c:if test="${ not empty errors['port']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.sms.valid_port" />
</td>
</tr>
</c:if>
<!-- spacer -->
<tr><td colspan="2">&nbsp;</td></tr>
<tr>
<td width="30%" nowrap>
<fmt:message key="system.sms.systemId" />:
</td>
<td nowrap>
<input type="text" name="systemId" value="${fn:escapeXml(systemId)}" size="40" maxlength="150">
</td>
</tr>
<c:if test="${ not empty errors['systemId']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.sms.valid_systemId" />
</td>
</tr>
</c:if>
<tr>
<td width="30%" nowrap>
<fmt:message key="system.sms.password" />:
</td>
<td nowrap>
<input type="password" name="password" value="${fn:escapeXml(password)}" size="40" maxlength="8">
</td>
</tr>
<c:if test="${ not empty errors['password']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.sms.valid_password" />
</td>
</tr>
</c:if>
<!-- spacer -->
<tr><td colspan="2">&nbsp;</td></tr>
<tr>
<td width="30%" nowrap>
<fmt:message key="system.sms.systemType" />:
</td>
<td nowrap>
<input type="text" name="systemType" value="${fn:escapeXml(systemType)}" size="40" maxlength="150">
</td>
</tr>
<c:if test="${ not empty errors['systemType']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.sms.valid_systemType" />
</td>
</tr>
</c:if>
</table>
</admin:contentBox>
<input type="hidden" name="csrf" value="${csrf}"/>
<input type="submit" name="save" value="<fmt:message key="system.sms.save" />">
<input type="submit" name="test" value="<fmt:message key="system.sms.send_test" />" ${ not empty errors ? 'disabled' : ''}>
</form>
</body>
</html>
<%--
- Copyright (C) 2005-2008 Jive Software. All rights reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--%>
<%@ page import="org.jivesoftware.util.*,
java.util.*"
errorPage="error.jsp"
%>
<%@ taglib uri="admin" prefix="admin" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%-- Define Administration Bean --%>
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<% webManager.init(request, response, session, application, out ); %>
<% // Get paramters
boolean doTest = request.getParameter("test") != null;
boolean cancel = request.getParameter("cancel") != null;
String recipient = ParamUtils.getParameter(request, "recipient");
String message = ParamUtils.getParameter(request, "message");
// Cancel if requested
if (cancel) {
response.sendRedirect("system-sms.jsp");
return;
}
// Validate input
Map<String, String> errors = new HashMap<String, String>();
Cookie csrfCookie = CookieUtils.getCookie(request, "csrf");
String csrfParam = ParamUtils.getParameter(request, "csrf");
if (doTest) {
if (csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam)) {
doTest = false;
errors.put("csrf", "CSRF Failure!");
}
}
csrfParam = StringUtils.randomString(15);
CookieUtils.setCookie(request, response, "csrf", csrfParam, -1);
pageContext.setAttribute("csrf", csrfParam);
// See if the service has basic configuration.
if ( JiveGlobals.getProperty( "sms.smpp.host" ) == null ) {
errors.put( "host", "cannot be missing or empty." );
}
if ( JiveGlobals.getProperty( "sms.smpp.systemId" ) == null )
{
errors.put( "systemId", "cannot be missing or empty." );
}
if (JiveGlobals.getProperty( "sms.smpp.password" ) == null )
{
errors.put( "password", "cannot be missing or empty.");
}
if (doTest) {
if (recipient == null || recipient.trim().isEmpty() ) {
errors.put("recipient", "Recipient cannot be missing or empty.");
}
if (message == null || message.trim().isEmpty() ) {
errors.put("message", "Message cannot be missing or empty.");
}
if (errors.isEmpty())
{
final SmsService service = SmsService.getInstance();
try
{
service.sendImmediately( message, recipient );
response.sendRedirect("system-smstest.jsp?sent=true&success=true");
return;
}
catch ( Exception e )
{
errors.put( "sendfailed", SmsService.getDescriptiveMessage( e ) );
}
}
}
pageContext.setAttribute( "errors", errors );
pageContext.setAttribute( "recipient", recipient );
pageContext.setAttribute( "message", message );
%>
<html>
<head>
<title><fmt:message key="system.smstest.title"/></title>
<meta name="pageID" content="system-sms"/>
</head>
<body>
<c:if test="${not empty errors}">
<admin:infobox type="error">
<c:choose>
<c:when test="${ not empty errors['host'] or not empty errors['systemId'] or not empty errors['password']}">
<fmt:message key="system.smstest.invalid-service-config">
<fmt:param value="<a href=\"system-sms.jsp\">"/>
<fmt:param value="</a>"/>
</fmt:message>
</c:when>
<c:when test="${ not empty errors['sendfailed']}">
<fmt:message key="system.smstest.failure">
<fmt:param value="${errors['sendfailed']}"/>
</fmt:message>
</c:when>
<c:otherwise>
<fmt:message key="system.sms.config_failure" />
</c:otherwise>
</c:choose>
</admin:infobox>
</c:if>
<c:if test="${empty errors and param.success}">
<admin:infobox type="success"><fmt:message key="system.smstest.success" /></admin:infobox>
</c:if>
<p>
<fmt:message key="system.smstest.info" />
</p>
<form action="system-smstest.jsp" method="post">
<table cellpadding="3" cellspacing="0" border="0">
<tbody>
<tr>
<td>
<fmt:message key="system.smstest.recipient" />:
</td>
<td>
<input type="text" name="recipient" value="${fn:escapeXml(recipient)}"size="40" maxlength="100">
</td>
</tr>
<c:if test="${ not empty errors['recipient']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.smstest.valid_recipient" />
</td>
</tr>
</c:if>
<tr valign="top">
<td>
<fmt:message key="system.smstest.message" />:
</td>
<td>
<textarea name="message" cols="45" rows="5" maxlength="140" wrap="virtual"><c:out value="${message}"/></textarea>
</td>
</tr>
<c:if test="${ not empty errors['message']}">
<tr>
<td nowrap>
&nbsp;
</td>
<td nowrap class="jive-error-text">
<fmt:message key="system.smstest.valid_message" />
</td>
</tr>
</c:if>
<tr>
<td colspan="2">
<br>
<input type="hidden" name="csrf" value="${csrf}">
<input type="submit" name="test" value="<fmt:message key="system.smstest.send" />" ${ not empty errors['host'] or not empty errors['systemId'] or not empty errors['password'] ? 'disabled' : ''}>
<input type="submit" name="cancel" value="<fmt:message key="system.smstest.cancel" />">
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment