[Android] Remote Access: Allow bypassing HTTPS and WebSocket auth checks in debug builds

Nicolas Pomepuy git at videolan.org
Wed Oct 21 05:39:23 UTC 2026


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Oct 21 07:24:07 2026 +0200| [303d368279e720d437f715aea48f50132bef28a9] | committer: Nicolas Pomepuy

Remote Access: Allow bypassing HTTPS and WebSocket auth checks in debug builds

> https://code.videolan.org/videolan/vlc-android/commit/303d368279e720d437f715aea48f50132bef28a9
---

 .../videolan/vlc/remoteaccessserver/routing/RemoteAccessRouting.kt    | 2 +-
 .../vlc/remoteaccessserver/routing/RemoteAccessRoutingAuth.kt         | 4 ++--
 .../vlc/remoteaccessserver/routing/RemoteAccessRoutingCommon.kt       | 2 +-
 .../vlc/remoteaccessserver/websockets/RemoteAccessWebSockets.kt       | 1 +
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRouting.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRouting.kt
index 15ca0e3449..b8492d44d7 100644
--- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRouting.kt
+++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRouting.kt
@@ -54,7 +54,7 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
     authenticate("user_session", optional = RemoteAccessServer.byPassAuth) {
         intercept(ApplicationCallPipeline.Call) {
             val server = RemoteAccessServer.getInstance(appContext)
-            if (!server.isHttpsPort(call.request.local.serverPort)) {
+            if (!RemoteAccessServer.byPassAuth && !server.isHttpsPort(call.request.local.serverPort)) {
                 call.respond(HttpStatusCode.Forbidden)
                 finish()
             }
diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingAuth.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingAuth.kt
index a5f77b6267..6da2f1bc88 100644
--- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingAuth.kt
+++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingAuth.kt
@@ -51,7 +51,7 @@ fun Route.publicAuthRouting(appContext: Context, scope: CoroutineScope, settings
     //the client is requesting a new code.
     // if the formparameters "challenge" is sent. Remove the corresponding code
     post("/code") {
-        if (!RemoteAccessServer.getInstance(appContext).isHttpsPort(call.request.local.serverPort)) {
+        if (!RemoteAccessServer.byPassAuth && !RemoteAccessServer.getInstance(appContext).isHttpsPort(call.request.local.serverPort)) {
             call.respond(HttpStatusCode.Forbidden)
             return at post
         }
@@ -72,7 +72,7 @@ fun Route.publicAuthRouting(appContext: Context, scope: CoroutineScope, settings
     }
     //Verify the code and inject the cookie if valid
     post("/verify-code") {
-        if (!RemoteAccessServer.getInstance(appContext).isHttpsPort(call.request.local.serverPort)) {
+        if (!RemoteAccessServer.byPassAuth && !RemoteAccessServer.getInstance(appContext).isHttpsPort(call.request.local.serverPort)) {
             call.respond(HttpStatusCode.Forbidden)
             return at post
         }
diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingCommon.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingCommon.kt
index 278fc9f02f..0fb5de6dd8 100644
--- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingCommon.kt
+++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/routing/RemoteAccessRoutingCommon.kt
@@ -65,7 +65,7 @@ fun Route.publicCommonRouting(appContext: Context) {
     // Main end point redirect to index.html
     get("/") {
         val isHttps = RemoteAccessServer.getInstance(appContext).isHttpsPort(call.request.local.serverPort)
-        if (isHttps) {
+        if (isHttps || RemoteAccessServer.byPassAuth) {
             call.respondRedirect("index.html", permanent = true)
         } else {
             call.respondRedirect("/index.html#/ssl", permanent = false)
diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/websockets/RemoteAccessWebSockets.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/websockets/RemoteAccessWebSockets.kt
index 19dd684b30..f9014bd2f2 100644
--- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/websockets/RemoteAccessWebSockets.kt
+++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/websockets/RemoteAccessWebSockets.kt
@@ -276,6 +276,7 @@ object RemoteAccessWebSockets {
      * @return true if the websocket message is allowed
      */
     private fun verifyWebsocketAuth(incomingMessage: WSIncomingMessage?): Boolean {
+        if (RemoteAccessServer.byPassAuth) return true
         synchronized(tickets) {
             tickets.removeIf { it.expiration < System.currentTimeMillis() }
             return incomingMessage?.authTicket != null && tickets.firstOrNull { incomingMessage.authTicket == it.id } != null



More information about the Android mailing list