Merge pull request #18 from Jimuell12/master

Bulk SMS Support & Server IP Display Added
This commit is contained in:
David R
2024-09-05 18:20:57 +02:00
committed by GitHub
2 changed files with 57 additions and 38 deletions

View File

@@ -15,77 +15,78 @@ import javax.servlet.http.HttpServletResponse
@WebServlet
@MultipartConfig
class SMSServlet(private val serverLogging: ServerLogging, private val authEnabled: Boolean , private val goodToken: String) : HttpServlet() {
class SMSServlet(private val serverLogging: ServerLogging, private val authEnabled: Boolean, private val goodToken: String) : HttpServlet() {
@Throws(IOException::class)
override fun doPost(request: HttpServletRequest, response: HttpServletResponse) {
val message = request.getParameter("message")
val phoneno = request.getParameter("phoneno")
val phonenos = request.getParameter("phoneno")?.split(",")?.map { it.trim() }
val token = request.getParameter("token")
var tokenLog = ""
if(token != null) {
if (token != null) {
tokenLog = " Token: $token"
}
serverLogging.log("info", "SMS-Servlet [" + request.method + "] Request /send From: " + request.remoteAddr + tokenLog)
//Init Gson/PhoneNumberUtil
// Init Gson/PhoneNumberUtil
val gsonBuilder = GsonBuilder()
val gson = gsonBuilder.create()
val phoneUtil = PhoneNumberUtil.getInstance()
//Set Response
// Set Response
response.contentType = "application/json"
response.characterEncoding = "utf-8"
//Check if authentication is enabled
// Check if authentication is enabled
if (authEnabled) {
if (token == null) {
serverLogging.log("error", "No token")
response.writer.println(gson.toJson(SMSResponse(false, "Authentication token is missing!")))
return
}
else if (token != goodToken) {
serverLogging.log("error", "Supplied Token in wrong")
} else if (token != goodToken) {
serverLogging.log("error", "Supplied Token is wrong")
response.writer.println(gson.toJson(SMSResponse(false, "Authentication token is wrong!")))
return
}
}
//Check if post-parameters exists
if (message == null || phoneno == null) {
//Return Failing JSON
// Check if post-parameters exists
if (message == null || phonenos.isNullOrEmpty()) {
// Return Failing JSON
serverLogging.log("error", "SMS-Servlet message and/or phoneno parameter is missing")
response.writer.println(gson.toJson(SMSResponse(false, "message or phoneno parameter are missing!")))
return
}
//Check if message is valid
// Check if message is valid
if (message.isEmpty()) {
serverLogging.log("error", "SMS-Servlet Message is empty")
//Return Failing JSON
// Return Failing JSON
response.writer.println(gson.toJson(SMSResponse(false, "message is empty!")))
return
}
//Check if phoneno is valid and parse it
val phoneNumber: PhoneNumber
try {
phoneNumber = phoneUtil.parse(phoneno, null)
}
catch (ex: Exception) {
serverLogging.log("error", "SMS-Servlet Failed to parse phoneno")
ex.printStackTrace()
//Return Failing JSON
response.writer.println(gson.toJson(SMSResponse(false, "Invalid phoneno (make sure you include the + with Country-Code)!")))
return
}
//Send SMS
val smsManager = if(Build.VERSION.SDK_INT >= 31) {
// Send SMS to each phone number
val smsManager = if (Build.VERSION.SDK_INT >= 31) {
AppContext.appContext.getSystemService(SmsManager::class.java)
} else {
SmsManager.getDefault()
}
val msgArray = smsManager.divideMessage(message)
smsManager.sendMultipartTextMessage(phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL), null, msgArray, null, null)
//Show Success message
response.writer.println(gson.toJson(SMSResponse(true, null)))
serverLogging.log("info", "SMS-Servlet Successful send!")
}
}
for (phoneno in phonenos) {
try {
val phoneNumber = phoneUtil.parse(phoneno, null)
val formattedNumber = phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)
val msgArray = smsManager.divideMessage(message)
smsManager.sendMultipartTextMessage(formattedNumber, null, msgArray, null, null)
serverLogging.log("info", "SMS-Servlet Successfully sent to $formattedNumber")
} catch (ex: Exception) {
serverLogging.log("error", "SMS-Servlet Failed to parse or send SMS to $phoneno")
ex.printStackTrace()
response.writer.println(gson.toJson(SMSResponse(false, "Failed to send SMS to $phoneno")))
return
}
}
// Show Success message
response.writer.println(gson.toJson(SMSResponse(true, null)))
serverLogging.log("info", "SMS-Servlet Successfully sent to all numbers!")
}
}

View File

@@ -1,6 +1,9 @@
package net.xcreen.restsms.server
import java.io.IOException
import java.net.InetAddress
import java.net.NetworkInterface
import java.util.*
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
@@ -10,13 +13,28 @@ class SMSWelcomeServlet(private val serverLogging: ServerLogging) : HttpServlet(
@Throws(IOException::class)
override fun doGet(request: HttpServletRequest, response: HttpServletResponse) {
val requestURI = request.requestURI
val localIpAddress = getLocalIpAddress()
if (requestURI != null) {
serverLogging.log("info", "Welcome-Servlet [" + request.method + "] Request " + requestURI + " From: " + request.remoteAddr)
}
else {
} else {
serverLogging.log("info", "Welcome-Servlet [" + request.method + "] Request / From: " + request.remoteAddr)
}
response.writer.println("RestSMS-Server is running!")
response.writer.println("Server IP Address: $localIpAddress")
}
}
private fun getLocalIpAddress(): String {
val networkInterfaces = NetworkInterface.getNetworkInterfaces()
for (interfaceElement in Collections.list(networkInterfaces)) {
val inetAddresses = interfaceElement.inetAddresses
for (inetAddress in Collections.list(inetAddresses)) {
if (!inetAddress.isLoopbackAddress && inetAddress.hostAddress.indexOf(':') == -1) {
return inetAddress.hostAddress
}
}
}
return "Unknown IP Address"
}
}