diff --git a/.m1k1o/base/Dockerfile b/.m1k1o/base/Dockerfile new file mode 100644 index 0000000..3818f55 --- /dev/null +++ b/.m1k1o/base/Dockerfile @@ -0,0 +1,122 @@ +# +# STAGE 1: SERVER +# +FROM golang:1.14.4-stretch as server +WORKDIR /src + +# +# install dependencies +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends git cmake make libx11-dev libxrandr-dev libxtst-dev \ + libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good; \ + # + # install libclipboard + set -eux; \ + cd /tmp; \ + git clone https://github.com/jtanx/libclipboard; \ + cd libclipboard; \ + cmake .; \ + make -j4; \ + make install; \ + rm -rf /tmp/libclipboard; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# build server +COPY server/ . +RUN go get -v -t -d . && go build -o bin/neko -i cmd/neko/main.go + +# +# STAGE 2: CLIENT +# +FROM node:12.18.0-stretch-slim as client +WORKDIR /src + +# +# install dependencies +COPY client/package*.json ./ +RUN npm install + +# +# build client +COPY client/ . +RUN npm run build + +# +# STAGE 3: RUNTIME +# +FROM debian:stretch-slim + +# +# avoid warnings by switching to noninteractive +ENV DEBIAN_FRONTEND=noninteractive + +# +# set custom user +ARG USERNAME=neko +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# +# install dependencies +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends wget ca-certificates supervisor; \ + apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \ + apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx4; \ + # + # gst + apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ + gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-pulseaudio; \ + # + # create a non-root user + groupadd --gid $USER_GID $USERNAME; \ + useradd --uid $USER_UID --gid $USERNAME --shell /bin/bash --create-home $USERNAME; \ + adduser $USERNAME audio; \ + adduser $USERNAME video; \ + adduser $USERNAME pulse; \ + # + # setup pulseaudio + mkdir -p /home/$USERNAME/.config/pulse/; \ + echo "default-server=unix:/tmp/pulseaudio.socket" > /home/$USERNAME/.config/pulse/client.conf; \ + # + # workaround for an X11 problem: http://blog.tigerteufel.de/?p=476 + mkdir /tmp/.X11-unix; \ + chmod 1777 /tmp/.X11-unix; \ + chown $USERNAME /tmp/.X11-unix/; \ + # + # make directories for neko + mkdir -p /etc/neko /var/www /var/log/neko; \ + chmod 1777 /var/log/neko; \ + chown $USERNAME /var/log/neko/; \ + chown -R $USERNAME:$USERNAME /home/$USERNAME; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# copy config files +COPY .docker/dbus /usr/bin/dbus +COPY .docker/default.pa /etc/pulse/default.pa +COPY .docker/supervisord.conf /etc/neko/supervisord.conf +COPY .docker/xorg.conf /etc/neko/xorg.conf + +# +# set default envs +ENV USER=$USERNAME +ENV DISPLAY=:99.0 +ENV NEKO_PASSWORD=neko +ENV NEKO_PASSWORD_ADMIN=admin +ENV NEKO_BIND=:8080 + +# +# copy static files from previous stages +COPY --from=server /src/bin/neko /usr/bin/neko +COPY --from=client /src/dist/ /var/www + +# +# run neko +CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"] diff --git a/.m1k1o/base/dbus b/.m1k1o/base/dbus new file mode 100644 index 0000000..bf0d437 --- /dev/null +++ b/.m1k1o/base/dbus @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ ! -d /var/run/dbus ]; then + mkdir -p /var/run/dbus +fi + +if [ -f /var/run/dbus/pid ]; then + rm -f /var/run/dbus/pid +fi + +/usr/bin/dbus-daemon --nofork --print-pid --config-file=/usr/share/dbus-1/system.conf diff --git a/.m1k1o/base/default.pa b/.m1k1o/base/default.pa new file mode 100644 index 0000000..b0a26b1 --- /dev/null +++ b/.m1k1o/base/default.pa @@ -0,0 +1,7 @@ +#!/usr/bin/pulseaudio -nF + +# Allow pulse audio to be accessed via TCP (from localhost only), to allow other users to access the virtual devices +load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket auth-anonymous=1 + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink diff --git a/.m1k1o/base/supervisord.conf b/.m1k1o/base/supervisord.conf new file mode 100644 index 0000000..98f71bc --- /dev/null +++ b/.m1k1o/base/supervisord.conf @@ -0,0 +1,53 @@ +[supervisord] +nodaemon=true +pidfile=/var/run/supervisord.pid +logfile=/dev/null +logfile_maxbytes=0 +loglevel=debug + +[include] +files=/etc/neko/supervisord/*.conf + +[program:dbus] +environment=HOME="/root",USER="root" +command=/usr/bin/dbus +autorestart=true +priority=100 +user=root +stdout_logfile=/var/log/neko/dbus.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:x-server] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s" +command=/usr/bin/X -config /etc/neko/xorg.conf %(ENV_DISPLAY)s +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/xorg.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:pulseaudio] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/pulseaudio --disallow-module-loading -vvvv --disallow-exit --exit-idle-time=-1 +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/pulseaudio.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:neko] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/neko serve -d --static "/var/www" +autorestart=true +priority=800 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/neko.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true diff --git a/.m1k1o/base/xorg.conf b/.m1k1o/base/xorg.conf new file mode 100644 index 0000000..57016ad --- /dev/null +++ b/.m1k1o/base/xorg.conf @@ -0,0 +1,88 @@ +# This xorg configuration file is meant to be used by xpra +# to start a dummy X11 server. +# For details, please see: +# https://xpra.org/trac/wiki/Xdummy + +Section "ServerFlags" + Option "DontVTSwitch" "true" + Option "AllowMouseOpenFail" "true" + Option "PciForceNone" "true" + Option "AutoEnableDevices" "false" + Option "AutoAddDevices" "false" +EndSection + +Section "InputDevice" + Identifier "dummy_mouse" + Option "CorePointer" "true" + Driver "void" +EndSection + +Section "InputDevice" + Identifier "dummy_keyboard" + Option "CoreKeyboard" "true" + Driver "void" +EndSection + +Section "Device" + Identifier "dummy_videocard" + Driver "dummy" + Option "ConstantDPI" "true" + #VideoRam 4096000 + #VideoRam 256000 + VideoRam 192000 +EndSection + +Section "Monitor" + Identifier "dummy_monitor" + HorizSync 5.0 - 1000.0 + VertRefresh 5.0 - 200.0 + #This can be used to get a specific DPI, but only for the default resolution: + #DisplaySize 508 317 + #NOTE: the highest modes will not work without increasing the VideoRam + # for the dummy video card. + # https://arachnoid.com/modelines/ + + # 1280x720 @ 30.00 Hz (GTF) hsync: 21.99 kHz; pclk: 33.78 MHz + Modeline "1280x720_30.00" 33.78 1280 1288 1408 1536 720 721 724 733 -HSync +Vsync + + # 1280x720 @ 60.00 Hz (GTF) hsync: 44.76 kHz; pclk: 74.48 MHz + Modeline "1280x720_60.00" 74.48 1280 1336 1472 1664 720 721 724 746 -HSync +Vsync + # 1152x648 @ 60.00 Hz (GTF) hsync: 40.26 kHz; pclk: 59.91 MHz + Modeline "1152x648_60.00" 59.91 1152 1200 1320 1488 648 649 652 671 -HSync +Vsync + # 1024x576 @ 60.00 Hz (GTF) hsync: 35.82 kHz; pclk: 47.00 MHz + Modeline "1024x576_60.00" 47.00 1024 1064 1168 1312 576 577 580 597 -HSync +Vsync + # 960x720 @ 60.00 Hz (GTF) hsync: 44.76 kHz; pclk: 55.86 MHz + Modeline "960x720_60.00" 55.86 960 1008 1104 1248 720 721 724 746 -HSync +Vsync + # 800x600 @ 60.00 Hz (GTF) hsync: 37.32 kHz; pclk: 38.22 MHz + Modeline "800x600_60.00" 38.22 800 832 912 1024 600 601 604 622 -HSync +Vsync + + # 1920x1080 @ 30.00 Hz (GTF) hsync: 32.97 kHz; pclk: 80.18 MHz + Modeline "1920x1080_30.00" 80.18 1920 1984 2176 2432 1080 1081 1084 1099 -HSync +Vsync + # 1152x648 @ 30.00 Hz (GTF) hsync: 19.80 kHz; pclk: 26.93 MHz + Modeline "1152x648_30.00" 26.93 1152 1144 1256 1360 648 649 652 660 -HSync +Vsync + # 1024x576 @ 30.00 Hz (GTF) hsync: 17.61 kHz; pclk: 20.85 MHz + Modeline "1024x576_30.00" 20.85 1024 1008 1104 1184 576 577 580 587 -HSync +Vsync + # 960x720 @ 30.00 Hz (GTF) hsync: 21.99 kHz; pclk: 25.33 MHz + Modeline "960x720_30.00" 25.33 960 960 1056 1152 720 721 724 733 -HSync +Vsync + # 800x600 @ 30.00 Hz (GTF) hsync: 18.33 kHz; pclk: 17.01 MHz + Modeline "800x600_30.00" 17.01 800 792 864 928 600 601 604 611 -HSync +Vsync +EndSection + +Section "Screen" + Identifier "dummy_screen" + Device "dummy_videocard" + Monitor "dummy_monitor" + DefaultDepth 24 + SubSection "Display" + Viewport 0 0 + Depth 24 + Modes "1280x720_30.00" "1920x1080_60.00" "1280x720_60.00" "1152x648_60.00" "1024x576_60.00" "960x720_60.00" "800x600_60.00" "1920x1080_30.00" "1152x648_30.00" "1024x576_30.00" "960x720_30.00" "800x600_30.00" + EndSubSection +EndSection + +Section "ServerLayout" + Identifier "dummy_layout" + Screen "dummy_screen" + InputDevice "dummy_mouse" + InputDevice "dummy_keyboard" +EndSection diff --git a/.m1k1o/browser/Dockerfile b/.m1k1o/browser/Dockerfile new file mode 100644 index 0000000..18eb492 --- /dev/null +++ b/.m1k1o/browser/Dockerfile @@ -0,0 +1,22 @@ +FROM m1k1o/neko:base + +# +# install firefox-esr +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends openbox firefox-esr; \ + # + # install extensions + mkdir -p /usr/lib/firefox-esr/distribution/extensions; \ + wget -O '/usr/lib/firefox-esr/distribution/extensions/uBlock0@raymondhill.net.xpi' https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# copy configuation files +COPY supervisord.conf /etc/neko/supervisord/firefox.conf +COPY neko.js /usr/lib/firefox-esr/mozilla.cfg +COPY autoconfig.js /usr/lib/firefox-esr/defaults/pref/autoconfig.js +COPY policies.json /usr/lib/firefox-esr/distribution/policies.json +COPY openbox.xml /etc/neko/openbox.xml diff --git a/.m1k1o/browser/autoconfig.js b/.m1k1o/browser/autoconfig.js new file mode 100644 index 0000000..87d6579 --- /dev/null +++ b/.m1k1o/browser/autoconfig.js @@ -0,0 +1,2 @@ +pref("general.config.obscure_value", 0); +pref("general.config.filename", "mozilla.cfg"); \ No newline at end of file diff --git a/.m1k1o/browser/neko.js b/.m1k1o/browser/neko.js new file mode 100644 index 0000000..891d521 --- /dev/null +++ b/.m1k1o/browser/neko.js @@ -0,0 +1,35 @@ +// firefox config for neko +lockPref("browser.tabs.closeWindowWithLastTab", false); +lockPref("app.update.auto", false); +lockPref("app.update.enabled", false); +lockPref("app.update.silent", true); +lockPref("browser.cache.disk.capacity", 1000); +lockPref("browser.download.useDownloadDir", false); +lockPref("browser.rights.3.shown", true); +lockPref("browser.search.update", false); +lockPref("browser.shell.checkDefaultBrowser", false); +lockPref("extensions.update.enabled", false); +lockPref("plugin.default_plugin_disabled", false); +lockPref("plugin.scan.plid.all", true); +lockPref("plugins.hide_infobar_for_missing_plugin", true); +lockPref("profile.allow_automigration", false); +lockPref("signon.prefillForms", false); +lockPref("signon.rememberSignons", false); +lockPref("xpinstall.enabled", false); +lockPref("xpinstall.whitelist.required", true); +lockPref("browser.download.manager.retention", 0); +lockPref("browser.download.folderList", 2); +lockPref("browser.download.forbid_open_with", true); +lockPref("browser.safebrowsing.downloads.enabled", false); +lockPref("browser.safebrowsing.downloads.remote.enabled", false); +lockPref("browser.helperApps.alwaysAsk.force", false); +lockPref("browser.helperApps.neverAsk.saveToDisk", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf"); +lockPref("browser.helperApps.neverAsk.openFile", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf"); +lockPref("browser.newtabpage.activity-stream.default.sites", "https://ipleak.net/,https://www.youtube.com/,https://www.google.com/"); +// dark mode +lockPref("reader.color_scheme", "dark"); +lockPref("devtools.theme", "dark"); +lockPref("ui.systemUsesDarkTheme", 1); +lockPref("lightweightThemes.usedThemes","[]"); +lockPref("lightweightThemes.selectedThemeID", "firefox-compact-dark@mozilla.org"); +lockPref("browser.in-content.dark-mode", true); diff --git a/.m1k1o/browser/openbox.xml b/.m1k1o/browser/openbox.xml new file mode 100644 index 0000000..0e73a07 --- /dev/null +++ b/.m1k1o/browser/openbox.xml @@ -0,0 +1,763 @@ + + + + + + + + 10 + 20 + + + + + + no + true + yes + normal + + + + + yes + + no + + yes + + no + + 200 + + no + + + + + Smart + +
yes
+ + Primary + + 1 + +
+ + + Clearlooks + NLIMC + + yes + yes + + sans + 8 + + bold + + normal + + + + sans + 8 + + bold + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + bold + + normal + + + + sans + 9 + + bold + + normal + + + + + + + 1 + 1 + + + + 875 + + + + + yes + Nonpixel + + Center + + + + + 10 + + 10 + + + + + + + 0 + 0 + 0 + 0 + + + + TopLeft + + 0 + 0 + no + Above + + Vertical + + no + 300 + + 300 + + Middle + + + + + C-g + + + + leftno + + + rightno + + + upno + + + downno + + + leftno + + + rightno + + + upno + + + downno + + + 1 + + + 2 + + + 3 + + + 4 + + + + + + + + + + + + + + + + + + + + scrot -s + + + + + + + + + + + + + + + + + + + + + + + + yesyes + + + + + + + + + + + + right + + + + + left + + + + + up + + + + + down + + + + + + + + true + Konqueror + + kfmclient openProfile filemanagement + + + + + scrot + + + + + 1 + + 500 + + 400 + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + previous + + + next + + + previous + + + next + + + previous + + + next + + + + + + + + + + + + + + no + + + + + + + + + + + yes + + + + + + + + + + + + + + + + + + + + + + + + + + + top + + + + + + left + + + + + + right + + + + + + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vertical + + + horizontal + + + + + + + + + + + + + + + + + previous + + + next + + + + previous + + + next + + + previous + + + next + + + + + + + + + + + + + + + + + + + + previous + + + next + + + previous + + + next + + + + + + + + + + + menu.xml + 200 + + no + + 100 + + 400 + + yes + + yes + + + + + + + +
diff --git a/.m1k1o/browser/policies.json b/.m1k1o/browser/policies.json new file mode 100644 index 0000000..205daee --- /dev/null +++ b/.m1k1o/browser/policies.json @@ -0,0 +1,125 @@ +{ + "policies": { + "BlockAboutAddons": false, + "BlockAboutConfig": true, + "BlockAboutProfiles": true, + "BlockAboutSupport": true, + "Bookmarks": [ + { + "Title": "IPLeak", + "URL": "https://ipleak.net/", + "Favicon": "https://ipleak.net/favicon.ico", + "Folder": "Pages", + "Placement": "toolbar" + }, + { + "Title": "YouTube", + "URL": "https://www.youtube.com/", + "Favicon": "https://www.youtube.com/favicon.ico", + "Folder": "Pages", + "Placement": "toolbar" + }, + { + "Title": "Google", + "URL": "https://www.google.com/", + "Favicon": "https://www.google.com/favicon.ico", + "Folder": "Pages", + "Placement": "toolbar" + } + ], + "CaptivePortal": false, + "DisableAppUpdate": true, + "DisableBuiltinPDFViewer": true, + "DisableDeveloperTools": false, + "DisableFeedbackCommands": true, + "DisableFirefoxAccounts": true, + "DisableFirefoxScreenshots": true, + "DisableFirefoxStudies": true, + "DisableForgetButton": true, + "DisableMasterPasswordCreation": true, + "DisablePocket": true, + "DisablePrivateBrowsing": true, + "DisableProfileImport": true, + "DisableProfileRefresh": true, + "DisableSafeMode": true, + "DisableSetDesktopBackground": true, + "DisableSystemAddonUpdate": true, + "DisableTelemetry": true, + "DisplayBookmarksToolbar": false, + "DontCheckDefaultBrowser": true, + "EnableTrackingProtection": { + "Cryptomining": true, + "Fingerprinting": true, + "Value": true + }, + "ExtensionSettings": { + "*": { + "installation_mode": "blocked" + }, + "uBlock0@raymondhill.net": { + "install_url": "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi", + "installation_mode": "force_installed" + } + }, + "ExtensionUpdate": false, + "FirefoxHome": { + "Highlights": false, + "Pocket": false, + "Search": true, + "Snippets": false, + "TopSites": true + }, + "FlashPlugin": {}, + "HardwareAcceleration": false, + "Homepage": { + "Additional": [], + "StartPage": "none" + }, + "NewTabPage": true, + "NoDefaultBookmarks": true, + "OfferToSaveLogins": false, + "OfferToSaveLoginsDefault": false, + "OverrideFirstRunPage": "", + "OverridePostUpdatePage": "", + "PasswordManagerEnabled": false, + "Permissions": { + "Camera": { + "BlockNewRequests": true + }, + "Location": { + "BlockNewRequests": true + }, + "Microphone": { + "BlockNewRequests": true + }, + "Notifications": { + "BlockNewRequests": true + } + }, + "Preferences": { + "browser.tabs.warnOnClose": false, + "browser.urlbar.suggest.bookmark": false, + "browser.urlbar.suggest.history": false, + "browser.urlbar.suggest.openpage": false, + "datareporting.policy.dataSubmissionPolicyBypassNotification": true, + "dom.disable_window_flip": true, + "dom.disable_window_move_resize": true, + "dom.event.contextmenu.enabled": false, + "extensions.getAddons.showPane": false, + "places.history.enabled": false, + "privacy.file_unique_origin": true, + "ui.key.menuAccessKeyFocuses": false + }, + "PromptForDownloadLocation": false, + "SanitizeOnShutdown": { + "Cache": true, + "Cookies": true, + "Downloads": true, + "FormData": true, + "History": true, + "OfflineApps": true, + "Sessions": true, + "SiteSettings": true + } + } +} \ No newline at end of file diff --git a/.m1k1o/browser/supervisord.conf b/.m1k1o/browser/supervisord.conf new file mode 100644 index 0000000..d703a8d --- /dev/null +++ b/.m1k1o/browser/supervisord.conf @@ -0,0 +1,21 @@ +[program:firefox-esr] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/lib/firefox-esr/firefox-esr --display=%(ENV_DISPLAY)s -setDefaultBrowser -width 1280 -height 720 +autorestart=true +priority=800 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/firefox-esr.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:openbox] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/openbox --config-file /etc/neko/openbox.xml +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/openbox.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true diff --git a/.m1k1o/build b/.m1k1o/build new file mode 100755 index 0000000..2fea200 --- /dev/null +++ b/.m1k1o/build @@ -0,0 +1,29 @@ +#!/bin/sh + +BASE=../ + +build_client() { + docker build -t neko-dev-client -f base/Dockerfile --target client "$BASE" + docker run --rm -v "$BASE"/client/dist:/tmp/dist neko-dev-client sh -c "rm -rf /tmp/dist/*; cp -r /src/dist/* /tmp/dist" +} + +build_server() { + docker build -t neko-dev-server -f base/Dockerfile --target server "$BASE" + docker run --rm -v "$BASE"/server/bin:/tmp/bin neko-dev-server sh -c "rm -rf /tmp/bin/neko; cp /src/bin/neko /tmp/bin" +} + +build_base() { + docker build -t m1k1o/neko:base -f base/Dockerfile "$BASE" +} + +build_browser() { + docker build -t m1k1o/neko:browser -f browser/Dockerfile browser/ +} + +case $1 in + client) build_client;; + serve) build_server;; + base) build_base;; + browser) build_browser;; + *) echo "Unknown $1";; +esac