Warning, /network/neochat/src/qml/RoomSecurity.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2019-2020 Black Hat <bhat@encom.eu.org>
0002 // SPDX-FileCopyrightText: 2021 Carl Schwan <carl@carlschwan.eu>
0003 // SPDX-License-Identifier: GPL-3.0-only
0004 
0005 import QtQuick
0006 import QtQuick.Controls as QQC2
0007 import QtQuick.Layouts
0008 
0009 import org.kde.kirigami as Kirigami
0010 import org.kde.kirigamiaddons.formcard as FormCard
0011 
0012 import org.kde.neochat
0013 
0014 FormCard.FormCardPage {
0015     id: root
0016 
0017     property NeoChatRoom room
0018     property string needUpgradeRoom: i18n("You need to upgrade this room to a newer version to enable this setting.")
0019 
0020     title: i18n("Security")
0021 
0022     FormCard.FormHeader {
0023         title: i18nc("@option:check", "Encryption")
0024     }
0025     FormCard.FormCard {
0026         FormCard.FormSwitchDelegate {
0027             id: enableEncryptionSwitch
0028             text: i18n("Enable encryption")
0029             description: i18nc("option:check", "Once enabled, encryption cannot be disabled.")
0030             enabled: room.canEncryptRoom
0031             checked: room.usesEncryption
0032             onToggled: if (checked) {
0033                 let dialog = confirmEncryptionDialog.createObject(applicationWindow().overlay, {room: room});
0034                 dialog.open();
0035             }
0036         }
0037     }
0038 
0039     FormCard.FormHeader {
0040         title: i18nc("@option:check", "Access")
0041     }
0042     FormCard.FormCard {
0043         FormCard.FormRadioDelegate {
0044             text: i18nc("@option:check", "Private (invite only)")
0045             description: i18n("Only invited people can join.")
0046             checked: room.joinRule === "invite"
0047             enabled: room.canSendState("m.room.join_rules")
0048             onCheckedChanged: if (checked && room.joinRule != "invite") {
0049                 root.room.joinRule = "invite";
0050             }
0051         }
0052         FormCard.FormRadioDelegate {
0053             text: i18nc("@option:check", "Space members")
0054             description: i18n("Anyone in the selected spaces can find and join.") +
0055                             (!["8", "9", "10"].includes(room.version) ? `\n${needUpgradeRoom}` : "")
0056             checked: room.joinRule === "restricted"
0057             enabled: room.canSendState("m.room.join_rules") && ["8", "9", "10"].includes(room.version)
0058             onCheckedChanged: if (checked && room.joinRule != "restricted") {
0059                 selectSpacesDialog.createObject(applicationWindow().overlay).open();
0060             }
0061 
0062             contentItem.children: QQC2.Button {
0063                 visible: root.room.joinRule === "restricted"
0064                 text: i18n("Select spaces")
0065                 icon.name: "list-add"
0066 
0067                 onClicked: selectSpacesDialog.createObject(applicationWindow().overlay).open();
0068 
0069                 QQC2.ToolTip.text: text
0070                 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0071                 QQC2.ToolTip.visible: hovered
0072             }
0073 
0074             Component {
0075                 id: selectSpacesDialog
0076                 SelectSpacesDialog {
0077                     room: root.room
0078                 }
0079             }
0080         }
0081         FormCard.FormRadioDelegate {
0082             text: i18nc("@option:check", "Knock")
0083             description: i18n("People not in the room need to request an invite to join the room.") +
0084                             (!["7", "8", "9", "10"].includes(room.version) ? `\n${needUpgradeRoom}` : "")
0085             checked: room.joinRule === "knock"
0086             // https://spec.matrix.org/v1.4/rooms/#feature-matrix
0087             enabled: room.canSendState("m.room.join_rules") && ["7", "8", "9", "10"].includes(room.version)
0088             onCheckedChanged: if (checked && room.joinRule != "knock") {
0089                 root.room.joinRule = "knock";
0090             }
0091         }
0092         FormCard.FormRadioDelegate {
0093             text: i18nc("@option:check", "Public")
0094             description: i18nc("@option:check", "Anyone can find and join.")
0095             checked: room.joinRule === "public"
0096             enabled: room.canSendState("m.room.join_rules")
0097             onCheckedChanged: if (checked && root.room.joinRule != "public") {
0098                 root.room.joinRule = "public";
0099             }
0100         }
0101     }
0102 
0103     FormCard.FormHeader {
0104         title: i18nc("@option:check", "Message history visibility")
0105     }
0106     FormCard.FormCard {
0107         FormCard.FormRadioDelegate {
0108             text: i18nc("@option:check", "Anyone")
0109             description: i18nc("@option:check", "Anyone, regardless of whether they have joined, can view history.")
0110             checked: room.historyVisibility === "world_readable"
0111             enabled: room.canSendState("m.room.history_visibility")
0112             onCheckedChanged: if (checked) {
0113                 room.historyVisibility = "world_readable"
0114             }
0115         }
0116         FormCard.FormRadioDelegate {
0117             text: i18nc("@option:check", "Members only")
0118             description: i18nc("@option:check", "All members can view the entire message history, even before they joined.")
0119             checked: room.historyVisibility === "shared"
0120             enabled: room.canSendState("m.room.history_visibility")
0121             onCheckedChanged: if (checked) {
0122                 room.historyVisibility = "shared"
0123             }
0124         }
0125         FormCard.FormRadioDelegate {
0126             text: i18nc("@option:check", "Members only (since invite)")
0127             description: i18nc("@option:check", "New members can view the message history from the point they were invited to the room.")
0128             checked: room.historyVisibility === "invited"
0129             enabled: room.canSendState("m.room.history_visibility")
0130             onCheckedChanged: if (checked) {
0131                 room.historyVisibility = "invited"
0132             }
0133         }
0134         FormCard.FormRadioDelegate {
0135             text: i18nc("@option:check", "Members only (since joining)")
0136             description: i18nc("@option:check", "New members can view the message history from the point they joined the room.")
0137             checked: room.historyVisibility === "joined"
0138             enabled: room.canSendState("m.room.history_visibility")
0139             onCheckedChanged: if (checked) {
0140                 room.historyVisibility = "joined"
0141             }
0142         }
0143     }
0144 
0145     property Component confirmEncryptionDialog: Component {
0146         id: confirmEncryptionDialog
0147 
0148         ConfirmEncryptionDialog {
0149             onClosed: {
0150                 // At the point this is executed, the state in the room is not yet changed.
0151                 // The value will be updated when room.onEncryption() emitted.
0152                 // This is in case if user simply closed the dialog.
0153                 enableEncryptionSwitch.checked = false
0154             }
0155         }
0156     }
0157 
0158     property Connections connections: Connections {
0159         target: room
0160         onEncryption: {
0161             enableEncryptionSwitch.checked = room.usesEncryption
0162         }
0163     }
0164 }
0165