Добавить самозаверяющий сертификат с помощью модифицированного вызова - PullRequest
0 голосов
/ 22 октября 2019

Я хочу добавить самозаверяющий сертификат, используя модификацию, для этого мне нужно передать контекст, но возникают проблемы с передачей контекста через модель MVC

Модифицированный клиент

object RetrofitClient    {
  fun call(context: Context): Webservice {
    val webservice by lazy {
        Retrofit.Builder()
            //  .baseUrl("http://68.183.183.255:8080")
            //.baseUrl("http://my-json-server.typicode.com")
            .baseUrl("https://54roh005p5.execute-api.us-west-2.amazonaws.com/mdv/cloud/login/")
            .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
            .addConverterFactory(ScalarsConverterFactory.create())
            .client(SelfSigningClientBuilder.createClient(context))
            .build().create(Webservice::class.java)
    }
    return webservice
  }
}

Репозиторий

class TodoRepository(context:Context) {

   private var client:Webservice = RetrofitClient.call(context)
   //suspend fun getTodo(id: String) = client.getTodo(id)
   suspend fun getTodo(id: User) = client.getTodo(id)
}

ViewModel

class NetworkViewModel(context: Context) : ViewModel() {

  var repository: TodoRepository  = TodoRepository(context)
  fun getTodo(arg : User):LiveData<Response<com.example.myapplication.entity.UserData>> {
    val result = liveData(Dispatchers.IO) {
        val retrivedTodo = repository.getTodo(arg)

        emit(retrivedTodo)
      }
    return result
   }
}

MainActivity

networkViewModel=ViewModelProviders.of(this).get(NetworkViewModel(this)::class.java)

выдает ошибку

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.myapplication.network.NetworkViewModel

что я делаюнеправильно. Если есть лучший метод, пожалуйста, предложите его

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Вы можете настроить свои OkHttpClients sslSocketFactory

например (настройка клиента Retrofit)

val retrofit Retrofit
    .Builder()
    .client(client)
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()

например (настройка sslSocketFactory OkHttpsClient)

  val client =OkHttpClient.Builder()
            .sslSocketFactory(sslContextWithSS.getSocketFactory())
            .build()

например (SSLSocketFactory с пользовательским сертификатом)

        val keyStore = readKeyStore() //your method to obtain KeyStore
        val sslContext = SSLContext.getInstance("SSL")
        val trustManagerFactory = TrustManagerFactory.getInstance(getDefaultAlgorithm())
        trustManagerFactory.init(keyStore)
        val keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
        keyManagerFactory.init(keyStore, "keystore_pass".toCharArray())
        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), SecureRandom())
        client.setSslSocketFactory(sslContext.getSocketFactory())

Получение KeyStore с вашим CustomCertificate

 fun readKeyStore()= KeyStore.getInstance(KeyStore.getDefaultType()).also{
  try (val inputStream = context.getResources().openRawResource(R.raw.custom_certificate)) {
        it.load(inputStream, getPassword());
    }
}


0 голосов
/ 22 октября 2019

Вместо передачи контекста от класса к классу хорошо создать класс приложения и использовать этот контекст приложения, когда это необходимо. Пожалуйста, проверьте ниже:

class MainApplication : Application() {
    companion object {
        private lateinit var instance: MainApplication

        fun applicationContext() : Context {
            return instance.applicationContext
        }
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}

Затем в тег приложения AndroidManifest добавьте android:name=".MainApplication"

Затем вызовите MainApplication.applicationContext (), чтобы получить Context из любого места.

0 голосов
/ 22 октября 2019

Не инициализировать объект ViewModel через конструктор: - NetworkViewModel(this)::class.java неверно. Использование: -

 networkViewModel = ViewModelProviders.of(this).get(NetworkViewModel::class.java)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...