summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium91
-rw-r--r--core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies33
-rw-r--r--core/modules/kiosk-chromium/module.build12
-rw-r--r--core/modules/kiosk-chromium/module.conf5
-rw-r--r--core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target (renamed from core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target)0
l---------core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target (renamed from core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target)0
l---------core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service (renamed from core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service)0
-rw-r--r--core/modules/kiosk-common/data/etc/systemd/system/kiosk.service (renamed from core/modules/slxbrowser/data/etc/systemd/system/kiosk.service)0
-rw-r--r--core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk345
-rw-r--r--core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode9
-rw-r--r--core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables26
-rwxr-xr-xcore/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch26
-rwxr-xr-xcore/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk57
-rw-r--r--core/modules/kiosk-common/module.build12
-rw-r--r--core/modules/kiosk-common/module.conf4
-rw-r--r--core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.pngbin0 -> 23912 bytes
-rw-r--r--core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.pngbin0 -> 104803 bytes
-rw-r--r--core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css17
-rw-r--r--core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade359
-rwxr-xr-xcore/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py221
-rw-r--r--core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint10
-rw-r--r--core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop5
-rw-r--r--core/modules/kiosk-netpoint/module.build12
-rw-r--r--core/modules/kiosk-netpoint/module.conf5
-rw-r--r--core/modules/kiosk-netpoint/module.conf.ubuntu10
-rw-r--r--[-rwxr-xr-x]core/modules/kiosk-slxbrowser/data/opt/openslx/scripts/kiosk-launch.d/00-slxbrowser (renamed from core/modules/slxbrowser/data/opt/openslx/scripts/kiosk-launch)12
-rw-r--r--core/modules/kiosk-slxbrowser/module.build12
-rw-r--r--core/modules/kiosk-slxbrowser/module.conf8
-rwxr-xr-xcore/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account15
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc6
-rw-r--r--core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser10
-rwxr-xr-xcore/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk20
32 files changed, 1300 insertions, 42 deletions
diff --git a/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium b/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium
new file mode 100644
index 00000000..8221cadb
--- /dev/null
+++ b/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium
@@ -0,0 +1,91 @@
+#!/bin/bash
+# prepares and run chromium as kiosk browser
+
+. /opt/openslx/config
+
+# swallow keyboard shortcuts of chromium
+cat <<- EOF > "$HOME/.xbindkeysrc"
+"true"
+ Control+d
+"true"
+ Control+t
+"true"
+ Control+s
+"true"
+ Control+n
+"true"
+ Control+j
+"true"
+ Control+p
+"true"
+ Control+h
+"true"
+ Control+Shift+o
+EOF
+# xbinkeys requires a daemon, run it
+xbindkeys_autostart &
+
+[ -n "$SLX_BROWSER_INSECURE" ] && SLX_BROWSER_INSECURE="--allow-running-insecure-content --ignore-certificate-errors"
+
+# clear state of previous sessions
+[ -e "$HOME/.config/chromium" ] && rm -rf -- "$HOME/.config/chromium"
+mkdir -p "$HOME/.config/chromium/Default"
+
+bookmark_template="$(mktemp)"
+cat <<-EOF > "$bookmark_template"
+{
+ "roots": {
+ "bookmark_bar": {
+ "children": [ ],
+ "id": "1",
+ "name": "Lesezeichenleiste",
+ "type": "folder"
+ },
+ "other": {
+ "children": [ ],
+ "id": "2",
+ "name": "Weitere Lesezeichen",
+ "type": "folder"
+ },
+ "synced": {
+ "children": [ ],
+ "id": "3",
+ "name": "Mobile Lesezeichen",
+ "type": "folder"
+ }
+ },
+ "version": 1
+}
+EOF
+
+# copy the Bookmark json template and fill in our bookmarks
+json_bookmarks() {
+ cur=0
+ echo -n '['
+ while [ $# -ne 0 ]; do
+ local bb="$1"
+ shift
+ awk -F, '{printf "%s","{\"id\": \"'$cur'\", \"type\": \"url\", \"name\": \""$1"\", \"url\": \""$2"\"}"}' <<< "$bb"
+ [ $# -ne 0 ] && echo -n ','
+ (( cur ++ ))
+ done
+ echo -n ']'
+}
+
+# set the bookmarks in the user's home directory
+jq ".roots.bookmark_bar.children += $(json_bookmarks $SLX_BROWSER_BOOKMARKS)" \
+ "$bookmark_template" > "$HOME/.config/chromium/Default/Bookmarks"
+
+if [ -n "$SLX_BROWSER_INTERACTIVE" ]; then
+ SLX_KIOSK=''
+else
+ SLX_KIOSK='--kiosk'
+fi
+
+# finally start chromium
+exec chromium-browser \
+ --noerrdialogs \
+ --disable-infobars \
+ $SLX_KIOSK \
+ $SLX_BROWSER_INSECURE \
+ "$SLX_BROWSER_URL"
diff --git a/core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies b/core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies
new file mode 100644
index 00000000..8b6a15d9
--- /dev/null
+++ b/core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies
@@ -0,0 +1,33 @@
+#!/bin/bash
+# ^SOURCED
+
+. /opt/openslx/config
+
+chromium_policies() {
+ # create managed policy file, those settings cannot be changed by the user
+ # (if he even gets to the settings dialog in the first place)
+ local chromium_policy_file="/etc/chromium-browser/policies/managed/kiosk-mode.json"
+ [ -e "$chromium_policy_file" ] && rm -f "$chromium_policy_file"
+
+ mkdir -p ${chromium_policy_file%/*}
+
+ if [ -n "$SLX_BROWSER_BOOKMARKS" ]; then
+ bookmarkbar=true
+ else
+ bookmarkbar=false
+ fi
+
+ cat <<- EOF > "$chromium_policy_file"
+ {
+ "BackgroundModeEnabled": false,
+ "BookmarkBarEnabled": $bookmarkbar,
+ "DefaultBrowserSettingEnabled": true,
+ "DownloadRestrictions": 3,
+ "ShowAppsShortcutInBookmarkBar": false,
+ "TranslateEnabled": false
+ }
+ EOF
+}
+
+chromium_policies
+true
diff --git a/core/modules/kiosk-chromium/module.build b/core/modules/kiosk-chromium/module.build
new file mode 100644
index 00000000..a5cbb6b6
--- /dev/null
+++ b/core/modules/kiosk-chromium/module.build
@@ -0,0 +1,12 @@
+#!/bin/bash
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/kiosk-chromium/module.conf b/core/modules/kiosk-chromium/module.conf
new file mode 100644
index 00000000..613d6d21
--- /dev/null
+++ b/core/modules/kiosk-chromium/module.conf
@@ -0,0 +1,5 @@
+#!/bin/bash
+REQUIRED_MODULES="kiosk-common"
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target
index fb95249c..fb95249c 100644
--- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target
+++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target
diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target
index 949b0756..949b0756 120000
--- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target
+++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target
diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service
index a6e3a110..a6e3a110 120000
--- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service
+++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service
diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk.service b/core/modules/kiosk-common/data/etc/systemd/system/kiosk.service
index dba49864..dba49864 100644
--- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk.service
+++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk.service
diff --git a/core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk b/core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk
new file mode 100644
index 00000000..65e09cb5
--- /dev/null
+++ b/core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Do not edit this file, it will be overwritten on install.
+ Copy the file to $HOME/.config/openbox/ instead. -->
+
+<openbox_config xmlns="http://openbox.org/3.4/rc"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+
+<resistance>
+ <strength>10</strength>
+ <screen_edge_strength>20</screen_edge_strength>
+</resistance>
+
+<focus>
+ <focusNew>yes</focusNew>
+ <!-- always try to focus new windows when they appear. other rules do
+ apply -->
+ <followMouse>no</followMouse>
+ <!-- move focus to a window when you move the mouse into it -->
+ <focusLast>yes</focusLast>
+ <!-- focus the last used window when changing desktops, instead of the one
+ under the mouse pointer. when followMouse is enabled -->
+ <underMouse>no</underMouse>
+ <!-- move focus under the mouse, even when the mouse is not moving -->
+ <focusDelay>200</focusDelay>
+ <!-- when followMouse is enabled, the mouse must be inside the window for
+ this many milliseconds (1000 = 1 sec) before moving focus to it -->
+ <raiseOnFocus>no</raiseOnFocus>
+ <!-- when followMouse is enabled, and a window is given focus by moving the
+ mouse into it, also raise the window -->
+</focus>
+
+<placement>
+ <policy>Smart</policy>
+ <!-- 'Smart' or 'UnderMouse' -->
+ <center>yes</center>
+ <!-- whether to place windows in the center of the free area found or
+ the top left corner -->
+ <monitor>Primary</monitor>
+ <!-- with Smart placement on a multi-monitor system, try to place new windows
+ on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
+ the active window is, 'Primary' - only on the primary monitor -->
+ <primaryMonitor>1</primaryMonitor>
+ <!-- The monitor where Openbox should place popup dialogs such as the
+ focus cycling popup, or the desktop switch popup. It can be an index
+ from 1, specifying a particular monitor. Or it can be one of the
+ following: 'Mouse' - where the mouse is, or
+ 'Active' - where the active window is -->
+</placement>
+
+<theme>
+ <name>Orion</name>
+ <titleLayout>LC</titleLayout>
+ <!--
+ available characters are NDSLIMC, each can occur at most once.
+ N: window icon
+ L: window label (AKA title).
+ I: iconify
+ M: maximize
+ C: close
+ S: shade (roll up/down)
+ D: omnipresent (on all desktops).
+ -->
+ <keepBorder>yes</keepBorder>
+ <animateIconify>yes</animateIconify>
+ <font place="ActiveWindow">
+ <name>sans</name>
+ <size>8</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="InactiveWindow">
+ <name>sans</name>
+ <size>8</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="MenuHeader">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>normal</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="MenuItem">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>normal</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="ActiveOnScreenDisplay">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="InactiveOnScreenDisplay">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+</theme>
+
+<desktops>
+ <!-- this stuff is only used at startup, pagers allow you to change them
+ during a session
+
+ these are default values to use when other ones are not already set
+ by other applications, or saved in your session
+
+ use obconf if you want to change these without having to log out
+ and back in -->
+ <number>1</number>
+ <firstdesk>1</firstdesk>
+ <names>
+ <!-- set names up here if you want to, like this:
+ <name>desktop 1</name>
+ <name>desktop 2</name>
+ -->
+ </names>
+ <popupTime>875</popupTime>
+ <!-- The number of milliseconds to show the popup for when switching
+ desktops. Set this to 0 to disable the popup. -->
+</desktops>
+
+<resize>
+ <drawContents>yes</drawContents>
+ <popupShow>Nonpixel</popupShow>
+ <!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) -->
+ <popupPosition>Center</popupPosition>
+ <!-- 'Center', 'Top', or 'Fixed' -->
+ <popupFixedPosition>
+ <!-- these are used if popupPosition is set to 'Fixed' -->
+
+ <x>10</x>
+ <!-- positive number for distance from left edge, negative number for
+ distance from right edge, or 'Center' -->
+ <y>10</y>
+ <!-- positive number for distance from top edge, negative number for
+ distance from bottom edge, or 'Center' -->
+ </popupFixedPosition>
+</resize>
+
+<!-- You can reserve a portion of your screen where windows will not cover when
+ they are maximized, or when they are initially placed.
+ Many programs reserve space automatically, but you can use this in other
+ cases. -->
+<margins>
+ <top>0</top>
+ <bottom>0</bottom>
+ <left>0</left>
+ <right>0</right>
+</margins>
+
+<dock>
+ <position>TopLeft</position>
+ <!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->
+ <floatingX>0</floatingX>
+ <floatingY>0</floatingY>
+ <noStrut>no</noStrut>
+ <stacking>Above</stacking>
+ <!-- 'Above', 'Normal', or 'Below' -->
+ <direction>Vertical</direction>
+ <!-- 'Vertical' or 'Horizontal' -->
+ <autoHide>no</autoHide>
+ <hideDelay>300</hideDelay>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <showDelay>300</showDelay>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <moveButton>Middle</moveButton>
+ <!-- 'Left', 'Middle', 'Right' -->
+</dock>
+
+<keyboard>
+</keyboard>
+
+<mouse>
+ <dragThreshold>1</dragThreshold>
+ <!-- number of pixels the mouse must move before a drag begins -->
+ <doubleClickTime>500</doubleClickTime>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <screenEdgeWarpTime>400</screenEdgeWarpTime>
+ <!-- Time before changing desktops when the pointer touches the edge of the
+ screen while moving a window, in milliseconds (1000 = 1 second).
+ Set this to 0 to disable warping -->
+ <screenEdgeWarpMouse>false</screenEdgeWarpMouse>
+ <!-- Set this to TRUE to move the mouse pointer across the desktop when
+ switching due to hitting the edge of the screen -->
+ <context name="Close">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Left" action="Click">
+ <action name="Close"/>
+ </mousebind>
+ </context>
+</mouse>
+
+<menu>
+ <!-- You can specify more than one menu file in here and they are all loaded,
+ just don't make menu ids clash or, well, it'll be kind of pointless -->
+
+ <!-- default menu file (or custom one in $HOME/.config/openbox/) -->
+ <!-- system menu files on Debian systems -->
+ <file>/var/lib/openbox/debian-menu.xml</file>
+ <file>menu.xml</file>
+ <hideDelay>200</hideDelay>
+ <!-- if a press-release lasts longer than this setting (in milliseconds), the
+ menu is hidden again -->
+ <middle>no</middle>
+ <!-- center submenus vertically about the parent entry -->
+ <submenuShowDelay>100</submenuShowDelay>
+ <!-- time to delay before showing a submenu after hovering over the parent
+ entry.
+ if this is a negative value, then the delay is infinite and the
+ submenu will not be shown until it is clicked on -->
+ <submenuHideDelay>400</submenuHideDelay>
+ <!-- time to delay before hiding a submenu when selecting another
+ entry in parent menu
+ if this is a negative value, then the delay is infinite and the
+ submenu will not be hidden until a different submenu is opened -->
+ <showIcons>yes</showIcons>
+ <!-- controls if icons appear in the client-list-(combined-)menu -->
+ <manageDesktops>yes</manageDesktops>
+ <!-- show the manage desktops section in the client-list-(combined-)menu -->
+</menu>
+
+<applications>
+<!--
+ # this is an example with comments through out. use these to make your
+ # own rules, but without the comments of course.
+ # you may use one or more of the name/class/role/title/type rules to specify
+ # windows to match
+
+ <application name="the window's _OB_APP_NAME property (see obxprop)"
+ class="the window's _OB_APP_CLASS property (see obxprop)"
+ groupname="the window's _OB_APP_GROUP_NAME property (see obxprop)"
+ groupclass="the window's _OB_APP_GROUP_CLASS property (see obxprop)"
+ role="the window's _OB_APP_ROLE property (see obxprop)"
+ title="the window's _OB_APP_TITLE property (see obxprop)"
+ type="the window's _OB_APP_TYPE property (see obxprob)..
+ (if unspecified, then it is 'dialog' for child windows)">
+ # you may set only one of name/class/role/title/type, or you may use more
+ # than one together to restrict your matches.
+
+ # the name, class, role, and title use simple wildcard matching such as those
+ # used by a shell. you can use * to match any characters and ? to match
+ # any single character.
+
+ # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
+ # or desktop
+
+ # when multiple rules match a window, they will all be applied, in the
+ # order that they appear in this list
+
+
+ # each rule element can be left out or set to 'default' to specify to not
+ # change that attribute of the window
+
+ <decor>yes</decor>
+ # enable or disable window decorations
+
+ <shade>no</shade>
+ # make the window shaded when it appears, or not
+
+ <position force="no">
+ # the position is only used if both an x and y coordinate are provided
+ # (and not set to 'default')
+ # when force is "yes", then the window will be placed here even if it
+ # says you want it placed elsewhere. this is to override buggy
+ # applications who refuse to behave
+ <x>center</x>
+ # a number like 50, or 'center' to center on screen. use a negative number
+ # to start from the right (or bottom for <y>), ie -50 is 50 pixels from
+ # the right edge (or bottom). use 'default' to specify using value
+ # provided by the application, or chosen by openbox, instead.
+ <y>200</y>
+ <monitor>1</monitor>
+ # specifies the monitor in a xinerama setup.
+ # 1 is the first head, or 'mouse' for wherever the mouse is
+ </position>
+
+ <size>
+ # the size to make the window.
+ <width>20</width>
+ # a number like 20, or 'default' to use the size given by the application.
+ # you can use fractions such as 1/2 or percentages such as 75% in which
+ # case the value is relative to the size of the monitor that the window
+ # appears on.
+ <height>30%</height>
+ </size>
+
+ <focus>yes</focus>
+ # if the window should try be given focus when it appears. if this is set
+ # to yes it doesn't guarantee the window will be given focus. some
+ # restrictions may apply, but Openbox will try to
+
+ <desktop>1</desktop>
+ # 1 is the first desktop, 'all' for all desktops
+
+ <layer>normal</layer>
+ # 'above', 'normal', or 'below'
+
+ <iconic>no</iconic>
+ # make the window iconified when it appears, or not
+
+ <skip_pager>no</skip_pager>
+ # asks to not be shown in pagers
+
+ <skip_taskbar>no</skip_taskbar>
+ # asks to not be shown in taskbars. window cycling actions will also
+ # skip past such windows
+
+ <fullscreen>yes</fullscreen>
+ # make the window in fullscreen mode when it appears
+
+ <maximized>true</maximized>
+ # 'Horizontal', 'Vertical' or boolean (yes/no)
+ </application>
+
+ # end of the example
+-->
+</applications>
+
+</openbox_config>
diff --git a/core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode b/core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode
new file mode 100644
index 00000000..b740496b
--- /dev/null
+++ b/core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode
@@ -0,0 +1,9 @@
+#!/bin/ash
+# ^SOURCED
+
+# kiosk mode?
+if [ -n "$SLX_BROWSER_URL" ]; then
+ exec /opt/openslx/scripts/kiosk-launch
+fi
+
+true
diff --git a/core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables b/core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables
new file mode 100644
index 00000000..38e4893a
--- /dev/null
+++ b/core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables
@@ -0,0 +1,26 @@
+#!/bin/ash
+# ^ SOURCED
+
+kiosk_rules="/opt/openslx/iptables/rules.d/90-kiosk"
+cat <<-EOF > "$kiosk_rules"
+ #!/bin/ash
+
+ iptables -w -A ipt-helper-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+ iptables -w -I ipt-helper-OUTPUT 1 -o br0 -d 132.230.0.0/16 -j ACCEPT
+ iptables -w -I ipt-helper-INPUT 1 -i br0 -d 132.230.0.0/16 -j ACCEPT
+ iptables -w -I ipt-helper-OUTPUT 1 -o br0 -d 10.0.0.0/8 -j ACCEPT
+ iptables -w -I ipt-helper-INPUT 1 -i br0 -d 10.0.0.0/8 -j ACCEPT
+
+ iptables -P INPUT DROP
+ iptables -P FORWARD DROP
+ iptables -P OUTPUT DROP
+EOF
+
+chmod +x "$kiosk_rules"
+
+# HACK: wait for iptables helper to setup the rules...
+sleep 2
+
+# make sure it is cleared on session close
+echo "rm -f \"$kiosk_rules\"" > "/etc/X11/Xreset.d/clear-kiosk-iptables"
+true
diff --git a/core/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch b/core/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch
new file mode 100755
index 00000000..43af3640
--- /dev/null
+++ b/core/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch
@@ -0,0 +1,26 @@
+#!/bin/bash
+# generic kiosk mode launcher
+
+. /opt/openslx/config
+
+[ -z "$SLX_BROWSER_URL" ] && exit 1
+
+# disable power management features
+xset s off
+xset -dpms
+
+# start openbox window manager
+openbox --config-file "/etc/xdg/openbox/rc.xml.kiosk" &
+
+# move the mouse away
+xdotool mousemove 20000 20000 &
+
+# run browser
+for file in "$0".d/*; do
+ . "$file" || slxlog "kiosk-launch" "Failed to source '$file'."
+done
+
+# should not come to this point as above sources should
+# exec away
+slxlog "kiosk-launch" "No kiosk browser configured!"
+exit 1
diff --git a/core/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk b/core/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk
new file mode 100755
index 00000000..a19e2bc3
--- /dev/null
+++ b/core/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+. /opt/openslx/config
+
+configure_fullscreen() {
+ # TODO having two variants of the rc.xml is quite bad, better to prune it with xmlstarlet?
+ local openbox_rc_file="/etc/xdg/openbox/rc.xml.kiosk"
+ local openbox_namespace="http://openbox.org/3.4/rc"
+ # for fullscreen functionality, use openbox
+ if [ ! -e "$openbox_rc_file" ]; then
+ echo "Could not find global openbox configuration"
+ return 1
+ fi
+ local browser_node="//x:applications/x:application[@role='browser']"
+ local -i browser_node_count="$(xmlstarlet sel -N x="$openbox_namespace" -t -c "count($browser_node)" "$openbox_rc_file")"
+ if [ "$browser_node_count" -gt 1 ]; then
+ echo "More than one node for '$browser_node' found. Removing them all..."
+ xmlstarlet ed -L -N x="$openbox_namespace" -d "$browser_node" "$openbox_rc_file"
+ fi
+ # either we removed everything, or we had none to start with
+ if [ "$browser_node_count" -eq 0 ] ; then
+ local tmpname="application$RANDOM"
+ xmlstarlet ed -L -N x="$openbox_namespace" -s "//x:applications" -t elem -n "$tmpname" -i "//$tmpname" -t attr -n "role" -v "browser" "$openbox_rc_file"
+ browser_node="//x:applications/x:$tmpname"
+ fi
+ # Fullscreen or maximized depends on whether we should start an interactive session or not
+ # For now use SLX_BROWSER_INTERACTIVE
+ local state
+ if [ -n "$SLX_BROWSER_INTERACTIVE" ]; then
+ state="maximized"
+ xmlstarlet ed -L -N x="$openbox_namespace" -d "$browser_node/x:fullscreen" "$openbox_rc_file"
+ else
+ state="fullscreen"
+ xmlstarlet ed -L -N x="$openbox_namespace" -d "$browser_node/x:maximized" "$openbox_rc_file"
+ fi
+
+ if ! xmlstarlet sel -Q -N x="$openbox_namespace" -t -c "$browser_node/x:$state" "$openbox_rc_file"; then
+ xmlstarlet ed -L -N x="$openbox_namespace" -s "$browser_node" -t elem -n "$state" -v "yes" "$openbox_rc_file"
+ elif [ "$(xmlstarlet sel -N x="$openbox_namespace" -t -v "$browser_node/x:$state" "$openbox_rc_file")" != "yes" ]; then
+ xmlstarlet ed -L -N x="$openbox_namespace" -u "$browser_node/x:$state" -v "yes" "$openbox_rc_file"
+ fi
+ xmlstarlet ed -L -N x="$openbox_namespace" -r "$browser_node" -v "application" "$openbox_rc_file"
+}
+
+## MAIN
+configure_fullscreen
+
+# Disable logout delay for demo user on shutdown/reboot/...
+mkdir -p "/run/openslx"
+touch "/run/openslx/demo-no-logout-delay"
+
+for file in "$0".d/*; do
+ # hooks for browser-related stuff
+ . "$file" || slxlog "kiosk-setup" "Failed to source '$file'."
+done
+
+exit 0
diff --git a/core/modules/kiosk-common/module.build b/core/modules/kiosk-common/module.build
new file mode 100644
index 00000000..a5cbb6b6
--- /dev/null
+++ b/core/modules/kiosk-common/module.build
@@ -0,0 +1,12 @@
+#!/bin/bash
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/kiosk-common/module.conf b/core/modules/kiosk-common/module.conf
new file mode 100644
index 00000000..8811668a
--- /dev/null
+++ b/core/modules/kiosk-common/module.conf
@@ -0,0 +1,4 @@
+#!/bin/bash
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.png b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.png
new file mode 100644
index 00000000..d89c5d7c
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.png
Binary files differ
diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.png b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.png
new file mode 100644
index 00000000..a340b9b2
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.png
Binary files differ
diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css
new file mode 100644
index 00000000..68ebbe46
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css
@@ -0,0 +1,17 @@
+#main {
+ background-color: white;
+}
+#sep {
+ -GtkWidget-wide-separators: 1;
+ -GtkWidget-separator-width: 5;
+ border-style: solid;
+ border-width: 2px;
+ color: grey;
+}
+#title {
+ border-top-style: solid;
+ border-bottom-style: double;
+ border-width: 3px;
+ border-color: grey;
+
+}
diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade
new file mode 100644
index 00000000..396d4a53
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade
@@ -0,0 +1,359 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <object class="GtkWindow" id="main">
+ <property name="name">main</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="window_position">center-always</property>
+ <property name="default_width">800</property>
+ <property name="default_height">600</property>
+ <property name="decorated">False</property>
+ <property name="gravity">center</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="name">title</property>
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Kioskswitcher</property>
+ <attributes>
+ <attribute name="font-desc" value="Sans Bold 18"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="name">sep</property>
+ <property name="width_request">10</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">False</property>
+ <property name="row_homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">False</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="guest_text">
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Gastzugang</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="font-desc" value="Sans Bold 14"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Hier können Sie sich ohne RZ-Zugang als Gast anmelden.
+Es können nur Seiten innerhalb des Universitätsnetzes aufgerufen werden.
+
+Zum Abmelden bitte den Browser schließen.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="width_chars">0</property>
+ <property name="max_width_chars">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="guest_button">
+ <property name="label" translatable="yes">Als Gast anmelden</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="guest_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="guest_image">
+ <property name="name">guest_image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="pixbuf">ff-rz-small.png</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="login_text">
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">RZ-Zugang</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="font-desc" value="Sans Bold 14"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="login_info">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Melden Sie sich mit Ihrem RZ-Konto an.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="width_chars">0</property>
+ <property name="max_width_chars">30</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="row_spacing">3</property>
+ <property name="column_spacing">3</property>
+ <child>
+ <object class="GtkEntry" id="pass_password">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="progress_pulse_step">0</property>
+ <signal name="activate" handler="login_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="pass_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Passwort:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="user_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Username:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="user_username">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal name="activate" handler="login_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="label" translatable="yes">Login</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="login_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="feedback_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="login_image">
+ <property name="name">login_image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="pixbuf">ff-google-small.png</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py
new file mode 100755
index 00000000..36a0a16b
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python2
+#
+# Author: Matt Fischer <matthew.fischer@canonical.com>
+# Copyright (C) 2012 Canonical, Ltd
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+# license.
+#
+# This code is based on the LightDM GTK Greeter which was written by:
+# Robert Ancell <robert.ancell@canonical.com>
+
+# required packages:
+# liblightdm-gobject-1-0
+# gir1.2-lightdm-1
+# python-gobject
+# gir1.2-glib-2.0
+# gir1.2-gtk-3.0
+
+from gi.repository import GObject
+from gi.repository import GLib
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository.GdkPixbuf import InterpType
+from gi.repository import LightDM
+import os
+import sys
+import threading
+import subprocess
+
+greeter = None
+
+main = None
+split = None
+
+guest_box = None
+guest_text = None
+guest_button = None
+guest_image = None
+
+login_box = None
+login_text = None
+user_box = None
+user_text = None
+user_username = None
+pass_box = None
+pass_text = None
+pass_password = None
+
+prompt_box = None
+prompt_label = None
+prompt_entry = None
+
+# For auto login
+auto_login_count = 30
+last_login_text = ""
+last_password_text = ""
+
+
+
+
+# This Gtk signal is called when the user hits enter after entering a
+# username/password or clicks the login button. Since we re-purposed
+# the text entry box, we have 3 possible cases to handle here.
+# 1) the user is already authenticated, if for example, they don't have
+# a password set.
+# 2) The username has been passed into LightDM and now we need to pass
+# the password
+# 3) The username has been entered, but not passed in. We pass it in
+# and start the authentication process.
+def login_cb(widget):
+ print >> sys.stderr, "login_cb"
+ if greeter.get_is_authenticated():
+ print >> sys.stderr, "user is already authenticated, starting session"
+ #start_session()
+ elif greeter.get_in_authentication():
+ print >> sys.stderr, "username was passed in already, send password to LightDM"
+ print >> sys.stderr, greeter.get_authentication_user()
+ greeter.respond(pass_password.get_text())
+ feedback_label.set_text("Authenticating...")
+ else:
+ print >> sys.stderr, "Initial entry of username, send it to LightDM"
+ greeter.authenticate(user_username.get_text())
+ feedback_label.set_text("Authenticating...")
+
+def guest_cb(widget):
+ print >> sys.stderr, "guest_cb"
+ if greeter.get_has_guest_account_hint():
+ print >> sys.stderr, "Guest accounts supported"
+ greeter.authenticate_as_guest()
+ else:
+ print >> sys.stderr, "Guest accounts not supported"
+
+
+# Gtk Signal Handlers
+handlers = {
+ "login_cb": login_cb,
+ "guest_cb": guest_cb
+}
+
+# The show_prompt callback is oddly named, but when you get this
+# callback you are supposed to send the password to LightDM next. In
+# our example, we re-purpose the prompt and ask the user for the
+# password which is then sent the next time the user hits the Login
+# button or presses enter.
+def show_prompt_cb(greeter, text, promptType):
+ print >> sys.stderr, "prompt type: " + str(promptType)
+ # if this is a password prompt, we want to hide the characters
+ if promptType == LightDM.PromptType.SECRET:
+ pass_password.set_visibility(False)
+ else:
+ pass_password.set_visibility(True)
+ greeter.respond(pass_password.get_text())
+
+
+# If LightDM sends a message back to the greeter, for example, "Login
+# failed" or "invalid password" we display it in our message box.
+def show_message_cb(text, message_type):
+ feedback_label.set_visibility(True)
+ feedback_label.set_text(text)
+
+# Callback for after we send LightDM the password, this method
+# has to handle a successful login, in which case we start the session
+# or a failed login, in which case we tell the user
+def authentication_complete_cb(greeter):
+ if greeter.get_is_authenticated():
+ if not greeter.start_session_sync("default"):
+ print >> sys.stderr, "Failed to start session"
+ else:
+ feedback_label.set_text("Login failed!")
+ pass_password.set_text("");
+ print >> sys.stderr, "Login failed"
+
+if __name__ == '__main__':
+ print >> sys.stderr, "Starting up..."
+ main_loop = GObject.MainLoop ()
+ builder = Gtk.Builder()
+ greeter = LightDM.Greeter()
+ styler = Gtk.CssProvider()
+ css = open(os.path.dirname(os.path.abspath(__file__)) + '/netpoint.css', 'r')
+
+ css_data = css.read()
+ css.close()
+ styler.load_from_data(css_data)
+ Gtk.StyleContext.add_provider_for_screen(
+ Gdk.Screen.get_default(),
+ styler,
+ Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
+ )
+
+ # connect signal handlers to LightDM
+ greeter.connect ("authentication-complete", authentication_complete_cb)
+ greeter.connect ("show-message", show_message_cb)
+ greeter.connect ("show-prompt", show_prompt_cb)
+
+ # connect builder and widgets
+ # you probably really want to put your .UI file somewhere else
+ builder.add_from_file(os.path.dirname(os.path.abspath(__file__)) + "/netpoint.glade")
+
+ main = builder.get_object("main")
+ split = builder.get_object("split")
+ sep = builder.get_object("sep")
+ guest_box = builder.get_object("guest_box")
+ guest_outer_box = builder.get_object("guest_outer_box")
+ guest_internal_box = builder.get_object("guest_internal_box")
+ guest_text = builder.get_object("guest_text")
+ guest_button = builder.get_object("guest_button")
+ guest_image = builder.get_object("guest_image")
+ login_image = builder.get_object("login_image")
+ checkbox = builder.get_object("checkbutton1")
+ pixbuf = guest_image.get_pixbuf()
+ pixbuf = pixbuf.scale_simple(pixbuf.get_width() * 0.75, pixbuf.get_height() * 0.75, InterpType.HYPER)
+ guest_image.set_from_pixbuf(pixbuf)
+ pixbuf = login_image.get_pixbuf()
+ pixbuf = pixbuf.scale_simple(pixbuf.get_width() * 0.75, pixbuf.get_height() * 0.75, InterpType.BILINEAR)
+ login_image.set_from_pixbuf(pixbuf)
+
+ login_box = builder.get_object("login_box")
+ login_text = builder.get_object("login_text")
+
+ user_box = builder.get_object("user_box")
+ user_text = builder.get_object("user_text")
+ user_username = builder.get_object("user_username")
+
+ pass_box = builder.get_object("pass_box")
+ pass_text = builder.get_object("pass_text")
+ pass_password = builder.get_object("pass_password")
+ feedback_label = builder.get_object("feedback_label")
+
+ # connect signals to Gtk UI
+ builder.connect_signals(handlers)
+
+ # connect to greeter
+ greeter.connect_sync()
+
+ # check for autologin
+ rc = subprocess.call("/opt/openslx/lightdm/is-autologin-enabled", shell=True)
+ if rc == 0:
+ greeter.authenticate_as_guest()
+ # setup the GUI
+ main.set_decorated(True)
+ main.get_root_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR))
+ main.show()
+ guest_text.show()
+ guest_button.show()
+ login_text.show()
+ user_text.show()
+ user_username.grab_focus()
+ user_username.show()
+ pass_text.show()
+ pass_password.set_sensitive(True)
+ pass_password.set_visibility(False)
+ pass_password.show()
+
+ # fullscreen it
+ main.resize(Gdk.Screen.width(), Gdk.Screen.height())
+
+ main_loop.run ()
diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint b/core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint
new file mode 100644
index 00000000..b172dd7e
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint
@@ -0,0 +1,10 @@
+#!/bin/ash
+
+# cause why not ...
+mkdir -p "/etc/lightdm/lightdm.conf.d/"
+cat <<-EOF > /etc/lightdm/lightdm.conf.d/20-netpoint-greeter.conf
+ [SeatDefaults]
+ greeter-session=netpoint
+EOF
+
+true
diff --git a/core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop b/core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop
new file mode 100644
index 00000000..e6f340b9
--- /dev/null
+++ b/core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Netpoint Greeter
+Comment=Netpoint Greeter
+Exec=/opt/openslx/lightdm/netpoint-greeter/netpoint.py
+Type=Application
diff --git a/core/modules/kiosk-netpoint/module.build b/core/modules/kiosk-netpoint/module.build
new file mode 100644
index 00000000..a5cbb6b6
--- /dev/null
+++ b/core/modules/kiosk-netpoint/module.build
@@ -0,0 +1,12 @@
+#!/bin/bash
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/kiosk-netpoint/module.conf b/core/modules/kiosk-netpoint/module.conf
new file mode 100644
index 00000000..613d6d21
--- /dev/null
+++ b/core/modules/kiosk-netpoint/module.conf
@@ -0,0 +1,5 @@
+#!/bin/bash
+REQUIRED_MODULES="kiosk-common"
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/kiosk-netpoint/module.conf.ubuntu b/core/modules/kiosk-netpoint/module.conf.ubuntu
new file mode 100644
index 00000000..f69c2445
--- /dev/null
+++ b/core/modules/kiosk-netpoint/module.conf.ubuntu
@@ -0,0 +1,10 @@
+#!/bin/bash
+REQUIRED_CONTENT_PACKAGES="
+ gir1.2-lightdm-1
+ liblightdm-gobject-1-0
+ liblightdm-qt5-3-0
+"
+REQUIRED_INSTALLED_PACKAGES="$REQUIRED_CONTENT_PACKAGES"
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/slxbrowser/data/opt/openslx/scripts/kiosk-launch b/core/modules/kiosk-slxbrowser/data/opt/openslx/scripts/kiosk-launch.d/00-slxbrowser
index 566bbb16..5a9196c4 100755..100644
--- a/core/modules/slxbrowser/data/opt/openslx/scripts/kiosk-launch
+++ b/core/modules/kiosk-slxbrowser/data/opt/openslx/scripts/kiosk-launch.d/00-slxbrowser
@@ -1,18 +1,10 @@
#!/bin/ash
+# ^ sourced!
-. /opt/openslx/config
-
-[ -z "$SLX_BROWSER_URL" ] && exit 1
-
-xset s off
-xset -dpms
-
-openbox &
+export PATH=$PATH:/opt/openslx/sbin:/opt/openslx/bin
[ -n "$SLX_BROWSER_INSECURE" ] && SLX_BROWSER_INSECURE="--insecure"
RELOAD=
[ -n "$SLX_BROWSER_RELOAD_SECS" ] && [ "$SLX_BROWSER_RELOAD_SECS" -gt 0 ] && RELOAD="--reload-interval $SLX_BROWSER_RELOAD_SECS"
-xdotool mousemove 20000 20000 &
exec slxbrowser $SLX_BROWSER_INSECURE $RELOAD --fullscreen "$SLX_BROWSER_URL"
-
diff --git a/core/modules/kiosk-slxbrowser/module.build b/core/modules/kiosk-slxbrowser/module.build
new file mode 100644
index 00000000..a5cbb6b6
--- /dev/null
+++ b/core/modules/kiosk-slxbrowser/module.build
@@ -0,0 +1,12 @@
+#!/bin/bash
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/kiosk-slxbrowser/module.conf b/core/modules/kiosk-slxbrowser/module.conf
new file mode 100644
index 00000000..c90b91dd
--- /dev/null
+++ b/core/modules/kiosk-slxbrowser/module.conf
@@ -0,0 +1,8 @@
+#!/bin/bash
+REQUIRED_MODULES="
+ kiosk-common
+ slxbrowser
+"
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account b/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account
index 30a23f24..2de5343f 100755
--- a/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account
+++ b/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account
@@ -1,5 +1,16 @@
#!/bin/ash
# Run as root, intended to setup the guest account
-# and echo its name at the end.
-# we use the existing demo user, so not much to do
+# and echo its name, demo in our case, at the end.
+# Further we allow for hooks to execute stuff here.
+
+(
+hook_dir="$(readlink -f $0)"
+if [ -d "$hook_dir" ]; then
+ for hook in "$hook_dir"/*; do
+ [ -s "$hook" ] || continue
+ . "$hook" || slxlog "kiosk-guest-account" "Failed to source '$hook'."
+ done
+fi
+) > /dev/null 2>&1
+# finish by echoing the guest account name
echo "demo"
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
index b4f87d11..28f18a3f 100644
--- a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc
@@ -482,6 +482,12 @@ dir_on_tmpfs() {
[ "x$(cut -d' ' -f3 <<< ${mount_line})" == "xtmpfs" ]
return $?
done
+ # NG: check if / is fully backed by hard drive
+ local dmsetup_conf="/run/openslx/dmsetup.conf"
+ if [ -s "$dmsetup_conf" ]; then
+ return $( ! grep -qE '^/dev/mapper/root\s+/\s+type=1' "$dmsetup_conf" )
+ fi
+ # else assume old-gen were / was in RAM
return 0
}
diff --git a/core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser b/core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser
deleted file mode 100644
index 4fe45c02..00000000
--- a/core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/ash
-# This file is SOURCED
-
-# Kiosk mode?
-if [ -n "$SLX_BROWSER_URL" ]; then
- exec /opt/openslx/scripts/kiosk-launch
-fi
-
-true
-
diff --git a/core/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk b/core/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk
deleted file mode 100755
index b8761aab..00000000
--- a/core/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/ash
-
-# Autologin
-sed -i '/^AutoLoginDelay=/d;/^AutoLoginUser=/d;s/^AutoLoginEnable=.*$/AutoLoginEnable=true\nAutoLoginUser=demo\nAutoLoginDelay=0/' "/etc/kde4/kdm/kdmrc"
-
-# Disable logout delay for demo user on shutdown/reboot/...
-mkdir -p "/run/openslx"
-touch "/run/openslx/demo-no-logout-delay"
-
-# desktop session
-cat > /opt/openslx/xsessions/default.desktop <<EOF
-[Desktop Entry]
-Name=SLXbrowser
-Comment=Minimalistic browser
-Exec=/opt/openslx/scripts/kiosk-launch
-Type=Application
-X-LightDM-DesktopName=SLXbrowser
-DesktopNames=SLXbrowser
-EOF
-