package com.door43.translationstudio.tasks;
import android.os.Process;
import com.door43.tools.reporting.Logger;
import com.door43.translationstudio.AppContext;
import com.door43.translationstudio.R;
import com.door43.translationstudio.SettingsActivity;
import com.door43.translationstudio.core.Profile;
import com.door43.util.FileUtilities;
import com.door43.util.tasks.ManagedTask;
import org.unfoldingword.gogsclient.GogsAPI;
import org.unfoldingword.gogsclient.PublicKey;
import org.unfoldingword.gogsclient.Response;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Created by joel on 4/18/16.
*/
public class RegisterSSHKeysTask extends ManagedTask {
public static final String TASK_ID = "register_ssh_public_key_task";
private final boolean force;
private final String keyName;
private boolean success = false;
/**
*
* @param force indicates if existing ssh keys should be regenerated
*/
public RegisterSSHKeysTask(boolean force) {
setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
this.force = force;
this.keyName = AppContext.context().getResources().getString(R.string.gogs_public_key_name) + " " + AppContext.udid();
}
@Override
public void start() {
if(AppContext.context().isNetworkAvailable()) {
publishProgress(-1, "Authenticating");
GogsAPI api = new GogsAPI(AppContext.getUserString(SettingsActivity.KEY_PREF_GOGS_API, R.string.pref_default_gogs_api));
Profile profile = AppContext.getProfile();
if (profile != null && profile.gogsUser != null) {
if (!AppContext.context().hasSSHKeys() || this.force) {
AppContext.context().generateSSHKeys();
}
String keyString = null;
try {
keyString = FileUtilities.readFileToString(new File(AppContext.context().getPublicKey().getAbsolutePath())).trim();
} catch (IOException e) {
e.printStackTrace();
Logger.e(this.getClass().getName(), "Failed to retreive the public key", e);
return;
}
PublicKey keyTemplate = new PublicKey(keyName, keyString);
// delete old key
List<PublicKey> keys = api.listPublicKeys(profile.gogsUser);
for(PublicKey k:keys) {
if(k.getTitle().equals(keyTemplate.getTitle())) {
api.deletePublicKey(k, profile.gogsUser);
break;
}
}
// create new key
PublicKey key = api.createPublicKey(keyTemplate, profile.gogsUser);
if (key != null) {
success = true;
} else {
Response response = api.getLastResponse();
Logger.w(this.getClass().getName(), "Failed to register the public key. Gogs responded with " + response.code + ": " + response.data, response.exception);
}
}
}
}
public boolean isSuccess() {
return success;
}
}