This commit is contained in:
tobiasKaminsky 2017-11-22 07:15:38 +01:00
Родитель 590e617c8a
Коммит cd0bebf45e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 0E00D4D47D0C5AF7
4 изменённых файлов: 33 добавлений и 119 удалений

Просмотреть файл

@ -1 +1,2 @@
include ':nextcloud-android-library' //include ':'
include 'nextcloud-android-library'

Просмотреть файл

@ -396,50 +396,7 @@ public class UploadFileOperation extends SyncOperation {
File originalFile = new File(mOriginalStoragePath); File originalFile = new File(mOriginalStoragePath);
File expectedFile = null; File expectedFile = null;
FileLock fileLock = null; FileLock fileLock = null;
long size = 0; long size;
boolean metadataExists = false;
String token = null;
ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(getContext().getContentResolver());
String privateKey = arbitraryDataProvider.getValue(getAccount().name, EncryptionUtils.PRIVATE_KEY);
String publicKey = arbitraryDataProvider.getValue(getAccount().name, EncryptionUtils.PUBLIC_KEY);
/// check the existence of the parent folder for the file to upload
String remoteParentPath = new File(getRemotePath()).getParent();
remoteParentPath = remoteParentPath.endsWith(OCFile.PATH_SEPARATOR) ?
remoteParentPath : remoteParentPath + OCFile.PATH_SEPARATOR;
RemoteOperationResult result = grantFolderExistence(remoteParentPath, client);
if (!result.isSuccess()) {
return result;
}
OCFile parent = getStorageManager().getFileByPath(remoteParentPath);
mFile.setParentId(parent.getFileId());
if (parent.isEncrypted()) {
Log_OC.d(TAG, "encrypted upload");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
return encryptedUpload(client, parent);
} else {
Log_OC.e(TAG, "Encrypted upload on old Android API");
return new RemoteOperationResult(ResultCode.OLD_ANDROID_API);
}
} else {
Log_OC.d(TAG, "normal upload");
return normalUpload(client);
}
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private RemoteOperationResult encryptedUpload(OwnCloudClient client, OCFile parentFile) {
RemoteOperationResult result = null;
File temporalFile = null;
File originalFile = new File(mOriginalStoragePath);
File expectedFile = null;
FileLock fileLock = null;
boolean metadataExists = false; boolean metadataExists = false;
String token = null; String token = null;
@ -453,8 +410,8 @@ public class UploadFileOperation extends SyncOperation {
// check conditions // check conditions
result = checkConditions (originalFile); result = checkConditions (originalFile);
/***** E2E *****/ /***** E2E *****/
// Lock folder // Lock folder
LockFileOperation lockFileOperation = new LockFileOperation(parentFile.getLocalId()); LockFileOperation lockFileOperation = new LockFileOperation(parentFile.getLocalId());
@ -663,15 +620,15 @@ public class UploadFileOperation extends SyncOperation {
// } // }
result = mUploadOperation.execute(client); result = mUploadOperation.execute(client);
if (result == null || result.isSuccess() && mUploadOperation != null) { // if (result == null || result.isSuccess() && mUploadOperation != null) {
result = mUploadOperation.execute(client); // result = mUploadOperation.execute(client);
/// move local temporal file or original file to its corresponding /// move local temporal file or original file to its corresponding
// location in the Nextcloud local folder // location in the Nextcloud local folder
if (!result.isSuccess() && result.getHttpCode() == HttpStatus.SC_PRECONDITION_FAILED) { if (!result.isSuccess() && result.getHttpCode() == HttpStatus.SC_PRECONDITION_FAILED) {
result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);
}
} }
// }
if (result.isSuccess()) { if (result.isSuccess()) {
// upload metadata // upload metadata
@ -720,15 +677,8 @@ public class UploadFileOperation extends SyncOperation {
} finally { } finally {
mUploadStarted.set(false); mUploadStarted.set(false);
// unlock file // unlock folder
if (token != null) { unlockFolder(parentFile, client, token);
UnlockFileOperation unlockFileOperation = new UnlockFileOperation(parentFile.getLocalId(), token);
RemoteOperationResult unlockFileOperationResult = unlockFileOperation.execute(client);
if (!unlockFileOperationResult.isSuccess()) {
Log_OC.e(TAG, "Failed to unlock " + parentFile.getLocalId());
}
}
if (fileLock != null) { if (fileLock != null) {
try { try {
@ -765,66 +715,29 @@ public class UploadFileOperation extends SyncOperation {
} }
} }
switch (mLocalBehaviour) { // TODO on failure store token
case FileUploader.LOCAL_BEHAVIOUR_FORGET: if (result.isSuccess()) {
String temporalPath = FileStorageUtils.getTemporalPath(mAccount.name) + mFile.getRemotePath(); handleSuccessfulUpload(temporalFile, expectedFile, originalFile, client);
if (mOriginalStoragePath.equals(temporalPath)) { unlockFolder(parentFile, client, token);
// delete local file is was pre-copied in temporary folder (see .ui.helpers.UriUploader)
temporalFile = new File(temporalPath);
temporalFile.delete();
}
mFile.setStoragePath("");
saveUploadedFile(client);
break;
case FileUploader.LOCAL_BEHAVIOUR_DELETE: } else if (result.getCode() == ResultCode.SYNC_CONFLICT) {
Log_OC.d(TAG, "Delete source file"); getStorageManager().saveConflict(mFile, mFile.getEtagInConflict());
originalFile.delete();
getStorageManager().deleteFileInMediaScan(originalFile.getAbsolutePath());
saveUploadedFile(client);
break;
case FileUploader.LOCAL_BEHAVIOUR_COPY:
if (temporalFile != null) {
try {
move(temporalFile, expectedFile);
} catch (IOException e) {
e.printStackTrace();
}
}
mFile.setStoragePath(expectedFile.getAbsolutePath());
saveUploadedFile(client);
FileDataStorageManager.triggerMediaScan(expectedFile.getAbsolutePath());
break;
case FileUploader.LOCAL_BEHAVIOUR_MOVE:
String expectedPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, mFile);
expectedFile = new File(expectedPath);
try {
move(originalFile, expectedFile);
} catch (IOException e) {
e.printStackTrace();
}
getStorageManager().deleteFileInMediaScan(originalFile.getAbsolutePath());
mFile.setStoragePath(expectedFile.getAbsolutePath());
saveUploadedFile(client);
FileDataStorageManager.triggerMediaScan(expectedFile.getAbsolutePath());
break;
} }
// TODO
// if (result.isSuccess()) {
// handleSuccessfulUpload(temporalFile, expectedFile, originalFile, client);
// } else if (result.getCode() == ResultCode.SYNC_CONFLICT) {
// getStorageManager().saveConflict(mFile, mFile.getEtagInConflict());
// }
return result; return result;
} }
private void unlockFolder(OCFile parentFolder, OwnCloudClient client, String token) {
if (token != null) {
UnlockFileOperation unlockFileOperation = new UnlockFileOperation(parentFolder.getLocalId(), token);
RemoteOperationResult unlockFileOperationResult = unlockFileOperation.execute(client);
if (!unlockFileOperationResult.isSuccess()) {
Log_OC.e(TAG, "Failed to unlock " + parentFolder.getLocalId());
}
}
}
private RemoteOperationResult checkConditions(File originalFile) { private RemoteOperationResult checkConditions(File originalFile) {
if (Device.getNetworkType(mContext).equals(JobRequest.NetworkType.ANY) || if (Device.getNetworkType(mContext).equals(JobRequest.NetworkType.ANY) ||
ConnectivityUtils.isInternetWalled(mContext)) { ConnectivityUtils.isInternetWalled(mContext)) {

Просмотреть файл

@ -471,6 +471,7 @@ public class EncryptionUtils {
String[] strings = string.split(ivDelimiter); String[] strings = string.split(ivDelimiter);
String cipherString = strings[0]; String cipherString = strings[0];
byte[] iv = new IvParameterSpec(decodeStringToBase64Bytes(strings[1])).getIV(); byte[] iv = new IvParameterSpec(decodeStringToBase64Bytes(strings[1])).getIV();
Key key = new SecretKeySpec(encryptionKeyBytes, "AES"); Key key = new SecretKeySpec(encryptionKeyBytes, "AES");

Просмотреть файл

@ -268,8 +268,7 @@
<string name="favorite_real">Set as favorite</string> <string name="favorite_real">Set as favorite</string>
<string name="unset_favorite_real">Unset favorite</string> <string name="unset_favorite_real">Unset favorite</string>
<string name="favorite_switch">Available offline</string> <string name="favorite_switch">Available offline</string>
<string name="encrypted">Set as encrypted</string> <string name="favorite_switch">Available offline</string>
<string name="unset_encrypted">Unset encryption</string>
<string name="encrypted">Set as encrypted</string> <string name="encrypted">Set as encrypted</string>
<string name="unset_encrypted">Unset encryption</string> <string name="unset_encrypted">Unset encryption</string>
<string name="common_rename">Rename</string> <string name="common_rename">Rename</string>