diff --git a/ucs-school-4.1/ucs-school-umc-computerroom/debian/ucs-school-umc-computerroom.univention-config-registry-variables b/ucs-school-4.1/ucs-school-umc-computerroom/debian/ucs-school-umc-computerroom.univention-config-registry-variables index 4d62e40..51b9836 100644 --- a/ucs-school-4.1/ucs-school-umc-computerroom/debian/ucs-school-umc-computerroom.univention-config-registry-variables +++ b/ucs-school-4.1/ucs-school-umc-computerroom/debian/ucs-school-umc-computerroom.univention-config-registry-variables @@ -9,3 +9,15 @@ Description[de]=UMC-Computerraum-Administration: auf "yes" setzen, um UltraVNC-S Description[en]=UMC-Computerroom-Administration: set "yes" to activate UltraVNC shortcut (Default: false) Type=str Categories=management-umc + +[ucsschool/umc/computerroom/hide_screenshots/groups] +Description[de]=Kommaseparierte Liste mit Gruppennamen, für deren Mitglieder keine Screenshots im Computerraum-Modul angezeigt werden sollen (Standard: Domain Admins) +Description[en]=Comma separated list of group names, for whose group members no screenshots are shown in computer room module (Default: Domain Admins) +Type=str +Categories=management-umc + +[ucsschool/umc/computerroom/hide_screenshots/teachers] +Description[de]=Der Wert "true" verhindert die Anzeige von Screenshots von Lehrer-Rechnern im Computerraum-Modul (Standard: false) +Description[en]=By setting this variable to "true", screenshots of teacher's computers are not shown in computer room module (Default: false) +Type=bool +Categories=management-umc diff --git a/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/__init__.py b/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/__init__.py index be76005..029f5c1 100644 --- a/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/__init__.py +++ b/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/__init__.py @@ -81,7 +81,8 @@ from notifier.nf_qt import _exit _ = Translation('ucs-school-umc-computerroom').translate ROOMDIR = '/var/cache/ucs-school-umc-computerroom' - +FN_SCREENSHOT_DENIED = '/usr/share/ucs-school-umc-computerroom/screenshot_denied.jpg' +FN_SCREENSHOT_NOTREADY = '/usr/share/ucs-school-umc-computerroom/screenshot_notready.jpg' def _getRoomFile(roomDN): if roomDN.startswith('cn='): @@ -545,17 +546,27 @@ class Instance(SchoolBaseModule): """ tmpfile = computer.screenshot - if tmpfile is None: - # vnc has not (yet) received any screenshots from the computer - # dont worry, try again later - self.finished(request.id, None) - return + if computer.hide_screenshot: + filename = FN_SCREENSHOT_DENIED + elif tmpfile is None: + filename = FN_SCREENSHOT_NOTREADY + else: + filename = tmpfile.name + response = Response(mime_type = MIMETYPE_JPEG) response.id = request.id response.command = 'COMMAND' - with open(tmpfile.name, 'rb') as fd: - response.body = fd.read() - os.unlink(tmpfile.name) + MODULE.info('screenshot(%s): hide screenshot = %r' % (computer.name, computer.hide_screenshot)) + try: + with open(filename, 'rb') as fd: + response.body = fd.read() + except (IOError, OSError) as ex: + MODULE.error('Unable to load screenshot file %r: %s' % (filename, ex)) + try: + if tmpfile: + os.unlink(tmpfile.name) + except (IOError, OSError) as ex: + MODULE.error('Unable to remove temporary screenshot file %r: %s' % (tmpfile.name, ex)) self.finished(request.id, response) @check_room_access diff --git a/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/italc2.py b/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/italc2.py index b45a33c..564c437 100644 --- a/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/italc2.py +++ b/ucs-school-4.1/ucs-school-umc-computerroom/umc/python/computerroom/italc2.py @@ -115,13 +115,22 @@ class UserMap( dict ): MODULE.info( 'Unknown user "%s"' % username ) dict.__setitem__( self, userstr, UserInfo( '', '' ) ) else: + result[0].open() userobj = UserInfo( result[ 0 ].dn, username ) - for grp in result[ 0 ][ 'groups' ]: - if grp.endswith( search_base.workgroups ): - userobj.workgroups.append( udm_uldap.explodeDn( grp, True )[ 0 ] ) - elif grp.endswith( search_base.classes ): - userobj.school_class = udm_uldap.explodeDn( grp, True )[ 0 ] userobj.isTeacher = search_base.isTeacher( userobj.dn ) + + blacklisted_groups = set([x.strip().lower() for x in ucr.get('ucsschool/umc/computerroom/hide_screenshots/groups', 'Domain Admins').split(',')]) + users_groupmemberships = set([udm_uldap.explodeDn(x, True)[0].lower() for x in result[0]['groups']]) + MODULE.info('UserMap: %s: hide screenshots for following groups: %s' % (username, blacklisted_groups,)) + MODULE.info('UserMap: %s: user is member of following groups: %s' % (username, users_groupmemberships,)) + userobj.hide_screenshot = bool(blacklisted_groups & users_groupmemberships) + + if ucr.is_true('ucsschool/umc/computerroom/hide_screenshots/teachers', False) and userobj.isTeacher: + MODULE.info('UserMap: %s: is teacher hiding screenshot' % (username,)) + userobj.hide_screenshot = True + + MODULE.info('UserMap: %s: hide_screenshot=%r' % (username, userobj.hide_screenshot)) + dict.__setitem__( self, userstr, userobj ) _usermap = UserMap() @@ -383,6 +392,14 @@ class ITALC_Computer( notifier.signals.Provider, QObject ): return (self._computer.info.get('mac') or [''])[ 0 ] @property + def hide_screenshot(self): + global _usermap + try: + return _usermap[str(self._username.current)].hide_screenshot + except AttributeError: + return False + + @property def isTeacher( self ): global _usermap try: