Codebase list lightdm-gtk-greeter-settings / 5ed9846
Value check for "background" and "default-user-image" options Andrew P. 9 years ago
3 changed file(s) with 106 addition(s) and 12 deletion(s). Raw diff Collapse all Expand all
479479 <property name="visible">True</property>
480480 <property name="can_focus">False</property>
481481 <child>
482 <object class="GtkLabel" id="greeter_background_label">
483 <property name="visible">True</property>
484 <property name="can_focus">False</property>
485 <property name="halign">start</property>
486 <property name="label" translatable="yes" context="option|greeter|background">Background</property>
487 <attributes>
488 <attribute name="weight" value="semibold"/>
489 </attributes>
482 <object class="GtkBox" id="box13">
483 <property name="visible">True</property>
484 <property name="can_focus">False</property>
485 <child>
486 <object class="GtkLabel" id="greeter_background_label">
487 <property name="visible">True</property>
488 <property name="can_focus">False</property>
489 <property name="halign">start</property>
490 <property name="label" translatable="yes" context="option|greeter|background">Background</property>
491 <attributes>
492 <attribute name="weight" value="semibold"/>
493 </attributes>
494 </object>
495 <packing>
496 <property name="expand">False</property>
497 <property name="fill">True</property>
498 <property name="position">0</property>
499 </packing>
500 </child>
501 <child>
502 <object class="GtkImage" id="greeter_background_error">
503 <property name="can_focus">False</property>
504 <property name="yalign">0</property>
505 <property name="pixel_size">12</property>
506 <property name="icon_name">dialog-warning</property>
507 <property name="icon_size">1</property>
508 </object>
509 <packing>
510 <property name="expand">False</property>
511 <property name="fill">True</property>
512 <property name="position">1</property>
513 </packing>
514 </child>
490515 </object>
491516 <packing>
492517 <property name="expand">False</property>
500525 <property name="can_focus">True</property>
501526 <property name="label" translatable="yes" context="option|multihead"> &lt;i&gt;(or use &lt;a href=""&gt;multihead setup&lt;/a&gt; for individual monitors)&lt;/i&gt;</property>
502527 <property name="use_markup">True</property>
503 <property name="angle">0.029999999999999999</property>
504528 </object>
505529 <packing>
506530 <property name="expand">False</property>
665689 </packing>
666690 </child>
667691 <child>
668 <object class="GtkImage" id="cgreeter_default-user-image_error">
692 <object class="GtkImage" id="greeter_default-user-image_error">
669693 <property name="can_focus">False</property>
670694 <property name="yalign">0</property>
671695 <property name="pixel_size">12</property>
2222 from glob import iglob
2323 from itertools import chain
2424 from locale import gettext as _
25 from gi.repository import Gtk
25 from gi.repository import Gtk, Gdk
2626
2727 from lightdm_gtk_greeter_settings import helpers
2828 from lightdm_gtk_greeter_settings.helpers import C_, WidgetsWrapper, string2bool
6565 ('greeter', 'theme-name'): self.on_entry_setup_greeter_theme_name,
6666 ('greeter', 'icon-theme-name'): self.on_entry_setup_greeter_icon_theme_name,
6767 ('greeter', 'default-user-image'): self.on_entry_setup_greeter_default_user_image,
68 ('greeter', 'background'): self.on_entry_setup_greeter_background,
6869 ('greeter', 'allow-debugging'): self.on_entry_setup_greeter_allow_debugging,
6970 }
7071
226227 def on_entry_setup_greeter_default_user_image(self, entry):
227228 entry.changed.connect(self.on_entry_changed_greeter_default_user_image)
228229
230 def on_entry_setup_greeter_background(self, entry):
231 entry.changed.connect(self.on_entry_changed_greeter_background)
232
229233 def on_entry_setup_greeter_allow_debugging(self, entry):
230234 if (Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION, Gtk.MICRO_VERSION) < (3, 14, 0):
231235 entry.changed.connect(self.on_entry_changed_greeter_allow_debugging)
255259 entry.error = C_('option|greeter|icon-theme-name', 'Selected theme is not available')
256260
257261 def on_entry_changed_greeter_default_user_image(self, entry):
258 pass
262 value = entry.value
263 if value.startswith('#'):
264 entry.error = None
265 elif not os.path.exists(value):
266 entry.error = C_('option|greeter|default-user-image', 'File not found: {path}'.format(path=value))
267 else:
268 try:
269 if not helpers.file_is_readable_by_greeter(value):
270 entry.error = C_('option|greeter|default-user-image', 'File may be not readable for greeter: {path}'.format(path=value))
271 else:
272 entry.error = None
273 except:
274 entry.error = C_('option|greeter|default-user-image', 'Failed to check permissions for file: {path}'.format(path=value))
275
276 def on_entry_changed_greeter_background(self, entry):
277 value = entry.value
278 if Gdk.RGBA().parse(value):
279 entry.error = None
280 elif not os.path.exists(value):
281 entry.error = C_('option|greeter|background', 'File not found: {path}'.format(path=value))
282 else:
283 try:
284 if not helpers.file_is_readable_by_greeter(value):
285 entry.error = C_('option|greeter|background', 'File may be not readable for greeter: {path}'.format(path=value))
286 else:
287 entry.error = None
288 except:
289 entry.error = C_('option|greeter|background', 'Failed to check permissions for file: {path}'.format(path=value))
259290
260291 def on_entry_changed_greeter_allow_debugging(self, entry):
261292 if string2bool(entry.value):
1616
1717 from collections import namedtuple
1818 from itertools import chain
19 import configparser
20 import glob
1921 import locale
22 import pwd
2023 import os
24 import stat
2125
2226 from gi.repository import Gtk, GdkPixbuf
2327
3741 __all__ = ['C_', 'NC_',
3842 'get_data_path', 'get_config_path', 'show_message',
3943 'bool2string', 'string2bool', 'new_pixbuf_from_file_scaled_down',
44 'file_is_readable_by_greeter',
4045 'ModelRowEnum', 'WidgetsWrapper']
4146
4247
9196 return pixbuf
9297
9398
99 def file_is_readable_by_greeter(path):
100 try:
101 uid, groups = file_is_readable_by_greeter.id_cached_data
102 except AttributeError:
103 files = glob.glob('/etc/lightdm/lightdm.d/*.conf')
104 files += ['/etc/lightdm/lightdm.conf']
105 config = configparser.RawConfigParser(strict=False)
106 config.read(files)
107 username = config.get('LightDM', 'greeter-user', fallback='lightdm')
108
109 pw = pwd.getpwnam(username)
110 uid = pw.pw_uid
111 groups = set(os.getgrouplist(username, pw.pw_gid))
112 file_is_readable_by_greeter.id_cached_data = uid, groups
113
114 parts = os.path.normpath(path).split(os.path.sep)
115 if not parts[0]:
116 parts[0] = os.path.sep
117
118 def readable(st, uid, gids):
119 if stat.S_ISDIR(st.st_mode) and not stat.S_IREAD:
120 return False
121 if st.st_uid == uid and bool(st.st_mode & stat.S_IRUSR):
122 return True
123 if st.st_gid in groups and bool(st.st_mode & stat.S_IRGRP):
124 return True
125 if bool(st.st_mode & stat.S_IROTH):
126 return True
127 return False
128
129 return all(readable(os.stat(os.path.join(*parts[:i+1])), uid, groups)
130 for i in range(len(parts)))
131
132
94133 class ModelRowEnum:
95134
96135 def __init__(self, *names):