зеркало из https://github.com/nextcloud/android.git
This commit is contained in:
Родитель
590e617c8a
Коммит
cd0bebf45e
|
@ -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;
|
||||||
|
@ -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);
|
} else if (result.getCode() == ResultCode.SYNC_CONFLICT) {
|
||||||
temporalFile.delete();
|
getStorageManager().saveConflict(mFile, mFile.getEtagInConflict());
|
||||||
}
|
}
|
||||||
mFile.setStoragePath("");
|
|
||||||
saveUploadedFile(client);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FileUploader.LOCAL_BEHAVIOUR_DELETE:
|
|
||||||
Log_OC.d(TAG, "Delete source file");
|
|
||||||
|
|
||||||
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>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче