plugin android: use certifi SSL root certicates

This commit is contained in:
Goffi 2020-04-01 22:28:50 +02:00
commit e573f7f627

View file

@ -21,12 +21,7 @@ import os
import os.path
import json
from pathlib import Path
from sat.core.i18n import _, D_
from sat.core.constants import Const as C
from sat.core.log import getLogger
from sat.core import exceptions
from sat.tools.common import async_process
from sat.memory import params
from zope.interface import implementer
from twisted.names import client as dns_client
from twisted.python.procutils import which
from twisted.internet import defer
@ -34,6 +29,14 @@ from twisted.internet import reactor
from twisted.internet import protocol
from twisted.internet import abstract
from twisted.internet import error as int_error
from twisted.internet import _sslverify
from sat.core.i18n import _, D_
from sat.core.constants import Const as C
from sat.core.log import getLogger
from sat.core import exceptions
from sat.tools.common import async_process
from sat.memory import params
log = getLogger(__name__)
@ -54,6 +57,7 @@ if sys.platform != "android":
import re
import certifi
from plyer import vibrator
from android import api_version
from plyer.platforms.android import activity
@ -111,6 +115,19 @@ NET_TYPE_OTHER = "other"
INTENT_EXTRA_ACTION = AndroidString("org.salut-a-toi.IntentAction")
@implementer(_sslverify.IOpenSSLTrustRoot)
class AndroidTrustPaths:
def _addCACertsToContext(self, context):
# twisted doesn't have access to Android root certificates
# we use certifi to work around that (same thing is done in Kivy)
context.load_verify_locations(certifi.where())
def platformTrust():
return AndroidTrustPaths()
class Notification(AndroidNotification):
# We extend plyer's AndroidNotification instead of creating directly with jnius
# because it already handles issues like backward compatibility, and we just want to
@ -275,6 +292,10 @@ class AndroidPlugin(object):
self.notif_player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION)
self.notif_player.prepare()
# SSL fix
_sslverify.platformTrust = platformTrust
log.info("SSL Android patch applied")
# DNS fix
defer.ensureDeferred(self.updateResolver())