]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
gp: Ensure Issue policy preforms proper cleanup
authorDavid Mulder <dmulder@samba.org>
Tue, 10 Jan 2023 00:12:53 +0000 (17:12 -0700)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 31 Jul 2023 09:58:30 +0000 (09:58 +0000)
Signed-off-by: David Mulder <dmulder@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/gp/vgp_issue_ext.py
selftest/knownfail.d/gpo

index c622fa094b6ae21e43d29794a1758e9c06426c0f..10d4ea0f77f4856a33a2b07c367fbecea3e06461 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
-from samba.gp.gpclass import gp_xml_ext
+from samba.gp.gpclass import gp_xml_ext, gp_misc_applier
+
+class vgp_issue_ext(gp_xml_ext, gp_misc_applier):
+    def unapply(self, guid, issue, attribute, value):
+        if attribute != 'issue':
+            raise ValueError('"%s" is not a message attribute' % attribute)
+        msg = value
+        data = self.parse_value(value)
+        current = open(issue, 'r').read() if os.path.exists(issue) else ''
+        # Only overwrite the msg if it hasn't been modified. It may have been
+        # modified by another GPO.
+        if 'new_val' not in data or current.strip() == data['new_val'].strip():
+            msg = data['old_val']
+            with open(issue, 'w') as w:
+                if msg:
+                    w.write(msg)
+                else:
+                    w.truncate()
+        self.cache_remove_attribute(guid, attribute)
+
+    def apply(self, guid, issue, text):
+        current = open(issue, 'r').read() if os.path.exists(issue) else ''
+        if current != text.text:
+            with open(issue, 'w') as w:
+                w.write(text.text)
+            data = self.generate_value(old_val=current, new_val=text.text)
+            self.cache_add_attribute(guid, 'issue', data)
 
-class vgp_issue_ext(gp_xml_ext):
     def __str__(self):
         return 'Unix Settings/Issue'
 
     def process_group_policy(self, deleted_gpo_list, changed_gpo_list,
                              issue='/etc/issue'):
         for guid, settings in deleted_gpo_list:
-            self.gp_db.set_guid(guid)
             if str(self) in settings:
                 for attribute, msg in settings[str(self)].items():
-                    if attribute == 'issue':
-                        with open(issue, 'w') as w:
-                            if msg:
-                                w.write(msg)
-                            else:
-                                w.truncate()
-                    self.gp_db.delete(str(self), attribute)
-            self.gp_db.commit()
+                    self.unapply(guid, issue, attribute, msg)
 
         for gpo in changed_gpo_list:
             if gpo.file_sys_path:
-                self.gp_db.set_guid(gpo.name)
                 xml = 'MACHINE/VGP/VTLA/Unix/Issue/manifest.xml'
                 path = os.path.join(gpo.file_sys_path, xml)
                 xml_conf = self.parse(path)
@@ -47,12 +63,7 @@ class vgp_issue_ext(gp_xml_ext):
                 policy = xml_conf.find('policysetting')
                 data = policy.find('data')
                 text = data.find('text')
-                current = open(issue, 'r').read() if os.path.exists(issue) else ''
-                if current != text.text:
-                    with open(issue, 'w') as w:
-                        w.write(text.text)
-                        self.gp_db.store(str(self), 'issue', current)
-                    self.gp_db.commit()
+                self.apply(gpo.name, issue, text)
 
     def rsop(self, gpo):
         output = {}
index 11d97f3ebbc834c48b05bc04c5b021ced263bd9f..3d08aa883a41e39cd5b1248871e965f3bf0f073d 100644 (file)
@@ -1,5 +1,4 @@
 ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_vgp_motd
-^samba.tests.gpo.samba.tests.gpo.GPOTests.test_vgp_issue
 ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_smb_conf_ext
 ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_gp_user_scripts_ext
 ^samba.tests.gpo.samba.tests.gpo.GPOTests.test_gp_user_centrify_crontab_ext