Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ import android.net.Uri
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.serialization.Serializable
import org.thoughtcrime.securesms.api.ApiExecutorContext
import org.thoughtcrime.securesms.api.http.HttpBody
import org.thoughtcrime.securesms.api.http.HttpResponse
import okhttp3.MediaType

class BanUserApi @AssistedInject constructor(
@Assisted("user") private val userToBan: String,
Expand All @@ -17,6 +20,17 @@ class BanUserApi @AssistedInject constructor(
override val httpEndpoint: String =
"/user/${Uri.encode(userToBan)}/ban"

@Serializable
private data class BanBody(val rooms: List<String>)

override fun buildRequestBody(
serverBaseUrl: String,
x25519PubKeyHex: String
): Pair<MediaType, HttpBody> {
// JSON body {"rooms":[room]}
return buildJsonRequestBody(BanBody(rooms = listOf(room)))
}

override suspend fun handleSuccessResponse(
executorContext: ApiExecutorContext,
baseUrl: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.session.libsession.messaging.open_groups.api

import android.net.Uri
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.serialization.Serializable
import org.thoughtcrime.securesms.api.ApiExecutorContext
import org.thoughtcrime.securesms.api.http.HttpBody
import org.thoughtcrime.securesms.api.http.HttpResponse
import okhttp3.MediaType

class UnbanUserApi @AssistedInject constructor(
@Assisted("user") private val userToBan: String,
@Assisted override val room: String,
deps: CommunityApiDependencies,
) : CommunityApi<Unit>(deps) {
override val requiresSigning: Boolean get() = true
override val httpMethod: String get() = "POST"
override val httpEndpoint: String =
"/user/${Uri.encode(userToBan)}/unban"

@Serializable
private data class BanBody(val rooms: List<String>)

override fun buildRequestBody(
serverBaseUrl: String,
x25519PubKeyHex: String
): Pair<MediaType, HttpBody> {
// JSON body {"rooms":[room]}
return buildJsonRequestBody(BanBody(rooms = listOf(room)))
}

override suspend fun handleSuccessResponse(
executorContext: ApiExecutorContext,
baseUrl: String,
response: HttpResponse
) = Unit

@AssistedFactory
interface Factory {
fun create(
@Assisted("user") userToBan: String,
room: String
): UnbanUserApi
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody
import org.session.libsignal.utilities.ByteArraySlice.Companion.toRequestBody
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.api.ApiExecutorContext

class OkHttpApiExecutor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import org.session.libsession.utilities.AESGCM
import org.session.libsignal.utilities.Base64
import org.session.libsignal.utilities.ByteArraySlice
import org.session.libsignal.utilities.ByteArraySlice.Companion.view
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.api.ApiExecutorContext
import org.thoughtcrime.securesms.api.SessionApiExecutor
import org.thoughtcrime.securesms.api.SessionApiRequest
Expand Down Expand Up @@ -69,12 +70,15 @@ class OnionSessionApiExecutor @Inject constructor(

when (req) {
is SessionApiRequest.SnodeJsonRPC -> {
Log.d("OnionSessionApiExecutor", "Sending Onion request to Snode destination. Method: ${req.request.method} -- Destination: ${req.snode}")

onionRequestVersion = OnionRequestVersion.V3
onionDestination = OnionDestination.SnodeDestination(req.snode)
payload = json.encodeToString(req.request).toByteArray()
}

is SessionApiRequest.HttpServerRequest -> {
Log.d("OnionSessionApiExecutor", "Sending Onion request to Server destination. Url: ${req.request.url}")
onionRequestVersion = OnionRequestVersion.V4
onionDestination = OnionDestination.ServerDestination(
host = req.request.url.host,
Expand Down Expand Up @@ -193,6 +197,8 @@ class OnionSessionApiExecutor @Inject constructor(
): OnionError {
val guardSnode = path.first()

Log.d("OnionSessionApiExecutor", "Networking Error, got a non 200 response code: $httpResponseCode, body: $httpResponseBody")

// ---- 502: hop can't find/contact next hop ----
val nextNodeNotFound = "Next node not found: "
val nextNodeUnreachable = "Next node is currently unreachable: "
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.api.server

import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.api.ApiExecutorContext
import org.thoughtcrime.securesms.api.error.ErrorWithFailureDecision
import org.thoughtcrime.securesms.api.http.HttpRequest
Expand Down Expand Up @@ -44,6 +45,8 @@ abstract class ServerApi<ResponseType>(
ctx = failureContext,
)

Log.d("ServerApi", "Network error for a Server endpoint ($baseUrl), with status:${response.statusCode} - error: $error")

executorContext.set(
key = ServerClientFailureContextKey,
value = failureContext.copy(previousErrorCode = response.statusCode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import org.session.libsession.snode.SwarmAuth
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.Snode
import org.thoughtcrime.securesms.api.ApiExecutorContext
import org.thoughtcrime.securesms.api.error.ErrorWithFailureDecision
Expand Down Expand Up @@ -47,6 +48,8 @@ abstract class AbstractSnodeApi<RespType : SnodeApiResponse>(
ctx = failureContext
)

Log.d("SnodeApi", "Network error for a Snode endpoint ($snode), with status:${code} - error: $error")

ctx.set(SnodeClientFailureKey, failureContext.copy(previousErrorCode = code))

if (decision != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public void setText(Recipient recipient, boolean read) {

setText(builder);

if (recipient.getBlocked()) setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_user_round_x, 0, 0, 0);
if (recipient.getBlocked()) setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_user_round_block, 0, 0, 0);
else if (recipient.isMuted()) setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_volume_off, 0, 0, 0);
else setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2645,6 +2645,14 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate,
}
}

override fun unbanUser(messages: Set<MessageRecord>) {
showSessionDialog {
title(R.string.banUnbanUser)
dangerButton(R.string.theContinue) { viewModel.unbanUser(messages.first().individualRecipient.address); endActionMode() }
cancelButton(::endActionMode)
}
}

override fun banAndDeleteAll(messages: Set<MessageRecord>) {
showSessionDialog {
title(R.string.banDeleteAll)
Expand Down Expand Up @@ -2979,6 +2987,7 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate,
ConversationReactionOverlay.Action.DELETE -> deleteMessages(selectedItems)
ConversationReactionOverlay.Action.BAN_AND_DELETE_ALL -> banAndDeleteAll(selectedItems)
ConversationReactionOverlay.Action.BAN_USER -> banUser(selectedItems)
ConversationReactionOverlay.Action.UNBAN_USER -> unbanUser(selectedItems)
ConversationReactionOverlay.Action.COPY_ACCOUNT_ID -> copyAccountID(selectedItems)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -673,16 +673,14 @@ class ConversationReactionOverlay : FrameLayout {
// Ban user
if (userCanBanSelectedUsers(message) && !isDeleteOnly && !isDeprecatedLegacyGroup) {
items += ActionItem(R.attr.menu_ban_icon, R.string.banUser, { handleActionItemClicked(Action.BAN_USER) })
}
// Ban and delete all
if (userCanBanSelectedUsers(message) && !isDeleteOnly && !isDeprecatedLegacyGroup) {
items += ActionItem(R.attr.menu_trash_icon, R.string.banDeleteAll, { handleActionItemClicked(Action.BAN_AND_DELETE_ALL) })
items += ActionItem(R.attr.menu_unban_icon, R.string.banUnbanUser, { handleActionItemClicked(Action.UNBAN_USER) })
}
// Message detail
if(!isDeleteOnly) {
items += ActionItem(
R.attr.menu_info_icon,
R.string.messageInfo,
R.string.info,
{ handleActionItemClicked(Action.VIEW_INFO) })
}
// Resend
Expand Down Expand Up @@ -833,6 +831,7 @@ class ConversationReactionOverlay : FrameLayout {
SELECT,
DELETE,
BAN_USER,
UNBAN_USER,
BAN_AND_DELETE_ALL
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1112,6 +1112,19 @@ class ConversationViewModel @AssistedInject constructor(
}
}

fun unbanUser(recipient: Address) = viewModelScope.launch {
repository.unbanUser(
community = address as Address.Community,
userId = (recipient as Address.WithAccountId).accountId
)
.onSuccess {
showMessage(application.getString(R.string.banUnbanUserUnbanned))
}
.onFailure {
showMessage(application.getString(R.string.banUnbanErrorFailed))
}
}

fun banAndDeleteAll(messageRecord: MessageRecord) = viewModelScope.launch {
repository.banAndDeleteAll(
community = address as Address.Community,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ class ConversationActionModeCallback(
// Delete message
menu.findItem(R.id.menu_context_delete_message).isVisible = !isDeprecatedLegacyGroup // can always delete since delete logic will be handled by the VM
// Ban user
menu.findItem(R.id.menu_context_ban_user).isVisible = userCanBanSelectedUsers() && !isDeprecatedLegacyGroup
val canBan = userCanBanSelectedUsers() && !isDeprecatedLegacyGroup
menu.findItem(R.id.menu_context_ban_user).isVisible = canBan
menu.findItem(R.id.menu_context_unban_user).isVisible = canBan
// Ban and delete all
menu.findItem(R.id.menu_context_ban_and_delete_all).isVisible = userCanBanSelectedUsers() && !isDeprecatedLegacyGroup
// Copy message text
Expand Down Expand Up @@ -99,6 +101,7 @@ class ConversationActionModeCallback(
when (item.itemId) {
R.id.menu_context_delete_message -> delegate?.deleteMessages(selectedItems)
R.id.menu_context_ban_user -> delegate?.banUser(selectedItems)
R.id.menu_context_unban_user -> delegate?.unbanUser(selectedItems)
R.id.menu_context_ban_and_delete_all -> delegate?.banAndDeleteAll(selectedItems)
R.id.menu_context_copy -> delegate?.copyMessages(selectedItems)
R.id.menu_context_resync -> delegate?.resyncMessage(selectedItems)
Expand All @@ -122,6 +125,7 @@ interface ConversationActionModeCallbackDelegate {
fun selectMessages(messages: Set<MessageRecord>)
fun deleteMessages(messages: Set<MessageRecord>)
fun banUser(messages: Set<MessageRecord>)
fun unbanUser(messages: Set<MessageRecord>)
fun banAndDeleteAll(messages: Set<MessageRecord>)
fun copyMessages(messages: Set<MessageRecord>)
fun resyncMessage(messages: Set<MessageRecord>)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ class ConversationSettingsViewModel @AssistedInject constructor(
private val optionBlock: OptionsItem by lazy{
OptionsItem(
name = context.getString(R.string.block),
icon = R.drawable.ic_user_round_x,
icon = R.drawable.ic_user_round_block,
qaTag = R.string.qa_conversation_settings_block,
onClick = ::confirmBlockUser
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.core.os.BundleCompat
import androidx.core.view.doOnLayout
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
Expand Down Expand Up @@ -72,7 +71,7 @@ class SearchContactActionBottomSheet : BottomSheetDialogFragment() {
if (address is Address.Standard) {
ActionSheetItem(
text = stringResource(R.string.block),
leadingIcon = R.drawable.ic_user_round_x,
leadingIcon = R.drawable.ic_user_round_block,
qaTag = stringResource(R.string.AccessibilityId_block),
onClick = {
showBlockConfirmation()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ interface ConversationRepository {
suspend fun deleteGroupV2MessagesRemotely(recipient: Address, messages: Set<MessageRecord>)

suspend fun banUser(community: Address.Community, userId: AccountId): Result<Unit>
suspend fun unbanUser(community: Address.Community, userId: AccountId): Result<Unit>
suspend fun banAndDeleteAll(community: Address.Community, userId: AccountId): Result<Unit>
suspend fun deleteMessageRequest(thread: ThreadRecord): Result<Unit>
suspend fun clearAllMessageRequests(): Result<Unit>
Expand Down
Loading