]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
gp: Ensure Messages policy preforms proper cleanup
authorDavid Mulder <dmulder@samba.org>
Mon, 9 Jan 2023 23:33:59 +0000 (16:33 -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/gp_msgs_ext.py
selftest/knownfail.d/gpo

index 267c7456ad11bf1d5de328eced8c4e9234619c09..f1a13323c4df5301002ba1bc499f38c87039d2b2 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
-from samba.gp.gpclass import gp_pol_ext
+from samba.gp.gpclass import gp_pol_ext, gp_misc_applier
+
+class gp_msgs_ext(gp_pol_ext, gp_misc_applier):
+    def unapply(self, guid, cdir, attribute, value):
+        if attribute not in ['motd', 'issue']:
+            raise ValueError('"%s" is not a message attribute' % attribute)
+        data = self.parse_value(value)
+        mfile = os.path.join(cdir, attribute)
+        current = open(mfile, 'r').read() if os.path.exists(mfile) 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(mfile, 'w') as w:
+                if msg:
+                    w.write(msg)
+                else:
+                    w.truncate()
+        self.cache_remove_attribute(guid, attribute)
+
+    def apply(self, guid, cdir, entries):
+        section_name = 'Software\\Policies\\Samba\\Unix Settings\\Messages'
+        for e in entries:
+            if e.keyname == section_name and e.data.strip():
+                if e.valuename not in ['motd', 'issue']:
+                    raise ValueError('"%s" is not a message attribute' % \
+                            e.valuename)
+                mfile = os.path.join(cdir, e.valuename)
+                if os.path.exists(mfile):
+                    old_val = open(mfile, 'r').read()
+                else:
+                    old_val = ''
+                # If policy is already applied, skip application
+                if old_val.strip() == e.data.strip():
+                    return
+                with open(mfile, 'w') as w:
+                    w.write(e.data)
+                data = self.generate_value(old_val=old_val, new_val=e.data)
+                self.cache_add_attribute(guid, e.valuename, data)
 
-class gp_msgs_ext(gp_pol_ext):
     def __str__(self):
         return 'Unix Settings/Messages'
 
     def process_group_policy(self, deleted_gpo_list, changed_gpo_list,
                              cdir='/etc'):
         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 == 'motd':
-                        mfile = os.path.join(cdir, 'motd')
-                    elif attribute == 'issue':
-                        mfile = os.path.join(cdir, 'issue')
-                    else:
-                        continue
-                    with open(mfile, '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, cdir, attribute, msg)
 
         for gpo in changed_gpo_list:
             if gpo.file_sys_path:
                 section_name = 'Software\\Policies\\Samba\\Unix Settings\\Messages'
-                self.gp_db.set_guid(gpo.name)
                 pol_file = 'MACHINE/Registry.pol'
                 path = os.path.join(gpo.file_sys_path, pol_file)
                 pol_conf = self.parse(path)
                 if not pol_conf:
                     continue
-                for e in pol_conf.entries:
-                    if e.keyname == section_name and e.data.strip():
-                        if e.valuename == 'motd':
-                            mfile = os.path.join(cdir, 'motd')
-                        elif e.valuename == 'issue':
-                            mfile = os.path.join(cdir, 'issue')
-                        else:
-                            continue
-                        if os.path.exists(mfile):
-                            old_val = open(mfile, 'r').read()
-                        else:
-                            old_val = ''
-                        with open(mfile, 'w') as w:
-                            w.write(e.data)
-                            self.gp_db.store(str(self), e.valuename, old_val)
-                        self.gp_db.commit()
+                self.apply(gpo.name, cdir, pol_conf.entries)
 
     def rsop(self, gpo):
         output = {}
index 3810b7195d1c94ee7ac6b10204947c66be77f46a..11d97f3ebbc834c48b05bc04c5b021ced263bd9f 100644 (file)
@@ -1,4 +1,3 @@
-^samba.tests.gpo.samba.tests.gpo.GPOTests.test_gp_motd
 ^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