Skip to content
Snippets Groups Projects
Commit d1df014c authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Make the current SSL session available to the frontend

parent 2ee0c54e
No related branches found
No related tags found
No related merge requests found
Showing
with 79 additions and 36 deletions
......@@ -10,6 +10,7 @@ import de.kuschku.libquassel.protocol.Message.MessageType.*
import de.kuschku.libquassel.protocol.Message_Type
import de.kuschku.quasseldroid_ng.R
import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
import de.kuschku.quasseldroid_ng.util.helper.styledAttributes
import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils
import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter
import org.threeten.bp.ZoneId
......@@ -20,23 +21,21 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
private val timeFormatter = DateTimeFormatter.ofPattern(
(DateFormat.getTimeFormat(context) as SimpleDateFormat).toLocalizedPattern()
)
private val senderColors: IntArray
private lateinit var senderColors: IntArray
private val zoneId = ZoneId.systemDefault()
init {
val typedArray = context.obtainStyledAttributes(
intArrayOf(
context.theme.styledAttributes(
R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF
)
)
) {
senderColors = IntArray(16) {
typedArray.getColor(it, 0)
getColor(it, 0)
}
}
typedArray.recycle()
}
override fun layout(type: Message_Type?, hasHighlight: Boolean)
......@@ -66,7 +65,8 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
}
override fun render(message: QuasselDatabase.DatabaseMessage): FormattedMessage {
return FormattedMessage(
when (message.type) {
else -> return FormattedMessage(
message.messageId,
timeFormatter.format(message.time.atZone(zoneId)),
SpanFormatter.format(
......@@ -77,6 +77,7 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
)
)
}
}
private fun formatNick(sender: String): CharSequence {
val nick = IrcUserUtils.nick(sender)
......
......@@ -15,10 +15,7 @@ import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.session.Backend
import de.kuschku.libquassel.session.SessionManager
import de.kuschku.quasseldroid_ng.R
import de.kuschku.quasseldroid_ng.util.helper.map
import de.kuschku.quasseldroid_ng.util.helper.switchMap
import de.kuschku.quasseldroid_ng.util.helper.switchMapRx
import de.kuschku.quasseldroid_ng.util.helper.visibleIf
import de.kuschku.quasseldroid_ng.util.helper.*
import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment
class ToolbarFragment : ServiceBoundFragment() {
......@@ -41,6 +38,14 @@ class ToolbarFragment : ServiceBoundFragment() {
}
}
private val isSecure: LiveData<Boolean?> = sessionManager.switchMapRx(
SessionManager::session
).switchMapRx { session ->
session.state.map { state ->
session.sslSession != null
}
}
var title: CharSequence
get() = toolbarTitle.text
set(value) {
......@@ -60,12 +65,15 @@ class ToolbarFragment : ServiceBoundFragment() {
val view = inflater.inflate(R.layout.fragment_toolbar, container, false)
ButterKnife.bind(this, view)
currentBufferInfo.observe(
currentBufferInfo.zip(isSecure).observe(
this, Observer {
title = it?.bufferName ?: resources.getString(
if (it != null) {
val (info, isSecure) = it
this.title = info?.bufferName ?: resources.getString(
R.string.app_name
)
}
}
)
return view
......
......@@ -44,7 +44,8 @@
android:layout_marginEnd="@dimen/message_horizontal"
android:layout_marginRight="@dimen/message_horizontal"
android:textColor="?attr/colorForegroundSecondary"
android:typeface="monospace" />
android:typeface="monospace"
tools:text="[15:55]" />
<TextView
android:id="@+id/content"
......@@ -53,5 +54,6 @@
android:layout_weight="1"
android:textColor="?attr/colorForegroundAction"
android:textIsSelectable="true"
android:textStyle="italic" />
android:textStyle="italic"
tools:text="-*- justJanne loves the new version" />
</LinearLayout>
......@@ -15,6 +15,7 @@
android:paddingStart="@dimen/message_horizontal"
android:paddingTop="@dimen/message_vertical"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
tools:background="@android:color/background_light"
tools:theme="@style/Theme.ChatTheme.Quassel_Light">
<TextView
......@@ -24,7 +25,8 @@
android:layout_marginEnd="@dimen/message_horizontal"
android:layout_marginRight="@dimen/message_horizontal"
android:textColor="?attr/colorForegroundSecondary"
android:typeface="monospace" />
android:typeface="monospace"
tools:text="[15:55]" />
<TextView
android:id="@+id/content"
......@@ -33,5 +35,6 @@
android:layout_weight="1"
android:textColor="?attr/colorForegroundError"
android:textIsSelectable="true"
android:textStyle="italic" />
android:textStyle="italic"
tools:text="everyone: deserves a chance to fly. No such channel" />
</LinearLayout>
......@@ -15,6 +15,7 @@
android:paddingStart="@dimen/message_horizontal"
android:paddingTop="@dimen/message_vertical"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
tools:background="@android:color/background_light"
tools:theme="@style/Theme.ChatTheme.Quassel_Light">
<TextView
......@@ -24,7 +25,8 @@
android:layout_marginEnd="@dimen/message_horizontal"
android:layout_marginRight="@dimen/message_horizontal"
android:textColor="?attr/colorForegroundSecondary"
android:typeface="monospace" />
android:typeface="monospace"
tools:text="[15:55]" />
<TextView
android:id="@+id/content"
......@@ -33,5 +35,6 @@
android:layout_weight="1"
android:textColor="?attr/colorForegroundSecondary"
android:textIsSelectable="true"
android:textStyle="italic" />
android:typeface="monospace"
tools:text="Connecting to irc.freenode.net:6667..." />
</LinearLayout>
......@@ -223,4 +223,7 @@ class CoreConnection(
dataBuffer.hexDump()
}
}
val sslSession
get() = channel?.sslSession
}
......@@ -2,13 +2,18 @@ package de.kuschku.libquassel.session
import de.kuschku.libquassel.protocol.IdentityId
import de.kuschku.libquassel.protocol.NetworkId
import de.kuschku.libquassel.protocol.Quassel_Features
import de.kuschku.libquassel.quassel.syncables.*
import io.reactivex.Observable
import io.reactivex.subjects.BehaviorSubject
import java.io.Closeable
import javax.net.ssl.SSLSession
interface ISession : Closeable {
val state: Observable<ConnectionState>
val coreFeatures: Quassel_Features
val negotiatedFeatures: Quassel_Features
val sslSession: SSLSession?
val aliasManager: AliasManager?
val backlogManager: BacklogManager?
......@@ -27,6 +32,11 @@ interface ISession : Closeable {
companion object {
val NULL = object : ISession {
override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED)
override val coreFeatures: Quassel_Features = Quassel_Features.of()
override val negotiatedFeatures: Quassel_Features = Quassel_Features.of()
override val sslSession: SSLSession? = null
override val rpcHandler: RpcHandler? = null
override val aliasManager: AliasManager? = null
override val backlogManager: BacklogManager? = null
......@@ -43,7 +53,6 @@ interface ISession : Closeable {
override val initStatus: Observable<Pair<Int, Int>> = Observable.just(0 to 0)
override fun close() = Unit
override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED)
}
}
}
......@@ -23,10 +23,13 @@ class Session(
backlogStorage: BacklogStorage,
private val userData: Pair<String, String>
) : ProtocolHandler(), ISession {
var coreFeatures: Quassel_Features = Quassel_Feature.NONE
val negotiatedFeatures
override var coreFeatures: Quassel_Features = Quassel_Feature.NONE
override val negotiatedFeatures
get() = coreFeatures and clientData.clientFeatures
override val sslSession
get() = coreConnection.sslSession
private val coreConnection = CoreConnection(this, address, handlerService)
override val state = coreConnection.state
......
......@@ -3,6 +3,7 @@ package de.kuschku.libquassel.session
import de.kuschku.libquassel.protocol.ClientData
import de.kuschku.libquassel.protocol.IdentityId
import de.kuschku.libquassel.protocol.NetworkId
import de.kuschku.libquassel.protocol.Quassel_Features
import de.kuschku.libquassel.quassel.syncables.*
import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
import de.kuschku.libquassel.util.compatibility.HandlerService
......@@ -11,9 +12,16 @@ import de.kuschku.libquassel.util.compatibility.log
import de.kuschku.libquassel.util.helpers.or
import io.reactivex.Observable
import io.reactivex.subjects.BehaviorSubject
import javax.net.ssl.SSLSession
import javax.net.ssl.X509TrustManager
class SessionManager(offlineSession: ISession, val backlogStorage: BacklogStorage) : ISession {
override val coreFeatures: Quassel_Features
get() = session.or(lastSession).coreFeatures
override val negotiatedFeatures: Quassel_Features
get() = session.or(lastSession).negotiatedFeatures
override val sslSession: SSLSession?
get() = session.or(lastSession).sslSession
override val aliasManager: AliasManager?
get() = session.or(lastSession).aliasManager
override val backlogManager: BacklogManager?
......
......@@ -63,7 +63,7 @@ class WrappedChannel(
val managers = arrayOf(certificateManager)
context.init(null, managers, null)
val factory = context.socketFactory
val socket = factory.createSocket(socket, address.host, address.port.toInt(), true) as SSLSocket
val socket = factory.createSocket(socket, address.host, address.port, true) as SSLSocket
socket.useClientMode = true
socket.startHandshake()
return WrappedChannel.ofSocket(socket)
......@@ -187,4 +187,7 @@ class WrappedChannel(
override fun flush() {
flusher?.invoke()
}
val sslSession
get() = (socket as? SSLSocket)?.session
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment