Done refactoring scannerAPI; fixed android scanner to use modern settings api and allow URL+nonce
parent
0dfd2480d2
commit
3c52eb2e8d
|
@ -56,23 +56,18 @@ dependencies {
|
||||||
compile project(':meerkat-common')
|
compile project(':meerkat-common')
|
||||||
compile project(':scanner-api-common')
|
compile project(':scanner-api-common')
|
||||||
|
|
||||||
// compile 'com.android.support.constraint:constraint-layout:1.0.0-beta3'
|
|
||||||
|
|
||||||
//compile 'com.android.support:appcompat-v7:23.1.0'
|
|
||||||
// Google protobufs
|
|
||||||
// Retrofit
|
|
||||||
// compile 'com.squareup.retrofit2:retrofit:2.1.0'
|
|
||||||
// compile 'com.squareup.retrofit2:converter-protobuf:2.2.0'
|
|
||||||
|
|
||||||
// androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
|
|
||||||
// exclude group: 'com.android.support', module: 'support-annotations'
|
|
||||||
// })
|
|
||||||
|
|
||||||
compile 'com.android.support:appcompat-v7:26.0.+'
|
compile 'com.android.support:appcompat-v7:26.0.+'
|
||||||
compile 'com.google.protobuf:protobuf-java:3.+'
|
compile 'com.google.protobuf:protobuf-java:3.+'
|
||||||
compile 'com.android.support:support-v4:26.0.+'
|
compile 'com.android.support:support-v4:26.0.+'
|
||||||
compile 'com.android.support:support-vector-drawable:26.0.+'
|
compile 'com.android.support:support-vector-drawable:26.0.+'
|
||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
|
|
||||||
|
// Android logging
|
||||||
|
compile 'com.github.tony19:logback-android-core:1.1.1-6'
|
||||||
|
compile('com.github.tony19:logback-android-classic:1.1.1-6') {
|
||||||
|
// workaround issue #73
|
||||||
|
exclude group: 'com.google.android', module: 'android'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender">
|
||||||
|
<tagEncoder>
|
||||||
|
<pattern>%logger{12}</pattern>
|
||||||
|
</tagEncoder>
|
||||||
|
<encoder>
|
||||||
|
<pattern>[%-20thread] %msg</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="DEBUG">
|
||||||
|
<appender-ref ref="logcat" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -4,7 +4,9 @@ package com.meerkat.laura.fakescannerapp;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
@ -16,7 +18,9 @@ import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
import ch.qos.logback.classic.android.BasicLogcatConfigurator;
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
|
import com.google.protobuf.Message;
|
||||||
import com.google.zxing.integration.android.IntentIntegrator;
|
import com.google.zxing.integration.android.IntentIntegrator;
|
||||||
import com.google.zxing.integration.android.IntentResult;
|
import com.google.zxing.integration.android.IntentResult;
|
||||||
import meerkat.crypto.DigitalSignatureGenerator;
|
import meerkat.crypto.DigitalSignatureGenerator;
|
||||||
|
@ -31,7 +35,12 @@ import java.util.Date;
|
||||||
import static com.meerkat.laura.fakescannerapp.R.xml.preferences;
|
import static com.meerkat.laura.fakescannerapp.R.xml.preferences;
|
||||||
|
|
||||||
|
|
||||||
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
|
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
static {
|
||||||
|
BasicLogcatConfigurator.configureDefaultContext();
|
||||||
|
}
|
||||||
|
|
||||||
final public static String SCANNER_NAME = "AndroidScanner";
|
final public static String SCANNER_NAME = "AndroidScanner";
|
||||||
SharedPreferences sharedPref;
|
SharedPreferences sharedPref;
|
||||||
|
|
||||||
|
@ -40,6 +49,90 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
|
||||||
PollingStationScanner.ScannerClient scannerClient;
|
PollingStationScanner.ScannerClient scannerClient;
|
||||||
DigitalSignatureGenerator signer;
|
DigitalSignatureGenerator signer;
|
||||||
|
|
||||||
|
class AsyncScanConnect extends AsyncTask<Void, Void, Boolean> {
|
||||||
|
PollingStation.ConnectionServerData serverData;
|
||||||
|
|
||||||
|
public AsyncScanConnect(PollingStation.ConnectionServerData connectionServerData) {
|
||||||
|
this.serverData = connectionServerData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute() {
|
||||||
|
super.onPreExecute();
|
||||||
|
serverStatus.setTextColor(Color.BLUE);
|
||||||
|
serverStatus.setText("Connecting to " + serverData.getServerUrl());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground(Void... foo) {
|
||||||
|
try {
|
||||||
|
return scannerClient.connect(serverData);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
Log.e("MainActivity", "Exception during connect: " + e.toString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Boolean res) {
|
||||||
|
super.onPostExecute(res);
|
||||||
|
if (res) {
|
||||||
|
serverStatus.setTextColor(Color.GREEN);
|
||||||
|
serverStatus.setText("Connected to " + serverData.getServerUrl());
|
||||||
|
} else {
|
||||||
|
serverStatus.setTextColor(Color.RED);
|
||||||
|
serverStatus.setText("Connection failed: " + serverData.getServerUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AsyncScanSend extends AsyncTask<Void, Void, Boolean> {
|
||||||
|
Message data;
|
||||||
|
|
||||||
|
public AsyncScanSend(Message data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute() {
|
||||||
|
super.onPreExecute();
|
||||||
|
serverStatus.setTextColor(Color.BLUE);
|
||||||
|
serverStatus.setText("Sending to server...");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground(Void... foo) {
|
||||||
|
try {
|
||||||
|
if (data instanceof PollingStation.ScannedBallot) {
|
||||||
|
return scannerClient.newScan((PollingStation.ScannedBallot) data);
|
||||||
|
} else if (data instanceof PollingStation.ScanError) {
|
||||||
|
return scannerClient.reportError((PollingStation.ScanError) data);
|
||||||
|
} else {
|
||||||
|
Log.e("MainActivity", "Trying to send invalid message to scanner");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
Log.e("MainActivity", "Exception during send: " + e.toString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Boolean res) {
|
||||||
|
super.onPostExecute(res);
|
||||||
|
if (res) {
|
||||||
|
serverStatus.setTextColor(Color.GREEN);
|
||||||
|
serverStatus.setText("Sent successfully");
|
||||||
|
Log.i("MainActivity", "post submitted to API.");
|
||||||
|
} else {
|
||||||
|
serverStatus.setTextColor(Color.RED);
|
||||||
|
serverStatus.setText("Send failed");
|
||||||
|
Log.e("MainActivity", "Unable to submit post to API.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
MenuInflater inflater = getMenuInflater();
|
MenuInflater inflater = getMenuInflater();
|
||||||
|
@ -61,60 +154,52 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
|
||||||
}
|
}
|
||||||
|
|
||||||
void setNewScannerClientAPI(SharedPreferences sharedPref) {
|
void setNewScannerClientAPI(SharedPreferences sharedPref) {
|
||||||
String pscUrlString = sharedPref.getString(SettingsActivity.PSC_URL, "");
|
String pscUrlString = sharedPref.getString(SettingsFragment.PSC_URL, "");
|
||||||
|
long nonce = 0;
|
||||||
|
|
||||||
scannerClient = new ScannerClientAPI(signer);
|
try {
|
||||||
|
nonce = Long.parseLong(sharedPref.getString(SettingsFragment.PSC_NONCE, "0"));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
|
||||||
serverStatus.setTextColor(Color.BLUE);
|
if (pscUrlString.isEmpty())
|
||||||
serverStatus.setText("Connecting to " + pscUrlString);
|
return;
|
||||||
|
|
||||||
PollingStation.ConnectionServerData serverData = PollingStation.ConnectionServerData.newBuilder()
|
PollingStation.ConnectionServerData serverData = PollingStation.ConnectionServerData.newBuilder()
|
||||||
.setServerUrl(pscUrlString)
|
.setServerUrl(pscUrlString)
|
||||||
.setNonce(0)
|
.setNonce(nonce)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
boolean res = scannerClient.connect(serverData);
|
new AsyncScanConnect(serverData).execute();
|
||||||
if (res) {
|
|
||||||
serverStatus.setTextColor(Color.GREEN);
|
|
||||||
serverStatus.setText("Connected to " + pscUrlString);
|
|
||||||
} else {
|
|
||||||
serverStatus.setTextColor(Color.RED);
|
|
||||||
serverStatus.setText("Connection failed: " + pscUrlString);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
PreferenceManager.setDefaultValues(this, preferences, false);
|
|
||||||
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
|
||||||
sharedPref.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
|
|
||||||
if (s.equals(SettingsActivity.PSC_URL))
|
|
||||||
setNewScannerClientAPI(sharedPreferences);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
scanBtn = (Button)findViewById(R.id.scan_button);
|
|
||||||
formatTxt = (TextView)findViewById(R.id.scan_format);
|
|
||||||
contentTxt = (TextView)findViewById(R.id.scan_content);
|
|
||||||
responseTxt = (TextView)findViewById(R.id.server_response);
|
|
||||||
serverStatus = (TextView) findViewById(R.id.serverStatus);
|
|
||||||
|
|
||||||
|
|
||||||
signer = new ECDSADeterministicSignature();
|
signer = new ECDSADeterministicSignature();
|
||||||
signer.generateSigningCertificate(BigInteger.ONE, new Date(System.currentTimeMillis()),
|
signer.generateSigningCertificate(BigInteger.ONE, new Date(System.currentTimeMillis()),
|
||||||
new Date(System.currentTimeMillis() + 1000*60*60*24*365), SCANNER_NAME);
|
new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 365), SCANNER_NAME);
|
||||||
|
scannerClient = new ScannerClientAPI(signer);
|
||||||
|
|
||||||
|
PreferenceManager.setDefaultValues(this, preferences, false);
|
||||||
|
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
sharedPref.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
|
||||||
|
scanBtn = (Button) findViewById(R.id.scan_button);
|
||||||
|
formatTxt = (TextView) findViewById(R.id.scan_format);
|
||||||
|
contentTxt = (TextView) findViewById(R.id.scan_content);
|
||||||
|
responseTxt = (TextView) findViewById(R.id.server_response);
|
||||||
|
serverStatus = (TextView) findViewById(R.id.serverStatus);
|
||||||
|
|
||||||
setNewScannerClientAPI(sharedPref);
|
setNewScannerClientAPI(sharedPref);
|
||||||
scanBtn.setOnClickListener(this);
|
scanBtn.setOnClickListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClick(View v){
|
public void onClick(View v) {
|
||||||
if(v.getId()==R.id.scan_button){
|
if (v.getId() == R.id.scan_button) {
|
||||||
IntentIntegrator scanIntegrator = new IntentIntegrator(this);
|
IntentIntegrator scanIntegrator = new IntentIntegrator(this);
|
||||||
formatTxt.setText("Initiating scan...");
|
formatTxt.setText("Initiating scan...");
|
||||||
scanIntegrator.initiateScan();
|
scanIntegrator.initiateScan();
|
||||||
|
@ -131,28 +216,24 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
|
||||||
contentTxt.setText("CONTENT: " + scanContent + "sending data to server...");
|
contentTxt.setText("CONTENT: " + scanContent + "sending data to server...");
|
||||||
// sendPost(rawBytes);
|
// sendPost(rawBytes);
|
||||||
sendPost(scanContent);
|
sendPost(scanContent);
|
||||||
} else{
|
} else {
|
||||||
Toast toast = Toast.makeText(getApplicationContext(),
|
Toast toast = Toast.makeText(getApplicationContext(),
|
||||||
"No scan data received!", Toast.LENGTH_SHORT);
|
"No scan data received!", Toast.LENGTH_SHORT);
|
||||||
toast.show();
|
toast.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void sendPost(byte[] body) {
|
// public void sendPost(byte[] body) {
|
||||||
public void sendPost(String scanContent) {
|
public void sendPost(String scanContent) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
PollingStation.ScannedBallot scannedBallot = PollingStation.ScannedBallot.parseFrom(Base64.decode(scanContent.getBytes(), Base64.DEFAULT));
|
PollingStation.ScannedBallot scannedBallot = PollingStation.ScannedBallot.parseFrom(Base64.decode(scanContent.getBytes(), Base64.DEFAULT));
|
||||||
//
|
//
|
||||||
// PollingStation.ScannedData scannedData = PollingStation.ScannedData.newBuilder()
|
// PollingStation.ScannedData scannedData = PollingStation.ScannedData.newBuilder()
|
||||||
// .setChannel(ByteString.copyFrom(body))
|
// .setChannel(ByteString.copyFrom(body))
|
||||||
// .build();
|
// .build();
|
||||||
|
|
||||||
if (scannerClient.newScan(scannedBallot)) {
|
new AsyncScanSend(scannedBallot).execute();
|
||||||
Log.i("MainActivity", "post submitted to API.");
|
|
||||||
} else {
|
|
||||||
Log.e("MainActivity", "Unable to submit post to API.");
|
|
||||||
}
|
|
||||||
} catch (InvalidProtocolBufferException e) {
|
} catch (InvalidProtocolBufferException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -162,4 +243,10 @@ public void sendPost(String scanContent) {
|
||||||
responseTxt.setText(response);
|
responseTxt.setText(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){
|
||||||
|
setNewScannerClientAPI(sharedPreferences);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,26 @@
|
||||||
package com.meerkat.laura.fakescannerapp;
|
package com.meerkat.laura.fakescannerapp;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
public class SettingsActivity extends PreferenceActivity {
|
/**
|
||||||
public final static String PSC_URL = "psc_url";
|
* Created by talm on 25/06/17.
|
||||||
|
*/
|
||||||
|
public class SettingsActivity extends Activity {
|
||||||
|
SettingsFragment settings;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
addPreferencesFromResource(R.xml.preferences);
|
|
||||||
|
settings = new SettingsFragment();
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(settings);
|
||||||
|
|
||||||
|
// Display the fragment as the main content.
|
||||||
|
getFragmentManager().beginTransaction()
|
||||||
|
.replace(android.R.id.content, settings)
|
||||||
|
.commit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.meerkat.laura.fakescannerapp;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.preference.PreferenceFragment;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
public final static String PSC_URL = "psc_url";
|
||||||
|
public final static String PSC_NONCE = "psc_nonce";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
addPreferencesFromResource(R.xml.preferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
Preference pref = findPreference(key);
|
||||||
|
if (pref == null)
|
||||||
|
return;
|
||||||
|
switch(key) {
|
||||||
|
case SettingsFragment.PSC_URL:
|
||||||
|
pref.setSummary(sharedPreferences.getString(key, ""));
|
||||||
|
break;
|
||||||
|
case SettingsFragment.PSC_NONCE:
|
||||||
|
pref.setSummary(sharedPreferences.getString(key, ""));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<string name="pref_title_psc_url">Scanner Service URL</string>
|
<string name="pref_title_psc_url">Scanner Service URL</string>
|
||||||
<string name="pref_default_psc_url">http://192.168.70.10:8880/</string>
|
<string name="pref_default_psc_url">http://192.168.70.10:8880/scan</string>
|
||||||
|
|
||||||
<string name="pref_title_add_friends_to_messages">Add friends to messages</string>
|
<string name="pref_title_add_friends_to_messages">Add friends to messages</string>
|
||||||
<string-array name="pref_example_list_titles">
|
<string-array name="pref_example_list_titles">
|
||||||
|
|
|
@ -12,6 +12,15 @@
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:inputType="textUri" />
|
android:inputType="textUri" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="psc_nonce"
|
||||||
|
android:title="Nonce"
|
||||||
|
android:defaultValue="0"
|
||||||
|
android:selectAllOnFocus="true"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:inputType="number"/>
|
||||||
|
|
||||||
<!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
|
<!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
|
||||||
dismiss it. -->
|
dismiss it. -->
|
||||||
<!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
|
<!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
|
||||||
|
|
|
@ -42,7 +42,7 @@ version += "${isSnapshot ? '-SNAPSHOT' : ''}"
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// Logging
|
// Logging
|
||||||
compile 'org.slf4j:slf4j-api:1.7.7'
|
compile 'org.slf4j:slf4j-api:1.7.21'
|
||||||
runtime 'ch.qos.logback:logback-classic:1.1.2'
|
runtime 'ch.qos.logback:logback-classic:1.1.2'
|
||||||
runtime 'ch.qos.logback:logback-core:1.1.2'
|
runtime 'ch.qos.logback:logback-core:1.1.2'
|
||||||
|
|
||||||
|
@ -53,12 +53,18 @@ dependencies {
|
||||||
compile 'com.google.protobuf:protobuf-java:3.+'
|
compile 'com.google.protobuf:protobuf-java:3.+'
|
||||||
|
|
||||||
// ListeningExecutor
|
// ListeningExecutor
|
||||||
compile 'com.google.guava:guava:15.0'
|
compile 'com.google.guava:guava:19.0'
|
||||||
|
|
||||||
// Crypto
|
// Crypto
|
||||||
compile 'org.factcenter.qilin:qilin:1.2.+'
|
compile 'org.factcenter.qilin:qilin:1.2.+'
|
||||||
compile 'org.bouncycastle:bcprov-jdk15on:1.57'
|
|
||||||
compile 'org.bouncycastle:bcpkix-jdk15on:1.57' // For certificate generation
|
// Use SpongyCastle instead of bouncycastle for android compatibility
|
||||||
|
// compile 'org.bouncycastle:bcprov-jdk15on:1.57'
|
||||||
|
// compile 'org.bouncycastle:bcpkix-jdk15on:1.57' // For certificate generation
|
||||||
|
|
||||||
|
compile 'com.madgag.spongycastle:prov:1.56.0.0'
|
||||||
|
compile 'com.madgag.spongycastle:bcpkix-jdk15on:1.56.0.0' // For certificate generation
|
||||||
|
|
||||||
|
|
||||||
testCompile 'junit:junit:4.+'
|
testCompile 'junit:junit:4.+'
|
||||||
|
|
||||||
|
|
|
@ -6,17 +6,17 @@ import meerkat.crypto.DigitalSignatureGenerator;
|
||||||
import meerkat.protobuf.Crypto;
|
import meerkat.protobuf.Crypto;
|
||||||
import meerkat.protobuf.Crypto.Signature;
|
import meerkat.protobuf.Crypto.Signature;
|
||||||
import meerkat.util.Hex;
|
import meerkat.util.Hex;
|
||||||
import org.bouncycastle.asn1.ASN1EncodableVector;
|
import org.spongycastle.asn1.ASN1EncodableVector;
|
||||||
import org.bouncycastle.asn1.DERSequence;
|
import org.spongycastle.asn1.DERSequence;
|
||||||
import org.bouncycastle.asn1.x500.X500Name;
|
import org.spongycastle.asn1.x500.X500Name;
|
||||||
import org.bouncycastle.asn1.x509.*;
|
import org.spongycastle.asn1.x509.*;
|
||||||
import org.bouncycastle.asn1.x509.Extension;
|
import org.spongycastle.asn1.x509.Extension;
|
||||||
import org.bouncycastle.cert.X509v3CertificateBuilder;
|
import org.spongycastle.cert.X509v3CertificateBuilder;
|
||||||
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
|
import org.spongycastle.cert.jcajce.JcaX509CertificateConverter;
|
||||||
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
|
import org.spongycastle.cert.jcajce.JcaX509ExtensionUtils;
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.spongycastle.jce.provider.BouncyCastleProvider;
|
||||||
import org.bouncycastle.operator.ContentSigner;
|
import org.spongycastle.operator.ContentSigner;
|
||||||
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
|
import org.spongycastle.operator.jcajce.JcaContentSignerBuilder;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package meerkat.crypto.concrete;
|
package meerkat.crypto.concrete;
|
||||||
|
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.spongycastle.jce.provider.BouncyCastleProvider;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
|
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
|
||||||
import ch.qos.logback.classic.filter.ThresholdFilter
|
import ch.qos.logback.classic.filter.ThresholdFilter
|
||||||
import ch.qos.logback.core.ConsoleAppender
|
|
||||||
import ch.qos.logback.core.util.Duration
|
import ch.qos.logback.core.util.Duration
|
||||||
|
|
||||||
import static ch.qos.logback.classic.Level.*
|
import static ch.qos.logback.classic.Level.*
|
||||||
|
|
||||||
if (System.getProperty("log.debug") != null) {
|
if (System.getProperty("log.debug") != null) {
|
||||||
|
@ -41,6 +39,4 @@ if (haveBeagle) {
|
||||||
appenders += ["SOCKET"]
|
appenders += ["SOCKET"]
|
||||||
}
|
}
|
||||||
|
|
||||||
root(LOG_LEVEL, appenders)
|
root(LOG_LEVEL, appenders)
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class PollingStationToyRun {
|
||||||
scanner = new PollingStationWebScanner(0, CONTEXT_PATH);
|
scanner = new PollingStationWebScanner(0, CONTEXT_PATH);
|
||||||
PollingStation.ConnectionServerData serverData = scanner.start(true);
|
PollingStation.ConnectionServerData serverData = scanner.start(true);
|
||||||
|
|
||||||
logger.info("Started polling station web scanner on {}", serverData.getServerUrl());
|
logger.info("Started polling station web scanner on {} (nonce: {})", serverData.getServerUrl(), Long.toUnsignedString(serverData.getNonce()));
|
||||||
PollingStationMainController controller = new PollingStationMainController();
|
PollingStationMainController controller = new PollingStationMainController();
|
||||||
controller.init(scanner);
|
controller.init(scanner);
|
||||||
|
|
||||||
|
|
|
@ -242,7 +242,8 @@ public class PollingStationWebScanner implements PollingStationScanner.PollingSt
|
||||||
@Override
|
@Override
|
||||||
public PollingStation.ConnectionServerData start(boolean verifyScanner) throws Exception {
|
public PollingStation.ConnectionServerData start(boolean verifyScanner) throws Exception {
|
||||||
this.verifyNonce = this.verifySignatures = verifyScanner;
|
this.verifyNonce = this.verifySignatures = verifyScanner;
|
||||||
nonce = new SecureRandom().nextLong();
|
// Use a 40-bit nonce (should be enough, since you can't do offline verification).
|
||||||
|
nonce = new SecureRandom().nextLong() & 0xffffffffffL;
|
||||||
|
|
||||||
server.start();
|
server.start();
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ sourceCompatibility = '1.7'
|
||||||
ext { isSnapshot = false }
|
ext { isSnapshot = false }
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
groupId = 'org.factcenter.meerkat'
|
groupId = 'org.factcenter.meerkat'
|
||||||
// Credentials for publishing repositories
|
// Credentials for publishing repositories
|
||||||
publishRepository = "https://cs.idc.ac.il/nexus/content/repositories/${project.isSnapshot ? 'snapshots' : 'releases'}"
|
publishRepository = "https://cs.idc.ac.il/nexus/content/repositories/${project.isSnapshot ? 'snapshots' : 'releases'}"
|
||||||
publishUser = project.hasProperty('publishUser') ? project.property('publishUser') : ""
|
publishUser = project.hasProperty('publishUser') ? project.property('publishUser') : ""
|
||||||
|
@ -161,21 +161,6 @@ if (project.hasProperty('mainClassName') && (mainClassName != null)) {
|
||||||
*===================================*/
|
*===================================*/
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
|
||||||
// Prefer the local nexus repository (it may have 3rd party artifacts not found in mavenCentral)
|
|
||||||
maven {
|
|
||||||
url nexusRepository
|
|
||||||
|
|
||||||
if (isSnapshot) {
|
|
||||||
credentials { username
|
|
||||||
password
|
|
||||||
|
|
||||||
username nexusUser
|
|
||||||
password nexusPassword
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use local maven repository
|
// Use local maven repository
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue