Disable file copy & paste in view mode (#6749)

* Disable file copy & paste in view mode

Signed-off-by: fufesou <shuanglongchen@yeah.net>

* hide 'Enable file copy & paste' when no keyboard perm

Signed-off-by: fufesou <shuanglongchen@yeah.net>

* Disable some functions in view mode

Signed-off-by: fufesou <shuanglongchen@yeah.net>

---------

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-12-25 21:49:34 +08:00 committed by GitHub
parent fc0fc5ea10
commit 6d0953dca4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 24 deletions

View File

@ -442,18 +442,22 @@ Future<List<TToggleMenu>> toolbarDisplayToggle(
child: Text(translate('Mute')))); child: Text(translate('Mute'))));
} }
// file copy and paste // file copy and paste
if (perms['file'] != false && if (ffiModel.keyboard &&
perms['file'] != false &&
bind.mainHasFileClipboard() && bind.mainHasFileClipboard() &&
pi.platformAdditions.containsKey(kPlatformAdditionsHasFileClipboard)) { pi.platformAdditions.containsKey(kPlatformAdditionsHasFileClipboard)) {
final enabled = !ffiModel.viewOnly;
final option = 'enable-file-transfer'; final option = 'enable-file-transfer';
final value = final value =
bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option);
v.add(TToggleMenu( v.add(TToggleMenu(
value: value, value: value,
onChanged: (value) { onChanged: enabled
? (value) {
if (value == null) return; if (value == null) return;
bind.sessionToggleOption(sessionId: sessionId, value: option); bind.sessionToggleOption(sessionId: sessionId, value: option);
}, }
: null,
child: Text(translate('Enable file copy and paste')))); child: Text(translate('Enable file copy and paste'))));
} }
// disable clipboard // disable clipboard
@ -475,15 +479,18 @@ Future<List<TToggleMenu>> toolbarDisplayToggle(
} }
// lock after session end // lock after session end
if (ffiModel.keyboard) { if (ffiModel.keyboard) {
final enabled = !ffiModel.viewOnly;
final option = 'lock-after-session-end'; final option = 'lock-after-session-end';
final value = final value =
bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option);
v.add(TToggleMenu( v.add(TToggleMenu(
value: value, value: value,
onChanged: (value) { onChanged: enabled
? (value) {
if (value == null) return; if (value == null) return;
bind.sessionToggleOption(sessionId: sessionId, value: option); bind.sessionToggleOption(sessionId: sessionId, value: option);
}, }
: null,
child: Text(translate('Lock after session end')))); child: Text(translate('Lock after session end'))));
} }
@ -553,19 +560,27 @@ List<TToggleMenu> toolbarPrivacyMode(
final sessionId = ffi.sessionId; final sessionId = ffi.sessionId;
getDefaultMenu(Future<void> Function(SessionID sid, String opt) toggleFunc) { getDefaultMenu(Future<void> Function(SessionID sid, String opt) toggleFunc) {
final enabled = !ffi.ffiModel.viewOnly;
return TToggleMenu( return TToggleMenu(
value: privacyModeState.isNotEmpty, value: privacyModeState.isNotEmpty,
onChanged: (value) { onChanged: enabled
? (value) {
if (value == null) return; if (value == null) return;
if (ffiModel.pi.currentDisplay != 0 && if (ffiModel.pi.currentDisplay != 0 &&
ffiModel.pi.currentDisplay != kAllDisplayValue) { ffiModel.pi.currentDisplay != kAllDisplayValue) {
msgBox(sessionId, 'custom-nook-nocancel-hasclose', 'info', msgBox(
'Please switch to Display 1 first', '', ffi.dialogManager); sessionId,
'custom-nook-nocancel-hasclose',
'info',
'Please switch to Display 1 first',
'',
ffi.dialogManager);
return; return;
} }
final option = 'privacy-mode'; final option = 'privacy-mode';
toggleFunc(sessionId, option); toggleFunc(sessionId, option);
}, }
: null,
child: Text(translate('Privacy mode'))); child: Text(translate('Privacy mode')));
} }

View File

@ -1422,10 +1422,14 @@ impl LoginConfigHandler {
option.disable_keyboard = f(true); option.disable_keyboard = f(true);
option.disable_clipboard = f(true); option.disable_clipboard = f(true);
option.show_remote_cursor = f(true); option.show_remote_cursor = f(true);
option.enable_file_transfer = f(false);
option.lock_after_session_end = f(false);
} else { } else {
option.disable_keyboard = f(false); option.disable_keyboard = f(false);
option.disable_clipboard = f(self.get_toggle_option("disable-clipboard")); option.disable_clipboard = f(self.get_toggle_option("disable-clipboard"));
option.show_remote_cursor = f(self.get_toggle_option("show-remote-cursor")); option.show_remote_cursor = f(self.get_toggle_option("show-remote-cursor"));
option.enable_file_transfer = f(self.config.enable_file_transfer.v);
option.lock_after_session_end = f(self.config.lock_after_session_end.v);
} }
} else { } else {
let is_set = self let is_set = self
@ -1516,7 +1520,7 @@ impl LoginConfigHandler {
msg.show_remote_cursor = BoolOption::Yes.into(); msg.show_remote_cursor = BoolOption::Yes.into();
n += 1; n += 1;
} }
if self.get_toggle_option("lock-after-session-end") { if !view_only && self.get_toggle_option("lock-after-session-end") {
msg.lock_after_session_end = BoolOption::Yes.into(); msg.lock_after_session_end = BoolOption::Yes.into();
n += 1; n += 1;
} }
@ -1524,7 +1528,7 @@ impl LoginConfigHandler {
msg.disable_audio = BoolOption::Yes.into(); msg.disable_audio = BoolOption::Yes.into();
n += 1; n += 1;
} }
if self.get_toggle_option("enable-file-transfer") { if !view_only && self.get_toggle_option("enable-file-transfer") {
msg.enable_file_transfer = BoolOption::Yes.into(); msg.enable_file_transfer = BoolOption::Yes.into();
n += 1; n += 1;
} }

View File

@ -321,10 +321,15 @@ impl<T: InvokeUiSession> Remote<T> {
*self.handler.server_file_transfer_enabled.read().unwrap(); *self.handler.server_file_transfer_enabled.read().unwrap();
let file_transfer_enabled = let file_transfer_enabled =
self.handler.lc.read().unwrap().enable_file_transfer.v; self.handler.lc.read().unwrap().enable_file_transfer.v;
let view_only = self.handler.lc.read().unwrap().view_only.v;
let stop = is_stopping_allowed let stop = is_stopping_allowed
&& (!self.is_connected && (view_only
|| !self.is_connected
|| !(server_file_transfer_enabled && file_transfer_enabled)); || !(server_file_transfer_enabled && file_transfer_enabled));
log::debug!("Process clipboard message from system, stop: {}, is_stopping_allowed: {}, server_file_transfer_enabled: {}, file_transfer_enabled: {}", stop, is_stopping_allowed, server_file_transfer_enabled, file_transfer_enabled); log::debug!(
"Process clipboard message from system, stop: {}, is_stopping_allowed: {}, view_only: {}, server_file_transfer_enabled: {}, file_transfer_enabled: {}",
view_only, stop, is_stopping_allowed, server_file_transfer_enabled, file_transfer_enabled
);
if stop { if stop {
ContextSend::set_is_stopped(); ContextSend::set_is_stopped();
} else { } else {