Blob Blame History Raw
From ee64cd773bdeef845d02dc84063f926d77090dec Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 21 Aug 2019 15:06:46 -0400
Subject: [PATCH 4/4] shellEntry: Support lockdown of "Show Text" menu in
 password entries

Some deployments require being able to prevent users from showing
the password they're currently typing.

This commit adds support for that kind of lockdown.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/687
---
 js/ui/shellEntry.js | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index 765cede06..c45e4545a 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -1,81 +1,89 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const { Clutter, GObject, Pango, Shell, St } = imports.gi;
+const { Clutter, Gio, GObject, Pango, Shell, St } = imports.gi;
 
 const BoxPointer = imports.ui.boxpointer;
 const Main = imports.ui.main;
 const Params = imports.misc.params;
 const PopupMenu = imports.ui.popupMenu;
 const Tweener = imports.ui.tweener;
 
+const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
+const DISABLE_SHOW_PASSWORD_KEY = 'disable-show-password';
+
 var EntryMenu = class extends PopupMenu.PopupMenu {
     constructor(entry) {
         super(entry, 0, St.Side.TOP);
 
+        this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
+        this._lockdownSettings.connect('changed::' + DISABLE_SHOW_PASSWORD_KEY, this._resetPasswordItem.bind(this));
+
         this._entry = entry;
         this._clipboard = St.Clipboard.get_default();
 
         // Populate menu
         let item;
         item = new PopupMenu.PopupMenuItem(_("Copy"));
         item.connect('activate', this._onCopyActivated.bind(this));
         this.addMenuItem(item);
         this._copyItem = item;
 
         item = new PopupMenu.PopupMenuItem(_("Paste"));
         item.connect('activate', this._onPasteActivated.bind(this));
         this.addMenuItem(item);
         this._pasteItem = item;
 
         this._passwordItem = null;
 
         Main.uiGroup.add_actor(this.actor);
         this.actor.hide();
     }
 
     _makePasswordItem() {
         let item = new PopupMenu.PopupMenuItem('');
         item.connect('activate', this._onPasswordActivated.bind(this));
         this.addMenuItem(item);
         this._passwordItem = item;
         this._updatePasswordItem();
     }
 
     _resetPasswordItem() {
-        if (!this.isPassword) {
+        let passwordDisabled = this._lockdownSettings.get_boolean(DISABLE_SHOW_PASSWORD_KEY);
+
+        if (!this.isPassword || passwordDisabled) {
             if (this._passwordItem) {
                 this._passwordItem.destroy();
                 this._passwordItem = null;
             }
             this._entry.clutter_text.set_password_char('\u25cf');
-        } else {
+        } else if (this.isPassword && !passwordDisabled) {
             if (!this._passwordItem)
                 this._makePasswordItem();
         }
     }
 
     get isPassword() {
         return this._entry.input_purpose == Clutter.InputContentPurpose.PASSWORD;
     }
 
     set isPassword(v) {
         if (v == this.isPassword)
             return;
 
         if (v)
             this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD;
         else
             this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
 
         this._resetPasswordItem();
     }
 
     open(animate) {
         this._updatePasteItem();
         this._updateCopyItem();
         if (this._passwordItem)
             this._updatePasswordItem();
 
         super.open(animate);
         this._entry.add_style_pseudo_class('focus');
 
-- 
2.27.0