diff --git a/otgc/build.gradle b/otgc/build.gradle index 78604feb710d75d7be6d3d6c48bb22844f267996..3210a6641444e3ef455976581408caaf4dbf79aa 100644 --- a/otgc/build.gradle +++ b/otgc/build.gradle @@ -30,7 +30,7 @@ android { minSdkVersion 21 targetSdkVersion 28 versionCode 13 - versionName "2.5.0" + versionName "2.6.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" compileOptions { diff --git a/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IORepository.java b/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IORepository.java index d8fa8cb98d081815aa3f0be05c3a43b7e57d19f9..c98c061b0d8eb6a2a20791949bb9e1e43b749fac 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IORepository.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IORepository.java @@ -154,6 +154,15 @@ public class IORepository { }); } + public Single getFileAsX509Certificate(InputStream is) { + return Single.create(emitter -> { + Security.addProvider(new BouncyCastleProvider()); + CertificateFactory factory = CertificateFactory.getInstance("X.509", BouncyCastleProvider.PROVIDER_NAME); + X509Certificate caCert = (X509Certificate) factory.generateCertificate(is); + emitter.onSuccess(caCert); + }); + } + public Single getBytesFromFile(String path) { return Single.fromCallable(() -> { byte[] fileBytes; diff --git a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/trustanchor/StoreTrustAnchorUseCase.java b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/trustanchor/StoreTrustAnchorUseCase.java index 4071cf1638804ef77a0f9414a25653e961c381aa..0ed549cc875249994e3d88c6a546fb01d37af818 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/trustanchor/StoreTrustAnchorUseCase.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/trustanchor/StoreTrustAnchorUseCase.java @@ -19,11 +19,12 @@ package org.openconnectivity.otgc.domain.usecase.trustanchor; import io.reactivex.Completable; -import org.iotivity.OCPki; import org.openconnectivity.otgc.data.repository.CertRepository; import org.openconnectivity.otgc.data.repository.CmsRepository; import org.openconnectivity.otgc.data.repository.IORepository; +import java.io.InputStream; + import javax.inject.Inject; public class StoreTrustAnchorUseCase { @@ -41,8 +42,8 @@ public class StoreTrustAnchorUseCase { this.cmsRepository = cmsRepository; } - public Completable execute(String path) { - return ioRepository.getFileAsX509Certificate(path) + public Completable execute(InputStream is) { + return ioRepository.getFileAsX509Certificate(is) .flatMap(certRepository::x509CertificateToPemString) .flatMapCompletable(cmsRepository::addTrustAnchor); } diff --git a/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java b/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java index 17a933d28ae5bbf8f19662a5dd5b21a967b54cb5..2b301866c6e8ebdad7c6e46425643c4ee1f9ce07 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java @@ -42,7 +42,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import org.openconnectivity.otgc.R; import org.openconnectivity.otgc.domain.model.resource.secure.cred.OcCredential; -import org.openconnectivity.otgc.utils.FilePath; import org.openconnectivity.otgc.utils.di.Injectable; import org.openconnectivity.otgc.utils.view.EmptyRecyclerView; import org.openconnectivity.otgc.utils.viewmodel.ViewModelError; @@ -50,12 +49,16 @@ import org.openconnectivity.otgc.viewmodel.TrustAnchorViewModel; import org.spongycastle.jce.provider.BouncyCastleProvider; import org.spongycastle.util.encoders.Base64; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.security.Security; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; +import java.util.Objects; import javax.inject.Inject; @@ -98,8 +101,13 @@ public class TrustAnchorActivity extends AppCompatActivity implements Injectable Uri uri = null; if (resultData != null) { uri = resultData.getData(); - String path = FilePath.getPath(this, uri); - mViewModel.addTrustAnchor(path); + try { + mViewModel.addTrustAnchor(getContentResolver().openInputStream(uri)); + } catch (Exception e) { + int errorId = R.string.trust_anchor_create_error; + Toast.makeText(this, errorId, Toast.LENGTH_SHORT).show(); + } + } } } diff --git a/otgc/src/main/java/org/openconnectivity/otgc/viewmodel/TrustAnchorViewModel.java b/otgc/src/main/java/org/openconnectivity/otgc/viewmodel/TrustAnchorViewModel.java index 3f11fbc5950ffea541acb9e6b0db43029e6fbbd0..7849c2ce9af96f64213196da4ddf5ece69117eac 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/viewmodel/TrustAnchorViewModel.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/viewmodel/TrustAnchorViewModel.java @@ -14,7 +14,7 @@ import org.openconnectivity.otgc.utils.rx.SchedulersFacade; import org.openconnectivity.otgc.utils.viewmodel.ViewModelError; import org.openconnectivity.otgc.utils.viewmodel.ViewModelErrorType; -import java.io.File; +import java.io.InputStream; import javax.inject.Inject; @@ -85,8 +85,8 @@ public class TrustAnchorViewModel extends ViewModel { )); } - public void addTrustAnchor(String path) { - disposable.add(storeTrustAnchorUseCase.execute(path) + public void addTrustAnchor(InputStream is) { + disposable.add(storeTrustAnchorUseCase.execute(is) .subscribeOn(schedulersFacade.io()) .observeOn(schedulersFacade.ui()) .subscribe(