Add option to disable IP logging
authorTheSaminator <TheSaminator@users.noreply.github.com>
Mon, 14 Feb 2022 17:39:12 +0000 (12:39 -0500)
committerTheSaminator <TheSaminator@users.noreply.github.com>
Mon, 14 Feb 2022 17:40:07 +0000 (12:40 -0500)
src/jvmMain/kotlin/starshipfights/auth/providers.kt
src/jvmMain/kotlin/starshipfights/auth/utils.kt
src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt
src/jvmMain/kotlin/starshipfights/info/views_user.kt

index cab29d64af78aae4283d691a7f7f102ac3ecc24f..e675c2a9822bda80d62e50d2a389797af5c49408 100644 (file)
@@ -91,10 +91,20 @@ interface AuthProvider {
                                        val newUser = currentUser.copy(
                                                showDiscordName = form["showdiscord"] == "yes",
                                                showUserStatus = form["showstatus"] == "yes",
+                                               logIpAddresses = form["logaddress"] == "yes",
                                                profileName = form["name"]?.takeIf { it.isNotBlank() && it.length <= PROFILE_NAME_MAX_LENGTH } ?: redirect("/me/manage?" + parametersOf("error", "Invalid name - must not be blank, must be at most $PROFILE_NAME_MAX_LENGTH characters").formUrlEncode()),
                                                profileBio = form["bio"]?.takeIf { it.isNotBlank() && it.length <= PROFILE_BIO_MAX_LENGTH } ?: redirect("/me/manage?" + parametersOf("error", "Invalid bio - must not be blank, must be at most $PROFILE_BIO_MAX_LENGTH characters").formUrlEncode())
                                        )
                                        User.put(newUser)
+                                       
+                                       if (!newUser.logIpAddresses)
+                                               launch {
+                                                       UserSession.update(
+                                                               UserSession::user eq currentUser.id,
+                                                               setValue(UserSession::clientAddresses, emptyList())
+                                                       )
+                                               }
+                                       
                                        redirect("/user/${newUser.id}")
                                }
                                
@@ -365,6 +375,7 @@ object TestAuthProvider : AuthProvider {
                                                                registeredAt = Instant.now(),
                                                                lastActivity = Instant.now(),
                                                                showUserStatus = false,
+                                                               logIpAddresses = false,
                                                        ).also {
                                                                User.put(it)
                                                        }
@@ -539,6 +550,7 @@ class ProductionAuthProvider(val discordLogin: DiscordLogin) : AuthProvider {
                                                registeredAt = Instant.now(),
                                                lastActivity = Instant.now(),
                                                showUserStatus = false,
+                                               logIpAddresses = false,
                                        )
                                        
                                        val userSession = UserSession(
index beabee31f9c430492298f72c6e5c63dae2285f8c..b5e5669e5e7582463fc2da5c9d3edc70ac42bb59 100644 (file)
@@ -16,7 +16,12 @@ suspend fun Id<UserSession>.resolve(userAgent: String) = UserSession.get(this)?.
 
 suspend fun UserSession.renewed(clientAddress: String) = copy(
        expiration = Instant.now().plus(1, ChronoUnit.HOURS),
-       clientAddresses = if (clientAddresses.last() != clientAddress) clientAddresses + clientAddress else clientAddresses
+       clientAddresses = if (User.get(user)?.logIpAddresses != true)
+               emptyList()
+       else if (clientAddresses.lastOrNull() != clientAddress)
+               clientAddresses + clientAddress
+       else
+               clientAddresses
 ).also { UserSession.put(it) }
 
 suspend fun User.updated() = copy(
index f53352d982ef8f321e35026b8bd10d5601038907..23d60a3f891240559581a83f2b43d9917915a278 100644 (file)
@@ -28,6 +28,8 @@ data class User(
        val lastActivity: @Contextual Instant,
        val showUserStatus: Boolean,
        
+       val logIpAddresses: Boolean,
+       
        val status: UserStatus = UserStatus.AVAILABLE,
 ) : DataDocument<User> {
        val discordAvatarUrl: String
index 5faf523680339bf19a6a9e16796c8e8fa98ae6a7..cffb1eacf65b681f25b52b170330f6ed732bef85 100644 (file)
@@ -188,6 +188,16 @@ suspend fun ApplicationCall.manageUserPage(): HTML.() -> Unit {
                                        +Entities.nbsp
                                        +"Show Online Status"
                                }
+                               br
+                               label {
+                                       checkBoxInput {
+                                               name = "logaddress"
+                                               checked = currentUser.logIpAddresses
+                                               value = "yes"
+                                       }
+                                       +Entities.nbsp
+                                       +"Log Session IP Addresses"
+                               }
                                request.queryParameters["error"]?.let { errorMsg ->
                                        p {
                                                style = "color:#d22"