mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 17:17:29 -05:00
Authorization features.
This commit is contained in:
@@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Audio broadcaster to push completed audio recordings to the Rdio Scanner call upload API.
|
* Audio broadcaster to push completed audio recordings to the OpenMHz call upload API.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class OpenMHzBroadcaster extends AbstractAudioBroadcaster<OpenMHzConfiguration>
|
public class OpenMHzBroadcaster extends AbstractAudioBroadcaster<OpenMHzConfiguration>
|
||||||
@@ -81,6 +81,7 @@
|
|||||||
private static final String MULTIPART_TYPE = "multipart";
|
private static final String MULTIPART_TYPE = "multipart";
|
||||||
private static final String DEFAULT_SUBTYPE = "form-data";
|
private static final String DEFAULT_SUBTYPE = "form-data";
|
||||||
private static final String MULTIPART_FORM_DATA = MULTIPART_TYPE + "/" + DEFAULT_SUBTYPE;
|
private static final String MULTIPART_FORM_DATA = MULTIPART_TYPE + "/" + DEFAULT_SUBTYPE;
|
||||||
|
private static final String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded";
|
||||||
private Queue<AudioRecording> mAudioRecordingQueue = new LinkedTransferQueue<>();
|
private Queue<AudioRecording> mAudioRecordingQueue = new LinkedTransferQueue<>();
|
||||||
private ScheduledFuture<?> mAudioRecordingProcessorFuture;
|
private ScheduledFuture<?> mAudioRecordingProcessorFuture;
|
||||||
private HttpClient mHttpClient = HttpClient.newBuilder()
|
private HttpClient mHttpClient = HttpClient.newBuilder()
|
||||||
@@ -115,16 +116,16 @@
|
|||||||
mLastConnectionAttempt = System.currentTimeMillis();
|
mLastConnectionAttempt = System.currentTimeMillis();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rdio Scanner API does not currently expose a test method.
|
* OpenMHz API does not currently expose a test method.
|
||||||
* TODO: FIX THIS
|
* TODO: FIX THIS
|
||||||
*/
|
*/
|
||||||
if(response != null)// && response.toLowerCase().startsWith("<head><title>502 bad gateway</title></head>"))
|
if(response == "OK")// && response.toLowerCase().startsWith("<head><title>502 bad gateway</title></head>"))
|
||||||
{
|
{
|
||||||
setBroadcastState(BroadcastState.CONNECTED);
|
setBroadcastState(BroadcastState.CONNECTED);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mLog.error("Error connecting to Rdio Scanner server on startup [" + response + "]");
|
mLog.error("Error connecting to OpenMHz server on startup [" + response + "]");
|
||||||
setBroadcastState(BroadcastState.ERROR);
|
setBroadcastState(BroadcastState.ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +171,7 @@
|
|||||||
* server. If there is a connectivity or other issue, the broadcast state is set to temporary error and
|
* server. If there is a connectivity or other issue, the broadcast state is set to temporary error and
|
||||||
* the audio processor thread will persistently invoke this method to attempt a reconnect.
|
* the audio processor thread will persistently invoke this method to attempt a reconnect.
|
||||||
*
|
*
|
||||||
* Rdio Scanner does not have a test API endpoint, so we look for the incomplete call response.
|
* OpenMHz does not have a test API endpoint, so we look for the incomplete call response.
|
||||||
*/
|
*/
|
||||||
private boolean connected()
|
private boolean connected()
|
||||||
{
|
{
|
||||||
@@ -182,7 +183,7 @@
|
|||||||
String response = testConnection(getBroadcastConfiguration());
|
String response = testConnection(getBroadcastConfiguration());
|
||||||
mLastConnectionAttempt = System.currentTimeMillis();
|
mLastConnectionAttempt = System.currentTimeMillis();
|
||||||
|
|
||||||
if(response != null && response.toLowerCase().startsWith("incomplete call data: no talkgroup"))
|
if(response != null && response == "200")
|
||||||
{
|
{
|
||||||
setBroadcastState(BroadcastState.CONNECTED);
|
setBroadcastState(BroadcastState.CONNECTED);
|
||||||
}
|
}
|
||||||
@@ -256,11 +257,12 @@
|
|||||||
}
|
}
|
||||||
catch(IOException e)
|
catch(IOException e)
|
||||||
{
|
{
|
||||||
mLog.error("Rdio Scanner API - audio recording file not found - ignoring upload");
|
mLog.error("OpenMHz - audio recording file not found - ignoring upload");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(audioBytes != null)
|
if(audioBytes != null)
|
||||||
{
|
{
|
||||||
|
String uri = getBroadcastConfiguration().getHost() + "/" + getBroadcastConfiguration().getSystemName() + "/upload";
|
||||||
|
|
||||||
OpenMHzBuilder bodyBuilder = new OpenMHzBuilder();
|
OpenMHzBuilder bodyBuilder = new OpenMHzBuilder();
|
||||||
bodyBuilder
|
bodyBuilder
|
||||||
@@ -272,17 +274,14 @@
|
|||||||
.addPart(FormField.TALKGROUP_NUM, talkgroup)
|
.addPart(FormField.TALKGROUP_NUM, talkgroup)
|
||||||
.addPart(FormField.EMERGENCY, 0)
|
.addPart(FormField.EMERGENCY, 0)
|
||||||
.addPart(FormField.API_KEY, getBroadcastConfiguration().getApiKey())
|
.addPart(FormField.API_KEY, getBroadcastConfiguration().getApiKey())
|
||||||
.addPart(FormField.PATCHES, patches)
|
// For future use if OpenMHz supports patch information
|
||||||
|
//.addPart(FormField.PATCHES, patches)
|
||||||
.addPart(FormField.SOURCE_LIST, "[{ \"pos\": 0.00, \"src\": " + radioId + "}]");
|
.addPart(FormField.SOURCE_LIST, "[{ \"pos\": 0.00, \"src\": " + radioId + "}]");
|
||||||
//.addPart(FormField.FREQ_LIST, frequency)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HttpRequest fileRequest = HttpRequest.newBuilder()
|
HttpRequest fileRequest = HttpRequest.newBuilder()
|
||||||
.uri(URI.create(getBroadcastConfiguration().getHost()))
|
.uri(URI.create(uri))
|
||||||
.header(HttpHeaders.CONTENT_TYPE, MULTIPART_FORM_DATA + "; boundary=" + bodyBuilder.getBoundary())
|
.header(HttpHeaders.CONTENT_TYPE, MULTIPART_FORM_DATA + "; boundary=" + bodyBuilder.getBoundary())
|
||||||
.header(HttpHeaders.USER_AGENT, "sdrtrunk")
|
.header(HttpHeaders.USER_AGENT, "sdrtrunk")
|
||||||
//.header(HttpHeaders.CONTENT_TYPE, "application/octet-stream")
|
|
||||||
.POST(bodyBuilder.build())
|
.POST(bodyBuilder.build())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@@ -295,14 +294,14 @@
|
|||||||
//We get socket reset exceptions occasionally when the remote server doesn't
|
//We get socket reset exceptions occasionally when the remote server doesn't
|
||||||
//fully read our request and immediately responds.
|
//fully read our request and immediately responds.
|
||||||
setBroadcastState(BroadcastState.TEMPORARY_BROADCAST_ERROR);
|
setBroadcastState(BroadcastState.TEMPORARY_BROADCAST_ERROR);
|
||||||
mLog.error("Rdio Scanner API file upload fail [" +
|
mLog.error("OpenMHz API file upload fail [" +
|
||||||
fileResponse.statusCode() + "] response [" +
|
fileResponse.statusCode() + "] response [" +
|
||||||
fileResponse.body() + "]");
|
fileResponse.body() + "]");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setBroadcastState(BroadcastState.TEMPORARY_BROADCAST_ERROR);
|
setBroadcastState(BroadcastState.TEMPORARY_BROADCAST_ERROR);
|
||||||
mLog.error("Rdio Scanner API file upload fail [" +
|
mLog.error("OpenMHz API file upload fail [" +
|
||||||
fileResponse.statusCode() + "] response [" +
|
fileResponse.statusCode() + "] response [" +
|
||||||
fileResponse.body() + "]");
|
fileResponse.body() + "]");
|
||||||
}
|
}
|
||||||
@@ -324,7 +323,7 @@
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
setBroadcastState(BroadcastState.TEMPORARY_BROADCAST_ERROR);
|
setBroadcastState(BroadcastState.TEMPORARY_BROADCAST_ERROR);
|
||||||
mLog.error("Rdio Scanner API file upload fail [" +
|
mLog.error("OpenMHz API file upload fail [" +
|
||||||
fileResponse.statusCode() + "] response [" +
|
fileResponse.statusCode() + "] response [" +
|
||||||
fileResponse.body() + "]");
|
fileResponse.body() + "]");
|
||||||
}
|
}
|
||||||
@@ -337,7 +336,7 @@
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Register an error for the file not found exception
|
//Register an error for the file not found exception
|
||||||
mLog.error("Rdio Scanner API - upload file not found [" +
|
mLog.error("OpenMHz API - upload file not found [" +
|
||||||
audioRecording.getPath().toString() + "]");
|
audioRecording.getPath().toString() + "]");
|
||||||
incrementErrorAudioCount();
|
incrementErrorAudioCount();
|
||||||
broadcast(new BroadcastEvent(OpenMHzBroadcaster.this,
|
broadcast(new BroadcastEvent(OpenMHzBroadcaster.this,
|
||||||
@@ -547,21 +546,19 @@
|
|||||||
*/
|
*/
|
||||||
public static String testConnection(OpenMHzConfiguration configuration)
|
public static String testConnection(OpenMHzConfiguration configuration)
|
||||||
{
|
{
|
||||||
|
String uri = configuration.getHost() + "/" + configuration.getSystemName() + "/authorize";
|
||||||
|
|
||||||
HttpClient httpClient = HttpClient.newBuilder()
|
HttpClient httpClient = HttpClient.newBuilder()
|
||||||
.version(HttpClient.Version.HTTP_1_1)
|
.version(HttpClient.Version.HTTP_1_1)
|
||||||
.followRedirects(HttpClient.Redirect.NORMAL)
|
.followRedirects(HttpClient.Redirect.NORMAL)
|
||||||
.connectTimeout(Duration.ofSeconds(20))
|
.connectTimeout(Duration.ofSeconds(20))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
OpenMHzBuilder bodyBuilder = new OpenMHzBuilder();
|
|
||||||
bodyBuilder.addPart(FormField.API_KEY, configuration.getApiKey());
|
|
||||||
|
|
||||||
HttpRequest request = HttpRequest.newBuilder()
|
HttpRequest request = HttpRequest.newBuilder()
|
||||||
.uri(URI.create(configuration.getHost()))
|
.uri(URI.create(uri))
|
||||||
.header(HttpHeaders.CONTENT_TYPE, MULTIPART_FORM_DATA + "; boundary=" + bodyBuilder.getBoundary())
|
.header(HttpHeaders.CONTENT_TYPE, APPLICATION_FORM_URLENCODED)
|
||||||
.header(HttpHeaders.USER_AGENT, "sdrtrunk")
|
.header(HttpHeaders.USER_AGENT, "sdrtrunk")
|
||||||
.header(HttpHeaders.ACCEPT, "*/*")
|
.POST(HttpRequest.BodyPublishers.ofString("api_key="+configuration.getApiKey()))
|
||||||
.POST(bodyBuilder.build())
|
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
HttpResponse.BodyHandler<String> responseHandler = HttpResponse.BodyHandlers.ofString();
|
HttpResponse.BodyHandler<String> responseHandler = HttpResponse.BodyHandlers.ofString();
|
||||||
@@ -570,7 +567,20 @@
|
|||||||
{
|
{
|
||||||
HttpResponse<String> response = httpClient.send(request, responseHandler);
|
HttpResponse<String> response = httpClient.send(request, responseHandler);
|
||||||
String responseBody = response.body();
|
String responseBody = response.body();
|
||||||
return (responseBody != null ? responseBody : "(no response)") + " Status Code:" + response.statusCode();
|
if (response.statusCode() == 200)
|
||||||
|
{
|
||||||
|
return "OK";
|
||||||
|
}
|
||||||
|
else if(response.statusCode() == 403)
|
||||||
|
{
|
||||||
|
return "Invalid API Key";
|
||||||
|
}
|
||||||
|
else if(response.statusCode() == 500)
|
||||||
|
{
|
||||||
|
return "Invalid System Name";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "No Response";
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch(Exception e)
|
||||||
{
|
{
|
||||||
@@ -597,20 +607,21 @@
|
|||||||
config.setSystemName("systemx");
|
config.setSystemName("systemx");
|
||||||
|
|
||||||
String response = testConnection(config);
|
String response = testConnection(config);
|
||||||
|
mLog.error("Response: " + response);
|
||||||
|
|
||||||
if(response == null)
|
if(response == "OK")
|
||||||
{
|
{
|
||||||
mLog.debug("Test Successful!");
|
mLog.debug("Test Successful!");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(response.contains("1 Invalid-API-Key"))
|
if(response.contains("Invalid API Key"))
|
||||||
{
|
{
|
||||||
mLog.error("Invalid API Key");
|
mLog.error("Invalid API Key");
|
||||||
}
|
}
|
||||||
else if(response.contains("1 API-Key-Access-Denied"))
|
else if(response.contains("Invalid System Name"))
|
||||||
{
|
{
|
||||||
mLog.error("System ID not valid for API Key");
|
mLog.error("Invalid System Name");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -110,8 +110,7 @@
|
|||||||
}
|
}
|
||||||
StringBuilder sb= new StringBuilder();
|
StringBuilder sb= new StringBuilder();
|
||||||
sb.append(DASH_DASH).append(boundary).append("\r\n");
|
sb.append(DASH_DASH).append(boundary).append("\r\n");
|
||||||
sb.append("Content-Disposition: form-data; name=\"").append("call").append("\"; filename=\"test.m4a\"\r\n");
|
sb.append("Content-Disposition: form-data; name=\"").append("call").append("\"; filename=\"audio.mp3\"\r\n\r\n");
|
||||||
sb.append("Content-Type: application/octet-stream\r\n\r\n");
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,8 @@
|
|||||||
*/
|
*/
|
||||||
public class OpenMHzConfiguration extends BroadcastConfiguration
|
public class OpenMHzConfiguration extends BroadcastConfiguration
|
||||||
{
|
{
|
||||||
|
public static final String PRODUCTION_ENDPOINT = "https://api.openmhz.com";
|
||||||
|
|
||||||
private StringProperty mSystemName = new SimpleStringProperty();
|
private StringProperty mSystemName = new SimpleStringProperty();
|
||||||
private StringProperty mApiKey = new SimpleStringProperty();
|
private StringProperty mApiKey = new SimpleStringProperty();
|
||||||
|
|
||||||
@@ -58,6 +60,11 @@
|
|||||||
{
|
{
|
||||||
super(format);
|
super(format);
|
||||||
|
|
||||||
|
if(getHost() == null)
|
||||||
|
{
|
||||||
|
setHost(PRODUCTION_ENDPOINT);
|
||||||
|
}
|
||||||
|
|
||||||
//The parent class binds this property, so we unbind it and rebind it here
|
//The parent class binds this property, so we unbind it and rebind it here
|
||||||
mValid.unbind();
|
mValid.unbind();
|
||||||
mValid.bind(Bindings.and(Bindings.and(Bindings.isNotNull(mSystemName), Bindings.isNotNull(mApiKey)),
|
mValid.bind(Bindings.and(Bindings.and(Bindings.isNotNull(mSystemName), Bindings.isNotNull(mApiKey)),
|
||||||
|
|||||||
@@ -152,7 +152,7 @@
|
|||||||
GridPane.setConstraints(getApiKeyTextField(), 1, row);
|
GridPane.setConstraints(getApiKeyTextField(), 1, row);
|
||||||
mEditorPane.getChildren().add(getApiKeyTextField());
|
mEditorPane.getChildren().add(getApiKeyTextField());
|
||||||
|
|
||||||
Label systemNameLabel = new Label("System Name");
|
Label systemNameLabel = new Label("System Short Name");
|
||||||
GridPane.setHalignment(systemNameLabel, HPos.RIGHT);
|
GridPane.setHalignment(systemNameLabel, HPos.RIGHT);
|
||||||
GridPane.setConstraints(systemNameLabel, 0, ++row);
|
GridPane.setConstraints(systemNameLabel, 0, ++row);
|
||||||
mEditorPane.getChildren().add(systemNameLabel);
|
mEditorPane.getChildren().add(systemNameLabel);
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
GridPane.setConstraints(getSystemNameTextField(), 1, row);
|
GridPane.setConstraints(getSystemNameTextField(), 1, row);
|
||||||
mEditorPane.getChildren().add(getSystemNameTextField());
|
mEditorPane.getChildren().add(getSystemNameTextField());
|
||||||
|
|
||||||
Label hostLabel = new Label("OpenMHz URL");
|
Label hostLabel = new Label("OpenMHz Upload Server (API)");
|
||||||
GridPane.setHalignment(hostLabel, HPos.RIGHT);
|
GridPane.setHalignment(hostLabel, HPos.RIGHT);
|
||||||
GridPane.setConstraints(hostLabel, 0, ++row);
|
GridPane.setConstraints(hostLabel, 0, ++row);
|
||||||
mEditorPane.getChildren().add(hostLabel);
|
mEditorPane.getChildren().add(hostLabel);
|
||||||
|
|||||||
Reference in New Issue
Block a user