diff --git a/android-shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/common/network/WatchTogetherRealtimeWebSocketTest.kt b/android-shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/common/network/WatchTogetherRealtimeWebSocketTest.kt index ab0941ee4..27d1cdcc3 100644 --- a/android-shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/common/network/WatchTogetherRealtimeWebSocketTest.kt +++ b/android-shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/common/network/WatchTogetherRealtimeWebSocketTest.kt @@ -112,7 +112,7 @@ class WatchTogetherRealtimeWebSocketTest { assertEquals("/api/v2/watch-together/rooms/room-a/ws", upgradeA.requestUrl?.encodedPath) assertNull(upgradeA.getHeader("Authorization")) assertNull(upgradeA.getHeader("X-Profile-Id")) - assertEquals("silo.room.v2, silo.ticket.opaque-proof", upgradeA.getHeader("Sec-WebSocket-Protocol")) + assertEquals("prairie.room.v2, prairie.ticket.opaque-proof", upgradeA.getHeader("Sec-WebSocket-Protocol")) } finally { collection?.cancelAndJoin() httpClient.close() @@ -191,7 +191,7 @@ class WatchTogetherRealtimeWebSocketTest { assertNull(request.getHeader("X-Profile-Id")) assertNull(request.getHeader("X-Profile-Token")) assertNull(request.getHeader("X-Room-Token")) - assertEquals("silo.room.v2, silo.ticket.opaque-proof", request.getHeader("Sec-WebSocket-Protocol")) + assertEquals("prairie.room.v2, prairie.ticket.opaque-proof", request.getHeader("Sec-WebSocket-Protocol")) assertTrue(serverSocket.await().close(1000, "physical EOF")) val terminated = assertIs( @@ -298,10 +298,10 @@ class WatchTogetherRealtimeWebSocketTest { MockResponse() .setResponseCode(200) .addHeader("Content-Type", "application/json") - .setBody("""{"ticket":"opaque-proof","expires_in":20,"max_connection_seconds":300,"protocol":"silo.room.v2"}""") + .setBody("""{"ticket":"opaque-proof","expires_in":20,"max_connection_seconds":300,"protocol":"prairie.room.v2"}""") private fun roomUpgrade(listener: WebSocketListener): MockResponse = - MockResponse().withWebSocketUpgrade(listener).addHeader("Sec-WebSocket-Protocol", "silo.room.v2") + MockResponse().withWebSocketUpgrade(listener).addHeader("Sec-WebSocket-Protocol", "prairie.room.v2") private fun approvedConsent(server: MockWebServer): CleartextOriginConsent { val approvedOrigin = canonicalHttpOrigin(server.url("/").toString()) diff --git a/shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketLoopbackTest.kt b/shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketLoopbackTest.kt index 7d7ab6043..34a38b116 100644 --- a/shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketLoopbackTest.kt +++ b/shared/src/androidUnitTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketLoopbackTest.kt @@ -29,7 +29,7 @@ class EventsSocketLoopbackTest { val input = socket.getInputStream().bufferedReader() assertEquals("POST /api/v2/events/ws-ticket HTTP/1.1",input.readLine()) while (!input.readLine().isNullOrEmpty()) { } - val body = """{"ticket":"proof-$attempt","expires_in":30,"max_connection_seconds":300,"protocol":"silo.events.v2"}""" + val body = """{"ticket":"proof-$attempt","expires_in":30,"max_connection_seconds":300,"protocol":"prairie.events.v2"}""" socket.getOutputStream().write("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: ${body.toByteArray().size}\r\nConnection: close\r\n\r\n$body".toByteArray()) socket.getOutputStream().flush() } @@ -44,11 +44,11 @@ class EventsSocketLoopbackTest { if (line.isEmpty()) break headers[line.substringBefore(':').lowercase()] = line.substringAfter(':').trim() } - assertEquals("silo.events.v2, silo.ticket.proof-$attempt",headers["sec-websocket-protocol"]) + assertEquals("prairie.events.v2, prairie.ticket.proof-$attempt",headers["sec-websocket-protocol"]) assertNull(headers["authorization"]); assertNull(headers["x-profile-token"]) val accept = Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-1").digest((headers.getValue("sec-websocket-key")+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").toByteArray())) val output = socket.getOutputStream() - output.write("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $accept\r\nSec-WebSocket-Protocol: silo.events.v2\r\n\r\n".toByteArray()) + output.write("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $accept\r\nSec-WebSocket-Protocol: prairie.events.v2\r\n\r\n".toByteArray()) val text = """{"type":"subscribed","channels":["catalog"]}""".toByteArray() output.write(byteArrayOf(0x81.toByte(),text.size.toByte())); output.write(text); output.flush() // Read the client's subscribe bytes before ending the socket. diff --git a/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/PlaybackRealtimeClient.kt b/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/PlaybackRealtimeClient.kt index 99586eb37..e1787339d 100644 --- a/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/PlaybackRealtimeClient.kt +++ b/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/PlaybackRealtimeClient.kt @@ -267,7 +267,7 @@ class DefaultPlaybackRealtimeClient( ) } -internal const val PLAYBACK_CONTROL_PROTOCOL = "silo.playback-control.v2" +internal const val PLAYBACK_CONTROL_PROTOCOL = "prairie.playback-control.v2" internal fun validPlaybackControlTicket(ticket: WsTicketResponse): Boolean = ticket.protocol == PLAYBACK_CONTROL_PROTOCOL && ticket.expiresIn in 1..30 && @@ -287,5 +287,5 @@ internal fun HttpRequestBuilder.playbackControlUpgrade(scope: AuthScopeSnapshot, authScope(scope); skipPrairieAuth(); singleAttempt() headers.remove(HttpHeaders.Authorization) headers.remove("X-Profile-Id"); headers.remove("X-Profile-Token") - header(HttpHeaders.SecWebSocketProtocol, "$PLAYBACK_CONTROL_PROTOCOL, silo.ticket.${ticket.ticket}") + header(HttpHeaders.SecWebSocketProtocol, "$PLAYBACK_CONTROL_PROTOCOL, prairie.ticket.${ticket.ticket}") } diff --git a/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/WatchTogetherRealtimeClient.kt b/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/WatchTogetherRealtimeClient.kt index ef702a6d2..60230313d 100644 --- a/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/WatchTogetherRealtimeClient.kt +++ b/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/WatchTogetherRealtimeClient.kt @@ -103,7 +103,7 @@ internal fun interface WatchTogetherSocketConnector { suspend fun open(request: WatchTogetherSocketRequest): WatchTogetherSocketConnection } -internal const val ROOM_SOCKET_PROTOCOL = "silo.room.v2" +internal const val ROOM_SOCKET_PROTOCOL = "prairie.room.v2" private fun roomPath(roomId: String) = "/api/v2/watch-together/rooms/${roomId.encodeURLPathPart()}" @@ -145,7 +145,7 @@ internal fun HttpRequestBuilder.roomSocketUpgrade(scope: AuthScopeSnapshot, room authScope(scope); skipPrairieAuth(); singleAttempt() headers.remove(HttpHeaders.Authorization) headers.remove("X-Profile-Id"); headers.remove("X-Profile-Token") - header(HttpHeaders.SecWebSocketProtocol, "$ROOM_SOCKET_PROTOCOL, silo.ticket.${ticket.ticket}") + header(HttpHeaders.SecWebSocketProtocol, "$ROOM_SOCKET_PROTOCOL, prairie.ticket.${ticket.ticket}") } private class KtorWatchTogetherSocketConnection( diff --git a/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Api.kt b/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Api.kt index 97025084a..a6a0bf785 100644 --- a/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Api.kt +++ b/shared/src/commonMain/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Api.kt @@ -73,7 +73,7 @@ class EventsSocketV2Api( internal class EventsTicketFailure(val code: Int) : Exception("Realtime ticket unavailable") -internal const val EVENTS_PROTOCOL = "silo.events.v2" +internal const val EVENTS_PROTOCOL = "prairie.events.v2" internal fun validTicket(ticket: WsTicketResponse): Boolean = ticket.protocol == EVENTS_PROTOCOL && ticket.expiresIn in 1..30 && ticket.maxConnectionSeconds in 1..300 && @@ -94,5 +94,5 @@ internal fun HttpRequestBuilder.eventsUpgrade(scope: AuthScopeSnapshot, ticket: authScope(scope); skipPrairieAuth(); singleAttempt() headers.remove(HttpHeaders.Authorization) headers.remove("X-Profile-Id"); headers.remove("X-Profile-Token") - header(HttpHeaders.SecWebSocketProtocol,"$EVENTS_PROTOCOL, silo.ticket.${ticket.ticket}") + header(HttpHeaders.SecWebSocketProtocol,"$EVENTS_PROTOCOL, prairie.ticket.${ticket.ticket}") } diff --git a/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/PlaybackControlV2Test.kt b/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/PlaybackControlV2Test.kt index 26ab59e4f..5cc1a133f 100644 --- a/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/PlaybackControlV2Test.kt +++ b/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/PlaybackControlV2Test.kt @@ -18,7 +18,7 @@ class PlaybackControlV2Test { playbackControlUpgrade(owner, "session-1", ticket) }.build() assertEquals("wss://example.invalid/api/v2/playback/sessions/session-1/control/ws", request.url.toString()) - assertEquals("$PLAYBACK_CONTROL_PROTOCOL, silo.ticket.single-use-proof", request.headers[HttpHeaders.SecWebSocketProtocol]) + assertEquals("$PLAYBACK_CONTROL_PROTOCOL, prairie.ticket.single-use-proof", request.headers[HttpHeaders.SecWebSocketProtocol]) assertNull(request.headers[HttpHeaders.Authorization]) assertNull(request.headers["X-Profile-Id"]) assertNull(request.headers["X-Profile-Token"]) @@ -28,7 +28,7 @@ class PlaybackControlV2Test { @Test fun rejectsWrongProtocolExpiredTicketAndHeaderInjection() { assertTrue(validPlaybackControlTicket(ticket)) - assertFalse(validPlaybackControlTicket(ticket.copy(protocol = "silo.events.v2"))) + assertFalse(validPlaybackControlTicket(ticket.copy(protocol = "prairie.events.v2"))) assertFalse(validPlaybackControlTicket(ticket.copy(expiresIn = 0))) assertFalse(validPlaybackControlTicket(ticket.copy(maxConnectionSeconds = 14401))) assertFalse(validPlaybackControlTicket(ticket.copy(ticket = "proof, injected"))) diff --git a/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Test.kt b/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Test.kt index dde9e6f49..f19890f2e 100644 --- a/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Test.kt +++ b/shared/src/commonTest/kotlin/org/prairieserver/prairie/network/apiv2/EventsSocketV2Test.kt @@ -14,7 +14,7 @@ import kotlin.test.* class EventsSocketV2Test { private var scope = AuthScopeSnapshot("server","profile","https://example.invalid", "pin-proof",identityGeneration=1) private val tokens = object : TokenManager by TokenManagerImpl() { override suspend fun snapshotCurrentScope() = scope } - private val wire = """{"ticket":"opaque-proof","expires_in":30,"max_connection_seconds":300,"protocol":"silo.events.v2"}""" + private val wire = """{"ticket":"opaque-proof","expires_in":30,"max_connection_seconds":300,"protocol":"prairie.events.v2"}""" @Test fun mintPinsOptionalProfileAndRejectsLatePinAuthority() = runTest { var replace = false @@ -44,7 +44,7 @@ class EventsSocketV2Test { eventsUpgrade(scope,WsTicketResponse("opaque-proof",30,300,EVENTS_PROTOCOL),listOf("user_state","catalog")) }.build() assertEquals("wss://example.invalid/api/v2/events/ws?channels=user_state%2Ccatalog",request.url.toString()) - assertEquals("silo.events.v2, silo.ticket.opaque-proof",request.headers[HttpHeaders.SecWebSocketProtocol]) + assertEquals("prairie.events.v2, prairie.ticket.opaque-proof",request.headers[HttpHeaders.SecWebSocketProtocol]) assertNull(request.headers[HttpHeaders.Authorization]); assertNull(request.headers["X-Profile-Token"]) assertTrue(request.attributes[SkipPrairieAuthAttributeKey]); assertTrue(request.attributes[SingleAttemptAttributeKey]) assertEquals(scope,request.attributes[AuthScopeAttributeKey]) diff --git a/shared/src/commonTest/resources/api/v2/fixtures/index.json b/shared/src/commonTest/resources/api/v2/fixtures/index.json index 71a2a58e0..81face8fa 100644 --- a/shared/src/commonTest/resources/api/v2/fixtures/index.json +++ b/shared/src/commonTest/resources/api/v2/fixtures/index.json @@ -63,8 +63,8 @@ "method": "GET", "path": "/api/v2/system/info", "headers": { - "X-Silo-Client": "Silo Fixture Client", - "X-Silo-Client-Version": "0.0.0" + "X-Prairie-Client": "Silo Fixture Client", + "X-Prairie-Client-Version": "0.0.0" } }, "expected_status": 200,