├── Dockerfile ├── README.md ├── docker-compose.yml ├── noVNC ├── .eslintignore ├── .eslintrc ├── AUTHORS ├── LICENSE.txt ├── README.md ├── app │ ├── error-handler.js │ ├── images │ │ ├── alt.svg │ │ ├── clipboard.svg │ │ ├── connect.svg │ │ ├── ctrl.svg │ │ ├── ctrlaltdel.svg │ │ ├── disconnect.svg │ │ ├── drag.svg │ │ ├── error.svg │ │ ├── esc.svg │ │ ├── expander.svg │ │ ├── fullscreen.svg │ │ ├── handle.svg │ │ ├── handle_bg.svg │ │ ├── icons │ │ │ ├── Makefile │ │ │ ├── novnc-120x120.png │ │ │ ├── novnc-144x144.png │ │ │ ├── novnc-152x152.png │ │ │ ├── novnc-16x16.png │ │ │ ├── novnc-192x192.png │ │ │ ├── novnc-24x24.png │ │ │ ├── novnc-32x32.png │ │ │ ├── novnc-48x48.png │ │ │ ├── novnc-60x60.png │ │ │ ├── novnc-64x64.png │ │ │ ├── novnc-72x72.png │ │ │ ├── novnc-76x76.png │ │ │ ├── novnc-96x96.png │ │ │ ├── novnc-icon-sm.svg │ │ │ └── novnc-icon.svg │ │ ├── info.svg │ │ ├── keyboard.svg │ │ ├── power.svg │ │ ├── settings.svg │ │ ├── tab.svg │ │ ├── toggleextrakeys.svg │ │ ├── warning.svg │ │ └── windows.svg │ ├── locale │ │ ├── README │ │ ├── cs.json │ │ ├── de.json │ │ ├── el.json │ │ ├── es.json │ │ ├── fr.json │ │ ├── it.json │ │ ├── ja.json │ │ ├── ko.json │ │ ├── nl.json │ │ ├── pl.json │ │ ├── pt_BR.json │ │ ├── ru.json │ │ ├── sv.json │ │ ├── tr.json │ │ ├── zh_CN.json │ │ └── zh_TW.json │ ├── localization.js │ ├── sounds │ │ ├── CREDITS │ │ ├── bell.mp3 │ │ └── bell.oga │ ├── styles │ │ ├── Orbitron700.ttf │ │ ├── Orbitron700.woff │ │ ├── base.css │ │ └── input.css │ ├── ui.js │ └── webutil.js ├── core │ ├── base64.js │ ├── decoders │ │ ├── copyrect.js │ │ ├── hextile.js │ │ ├── jpeg.js │ │ ├── raw.js │ │ ├── rre.js │ │ ├── tight.js │ │ ├── tightpng.js │ │ └── zrle.js │ ├── deflator.js │ ├── des.js │ ├── display.js │ ├── encodings.js │ ├── inflator.js │ ├── input │ │ ├── domkeytable.js │ │ ├── fixedkeys.js │ │ ├── gesturehandler.js │ │ ├── keyboard.js │ │ ├── keysym.js │ │ ├── keysymdef.js │ │ ├── util.js │ │ ├── vkeys.js │ │ └── xtscancodes.js │ ├── ra2.js │ ├── rfb.js │ ├── util │ │ ├── browser.js │ │ ├── cursor.js │ │ ├── element.js │ │ ├── events.js │ │ ├── eventtarget.js │ │ ├── int.js │ │ ├── logging.js │ │ ├── md5.js │ │ └── strings.js │ └── websock.js ├── docs │ ├── API-internal.md │ ├── API.md │ ├── EMBEDDING.md │ ├── LIBRARY.md │ ├── LICENSE.BSD-2-Clause │ ├── LICENSE.BSD-3-Clause │ ├── LICENSE.MPL-2.0 │ ├── LICENSE.OFL-1.1 │ ├── flash_policy.txt │ ├── links │ ├── notes │ ├── novnc_proxy.1 │ ├── rfb_notes │ ├── rfbproto-3.3.pdf │ ├── rfbproto-3.7.pdf │ └── rfbproto-3.8.pdf ├── karma.conf.js ├── package.json ├── po │ ├── .eslintrc │ ├── Makefile │ ├── cs.po │ ├── de.po │ ├── el.po │ ├── es.po │ ├── fr.po │ ├── it.po │ ├── ja.po │ ├── ko.po │ ├── nl.po │ ├── noVNC.pot │ ├── pl.po │ ├── po2js │ ├── pt_BR.po │ ├── ru.po │ ├── sv.po │ ├── tr.po │ ├── xgettext-html │ ├── zh_CN.po │ └── zh_TW.po ├── snap │ ├── hooks │ │ └── configure │ ├── local │ │ └── svc_wrapper.sh │ └── snapcraft.yaml ├── tests │ ├── .eslintrc │ ├── assertions.js │ ├── fake.websocket.js │ ├── playback-ui.js │ ├── playback.js │ ├── test.base64.js │ ├── test.copyrect.js │ ├── test.deflator.js │ ├── test.display.js │ ├── test.gesturehandler.js │ ├── test.helper.js │ ├── test.hextile.js │ ├── test.inflator.js │ ├── test.int.js │ ├── test.jpeg.js │ ├── test.keyboard.js │ ├── test.localization.js │ ├── test.ra2.js │ ├── test.raw.js │ ├── test.rfb.js │ ├── test.rre.js │ ├── test.tight.js │ ├── test.tightpng.js │ ├── test.util.js │ ├── test.websock.js │ ├── test.webutil.js │ ├── test.zrle.js │ └── vnc_playback.html ├── utils │ ├── .eslintrc │ ├── README.md │ ├── b64-to-binary.pl │ ├── convert.js │ ├── genkeysymdef.js │ ├── novnc_proxy │ ├── self.pem │ ├── u2x11 │ ├── validate │ └── websockify │ │ ├── CHANGES.txt │ │ ├── COPYING │ │ ├── MANIFEST.in │ │ ├── Makefile │ │ ├── README.md │ │ ├── Windows │ │ └── Windows Service Readme.md │ │ ├── docker │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ │ ├── docs │ │ ├── latency_results.txt │ │ ├── notes │ │ ├── release.txt │ │ └── websockify.1 │ │ ├── rebind │ │ ├── rebind.c │ │ ├── run │ │ ├── setup.py │ │ ├── test-requirements.txt │ │ ├── tests │ │ ├── echo.html │ │ ├── echo.py │ │ ├── echo_client.py │ │ ├── fixtures │ │ │ ├── private.pem │ │ │ ├── public.pem │ │ │ └── symmetric.key │ │ ├── latency.html │ │ ├── latency.py │ │ ├── load.html │ │ ├── load.py │ │ ├── plain_echo.html │ │ ├── simple.html │ │ ├── test_auth_plugins.py │ │ ├── test_token_plugins.py │ │ ├── test_websocket.py │ │ ├── test_websocketproxy.py │ │ └── test_websockifyserver.py │ │ ├── tox.ini │ │ ├── websockify.py │ │ └── websockify │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── __pycache__ │ │ ├── __init__.cpython-39.pyc │ │ ├── __main__.cpython-39.pyc │ │ ├── auth_plugins.cpython-39.pyc │ │ ├── websocket.cpython-39.pyc │ │ ├── websocketproxy.cpython-39.pyc │ │ ├── websocketserver.cpython-39.pyc │ │ └── websockifyserver.cpython-39.pyc │ │ ├── auth_plugins.py │ │ ├── sysloghandler.py │ │ ├── token_plugins.py │ │ ├── websocket.py │ │ ├── websocketproxy.py │ │ ├── websocketserver.py │ │ └── websockifyserver.py ├── vendor │ └── pako │ │ ├── LICENSE │ │ ├── README.md │ │ └── lib │ │ ├── utils │ │ └── common.js │ │ └── zlib │ │ ├── adler32.js │ │ ├── constants.js │ │ ├── crc32.js │ │ ├── deflate.js │ │ ├── gzheader.js │ │ ├── inffast.js │ │ ├── inflate.js │ │ ├── inftrees.js │ │ ├── messages.js │ │ ├── trees.js │ │ └── zstream.js ├── vnc.html └── vnc_lite.html ├── vscode-go └── Dockerfile └── xfce └── .config ├── autostart ├── novnc.desktop └── obsidian.desktop └── xfce4 ├── background.jpg ├── desktop ├── icons.screen0-1344x672.rc ├── icons.screen0-1344x721.rc └── icons.screen0-1344x752.rc └── xfconf └── xfce-perchannel-xml ├── thunar.xml ├── xfce4-desktop.xml ├── xfce4-keyboard-shortcuts.xml ├── xfce4-panel.xml ├── xfwm4.xml └── xsettings.xml /Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM ubuntu:18.04 3 | # 维护者信息 4 | MAINTAINER gotoeasy 5 | 6 | # 环境变量 7 | ENV DEBIAN_FRONTEND=noninteractive \ 8 | SIZE=1024x768 \ 9 | PASSWD=123456 \ 10 | TZ=Asia/Shanghai \ 11 | LANG=zh_CN.UTF-8 \ 12 | LC_ALL=${LANG} \ 13 | LANGUAGE=${LANG} 14 | 15 | USER root 16 | WORKDIR /root 17 | 18 | # 设定密码 19 | RUN echo "root:$PASSWD" | chpasswd 20 | 21 | # 安装 22 | RUN apt-get -y update && \ 23 | # tools 24 | apt-get install -y vim git subversion wget curl net-tools locales bzip2 unzip iputils-ping traceroute firefox firefox-locale-zh-hans ttf-wqy-microhei gedit ibus-pinyin && \ 25 | locale-gen zh_CN.UTF-8 && \ 26 | # ssh 27 | apt-get install -y openssh-server && \ 28 | mkdir -p /var/run/sshd && \ 29 | sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \ 30 | sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config && \ 31 | mkdir -p /root/.ssh && \ 32 | # TigerVNC 33 | wget -qO- https://nchc.dl.sourceforge.net/project/tigervnc/stable/1.12.0/tigervnc-1.12.0.x86_64.tar.gz | tar xz --strip 1 -C / && \ 34 | mkdir -p /root/.vnc && \ 35 | echo $PASSWD | vncpasswd -f > /root/.vnc/passwd && \ 36 | chmod 600 /root/.vnc/passwd && \ 37 | # xfce 38 | apt-get install -y xfce4 xfce4-terminal && \ 39 | apt-get purge -y pm-utils xscreensaver* && \ 40 | # xrdp 41 | apt-get install -y xrdp && \ 42 | echo "xfce4-session" > ~/.xsession && \ 43 | # 谷歌浏览器 44 | wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ 45 | apt-get install -y -f ./google-chrome-stable_current_amd64.deb && \ 46 | sed -e '/chrome/ s/^#*/#/' -i /opt/google/chrome/google-chrome && \ 47 | echo 'exec -a "$0" "$HERE/chrome" "$@" --user-data-dir="$HOME/.config/chrome" --no-sandbox --disable-dev-shm-usage' >> /opt/google/chrome/google-chrome && \ 48 | rm -f google-chrome-stable_current_amd64.deb && \ 49 | # mysql客户端 50 | apt-get install -y mysql-workbench && \ 51 | # clean 52 | apt-get -y clean && \ 53 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 54 | 55 | # 配置xfce图形界面 56 | ADD ./xfce/ /root/ 57 | 58 | COPY obsidian.AppImage /opt/ 59 | 60 | ADD ./noVNC /opt/noVNC/ 61 | 62 | RUN chmod 777 /opt/obsidian.AppImage && \ 63 | chmod 777 /opt/noVNC/utils/novnc_proxy && \ 64 | chmod 777 /opt/noVNC/utils/websockify/run 65 | 66 | # 创建脚本文件 67 | RUN echo "#!/bin/bash\n" > /root/startup.sh && \ 68 | # 修改密码 69 | echo 'if [ $PASSWD ] ; then' >> /root/startup.sh && \ 70 | echo ' echo "root:$PASSWD" | chpasswd' >> /root/startup.sh && \ 71 | echo ' echo $PASSWD | vncpasswd -f > /root/.vnc/passwd' >> /root/startup.sh && \ 72 | echo 'fi' >> /root/startup.sh && \ 73 | # SSH 74 | echo "/usr/sbin/sshd -D & source /root/.bashrc" >> /root/startup.sh && \ 75 | # VNC 76 | #echo 'vncserver -kill :0' >> /root/startup.sh && \ # 1.10.1 77 | #echo '/usr/libexec/vncserver :0' >> /root/startup.sh && \ # 1.12.0 78 | echo '/usr/libexec/vncserver :0' >> /root/startup.sh && \ 79 | echo "rm -rfv /tmp/.X*-lock /tmp/.X11-unix" >> /root/startup.sh && \ 80 | echo 'vncserver :0 -geometry $SIZE' >> /root/startup.sh && \ 81 | echo 'tail -f /root/.vnc/*:0.log' >> /root/startup.sh && \ 82 | # 可执行脚本 83 | chmod +x /root/startup.sh 84 | 85 | # 用户目录不使用中文 86 | RUN LANG=C xdg-user-dirs-update --force 87 | 88 | # 导出特定端口 89 | EXPOSE 22 5900 6080 6090 8500 8501 27123 27124 90 | 91 | # 启动脚本 92 | CMD ["/root/startup.sh"] 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 说明 2 | 说明::本镜像是一个将obsidian,安装在一个有桌面的docker系统。使用这个镜像,可以将obsidian嵌入到网页当中,进行使用。支持中文展示与中文输入。 3 | # 简单使用 4 | 下载运行镜像 5 | > docker run -p 6818:6090 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 6 | 7 | 运行启动完成后,打开下面的链接: 默认密码是:`123456` 8 | >https://192.168.55.25:6818/vnc.html 9 | 10 | (IP需要使用自己装docker镜像的IP) 11 | 12 | 13 | ![](https://files.mdnice.com/user/18211/ef97c37d-6690-474b-864c-013803b50d20.png) 14 | 15 | 16 | 恭喜你,可以开始obsidian的网上使用之旅了。 17 | 18 | # 更多的配置 19 | ## 登陆方式修改 20 | 这个docker仓库是支持ssh、VNC、网页三种方式登陆的。想要使用其中的登陆方式,我们需要修改一下启动命令。 21 | - 只使用ssh登陆方式 22 | > docker run -p 526:22 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 23 | - 只使用VNC登陆方式 24 | > docker run -p 5926:5900 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 25 | - 只使用网页登陆方式 26 | > docker run -p 6818:6090 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 27 | - 使用ssh、VNC、网页登陆三种方式 28 | > docker run -p 526:22 -p 5926:5900 -p 6818:6090 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 29 | 30 | ## 后台启动方式 31 | docker可以将镜像以后台的方式运行,添加参数 `-d` 32 | >docker run -d -p 6818:6090 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 33 | 34 | ## 修改密码 35 | ssh、VNC、网页都是有密码的,默认密码为:`123456` 36 | 我们要改密码的话,需要在启动命令中添加 `-e PASSWD=abcd1234`,新密码就变成 `abcd1234` 37 | > docker run -p 6818:6090 -e PASSWD=abcd1234 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 38 | 39 | ## 修改分辨率 40 | 修改分辨率的话,需要在启动命令中添加 `-e SIZE=1024x768` 41 | > docker run -p 6818:6090 -e SIZE=1024x768 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 42 | 43 | ## 挂载自己的目录到docker中 44 | 我们可以将自己主机中的目录,挂载到docker中,这样数据就不会丢失。 45 | 主机的目录为`/data/vaults` 46 | docker中的目录为 `/vaults` 47 | > docker run -v /data/vaults:/vaults -p 6818:6090 --device /dev/fuse --privileged hcyxsmile/obsidian-docker:v1.0 48 | 49 | 50 | # 环境配置 51 | obsidian-docker:v1.0 52 | obsidian:1.0.0 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | ubuntu-desktop: 5 | image: gotoeasy/ubuntu-desktop 6 | ports: 7 | - "22:22" 8 | - "5900:5900" 9 | - "13389:3389" 10 | environment: 11 | SIZE: 1600x840 12 | PASSWD: 123456 13 | -------------------------------------------------------------------------------- /noVNC/.eslintignore: -------------------------------------------------------------------------------- 1 | **/xtscancodes.js 2 | -------------------------------------------------------------------------------- /noVNC/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2020": true 5 | }, 6 | "parserOptions": { 7 | "sourceType": "module", 8 | "ecmaVersion": 2020 9 | }, 10 | "extends": "eslint:recommended", 11 | "rules": { 12 | // Unsafe or confusing stuff that we forbid 13 | 14 | "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], 15 | "no-constant-condition": ["error", { "checkLoops": false }], 16 | "no-var": "error", 17 | "no-useless-constructor": "error", 18 | "object-shorthand": ["error", "methods", { "avoidQuotes": true }], 19 | "prefer-arrow-callback": "error", 20 | "arrow-body-style": ["error", "as-needed", { "requireReturnForObjectLiteral": false } ], 21 | "arrow-parens": ["error", "as-needed", { "requireForBlockBody": true }], 22 | "arrow-spacing": ["error"], 23 | "no-confusing-arrow": ["error", { "allowParens": true }], 24 | 25 | // Enforced coding style 26 | 27 | "brace-style": ["error", "1tbs", { "allowSingleLine": true }], 28 | "indent": ["error", 4, { "SwitchCase": 1, 29 | "FunctionDeclaration": { "parameters": "first" }, 30 | "CallExpression": { "arguments": "first" }, 31 | "ArrayExpression": "first", 32 | "ObjectExpression": "first", 33 | "ignoreComments": true }], 34 | "comma-spacing": ["error"], 35 | "comma-style": ["error"], 36 | "curly": ["error", "multi-line"], 37 | "func-call-spacing": ["error"], 38 | "func-names": ["error"], 39 | "func-style": ["error", "declaration", { "allowArrowFunctions": true }], 40 | "key-spacing": ["error"], 41 | "keyword-spacing": ["error"], 42 | "no-trailing-spaces": ["error"], 43 | "semi": ["error"], 44 | "space-before-blocks": ["error"], 45 | "space-before-function-paren": ["error", { "anonymous": "always", 46 | "named": "never", 47 | "asyncArrow": "always" }], 48 | "switch-colon-spacing": ["error"], 49 | "camelcase": ["error", { allow: ["^XK_", "^XF86XK_"] }], 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /noVNC/AUTHORS: -------------------------------------------------------------------------------- 1 | maintainers: 2 | - Joel Martin (@kanaka) 3 | - Solly Ross (@directxman12) 4 | - Samuel Mannehed for Cendio AB (@samhed) 5 | - Pierre Ossman for Cendio AB (@CendioOssman) 6 | maintainersEmeritus: 7 | - @astrand 8 | contributors: 9 | # There are a bunch of people that should be here. 10 | # If you want to be on this list, feel free send a PR 11 | # to add yourself. 12 | - jalf 13 | - NTT corp. 14 | -------------------------------------------------------------------------------- /noVNC/LICENSE.txt: -------------------------------------------------------------------------------- 1 | noVNC is Copyright (C) 2019 The noVNC Authors 2 | (./AUTHORS) 3 | 4 | The noVNC core library files are licensed under the MPL 2.0 (Mozilla 5 | Public License 2.0). The noVNC core library is composed of the 6 | Javascript code necessary for full noVNC operation. This includes (but 7 | is not limited to): 8 | 9 | core/**/*.js 10 | app/*.js 11 | test/playback.js 12 | 13 | The HTML, CSS, font and images files that included with the noVNC 14 | source distibution (or repository) are not considered part of the 15 | noVNC core library and are licensed under more permissive licenses. 16 | The intent is to allow easy integration of noVNC into existing web 17 | sites and web applications. 18 | 19 | The HTML, CSS, font and image files are licensed as follows: 20 | 21 | *.html : 2-Clause BSD license 22 | 23 | app/styles/*.css : 2-Clause BSD license 24 | 25 | app/styles/Orbitron* : SIL Open Font License 1.1 26 | (Copyright 2009 Matt McInerney) 27 | 28 | app/images/ : Creative Commons Attribution-ShareAlike 29 | http://creativecommons.org/licenses/by-sa/3.0/ 30 | 31 | Some portions of noVNC are copyright to their individual authors. 32 | Please refer to the individual source files and/or to the noVNC commit 33 | history: https://github.com/novnc/noVNC/commits/master 34 | 35 | The are several files and projects that have been incorporated into 36 | the noVNC core library. Here is a list of those files and the original 37 | licenses (all MPL 2.0 compatible): 38 | 39 | core/base64.js : MPL 2.0 40 | 41 | core/des.js : Various BSD style licenses 42 | 43 | vendor/pako/ : MIT 44 | 45 | Any other files not mentioned above are typically marked with 46 | a copyright/license header at the top of the file. The default noVNC 47 | license is MPL-2.0. 48 | 49 | The following license texts are included: 50 | 51 | docs/LICENSE.MPL-2.0 52 | docs/LICENSE.OFL-1.1 53 | docs/LICENSE.BSD-3-Clause (New BSD) 54 | docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD) 55 | vendor/pako/LICENSE (MIT) 56 | 57 | Or alternatively the license texts may be found here: 58 | 59 | http://www.mozilla.org/MPL/2.0/ 60 | http://scripts.sil.org/OFL 61 | http://en.wikipedia.org/wiki/BSD_licenses 62 | https://opensource.org/licenses/MIT 63 | -------------------------------------------------------------------------------- /noVNC/app/error-handler.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | // Fallback for all uncought errors 10 | function handleError(event, err) { 11 | try { 12 | const msg = document.getElementById('noVNC_fallback_errormsg'); 13 | 14 | // Work around Firefox bug: 15 | // https://bugzilla.mozilla.org/show_bug.cgi?id=1685038 16 | if (event.message === "ResizeObserver loop completed with undelivered notifications.") { 17 | return false; 18 | } 19 | 20 | // Only show the initial error 21 | if (msg.hasChildNodes()) { 22 | return false; 23 | } 24 | 25 | let div = document.createElement("div"); 26 | div.classList.add('noVNC_message'); 27 | div.appendChild(document.createTextNode(event.message)); 28 | msg.appendChild(div); 29 | 30 | if (event.filename) { 31 | div = document.createElement("div"); 32 | div.className = 'noVNC_location'; 33 | let text = event.filename; 34 | if (event.lineno !== undefined) { 35 | text += ":" + event.lineno; 36 | if (event.colno !== undefined) { 37 | text += ":" + event.colno; 38 | } 39 | } 40 | div.appendChild(document.createTextNode(text)); 41 | msg.appendChild(div); 42 | } 43 | 44 | if (err && err.stack) { 45 | div = document.createElement("div"); 46 | div.className = 'noVNC_stack'; 47 | div.appendChild(document.createTextNode(err.stack)); 48 | msg.appendChild(div); 49 | } 50 | 51 | document.getElementById('noVNC_fallback_error') 52 | .classList.add("noVNC_open"); 53 | 54 | } catch (exc) { 55 | document.write("noVNC encountered an error."); 56 | } 57 | 58 | // Try to disable keyboard interaction, best effort 59 | try { 60 | // Remove focus from the currently focused element in order to 61 | // prevent keyboard interaction from continuing 62 | if (document.activeElement) { document.activeElement.blur(); } 63 | 64 | // Don't let any element be focusable when showing the error 65 | let keyboardFocusable = 'a[href], button, input, textarea, select, details, [tabindex]'; 66 | document.querySelectorAll(keyboardFocusable).forEach((elem) => { 67 | elem.setAttribute("tabindex", "-1"); 68 | }); 69 | } catch (exc) { 70 | // Do nothing 71 | } 72 | 73 | // Don't return true since this would prevent the error 74 | // from being printed to the browser console. 75 | return false; 76 | } 77 | 78 | window.addEventListener('error', evt => handleError(evt, evt.error)); 79 | window.addEventListener('unhandledrejection', evt => handleError(evt.reason, evt.reason)); 80 | -------------------------------------------------------------------------------- /noVNC/app/images/ctrlaltdel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 83 | 91 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /noVNC/app/images/error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /noVNC/app/images/expander.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 45 | 46 | 48 | 49 | 51 | image/svg+xml 52 | 54 | 55 | 56 | 57 | 58 | 63 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /noVNC/app/images/fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 82 | 87 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /noVNC/app/images/handle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /noVNC/app/images/icons/Makefile: -------------------------------------------------------------------------------- 1 | ICONS := \ 2 | novnc-16x16.png \ 3 | novnc-24x24.png \ 4 | novnc-32x32.png \ 5 | novnc-48x48.png \ 6 | novnc-64x64.png 7 | 8 | ANDROID_LAUNCHER := \ 9 | novnc-48x48.png \ 10 | novnc-72x72.png \ 11 | novnc-96x96.png \ 12 | novnc-144x144.png \ 13 | novnc-192x192.png 14 | 15 | IPHONE_LAUNCHER := \ 16 | novnc-60x60.png \ 17 | novnc-120x120.png 18 | 19 | IPAD_LAUNCHER := \ 20 | novnc-76x76.png \ 21 | novnc-152x152.png 22 | 23 | ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER) 24 | 25 | all: $(ALL_ICONS) 26 | 27 | novnc-16x16.png: novnc-icon-sm.svg 28 | convert -density 90 \ 29 | -background transparent "$<" "$@" 30 | novnc-24x24.png: novnc-icon-sm.svg 31 | convert -density 135 \ 32 | -background transparent "$<" "$@" 33 | novnc-32x32.png: novnc-icon-sm.svg 34 | convert -density 180 \ 35 | -background transparent "$<" "$@" 36 | 37 | novnc-%.png: novnc-icon.svg 38 | convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \ 39 | -background transparent "$<" "$@" 40 | 41 | clean: 42 | rm -f *.png 43 | -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-120x120.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-144x144.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-152x152.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-16x16.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-192x192.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-24x24.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-32x32.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-48x48.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-60x60.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-64x64.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-72x72.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-76x76.png -------------------------------------------------------------------------------- /noVNC/app/images/icons/novnc-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/images/icons/novnc-96x96.png -------------------------------------------------------------------------------- /noVNC/app/images/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /noVNC/app/images/settings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 49 | 52 | 53 | 55 | 56 | 58 | image/svg+xml 59 | 61 | 62 | 63 | 64 | 65 | 70 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /noVNC/app/images/tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /noVNC/app/images/windows.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml 51 | 56 | 57 | -------------------------------------------------------------------------------- /noVNC/app/locale/README: -------------------------------------------------------------------------------- 1 | DO NOT MODIFY THE FILES IN THIS FOLDER, THEY ARE AUTOMATICALLY GENERATED FROM THE PO-FILES. 2 | -------------------------------------------------------------------------------- /noVNC/app/locale/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Připojení...", 3 | "Disconnecting...": "Odpojení...", 4 | "Reconnecting...": "Obnova připojení...", 5 | "Internal error": "Vnitřní chyba", 6 | "Must set host": "Hostitel musí být nastavení", 7 | "Connected (encrypted) to ": "Připojení (šifrované) k ", 8 | "Connected (unencrypted) to ": "Připojení (nešifrované) k ", 9 | "Something went wrong, connection is closed": "Něco se pokazilo, odpojeno", 10 | "Failed to connect to server": "Chyba připojení k serveru", 11 | "Disconnected": "Odpojeno", 12 | "New connection has been rejected with reason: ": "Nové připojení bylo odmítnuto s odůvodněním: ", 13 | "New connection has been rejected": "Nové připojení bylo odmítnuto", 14 | "Password is required": "Je vyžadováno heslo", 15 | "noVNC encountered an error:": "noVNC narazilo na chybu:", 16 | "Hide/Show the control bar": "Skrýt/zobrazit ovládací panel", 17 | "Move/Drag Viewport": "Přesunout/přetáhnout výřez", 18 | "viewport drag": "přesun výřezu", 19 | "Active Mouse Button": "Aktivní tlačítka myši", 20 | "No mousebutton": "Žádné", 21 | "Left mousebutton": "Levé tlačítko myši", 22 | "Middle mousebutton": "Prostřední tlačítko myši", 23 | "Right mousebutton": "Pravé tlačítko myši", 24 | "Keyboard": "Klávesnice", 25 | "Show Keyboard": "Zobrazit klávesnici", 26 | "Extra keys": "Extra klávesy", 27 | "Show Extra Keys": "Zobrazit extra klávesy", 28 | "Ctrl": "Ctrl", 29 | "Toggle Ctrl": "Přepnout Ctrl", 30 | "Alt": "Alt", 31 | "Toggle Alt": "Přepnout Alt", 32 | "Send Tab": "Odeslat tabulátor", 33 | "Tab": "Tab", 34 | "Esc": "Esc", 35 | "Send Escape": "Odeslat Esc", 36 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 37 | "Send Ctrl-Alt-Del": "Poslat Ctrl-Alt-Del", 38 | "Shutdown/Reboot": "Vypnutí/Restart", 39 | "Shutdown/Reboot...": "Vypnutí/Restart...", 40 | "Power": "Napájení", 41 | "Shutdown": "Vypnout", 42 | "Reboot": "Restart", 43 | "Reset": "Reset", 44 | "Clipboard": "Schránka", 45 | "Clear": "Vymazat", 46 | "Fullscreen": "Celá obrazovka", 47 | "Settings": "Nastavení", 48 | "Shared Mode": "Sdílený režim", 49 | "View Only": "Pouze prohlížení", 50 | "Clip to Window": "Přizpůsobit oknu", 51 | "Scaling Mode:": "Přizpůsobení velikosti", 52 | "None": "Žádné", 53 | "Local Scaling": "Místní", 54 | "Remote Resizing": "Vzdálené", 55 | "Advanced": "Pokročilé", 56 | "Repeater ID:": "ID opakovače", 57 | "WebSocket": "WebSocket", 58 | "Encrypt": "Šifrování:", 59 | "Host:": "Hostitel:", 60 | "Port:": "Port:", 61 | "Path:": "Cesta", 62 | "Automatic Reconnect": "Automatická obnova připojení", 63 | "Reconnect Delay (ms):": "Zpoždění připojení (ms)", 64 | "Show Dot when No Cursor": "Tečka místo chybějícího kurzoru myši", 65 | "Logging:": "Logování:", 66 | "Disconnect": "Odpojit", 67 | "Connect": "Připojit", 68 | "Password:": "Heslo", 69 | "Send Password": "Odeslat heslo", 70 | "Cancel": "Zrušit" 71 | } -------------------------------------------------------------------------------- /noVNC/app/locale/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Verbinden...", 3 | "Disconnecting...": "Verbindung trennen...", 4 | "Reconnecting...": "Verbindung wiederherstellen...", 5 | "Internal error": "Interner Fehler", 6 | "Must set host": "Richten Sie den Server ein", 7 | "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ", 8 | "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ", 9 | "Something went wrong, connection is closed": "Etwas lief schief, Verbindung wurde getrennt", 10 | "Disconnected": "Verbindung zum Server getrennt", 11 | "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ", 12 | "New connection has been rejected": "Verbindung wurde abgelehnt", 13 | "Password is required": "Passwort ist erforderlich", 14 | "noVNC encountered an error:": "Ein Fehler ist aufgetreten:", 15 | "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen", 16 | "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen", 17 | "viewport drag": "Ansichtsfenster ziehen", 18 | "Active Mouse Button": "Aktive Maustaste", 19 | "No mousebutton": "Keine Maustaste", 20 | "Left mousebutton": "Linke Maustaste", 21 | "Middle mousebutton": "Mittlere Maustaste", 22 | "Right mousebutton": "Rechte Maustaste", 23 | "Keyboard": "Tastatur", 24 | "Show Keyboard": "Tastatur anzeigen", 25 | "Extra keys": "Zusatztasten", 26 | "Show Extra Keys": "Zusatztasten anzeigen", 27 | "Ctrl": "Strg", 28 | "Toggle Ctrl": "Strg umschalten", 29 | "Alt": "Alt", 30 | "Toggle Alt": "Alt umschalten", 31 | "Send Tab": "Tab senden", 32 | "Tab": "Tab", 33 | "Esc": "Esc", 34 | "Send Escape": "Escape senden", 35 | "Ctrl+Alt+Del": "Strg+Alt+Entf", 36 | "Send Ctrl-Alt-Del": "Strg+Alt+Entf senden", 37 | "Shutdown/Reboot": "Herunterfahren/Neustarten", 38 | "Shutdown/Reboot...": "Herunterfahren/Neustarten...", 39 | "Power": "Energie", 40 | "Shutdown": "Herunterfahren", 41 | "Reboot": "Neustarten", 42 | "Reset": "Zurücksetzen", 43 | "Clipboard": "Zwischenablage", 44 | "Clear": "Löschen", 45 | "Fullscreen": "Vollbild", 46 | "Settings": "Einstellungen", 47 | "Shared Mode": "Geteilter Modus", 48 | "View Only": "Nur betrachten", 49 | "Clip to Window": "Auf Fenster begrenzen", 50 | "Scaling Mode:": "Skalierungsmodus:", 51 | "None": "Keiner", 52 | "Local Scaling": "Lokales skalieren", 53 | "Remote Resizing": "Serverseitiges skalieren", 54 | "Advanced": "Erweitert", 55 | "Repeater ID:": "Repeater ID:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Verschlüsselt", 58 | "Host:": "Server:", 59 | "Port:": "Port:", 60 | "Path:": "Pfad:", 61 | "Automatic Reconnect": "Automatisch wiederverbinden", 62 | "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):", 63 | "Logging:": "Protokollierung:", 64 | "Disconnect": "Verbindung trennen", 65 | "Connect": "Verbinden", 66 | "Password:": "Passwort:", 67 | "Cancel": "Abbrechen", 68 | "Canvas not supported.": "Canvas nicht unterstützt." 69 | } -------------------------------------------------------------------------------- /noVNC/app/locale/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Συνδέεται...", 3 | "Disconnecting...": "Aποσυνδέεται...", 4 | "Reconnecting...": "Επανασυνδέεται...", 5 | "Internal error": "Εσωτερικό σφάλμα", 6 | "Must set host": "Πρέπει να οριστεί ο διακομιστής", 7 | "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ", 8 | "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ", 9 | "Something went wrong, connection is closed": "Κάτι πήγε στραβά, η σύνδεση διακόπηκε", 10 | "Disconnected": "Αποσυνδέθηκε", 11 | "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ", 12 | "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ", 13 | "Password is required": "Απαιτείται ο κωδικός πρόσβασης", 14 | "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:", 15 | "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου", 16 | "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου", 17 | "viewport drag": "σύρσιμο θεατού πεδίου", 18 | "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού", 19 | "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού", 20 | "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού", 21 | "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού", 22 | "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού", 23 | "Keyboard": "Πληκτρολόγιο", 24 | "Show Keyboard": "Εμφάνιση Πληκτρολογίου", 25 | "Extra keys": "Επιπλέον πλήκτρα", 26 | "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων", 27 | "Ctrl": "Ctrl", 28 | "Toggle Ctrl": "Εναλλαγή Ctrl", 29 | "Alt": "Alt", 30 | "Toggle Alt": "Εναλλαγή Alt", 31 | "Send Tab": "Αποστολή Tab", 32 | "Tab": "Tab", 33 | "Esc": "Esc", 34 | "Send Escape": "Αποστολή Escape", 35 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 36 | "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del", 37 | "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση", 38 | "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...", 39 | "Power": "Απενεργοποίηση", 40 | "Shutdown": "Κλείσιμο", 41 | "Reboot": "Επανεκκίνηση", 42 | "Reset": "Επαναφορά", 43 | "Clipboard": "Πρόχειρο", 44 | "Clear": "Καθάρισμα", 45 | "Fullscreen": "Πλήρης Οθόνη", 46 | "Settings": "Ρυθμίσεις", 47 | "Shared Mode": "Κοινόχρηστη Λειτουργία", 48 | "View Only": "Μόνο Θέαση", 49 | "Clip to Window": "Αποκοπή στο όριο του Παράθυρου", 50 | "Scaling Mode:": "Λειτουργία Κλιμάκωσης:", 51 | "None": "Καμία", 52 | "Local Scaling": "Τοπική Κλιμάκωση", 53 | "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους", 54 | "Advanced": "Για προχωρημένους", 55 | "Repeater ID:": "Repeater ID:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Κρυπτογράφηση", 58 | "Host:": "Όνομα διακομιστή:", 59 | "Port:": "Πόρτα διακομιστή:", 60 | "Path:": "Διαδρομή:", 61 | "Automatic Reconnect": "Αυτόματη επανασύνδεση", 62 | "Reconnect Delay (ms):": "Καθυστέρηση επανασύνδεσης (ms):", 63 | "Logging:": "Καταγραφή:", 64 | "Disconnect": "Αποσύνδεση", 65 | "Connect": "Σύνδεση", 66 | "Password:": "Κωδικός Πρόσβασης:", 67 | "Cancel": "Ακύρωση", 68 | "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas" 69 | } -------------------------------------------------------------------------------- /noVNC/app/locale/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Conectando...", 3 | "Connected (encrypted) to ": "Conectado (con encriptación) a", 4 | "Connected (unencrypted) to ": "Conectado (sin encriptación) a", 5 | "Disconnecting...": "Desconectando...", 6 | "Disconnected": "Desconectado", 7 | "Must set host": "Se debe configurar el host", 8 | "Reconnecting...": "Reconectando...", 9 | "Password is required": "La contraseña es obligatoria", 10 | "Disconnect timeout": "Tiempo de desconexión agotado", 11 | "noVNC encountered an error:": "noVNC ha encontrado un error:", 12 | "Hide/Show the control bar": "Ocultar/Mostrar la barra de control", 13 | "Move/Drag Viewport": "Mover/Arrastrar la ventana", 14 | "viewport drag": "Arrastrar la ventana", 15 | "Active Mouse Button": "Botón activo del ratón", 16 | "No mousebutton": "Ningún botón del ratón", 17 | "Left mousebutton": "Botón izquierdo del ratón", 18 | "Middle mousebutton": "Botón central del ratón", 19 | "Right mousebutton": "Botón derecho del ratón", 20 | "Keyboard": "Teclado", 21 | "Show Keyboard": "Mostrar teclado", 22 | "Extra keys": "Teclas adicionales", 23 | "Show Extra Keys": "Mostrar Teclas Adicionales", 24 | "Ctrl": "Ctrl", 25 | "Toggle Ctrl": "Pulsar/Soltar Ctrl", 26 | "Alt": "Alt", 27 | "Toggle Alt": "Pulsar/Soltar Alt", 28 | "Send Tab": "Enviar Tabulación", 29 | "Tab": "Tabulación", 30 | "Esc": "Esc", 31 | "Send Escape": "Enviar Escape", 32 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 33 | "Send Ctrl-Alt-Del": "Enviar Ctrl+Alt+Del", 34 | "Shutdown/Reboot": "Apagar/Reiniciar", 35 | "Shutdown/Reboot...": "Apagar/Reiniciar...", 36 | "Power": "Encender", 37 | "Shutdown": "Apagar", 38 | "Reboot": "Reiniciar", 39 | "Reset": "Restablecer", 40 | "Clipboard": "Portapapeles", 41 | "Clear": "Vaciar", 42 | "Fullscreen": "Pantalla Completa", 43 | "Settings": "Configuraciones", 44 | "Encrypt": "Encriptar", 45 | "Shared Mode": "Modo Compartido", 46 | "View Only": "Solo visualización", 47 | "Clip to Window": "Recortar al tamaño de la ventana", 48 | "Scaling Mode:": "Modo de escalado:", 49 | "None": "Ninguno", 50 | "Local Scaling": "Escalado Local", 51 | "Local Downscaling": "Reducción de escala local", 52 | "Remote Resizing": "Cambio de tamaño remoto", 53 | "Advanced": "Avanzado", 54 | "Local Cursor": "Cursor Local", 55 | "Repeater ID:": "ID del Repetidor:", 56 | "WebSocket": "WebSocket", 57 | "Host:": "Host:", 58 | "Port:": "Puerto:", 59 | "Path:": "Ruta:", 60 | "Automatic Reconnect": "Reconexión automática", 61 | "Reconnect Delay (ms):": "Retraso en la reconexión (ms):", 62 | "Logging:": "Registrando:", 63 | "Disconnect": "Desconectar", 64 | "Connect": "Conectar", 65 | "Password:": "Contraseña:", 66 | "Cancel": "Cancelar", 67 | "Canvas not supported.": "Canvas no soportado." 68 | } -------------------------------------------------------------------------------- /noVNC/app/locale/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "En cours de connexion...", 3 | "Disconnecting...": "Déconnexion en cours...", 4 | "Reconnecting...": "Reconnexion en cours...", 5 | "Internal error": "Erreur interne", 6 | "Must set host": "Doit définir l'hôte", 7 | "Connected (encrypted) to ": "Connecté (crypté) à ", 8 | "Connected (unencrypted) to ": "Connecté (non crypté) à ", 9 | "Something went wrong, connection is closed": "Quelque chose est arrivé, la connexion est fermée", 10 | "Failed to connect to server": "Échec de connexion au serveur", 11 | "Disconnected": "Déconnecté", 12 | "New connection has been rejected with reason: ": "Une nouvelle connexion a été rejetée avec raison: ", 13 | "New connection has been rejected": "Une nouvelle connexion a été rejetée", 14 | "Credentials are required": "Les identifiants sont requis", 15 | "noVNC encountered an error:": "noVNC a rencontré une erreur:", 16 | "Hide/Show the control bar": "Masquer/Afficher la barre de contrôle", 17 | "Drag": "Faire glisser", 18 | "Move/Drag Viewport": "Déplacer/faire glisser Viewport", 19 | "Keyboard": "Clavier", 20 | "Show Keyboard": "Afficher le clavier", 21 | "Extra keys": "Touches supplémentaires", 22 | "Show Extra Keys": "Afficher les touches supplémentaires", 23 | "Ctrl": "Ctrl", 24 | "Toggle Ctrl": "Basculer Ctrl", 25 | "Alt": "Alt", 26 | "Toggle Alt": "Basculer Alt", 27 | "Toggle Windows": "Basculer Windows", 28 | "Windows": "Windows", 29 | "Send Tab": "Envoyer l'onglet", 30 | "Tab": "l'onglet", 31 | "Esc": "Esc", 32 | "Send Escape": "Envoyer Escape", 33 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 34 | "Send Ctrl-Alt-Del": "Envoyer Ctrl-Alt-Del", 35 | "Shutdown/Reboot": "Arrêter/Redémarrer", 36 | "Shutdown/Reboot...": "Arrêter/Redémarrer...", 37 | "Power": "Alimentation", 38 | "Shutdown": "Arrêter", 39 | "Reboot": "Redémarrer", 40 | "Reset": "Réinitialiser", 41 | "Clipboard": "Presse-papiers", 42 | "Clear": "Effacer", 43 | "Fullscreen": "Plein écran", 44 | "Settings": "Paramètres", 45 | "Shared Mode": "Mode partagé", 46 | "View Only": "Afficher uniquement", 47 | "Clip to Window": "Clip à fenêtre", 48 | "Scaling Mode:": "Mode mise à l'échelle:", 49 | "None": "Aucun", 50 | "Local Scaling": "Mise à l'échelle locale", 51 | "Remote Resizing": "Redimensionnement à distance", 52 | "Advanced": "Avancé", 53 | "Quality:": "Qualité:", 54 | "Compression level:": "Niveau de compression:", 55 | "Repeater ID:": "ID Répéteur:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Crypter", 58 | "Host:": "Hôte:", 59 | "Port:": "Port:", 60 | "Path:": "Chemin:", 61 | "Automatic Reconnect": "Reconnecter automatiquemen", 62 | "Reconnect Delay (ms):": "Délai de reconnexion (ms):", 63 | "Show Dot when No Cursor": "Afficher le point lorsqu'il n'y a pas de curseur", 64 | "Logging:": "Se connecter:", 65 | "Version:": "Version:", 66 | "Disconnect": "Déconnecter", 67 | "Connect": "Connecter", 68 | "Username:": "Nom d'utilisateur:", 69 | "Password:": "Mot de passe:", 70 | "Send Credentials": "Envoyer les identifiants", 71 | "Cancel": "Annuler" 72 | } -------------------------------------------------------------------------------- /noVNC/app/locale/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Connessione in corso...", 3 | "Disconnecting...": "Disconnessione...", 4 | "Reconnecting...": "Riconnessione...", 5 | "Internal error": "Errore interno", 6 | "Must set host": "Devi impostare l'host", 7 | "Connected (encrypted) to ": "Connesso (crittografato) a ", 8 | "Connected (unencrypted) to ": "Connesso (non crittografato) a", 9 | "Something went wrong, connection is closed": "Qualcosa è andato storto, la connessione è stata chiusa", 10 | "Failed to connect to server": "Impossibile connettersi al server", 11 | "Disconnected": "Disconnesso", 12 | "New connection has been rejected with reason: ": "La nuova connessione è stata rifiutata con motivo: ", 13 | "New connection has been rejected": "La nuova connessione è stata rifiutata", 14 | "Credentials are required": "Le credenziali sono obbligatorie", 15 | "noVNC encountered an error:": "noVNC ha riscontrato un errore:", 16 | "Hide/Show the control bar": "Nascondi/Mostra la barra di controllo", 17 | "Drag": "", 18 | "Move/Drag Viewport": "", 19 | "Keyboard": "Tastiera", 20 | "Show Keyboard": "Mostra tastiera", 21 | "Extra keys": "Tasti Aggiuntivi", 22 | "Show Extra Keys": "Mostra Tasti Aggiuntivi", 23 | "Ctrl": "Ctrl", 24 | "Toggle Ctrl": "Tieni premuto Ctrl", 25 | "Alt": "Alt", 26 | "Toggle Alt": "Tieni premuto Alt", 27 | "Toggle Windows": "Tieni premuto Windows", 28 | "Windows": "Windows", 29 | "Send Tab": "Invia Tab", 30 | "Tab": "Tab", 31 | "Esc": "Esc", 32 | "Send Escape": "Invia Esc", 33 | "Ctrl+Alt+Del": "Ctrl+Alt+Canc", 34 | "Send Ctrl-Alt-Del": "Invia Ctrl-Alt-Canc", 35 | "Shutdown/Reboot": "Spegnimento/Riavvio", 36 | "Shutdown/Reboot...": "Spegnimento/Riavvio...", 37 | "Power": "Alimentazione", 38 | "Shutdown": "Spegnimento", 39 | "Reboot": "Riavvio", 40 | "Reset": "Reset", 41 | "Clipboard": "Clipboard", 42 | "Clear": "Pulisci", 43 | "Fullscreen": "Schermo intero", 44 | "Settings": "Impostazioni", 45 | "Shared Mode": "Modalità condivisa", 46 | "View Only": "Sola Visualizzazione", 47 | "Clip to Window": "", 48 | "Scaling Mode:": "Modalità di ridimensionamento:", 49 | "None": "Nessuna", 50 | "Local Scaling": "Ridimensionamento Locale", 51 | "Remote Resizing": "Ridimensionamento Remoto", 52 | "Advanced": "Avanzate", 53 | "Quality:": "Qualità:", 54 | "Compression level:": "Livello Compressione:", 55 | "Repeater ID:": "ID Ripetitore:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Crittografa", 58 | "Host:": "Host:", 59 | "Port:": "Porta:", 60 | "Path:": "Percorso:", 61 | "Automatic Reconnect": "Riconnessione Automatica", 62 | "Reconnect Delay (ms):": "Ritardo Riconnessione (ms):", 63 | "Show Dot when No Cursor": "Mostra Punto quando Nessun Cursore", 64 | "Logging:": "", 65 | "Version:": "Versione:", 66 | "Disconnect": "Disconnetti", 67 | "Connect": "Connetti", 68 | "Username:": "Utente:", 69 | "Password:": "Password:", 70 | "Send Credentials": "Invia Credenziale", 71 | "Cancel": "Annulla" 72 | } -------------------------------------------------------------------------------- /noVNC/app/locale/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "接続しています...", 3 | "Disconnecting...": "切断しています...", 4 | "Reconnecting...": "再接続しています...", 5 | "Internal error": "内部エラー", 6 | "Must set host": "ホストを設定する必要があります", 7 | "Connected (encrypted) to ": "接続しました (暗号化済み): ", 8 | "Connected (unencrypted) to ": "接続しました (暗号化されていません): ", 9 | "Something went wrong, connection is closed": "何らかの問題で、接続が閉じられました", 10 | "Failed to connect to server": "サーバーへの接続に失敗しました", 11 | "Disconnected": "切断しました", 12 | "New connection has been rejected with reason: ": "新規接続は次の理由で拒否されました: ", 13 | "New connection has been rejected": "新規接続は拒否されました", 14 | "Credentials are required": "資格情報が必要です", 15 | "noVNC encountered an error:": "noVNC でエラーが発生しました:", 16 | "Hide/Show the control bar": "コントロールバーを隠す/表示する", 17 | "Drag": "ドラッグ", 18 | "Move/Drag Viewport": "ビューポートを移動/ドラッグ", 19 | "Keyboard": "キーボード", 20 | "Show Keyboard": "キーボードを表示", 21 | "Extra keys": "追加キー", 22 | "Show Extra Keys": "追加キーを表示", 23 | "Ctrl": "Ctrl", 24 | "Toggle Ctrl": "Ctrl キーを切り替え", 25 | "Alt": "Alt", 26 | "Toggle Alt": "Alt キーを切り替え", 27 | "Toggle Windows": "Windows キーを切り替え", 28 | "Windows": "Windows", 29 | "Send Tab": "Tab キーを送信", 30 | "Tab": "Tab", 31 | "Esc": "Esc", 32 | "Send Escape": "Escape キーを送信", 33 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 34 | "Send Ctrl-Alt-Del": "Ctrl-Alt-Del を送信", 35 | "Shutdown/Reboot": "シャットダウン/再起動", 36 | "Shutdown/Reboot...": "シャットダウン/再起動...", 37 | "Power": "電源", 38 | "Shutdown": "シャットダウン", 39 | "Reboot": "再起動", 40 | "Reset": "リセット", 41 | "Clipboard": "クリップボード", 42 | "Clear": "クリア", 43 | "Fullscreen": "全画面表示", 44 | "Settings": "設定", 45 | "Shared Mode": "共有モード", 46 | "View Only": "表示のみ", 47 | "Clip to Window": "ウィンドウにクリップ", 48 | "Scaling Mode:": "スケーリングモード:", 49 | "None": "なし", 50 | "Local Scaling": "ローカルスケーリング", 51 | "Remote Resizing": "リモートでリサイズ", 52 | "Advanced": "高度", 53 | "Quality:": "品質:", 54 | "Compression level:": "圧縮レベル:", 55 | "Repeater ID:": "リピーター ID:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "暗号化", 58 | "Host:": "ホスト:", 59 | "Port:": "ポート:", 60 | "Path:": "パス:", 61 | "Automatic Reconnect": "自動再接続", 62 | "Reconnect Delay (ms):": "再接続する遅延 (ミリ秒):", 63 | "Show Dot when No Cursor": "カーソルがないときにドットを表示", 64 | "Logging:": "ロギング:", 65 | "Version:": "バージョン:", 66 | "Disconnect": "切断", 67 | "Connect": "接続", 68 | "Username:": "ユーザー名:", 69 | "Password:": "パスワード:", 70 | "Send Credentials": "資格情報を送信", 71 | "Cancel": "キャンセル" 72 | } -------------------------------------------------------------------------------- /noVNC/app/locale/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "연결중...", 3 | "Disconnecting...": "연결 해제중...", 4 | "Reconnecting...": "재연결중...", 5 | "Internal error": "내부 오류", 6 | "Must set host": "호스트는 설정되어야 합니다.", 7 | "Connected (encrypted) to ": "다음과 (암호화되어) 연결되었습니다:", 8 | "Connected (unencrypted) to ": "다음과 (암호화 없이) 연결되었습니다:", 9 | "Something went wrong, connection is closed": "무언가 잘못되었습니다, 연결이 닫혔습니다.", 10 | "Failed to connect to server": "서버에 연결하지 못했습니다.", 11 | "Disconnected": "연결이 해제되었습니다.", 12 | "New connection has been rejected with reason: ": "새 연결이 다음 이유로 거부되었습니다:", 13 | "New connection has been rejected": "새 연결이 거부되었습니다.", 14 | "Password is required": "비밀번호가 필요합니다.", 15 | "noVNC encountered an error:": "noVNC에 오류가 발생했습니다:", 16 | "Hide/Show the control bar": "컨트롤 바 숨기기/보이기", 17 | "Move/Drag Viewport": "움직이기/드래그 뷰포트", 18 | "viewport drag": "뷰포트 드래그", 19 | "Active Mouse Button": "마우스 버튼 활성화", 20 | "No mousebutton": "마우스 버튼 없음", 21 | "Left mousebutton": "왼쪽 마우스 버튼", 22 | "Middle mousebutton": "중간 마우스 버튼", 23 | "Right mousebutton": "오른쪽 마우스 버튼", 24 | "Keyboard": "키보드", 25 | "Show Keyboard": "키보드 보이기", 26 | "Extra keys": "기타 키들", 27 | "Show Extra Keys": "기타 키들 보이기", 28 | "Ctrl": "Ctrl", 29 | "Toggle Ctrl": "Ctrl 켜기/끄기", 30 | "Alt": "Alt", 31 | "Toggle Alt": "Alt 켜기/끄기", 32 | "Send Tab": "Tab 보내기", 33 | "Tab": "Tab", 34 | "Esc": "Esc", 35 | "Send Escape": "Esc 보내기", 36 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 37 | "Send Ctrl-Alt-Del": "Ctrl+Alt+Del 보내기", 38 | "Shutdown/Reboot": "셧다운/리붓", 39 | "Shutdown/Reboot...": "셧다운/리붓...", 40 | "Power": "전원", 41 | "Shutdown": "셧다운", 42 | "Reboot": "리붓", 43 | "Reset": "리셋", 44 | "Clipboard": "클립보드", 45 | "Clear": "지우기", 46 | "Fullscreen": "전체화면", 47 | "Settings": "설정", 48 | "Shared Mode": "공유 모드", 49 | "View Only": "보기 전용", 50 | "Clip to Window": "창에 클립", 51 | "Scaling Mode:": "스케일링 모드:", 52 | "None": "없음", 53 | "Local Scaling": "로컬 스케일링", 54 | "Remote Resizing": "원격 크기 조절", 55 | "Advanced": "고급", 56 | "Repeater ID:": "중계 ID", 57 | "WebSocket": "웹소켓", 58 | "Encrypt": "암호화", 59 | "Host:": "호스트:", 60 | "Port:": "포트:", 61 | "Path:": "위치:", 62 | "Automatic Reconnect": "자동 재연결", 63 | "Reconnect Delay (ms):": "재연결 지연 시간 (ms)", 64 | "Logging:": "로깅", 65 | "Disconnect": "연결 해제", 66 | "Connect": "연결", 67 | "Password:": "비밀번호:", 68 | "Send Password": "비밀번호 전송", 69 | "Cancel": "취소" 70 | } -------------------------------------------------------------------------------- /noVNC/app/locale/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Verbinden...", 3 | "Disconnecting...": "Verbinding verbreken...", 4 | "Reconnecting...": "Opnieuw verbinding maken...", 5 | "Internal error": "Interne fout", 6 | "Must set host": "Host moeten worden ingesteld", 7 | "Connected (encrypted) to ": "Verbonden (versleuteld) met ", 8 | "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ", 9 | "Something went wrong, connection is closed": "Er iets fout gelopen, verbinding werd verbroken", 10 | "Failed to connect to server": "Verbinding maken met server is mislukt", 11 | "Disconnected": "Verbinding verbroken", 12 | "New connection has been rejected with reason: ": "Nieuwe verbinding is geweigerd omwille van de volgende reden: ", 13 | "New connection has been rejected": "Nieuwe verbinding is geweigerd", 14 | "Password is required": "Wachtwoord is vereist", 15 | "noVNC encountered an error:": "noVNC heeft een fout bemerkt:", 16 | "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk", 17 | "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster", 18 | "viewport drag": "kijkvenster slepen", 19 | "Active Mouse Button": "Actieve Muisknop", 20 | "No mousebutton": "Geen muisknop", 21 | "Left mousebutton": "Linker muisknop", 22 | "Middle mousebutton": "Middelste muisknop", 23 | "Right mousebutton": "Rechter muisknop", 24 | "Keyboard": "Toetsenbord", 25 | "Show Keyboard": "Toon Toetsenbord", 26 | "Extra keys": "Extra toetsen", 27 | "Show Extra Keys": "Toon Extra Toetsen", 28 | "Ctrl": "Ctrl", 29 | "Toggle Ctrl": "Ctrl omschakelen", 30 | "Alt": "Alt", 31 | "Toggle Alt": "Alt omschakelen", 32 | "Toggle Windows": "Windows omschakelen", 33 | "Windows": "Windows", 34 | "Send Tab": "Tab Sturen", 35 | "Tab": "Tab", 36 | "Esc": "Esc", 37 | "Send Escape": "Escape Sturen", 38 | "Ctrl+Alt+Del": "Ctrl-Alt-Del", 39 | "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Sturen", 40 | "Shutdown/Reboot": "Uitschakelen/Herstarten", 41 | "Shutdown/Reboot...": "Uitschakelen/Herstarten...", 42 | "Power": "Systeem", 43 | "Shutdown": "Uitschakelen", 44 | "Reboot": "Herstarten", 45 | "Reset": "Resetten", 46 | "Clipboard": "Klembord", 47 | "Clear": "Wissen", 48 | "Fullscreen": "Volledig Scherm", 49 | "Settings": "Instellingen", 50 | "Shared Mode": "Gedeelde Modus", 51 | "View Only": "Alleen Kijken", 52 | "Clip to Window": "Randen buiten venster afsnijden", 53 | "Scaling Mode:": "Schaalmodus:", 54 | "None": "Geen", 55 | "Local Scaling": "Lokaal Schalen", 56 | "Remote Resizing": "Op Afstand Formaat Wijzigen", 57 | "Advanced": "Geavanceerd", 58 | "Repeater ID:": "Repeater ID:", 59 | "WebSocket": "WebSocket", 60 | "Encrypt": "Versleutelen", 61 | "Host:": "Host:", 62 | "Port:": "Poort:", 63 | "Path:": "Pad:", 64 | "Automatic Reconnect": "Automatisch Opnieuw Verbinden", 65 | "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):", 66 | "Show Dot when No Cursor": "Geef stip weer indien geen cursor", 67 | "Logging:": "Logmeldingen:", 68 | "Disconnect": "Verbinding verbreken", 69 | "Connect": "Verbinden", 70 | "Password:": "Wachtwoord:", 71 | "Send Password": "Verzend Wachtwoord:", 72 | "Cancel": "Annuleren" 73 | } -------------------------------------------------------------------------------- /noVNC/app/locale/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Łączenie...", 3 | "Disconnecting...": "Rozłączanie...", 4 | "Reconnecting...": "Łączenie...", 5 | "Internal error": "Błąd wewnętrzny", 6 | "Must set host": "Host i port są wymagane", 7 | "Connected (encrypted) to ": "Połączenie (szyfrowane) z ", 8 | "Connected (unencrypted) to ": "Połączenie (nieszyfrowane) z ", 9 | "Something went wrong, connection is closed": "Coś poszło źle, połączenie zostało zamknięte", 10 | "Disconnected": "Rozłączony", 11 | "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ", 12 | "New connection has been rejected": "Nowe połączenie zostało odrzucone", 13 | "Password is required": "Hasło jest wymagane", 14 | "noVNC encountered an error:": "noVNC napotkało błąd:", 15 | "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień", 16 | "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport", 17 | "viewport drag": "przeciągnij viewport", 18 | "Active Mouse Button": "Aktywny Przycisk Myszy", 19 | "No mousebutton": "Brak przycisku myszy", 20 | "Left mousebutton": "Lewy przycisk myszy", 21 | "Middle mousebutton": "Środkowy przycisk myszy", 22 | "Right mousebutton": "Prawy przycisk myszy", 23 | "Keyboard": "Klawiatura", 24 | "Show Keyboard": "Pokaż klawiaturę", 25 | "Extra keys": "Przyciski dodatkowe", 26 | "Show Extra Keys": "Pokaż przyciski dodatkowe", 27 | "Ctrl": "Ctrl", 28 | "Toggle Ctrl": "Przełącz Ctrl", 29 | "Alt": "Alt", 30 | "Toggle Alt": "Przełącz Alt", 31 | "Send Tab": "Wyślij Tab", 32 | "Tab": "Tab", 33 | "Esc": "Esc", 34 | "Send Escape": "Wyślij Escape", 35 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 36 | "Send Ctrl-Alt-Del": "Wyślij Ctrl-Alt-Del", 37 | "Shutdown/Reboot": "Wyłącz/Uruchom ponownie", 38 | "Shutdown/Reboot...": "Wyłącz/Uruchom ponownie...", 39 | "Power": "Włączony", 40 | "Shutdown": "Wyłącz", 41 | "Reboot": "Uruchom ponownie", 42 | "Reset": "Resetuj", 43 | "Clipboard": "Schowek", 44 | "Clear": "Wyczyść", 45 | "Fullscreen": "Pełny ekran", 46 | "Settings": "Ustawienia", 47 | "Shared Mode": "Tryb Współdzielenia", 48 | "View Only": "Tylko Podgląd", 49 | "Clip to Window": "Przytnij do Okna", 50 | "Scaling Mode:": "Tryb Skalowania:", 51 | "None": "Brak", 52 | "Local Scaling": "Skalowanie lokalne", 53 | "Remote Resizing": "Skalowanie zdalne", 54 | "Advanced": "Zaawansowane", 55 | "Repeater ID:": "ID Repeatera:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Szyfrowanie", 58 | "Host:": "Host:", 59 | "Port:": "Port:", 60 | "Path:": "Ścieżka:", 61 | "Automatic Reconnect": "Automatycznie wznawiaj połączenie", 62 | "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):", 63 | "Logging:": "Poziom logowania:", 64 | "Disconnect": "Rozłącz", 65 | "Connect": "Połącz", 66 | "Password:": "Hasło:", 67 | "Cancel": "Anuluj", 68 | "Canvas not supported.": "Element Canvas nie jest wspierany." 69 | } -------------------------------------------------------------------------------- /noVNC/app/locale/pt_BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Conectando...", 3 | "Disconnecting...": "Desconectando...", 4 | "Reconnecting...": "Reconectando...", 5 | "Internal error": "Erro interno", 6 | "Must set host": "É necessário definir o host", 7 | "Connected (encrypted) to ": "Conectado (com criptografia) a ", 8 | "Connected (unencrypted) to ": "Conectado (sem criptografia) a ", 9 | "Something went wrong, connection is closed": "Algo deu errado. A conexão foi encerrada.", 10 | "Failed to connect to server": "Falha ao conectar-se ao servidor", 11 | "Disconnected": "Desconectado", 12 | "New connection has been rejected with reason: ": "A nova conexão foi rejeitada pelo motivo: ", 13 | "New connection has been rejected": "A nova conexão foi rejeitada", 14 | "Credentials are required": "Credenciais são obrigatórias", 15 | "noVNC encountered an error:": "O noVNC encontrou um erro:", 16 | "Hide/Show the control bar": "Esconder/mostrar a barra de controles", 17 | "Drag": "Arrastar", 18 | "Move/Drag Viewport": "Mover/arrastar a janela", 19 | "Keyboard": "Teclado", 20 | "Show Keyboard": "Mostrar teclado", 21 | "Extra keys": "Teclas adicionais", 22 | "Show Extra Keys": "Mostar teclas adicionais", 23 | "Ctrl": "Ctrl", 24 | "Toggle Ctrl": "Pressionar/soltar Ctrl", 25 | "Alt": "Alt", 26 | "Toggle Alt": "Pressionar/soltar Alt", 27 | "Toggle Windows": "Pressionar/soltar Windows", 28 | "Windows": "Windows", 29 | "Send Tab": "Enviar Tab", 30 | "Tab": "Tab", 31 | "Esc": "Esc", 32 | "Send Escape": "Enviar Esc", 33 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 34 | "Send Ctrl-Alt-Del": "Enviar Ctrl-Alt-Del", 35 | "Shutdown/Reboot": "Desligar/reiniciar", 36 | "Shutdown/Reboot...": "Desligar/reiniciar...", 37 | "Power": "Ligar", 38 | "Shutdown": "Desligar", 39 | "Reboot": "Reiniciar", 40 | "Reset": "Reiniciar (forçado)", 41 | "Clipboard": "Área de transferência", 42 | "Clear": "Limpar", 43 | "Fullscreen": "Tela cheia", 44 | "Settings": "Configurações", 45 | "Shared Mode": "Modo compartilhado", 46 | "View Only": "Apenas visualizar", 47 | "Clip to Window": "Recortar à janela", 48 | "Scaling Mode:": "Modo de dimensionamento:", 49 | "None": "Nenhum", 50 | "Local Scaling": "Local", 51 | "Remote Resizing": "Remoto", 52 | "Advanced": "Avançado", 53 | "Quality:": "Qualidade:", 54 | "Compression level:": "Nível de compressão:", 55 | "Repeater ID:": "ID do repetidor:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Criptografar", 58 | "Host:": "Host:", 59 | "Port:": "Porta:", 60 | "Path:": "Caminho:", 61 | "Automatic Reconnect": "Reconexão automática", 62 | "Reconnect Delay (ms):": "Atraso da reconexão (ms)", 63 | "Show Dot when No Cursor": "Mostrar ponto quando não há cursor", 64 | "Logging:": "Registros:", 65 | "Version:": "Versão:", 66 | "Disconnect": "Desconectar", 67 | "Connect": "Conectar", 68 | "Username:": "Nome de usuário:", 69 | "Password:": "Senha:", 70 | "Send Credentials": "Enviar credenciais", 71 | "Cancel": "Cancelar" 72 | } -------------------------------------------------------------------------------- /noVNC/app/locale/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Подключение...", 3 | "Disconnecting...": "Отключение...", 4 | "Reconnecting...": "Переподключение...", 5 | "Internal error": "Внутренняя ошибка", 6 | "Must set host": "Задайте имя сервера или IP", 7 | "Connected (encrypted) to ": "Подключено (с шифрованием) к ", 8 | "Connected (unencrypted) to ": "Подключено (без шифрования) к ", 9 | "Something went wrong, connection is closed": "Что-то пошло не так, подключение разорвано", 10 | "Failed to connect to server": "Ошибка подключения к серверу", 11 | "Disconnected": "Отключено", 12 | "New connection has been rejected with reason: ": "Новое соединение отклонено по причине: ", 13 | "New connection has been rejected": "Новое соединение отклонено", 14 | "Credentials are required": "Требуются учетные данные", 15 | "noVNC encountered an error:": "Ошибка noVNC: ", 16 | "Hide/Show the control bar": "Скрыть/Показать контрольную панель", 17 | "Drag": "Переместить", 18 | "Move/Drag Viewport": "Переместить окно", 19 | "Keyboard": "Клавиатура", 20 | "Show Keyboard": "Показать клавиатуру", 21 | "Extra keys": "Дополнительные Кнопки", 22 | "Show Extra Keys": "Показать Дополнительные Кнопки", 23 | "Ctrl": "Ctrl", 24 | "Toggle Ctrl": "Переключение нажатия Ctrl", 25 | "Alt": "Alt", 26 | "Toggle Alt": "Переключение нажатия Alt", 27 | "Toggle Windows": "Переключение вкладок", 28 | "Windows": "Вкладка", 29 | "Send Tab": "Передать нажатие Tab", 30 | "Tab": "Tab", 31 | "Esc": "Esc", 32 | "Send Escape": "Передать нажатие Escape", 33 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 34 | "Send Ctrl-Alt-Del": "Передать нажатие Ctrl-Alt-Del", 35 | "Shutdown/Reboot": "Выключить/Перезагрузить", 36 | "Shutdown/Reboot...": "Выключить/Перезагрузить...", 37 | "Power": "Питание", 38 | "Shutdown": "Выключить", 39 | "Reboot": "Перезагрузить", 40 | "Reset": "Сброс", 41 | "Clipboard": "Буфер обмена", 42 | "Clear": "Очистить", 43 | "Fullscreen": "Во весь экран", 44 | "Settings": "Настройки", 45 | "Shared Mode": "Общий режим", 46 | "View Only": "Только Просмотр", 47 | "Clip to Window": "В окно", 48 | "Scaling Mode:": "Масштаб:", 49 | "None": "Нет", 50 | "Local Scaling": "Локльный масштаб", 51 | "Remote Resizing": "Удаленная перенастройка размера", 52 | "Advanced": "Дополнительно", 53 | "Quality:": "Качество", 54 | "Compression level:": "Уровень Сжатия", 55 | "Repeater ID:": "Идентификатор ID:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Шифрование", 58 | "Host:": "Сервер:", 59 | "Port:": "Порт:", 60 | "Path:": "Путь:", 61 | "Automatic Reconnect": "Автоматическое переподключение", 62 | "Reconnect Delay (ms):": "Задержка переподключения (мс):", 63 | "Show Dot when No Cursor": "Показать точку вместо курсора", 64 | "Logging:": "Лог:", 65 | "Version:": "Версия", 66 | "Disconnect": "Отключение", 67 | "Connect": "Подключение", 68 | "Username:": "Имя Пользователя", 69 | "Password:": "Пароль:", 70 | "Send Credentials": "Передача Учетных Данных", 71 | "Cancel": "Выход" 72 | } -------------------------------------------------------------------------------- /noVNC/app/locale/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Ansluter...", 3 | "Disconnecting...": "Kopplar ner...", 4 | "Reconnecting...": "Återansluter...", 5 | "Internal error": "Internt fel", 6 | "Must set host": "Du måste specifiera en värd", 7 | "Connected (encrypted) to ": "Ansluten (krypterat) till ", 8 | "Connected (unencrypted) to ": "Ansluten (okrypterat) till ", 9 | "Something went wrong, connection is closed": "Något gick fel, anslutningen avslutades", 10 | "Failed to connect to server": "Misslyckades att ansluta till servern", 11 | "Disconnected": "Frånkopplad", 12 | "New connection has been rejected with reason: ": "Ny anslutning har blivit nekad med följande skäl: ", 13 | "New connection has been rejected": "Ny anslutning har blivit nekad", 14 | "Credentials are required": "Användaruppgifter krävs", 15 | "noVNC encountered an error:": "noVNC stötte på ett problem:", 16 | "Hide/Show the control bar": "Göm/Visa kontrollbaren", 17 | "Drag": "Dra", 18 | "Move/Drag Viewport": "Flytta/Dra Vyn", 19 | "Keyboard": "Tangentbord", 20 | "Show Keyboard": "Visa Tangentbord", 21 | "Extra keys": "Extraknappar", 22 | "Show Extra Keys": "Visa Extraknappar", 23 | "Ctrl": "Ctrl", 24 | "Toggle Ctrl": "Växla Ctrl", 25 | "Alt": "Alt", 26 | "Toggle Alt": "Växla Alt", 27 | "Toggle Windows": "Växla Windows", 28 | "Windows": "Windows", 29 | "Send Tab": "Skicka Tab", 30 | "Tab": "Tab", 31 | "Esc": "Esc", 32 | "Send Escape": "Skicka Escape", 33 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 34 | "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del", 35 | "Shutdown/Reboot": "Stäng av/Boota om", 36 | "Shutdown/Reboot...": "Stäng av/Boota om...", 37 | "Power": "Ström", 38 | "Shutdown": "Stäng av", 39 | "Reboot": "Boota om", 40 | "Reset": "Återställ", 41 | "Clipboard": "Urklipp", 42 | "Clear": "Rensa", 43 | "Fullscreen": "Fullskärm", 44 | "Settings": "Inställningar", 45 | "Shared Mode": "Delat Läge", 46 | "View Only": "Endast Visning", 47 | "Clip to Window": "Begränsa till Fönster", 48 | "Scaling Mode:": "Skalningsläge:", 49 | "None": "Ingen", 50 | "Local Scaling": "Lokal Skalning", 51 | "Remote Resizing": "Ändra Storlek", 52 | "Advanced": "Avancerat", 53 | "Quality:": "Kvalitet:", 54 | "Compression level:": "Kompressionsnivå:", 55 | "Repeater ID:": "Repeater-ID:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Kryptera", 58 | "Host:": "Värd:", 59 | "Port:": "Port:", 60 | "Path:": "Sökväg:", 61 | "Automatic Reconnect": "Automatisk Återanslutning", 62 | "Reconnect Delay (ms):": "Fördröjning (ms):", 63 | "Show Dot when No Cursor": "Visa prick när ingen muspekare finns", 64 | "Logging:": "Loggning:", 65 | "Version:": "Version:", 66 | "Disconnect": "Koppla från", 67 | "Connect": "Anslut", 68 | "Username:": "Användarnamn:", 69 | "Password:": "Lösenord:", 70 | "Send Credentials": "Skicka Användaruppgifter", 71 | "Cancel": "Avbryt" 72 | } -------------------------------------------------------------------------------- /noVNC/app/locale/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "Bağlanıyor...", 3 | "Disconnecting...": "Bağlantı kesiliyor...", 4 | "Reconnecting...": "Yeniden bağlantı kuruluyor...", 5 | "Internal error": "İç hata", 6 | "Must set host": "Sunucuyu kur", 7 | "Connected (encrypted) to ": "Bağlı (şifrelenmiş)", 8 | "Connected (unencrypted) to ": "Bağlandı (şifrelenmemiş)", 9 | "Something went wrong, connection is closed": "Bir şeyler ters gitti, bağlantı kesildi", 10 | "Disconnected": "Bağlantı kesildi", 11 | "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ", 12 | "New connection has been rejected": "Bağlantı reddedildi", 13 | "Password is required": "Şifre gerekli", 14 | "noVNC encountered an error:": "Bir hata oluştu:", 15 | "Hide/Show the control bar": "Denetim masasını Gizle/Göster", 16 | "Move/Drag Viewport": "Görünümü Taşı/Sürükle", 17 | "viewport drag": "Görüntü penceresini sürükle", 18 | "Active Mouse Button": "Aktif Fare Düğmesi", 19 | "No mousebutton": "Fare düğmesi yok", 20 | "Left mousebutton": "Farenin sol düğmesi", 21 | "Middle mousebutton": "Farenin orta düğmesi", 22 | "Right mousebutton": "Farenin sağ düğmesi", 23 | "Keyboard": "Klavye", 24 | "Show Keyboard": "Klavye Düzenini Göster", 25 | "Extra keys": "Ekstra tuşlar", 26 | "Show Extra Keys": "Ekstra tuşları göster", 27 | "Ctrl": "Ctrl", 28 | "Toggle Ctrl": "Ctrl Değiştir ", 29 | "Alt": "Alt", 30 | "Toggle Alt": "Alt Değiştir", 31 | "Send Tab": "Sekme Gönder", 32 | "Tab": "Sekme", 33 | "Esc": "Esc", 34 | "Send Escape": "Boşluk Gönder", 35 | "Ctrl+Alt+Del": "Ctrl + Alt + Del", 36 | "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Gönder", 37 | "Shutdown/Reboot": "Kapat/Yeniden Başlat", 38 | "Shutdown/Reboot...": "Kapat/Yeniden Başlat...", 39 | "Power": "Güç", 40 | "Shutdown": "Kapat", 41 | "Reboot": "Yeniden Başlat", 42 | "Reset": "Sıfırla", 43 | "Clipboard": "Pano", 44 | "Clear": "Temizle", 45 | "Fullscreen": "Tam Ekran", 46 | "Settings": "Ayarlar", 47 | "Shared Mode": "Paylaşım Modu", 48 | "View Only": "Sadece Görüntüle", 49 | "Clip to Window": "Pencereye Tıkla", 50 | "Scaling Mode:": "Ölçekleme Modu:", 51 | "None": "Bilinmeyen", 52 | "Local Scaling": "Yerel Ölçeklendirme", 53 | "Remote Resizing": "Uzaktan Yeniden Boyutlandırma", 54 | "Advanced": "Gelişmiş", 55 | "Repeater ID:": "Tekralayıcı ID:", 56 | "WebSocket": "WebSocket", 57 | "Encrypt": "Şifrele", 58 | "Host:": "Ana makine:", 59 | "Port:": "Port:", 60 | "Path:": "Yol:", 61 | "Automatic Reconnect": "Otomatik Yeniden Bağlan", 62 | "Reconnect Delay (ms):": "Yeniden Bağlanma Süreci (ms):", 63 | "Logging:": "Giriş yapılıyor:", 64 | "Disconnect": "Bağlantıyı Kes", 65 | "Connect": "Bağlan", 66 | "Password:": "Parola:", 67 | "Cancel": "Vazgeç", 68 | "Canvas not supported.": "Tuval desteklenmiyor." 69 | } -------------------------------------------------------------------------------- /noVNC/app/locale/zh_CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "连接中...", 3 | "Disconnecting...": "正在断开连接...", 4 | "Reconnecting...": "重新连接中...", 5 | "Internal error": "内部错误", 6 | "Must set host": "请提供主机名", 7 | "Connected (encrypted) to ": "已连接到(加密)", 8 | "Connected (unencrypted) to ": "已连接到(未加密)", 9 | "Something went wrong, connection is closed": "发生错误,连接已关闭", 10 | "Failed to connect to server": "无法连接到服务器", 11 | "Disconnected": "已断开连接", 12 | "New connection has been rejected with reason: ": "连接被拒绝,原因:", 13 | "New connection has been rejected": "连接被拒绝", 14 | "Password is required": "请提供密码", 15 | "noVNC encountered an error:": "noVNC 遇到一个错误:", 16 | "Hide/Show the control bar": "显示/隐藏控制栏", 17 | "Move/Drag Viewport": "拖放显示范围", 18 | "viewport drag": "显示范围拖放", 19 | "Active Mouse Button": "启动鼠标按鍵", 20 | "No mousebutton": "禁用鼠标按鍵", 21 | "Left mousebutton": "鼠标左鍵", 22 | "Middle mousebutton": "鼠标中鍵", 23 | "Right mousebutton": "鼠标右鍵", 24 | "Keyboard": "键盘", 25 | "Show Keyboard": "显示键盘", 26 | "Extra keys": "额外按键", 27 | "Show Extra Keys": "显示额外按键", 28 | "Ctrl": "Ctrl", 29 | "Toggle Ctrl": "切换 Ctrl", 30 | "Alt": "Alt", 31 | "Toggle Alt": "切换 Alt", 32 | "Send Tab": "发送 Tab 键", 33 | "Tab": "Tab", 34 | "Esc": "Esc", 35 | "Send Escape": "发送 Escape 键", 36 | "Ctrl+Alt+Del": "Ctrl-Alt-Del", 37 | "Send Ctrl-Alt-Del": "发送 Ctrl-Alt-Del 键", 38 | "Shutdown/Reboot": "关机/重新启动", 39 | "Shutdown/Reboot...": "关机/重新启动...", 40 | "Power": "电源", 41 | "Shutdown": "关机", 42 | "Reboot": "重新启动", 43 | "Reset": "重置", 44 | "Clipboard": "剪贴板", 45 | "Clear": "清除", 46 | "Fullscreen": "全屏", 47 | "Settings": "设置", 48 | "Shared Mode": "分享模式", 49 | "View Only": "仅查看", 50 | "Clip to Window": "限制/裁切窗口大小", 51 | "Scaling Mode:": "缩放模式:", 52 | "None": "无", 53 | "Local Scaling": "本地缩放", 54 | "Remote Resizing": "远程调整大小", 55 | "Advanced": "高级", 56 | "Repeater ID:": "中继站 ID", 57 | "WebSocket": "WebSocket", 58 | "Encrypt": "加密", 59 | "Host:": "主机:", 60 | "Port:": "端口:", 61 | "Path:": "路径:", 62 | "Automatic Reconnect": "自动重新连接", 63 | "Reconnect Delay (ms):": "重新连接间隔 (ms):", 64 | "Logging:": "日志级别:", 65 | "Disconnect": "中断连接", 66 | "Connect": "连接", 67 | "Password:": "密码:", 68 | "Cancel": "取消" 69 | } -------------------------------------------------------------------------------- /noVNC/app/locale/zh_TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "Connecting...": "連線中...", 3 | "Disconnecting...": "正在中斷連線...", 4 | "Reconnecting...": "重新連線中...", 5 | "Internal error": "內部錯誤", 6 | "Must set host": "請提供主機資訊", 7 | "Connected (encrypted) to ": "已加密連線到", 8 | "Connected (unencrypted) to ": "未加密連線到", 9 | "Something went wrong, connection is closed": "發生錯誤,連線已關閉", 10 | "Failed to connect to server": "無法連線到伺服器", 11 | "Disconnected": "連線已中斷", 12 | "New connection has been rejected with reason: ": "連線被拒絕,原因:", 13 | "New connection has been rejected": "連線被拒絕", 14 | "Password is required": "請提供密碼", 15 | "noVNC encountered an error:": "noVNC 遇到一個錯誤:", 16 | "Hide/Show the control bar": "顯示/隱藏控制列", 17 | "Move/Drag Viewport": "拖放顯示範圍", 18 | "viewport drag": "顯示範圍拖放", 19 | "Active Mouse Button": "啟用滑鼠按鍵", 20 | "No mousebutton": "無滑鼠按鍵", 21 | "Left mousebutton": "滑鼠左鍵", 22 | "Middle mousebutton": "滑鼠中鍵", 23 | "Right mousebutton": "滑鼠右鍵", 24 | "Keyboard": "鍵盤", 25 | "Show Keyboard": "顯示鍵盤", 26 | "Extra keys": "額外按鍵", 27 | "Show Extra Keys": "顯示額外按鍵", 28 | "Ctrl": "Ctrl", 29 | "Toggle Ctrl": "切換 Ctrl", 30 | "Alt": "Alt", 31 | "Toggle Alt": "切換 Alt", 32 | "Send Tab": "送出 Tab 鍵", 33 | "Tab": "Tab", 34 | "Esc": "Esc", 35 | "Send Escape": "送出 Escape 鍵", 36 | "Ctrl+Alt+Del": "Ctrl-Alt-Del", 37 | "Send Ctrl-Alt-Del": "送出 Ctrl-Alt-Del 快捷鍵", 38 | "Shutdown/Reboot": "關機/重新啟動", 39 | "Shutdown/Reboot...": "關機/重新啟動...", 40 | "Power": "電源", 41 | "Shutdown": "關機", 42 | "Reboot": "重新啟動", 43 | "Reset": "重設", 44 | "Clipboard": "剪貼簿", 45 | "Clear": "清除", 46 | "Fullscreen": "全螢幕", 47 | "Settings": "設定", 48 | "Shared Mode": "分享模式", 49 | "View Only": "僅檢視", 50 | "Clip to Window": "限制/裁切視窗大小", 51 | "Scaling Mode:": "縮放模式:", 52 | "None": "無", 53 | "Local Scaling": "本機縮放", 54 | "Remote Resizing": "遠端調整大小", 55 | "Advanced": "進階", 56 | "Repeater ID:": "中繼站 ID", 57 | "WebSocket": "WebSocket", 58 | "Encrypt": "加密", 59 | "Host:": "主機:", 60 | "Port:": "連接埠:", 61 | "Path:": "路徑:", 62 | "Automatic Reconnect": "自動重新連線", 63 | "Reconnect Delay (ms):": "重新連線間隔 (ms):", 64 | "Logging:": "日誌級別:", 65 | "Disconnect": "中斷連線", 66 | "Connect": "連線", 67 | "Password:": "密碼:", 68 | "Cancel": "取消" 69 | } -------------------------------------------------------------------------------- /noVNC/app/sounds/CREDITS: -------------------------------------------------------------------------------- 1 | bell 2 | Copyright: Dr. Richard Boulanger et al 3 | URL: http://www.archive.org/details/Berklee44v12 4 | License: CC-BY Attribution 3.0 Unported 5 | -------------------------------------------------------------------------------- /noVNC/app/sounds/bell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/sounds/bell.mp3 -------------------------------------------------------------------------------- /noVNC/app/sounds/bell.oga: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/sounds/bell.oga -------------------------------------------------------------------------------- /noVNC/app/styles/Orbitron700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/styles/Orbitron700.ttf -------------------------------------------------------------------------------- /noVNC/app/styles/Orbitron700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/app/styles/Orbitron700.woff -------------------------------------------------------------------------------- /noVNC/core/decoders/copyrect.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | * 8 | */ 9 | 10 | export default class CopyRectDecoder { 11 | decodeRect(x, y, width, height, sock, display, depth) { 12 | if (sock.rQwait("COPYRECT", 4)) { 13 | return false; 14 | } 15 | 16 | let deltaX = sock.rQshift16(); 17 | let deltaY = sock.rQshift16(); 18 | 19 | if ((width === 0) || (height === 0)) { 20 | return true; 21 | } 22 | 23 | display.copyImage(deltaX, deltaY, x, y, width, height); 24 | 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /noVNC/core/decoders/raw.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | * 8 | */ 9 | 10 | export default class RawDecoder { 11 | constructor() { 12 | this._lines = 0; 13 | } 14 | 15 | decodeRect(x, y, width, height, sock, display, depth) { 16 | if ((width === 0) || (height === 0)) { 17 | return true; 18 | } 19 | 20 | if (this._lines === 0) { 21 | this._lines = height; 22 | } 23 | 24 | const pixelSize = depth == 8 ? 1 : 4; 25 | const bytesPerLine = width * pixelSize; 26 | 27 | if (sock.rQwait("RAW", bytesPerLine)) { 28 | return false; 29 | } 30 | 31 | const curY = y + (height - this._lines); 32 | const currHeight = Math.min(this._lines, 33 | Math.floor(sock.rQlen / bytesPerLine)); 34 | const pixels = width * currHeight; 35 | 36 | let data = sock.rQ; 37 | let index = sock.rQi; 38 | 39 | // Convert data if needed 40 | if (depth == 8) { 41 | const newdata = new Uint8Array(pixels * 4); 42 | for (let i = 0; i < pixels; i++) { 43 | newdata[i * 4 + 0] = ((data[index + i] >> 0) & 0x3) * 255 / 3; 44 | newdata[i * 4 + 1] = ((data[index + i] >> 2) & 0x3) * 255 / 3; 45 | newdata[i * 4 + 2] = ((data[index + i] >> 4) & 0x3) * 255 / 3; 46 | newdata[i * 4 + 3] = 255; 47 | } 48 | data = newdata; 49 | index = 0; 50 | } 51 | 52 | // Max sure the image is fully opaque 53 | for (let i = 0; i < pixels; i++) { 54 | data[index + i * 4 + 3] = 255; 55 | } 56 | 57 | display.blitImage(x, curY, width, currHeight, data, index); 58 | sock.rQskipBytes(currHeight * bytesPerLine); 59 | this._lines -= currHeight; 60 | if (this._lines > 0) { 61 | return false; 62 | } 63 | 64 | return true; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /noVNC/core/decoders/rre.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | * 8 | */ 9 | 10 | export default class RREDecoder { 11 | constructor() { 12 | this._subrects = 0; 13 | } 14 | 15 | decodeRect(x, y, width, height, sock, display, depth) { 16 | if (this._subrects === 0) { 17 | if (sock.rQwait("RRE", 4 + 4)) { 18 | return false; 19 | } 20 | 21 | this._subrects = sock.rQshift32(); 22 | 23 | let color = sock.rQshiftBytes(4); // Background 24 | display.fillRect(x, y, width, height, color); 25 | } 26 | 27 | while (this._subrects > 0) { 28 | if (sock.rQwait("RRE", 4 + 8)) { 29 | return false; 30 | } 31 | 32 | let color = sock.rQshiftBytes(4); 33 | let sx = sock.rQshift16(); 34 | let sy = sock.rQshift16(); 35 | let swidth = sock.rQshift16(); 36 | let sheight = sock.rQshift16(); 37 | display.fillRect(x + sx, y + sy, swidth, sheight, color); 38 | 39 | this._subrects--; 40 | } 41 | 42 | return true; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /noVNC/core/decoders/tightpng.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | * 8 | */ 9 | 10 | import TightDecoder from './tight.js'; 11 | 12 | export default class TightPNGDecoder extends TightDecoder { 13 | _pngRect(x, y, width, height, sock, display, depth) { 14 | let data = this._readData(sock); 15 | if (data === null) { 16 | return false; 17 | } 18 | 19 | display.imageRect(x, y, width, height, "image/png", data); 20 | 21 | return true; 22 | } 23 | 24 | _basicRect(ctl, x, y, width, height, sock, display, depth) { 25 | throw new Error("BasicCompression received in TightPNG rect"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /noVNC/core/deflator.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2020 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | import { deflateInit, deflate } from "../vendor/pako/lib/zlib/deflate.js"; 10 | import { Z_FULL_FLUSH } from "../vendor/pako/lib/zlib/deflate.js"; 11 | import ZStream from "../vendor/pako/lib/zlib/zstream.js"; 12 | 13 | export default class Deflator { 14 | constructor() { 15 | this.strm = new ZStream(); 16 | this.chunkSize = 1024 * 10 * 10; 17 | this.outputBuffer = new Uint8Array(this.chunkSize); 18 | this.windowBits = 5; 19 | 20 | deflateInit(this.strm, this.windowBits); 21 | } 22 | 23 | deflate(inData) { 24 | /* eslint-disable camelcase */ 25 | this.strm.input = inData; 26 | this.strm.avail_in = this.strm.input.length; 27 | this.strm.next_in = 0; 28 | this.strm.output = this.outputBuffer; 29 | this.strm.avail_out = this.chunkSize; 30 | this.strm.next_out = 0; 31 | /* eslint-enable camelcase */ 32 | 33 | let lastRet = deflate(this.strm, Z_FULL_FLUSH); 34 | let outData = new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); 35 | 36 | if (lastRet < 0) { 37 | throw new Error("zlib deflate failed"); 38 | } 39 | 40 | if (this.strm.avail_in > 0) { 41 | // Read chunks until done 42 | 43 | let chunks = [outData]; 44 | let totalLen = outData.length; 45 | do { 46 | /* eslint-disable camelcase */ 47 | this.strm.output = new Uint8Array(this.chunkSize); 48 | this.strm.next_out = 0; 49 | this.strm.avail_out = this.chunkSize; 50 | /* eslint-enable camelcase */ 51 | 52 | lastRet = deflate(this.strm, Z_FULL_FLUSH); 53 | 54 | if (lastRet < 0) { 55 | throw new Error("zlib deflate failed"); 56 | } 57 | 58 | let chunk = new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); 59 | totalLen += chunk.length; 60 | chunks.push(chunk); 61 | } while (this.strm.avail_in > 0); 62 | 63 | // Combine chunks into a single data 64 | 65 | let newData = new Uint8Array(totalLen); 66 | let offset = 0; 67 | 68 | for (let i = 0; i < chunks.length; i++) { 69 | newData.set(chunks[i], offset); 70 | offset += chunks[i].length; 71 | } 72 | 73 | outData = newData; 74 | } 75 | 76 | /* eslint-disable camelcase */ 77 | this.strm.input = null; 78 | this.strm.avail_in = 0; 79 | this.strm.next_in = 0; 80 | /* eslint-enable camelcase */ 81 | 82 | return outData; 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /noVNC/core/encodings.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | export const encodings = { 10 | encodingRaw: 0, 11 | encodingCopyRect: 1, 12 | encodingRRE: 2, 13 | encodingHextile: 5, 14 | encodingTight: 7, 15 | encodingZRLE: 16, 16 | encodingTightPNG: -260, 17 | encodingJPEG: 21, 18 | 19 | pseudoEncodingQualityLevel9: -23, 20 | pseudoEncodingQualityLevel0: -32, 21 | pseudoEncodingDesktopSize: -223, 22 | pseudoEncodingLastRect: -224, 23 | pseudoEncodingCursor: -239, 24 | pseudoEncodingQEMUExtendedKeyEvent: -258, 25 | pseudoEncodingDesktopName: -307, 26 | pseudoEncodingExtendedDesktopSize: -308, 27 | pseudoEncodingXvp: -309, 28 | pseudoEncodingFence: -312, 29 | pseudoEncodingContinuousUpdates: -313, 30 | pseudoEncodingCompressLevel9: -247, 31 | pseudoEncodingCompressLevel0: -256, 32 | pseudoEncodingVMwareCursor: 0x574d5664, 33 | pseudoEncodingExtendedClipboard: 0xc0a1e5ce 34 | }; 35 | 36 | export function encodingName(num) { 37 | switch (num) { 38 | case encodings.encodingRaw: return "Raw"; 39 | case encodings.encodingCopyRect: return "CopyRect"; 40 | case encodings.encodingRRE: return "RRE"; 41 | case encodings.encodingHextile: return "Hextile"; 42 | case encodings.encodingTight: return "Tight"; 43 | case encodings.encodingZRLE: return "ZRLE"; 44 | case encodings.encodingTightPNG: return "TightPNG"; 45 | case encodings.encodingJPEG: return "JPEG"; 46 | default: return "[unknown encoding " + num + "]"; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /noVNC/core/inflator.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2020 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | import { inflateInit, inflate, inflateReset } from "../vendor/pako/lib/zlib/inflate.js"; 10 | import ZStream from "../vendor/pako/lib/zlib/zstream.js"; 11 | 12 | export default class Inflate { 13 | constructor() { 14 | this.strm = new ZStream(); 15 | this.chunkSize = 1024 * 10 * 10; 16 | this.strm.output = new Uint8Array(this.chunkSize); 17 | this.windowBits = 5; 18 | 19 | inflateInit(this.strm, this.windowBits); 20 | } 21 | 22 | setInput(data) { 23 | if (!data) { 24 | //FIXME: flush remaining data. 25 | /* eslint-disable camelcase */ 26 | this.strm.input = null; 27 | this.strm.avail_in = 0; 28 | this.strm.next_in = 0; 29 | } else { 30 | this.strm.input = data; 31 | this.strm.avail_in = this.strm.input.length; 32 | this.strm.next_in = 0; 33 | /* eslint-enable camelcase */ 34 | } 35 | } 36 | 37 | inflate(expected) { 38 | // resize our output buffer if it's too small 39 | // (we could just use multiple chunks, but that would cause an extra 40 | // allocation each time to flatten the chunks) 41 | if (expected > this.chunkSize) { 42 | this.chunkSize = expected; 43 | this.strm.output = new Uint8Array(this.chunkSize); 44 | } 45 | 46 | /* eslint-disable camelcase */ 47 | this.strm.next_out = 0; 48 | this.strm.avail_out = expected; 49 | /* eslint-enable camelcase */ 50 | 51 | let ret = inflate(this.strm, 0); // Flush argument not used. 52 | if (ret < 0) { 53 | throw new Error("zlib inflate failed"); 54 | } 55 | 56 | if (this.strm.next_out != expected) { 57 | throw new Error("Incomplete zlib block"); 58 | } 59 | 60 | return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); 61 | } 62 | 63 | reset() { 64 | inflateReset(this.strm); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /noVNC/core/input/vkeys.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2018 The noVNC Authors 4 | * Licensed under MPL 2.0 or any later version (see LICENSE.txt) 5 | */ 6 | 7 | /* 8 | * Mapping between Microsoft® Windows® Virtual-Key codes and 9 | * HTML key codes. 10 | */ 11 | 12 | export default { 13 | 0x08: 'Backspace', 14 | 0x09: 'Tab', 15 | 0x0a: 'NumpadClear', 16 | 0x0d: 'Enter', 17 | 0x10: 'ShiftLeft', 18 | 0x11: 'ControlLeft', 19 | 0x12: 'AltLeft', 20 | 0x13: 'Pause', 21 | 0x14: 'CapsLock', 22 | 0x15: 'Lang1', 23 | 0x19: 'Lang2', 24 | 0x1b: 'Escape', 25 | 0x1c: 'Convert', 26 | 0x1d: 'NonConvert', 27 | 0x20: 'Space', 28 | 0x21: 'PageUp', 29 | 0x22: 'PageDown', 30 | 0x23: 'End', 31 | 0x24: 'Home', 32 | 0x25: 'ArrowLeft', 33 | 0x26: 'ArrowUp', 34 | 0x27: 'ArrowRight', 35 | 0x28: 'ArrowDown', 36 | 0x29: 'Select', 37 | 0x2c: 'PrintScreen', 38 | 0x2d: 'Insert', 39 | 0x2e: 'Delete', 40 | 0x2f: 'Help', 41 | 0x30: 'Digit0', 42 | 0x31: 'Digit1', 43 | 0x32: 'Digit2', 44 | 0x33: 'Digit3', 45 | 0x34: 'Digit4', 46 | 0x35: 'Digit5', 47 | 0x36: 'Digit6', 48 | 0x37: 'Digit7', 49 | 0x38: 'Digit8', 50 | 0x39: 'Digit9', 51 | 0x5b: 'MetaLeft', 52 | 0x5c: 'MetaRight', 53 | 0x5d: 'ContextMenu', 54 | 0x5f: 'Sleep', 55 | 0x60: 'Numpad0', 56 | 0x61: 'Numpad1', 57 | 0x62: 'Numpad2', 58 | 0x63: 'Numpad3', 59 | 0x64: 'Numpad4', 60 | 0x65: 'Numpad5', 61 | 0x66: 'Numpad6', 62 | 0x67: 'Numpad7', 63 | 0x68: 'Numpad8', 64 | 0x69: 'Numpad9', 65 | 0x6a: 'NumpadMultiply', 66 | 0x6b: 'NumpadAdd', 67 | 0x6c: 'NumpadDecimal', 68 | 0x6d: 'NumpadSubtract', 69 | 0x6e: 'NumpadDecimal', // Duplicate, because buggy on Windows 70 | 0x6f: 'NumpadDivide', 71 | 0x70: 'F1', 72 | 0x71: 'F2', 73 | 0x72: 'F3', 74 | 0x73: 'F4', 75 | 0x74: 'F5', 76 | 0x75: 'F6', 77 | 0x76: 'F7', 78 | 0x77: 'F8', 79 | 0x78: 'F9', 80 | 0x79: 'F10', 81 | 0x7a: 'F11', 82 | 0x7b: 'F12', 83 | 0x7c: 'F13', 84 | 0x7d: 'F14', 85 | 0x7e: 'F15', 86 | 0x7f: 'F16', 87 | 0x80: 'F17', 88 | 0x81: 'F18', 89 | 0x82: 'F19', 90 | 0x83: 'F20', 91 | 0x84: 'F21', 92 | 0x85: 'F22', 93 | 0x86: 'F23', 94 | 0x87: 'F24', 95 | 0x90: 'NumLock', 96 | 0x91: 'ScrollLock', 97 | 0xa6: 'BrowserBack', 98 | 0xa7: 'BrowserForward', 99 | 0xa8: 'BrowserRefresh', 100 | 0xa9: 'BrowserStop', 101 | 0xaa: 'BrowserSearch', 102 | 0xab: 'BrowserFavorites', 103 | 0xac: 'BrowserHome', 104 | 0xad: 'AudioVolumeMute', 105 | 0xae: 'AudioVolumeDown', 106 | 0xaf: 'AudioVolumeUp', 107 | 0xb0: 'MediaTrackNext', 108 | 0xb1: 'MediaTrackPrevious', 109 | 0xb2: 'MediaStop', 110 | 0xb3: 'MediaPlayPause', 111 | 0xb4: 'LaunchMail', 112 | 0xb5: 'MediaSelect', 113 | 0xb6: 'LaunchApp1', 114 | 0xb7: 'LaunchApp2', 115 | 0xe1: 'AltRight', // Only when it is AltGraph 116 | }; 117 | -------------------------------------------------------------------------------- /noVNC/core/util/element.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2020 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | /* 10 | * HTML element utility functions 11 | */ 12 | 13 | export function clientToElement(x, y, elem) { 14 | const bounds = elem.getBoundingClientRect(); 15 | let pos = { x: 0, y: 0 }; 16 | // Clip to target bounds 17 | if (x < bounds.left) { 18 | pos.x = 0; 19 | } else if (x >= bounds.right) { 20 | pos.x = bounds.width - 1; 21 | } else { 22 | pos.x = x - bounds.left; 23 | } 24 | if (y < bounds.top) { 25 | pos.y = 0; 26 | } else if (y >= bounds.bottom) { 27 | pos.y = bounds.height - 1; 28 | } else { 29 | pos.y = y - bounds.top; 30 | } 31 | return pos; 32 | } 33 | -------------------------------------------------------------------------------- /noVNC/core/util/eventtarget.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | export default class EventTargetMixin { 10 | constructor() { 11 | this._listeners = new Map(); 12 | } 13 | 14 | addEventListener(type, callback) { 15 | if (!this._listeners.has(type)) { 16 | this._listeners.set(type, new Set()); 17 | } 18 | this._listeners.get(type).add(callback); 19 | } 20 | 21 | removeEventListener(type, callback) { 22 | if (this._listeners.has(type)) { 23 | this._listeners.get(type).delete(callback); 24 | } 25 | } 26 | 27 | dispatchEvent(event) { 28 | if (!this._listeners.has(event.type)) { 29 | return true; 30 | } 31 | this._listeners.get(event.type) 32 | .forEach(callback => callback.call(this, event)); 33 | return !event.defaultPrevented; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /noVNC/core/util/int.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2020 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | export function toUnsigned32bit(toConvert) { 10 | return toConvert >>> 0; 11 | } 12 | 13 | export function toSigned32bit(toConvert) { 14 | return toConvert | 0; 15 | } 16 | -------------------------------------------------------------------------------- /noVNC/core/util/logging.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | /* 10 | * Logging/debug routines 11 | */ 12 | 13 | let _logLevel = 'warn'; 14 | 15 | let Debug = () => {}; 16 | let Info = () => {}; 17 | let Warn = () => {}; 18 | let Error = () => {}; 19 | 20 | export function initLogging(level) { 21 | if (typeof level === 'undefined') { 22 | level = _logLevel; 23 | } else { 24 | _logLevel = level; 25 | } 26 | 27 | Debug = Info = Warn = Error = () => {}; 28 | 29 | if (typeof window.console !== "undefined") { 30 | /* eslint-disable no-console, no-fallthrough */ 31 | switch (level) { 32 | case 'debug': 33 | Debug = console.debug.bind(window.console); 34 | case 'info': 35 | Info = console.info.bind(window.console); 36 | case 'warn': 37 | Warn = console.warn.bind(window.console); 38 | case 'error': 39 | Error = console.error.bind(window.console); 40 | case 'none': 41 | break; 42 | default: 43 | throw new window.Error("invalid logging type '" + level + "'"); 44 | } 45 | /* eslint-enable no-console, no-fallthrough */ 46 | } 47 | } 48 | 49 | export function getLogging() { 50 | return _logLevel; 51 | } 52 | 53 | export { Debug, Info, Warn, Error }; 54 | 55 | // Initialize logging level 56 | initLogging(); 57 | -------------------------------------------------------------------------------- /noVNC/core/util/strings.js: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC: HTML5 VNC client 3 | * Copyright (C) 2019 The noVNC Authors 4 | * Licensed under MPL 2.0 (see LICENSE.txt) 5 | * 6 | * See README.md for usage and integration instructions. 7 | */ 8 | 9 | // Decode from UTF-8 10 | export function decodeUTF8(utf8string, allowLatin1=false) { 11 | try { 12 | return decodeURIComponent(escape(utf8string)); 13 | } catch (e) { 14 | if (e instanceof URIError) { 15 | if (allowLatin1) { 16 | // If we allow Latin1 we can ignore any decoding fails 17 | // and in these cases return the original string 18 | return utf8string; 19 | } 20 | } 21 | throw e; 22 | } 23 | } 24 | 25 | // Encode to UTF-8 26 | export function encodeUTF8(DOMString) { 27 | return unescape(encodeURIComponent(DOMString)); 28 | } 29 | -------------------------------------------------------------------------------- /noVNC/docs/LIBRARY.md: -------------------------------------------------------------------------------- 1 | # Using the noVNC JavaScript library 2 | 3 | This document describes how to make use of the noVNC JavaScript library for 4 | integration in your own VNC client application. If you wish to embed the more 5 | complete noVNC application with its included user interface then please see 6 | our [embedding documentation](EMBEDDING.md). 7 | 8 | ## API 9 | 10 | The API of noVNC consists of a single object called `RFB`. The formal 11 | documentation for that object can be found in our [API documentation](API.md). 12 | 13 | ## Example 14 | 15 | noVNC includes a small example application called `vnc_lite.html`. This does 16 | not make use of all the features of noVNC, but is a good start to see how to 17 | do things. 18 | 19 | ## Conversion of Modules 20 | 21 | noVNC is written using ECMAScript 6 modules. This is not supported by older 22 | versions of Node.js. To use noVNC with those older versions of Node.js the 23 | library must first be converted. 24 | 25 | Fortunately noVNC includes a script to handle this conversion. Please follow 26 | the following steps: 27 | 28 | 1. Install Node.js 29 | 2. Run `npm install` in the noVNC directory 30 | 31 | The result of the conversion is available in the `lib/` directory. 32 | -------------------------------------------------------------------------------- /noVNC/docs/LICENSE.BSD-2-Clause: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 17 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /noVNC/docs/LICENSE.BSD-3-Clause: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the nor the 12 | names of its contributors may be used to endorse or promote products 13 | derived from this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /noVNC/docs/flash_policy.txt: -------------------------------------------------------------------------------- 1 | Manual setup: 2 | 3 | DATA="echo \'\'" 4 | /usr/bin/socat -T 1 TCP-L:843,reuseaddr,fork,crlf SYSTEM:"$DATA" 5 | -------------------------------------------------------------------------------- /noVNC/docs/links: -------------------------------------------------------------------------------- 1 | New tight PNG protocol: 2 | http://wiki.qemu.org/VNC_Tight_PNG 3 | http://xf.iksaif.net/blog/index.php?post/2010/06/14/QEMU:-Tight-PNG-and-some-profiling 4 | 5 | RFB protocol and extensions: 6 | http://tigervnc.org/cgi-bin/rfbproto 7 | 8 | Canvas Browser Compatibility: 9 | http://philip.html5.org/tests/canvas/suite/tests/results.html 10 | 11 | WebSockets API standard: 12 | http://www.whatwg.org/specs/web-apps/current-work/complete.html#websocket 13 | http://dev.w3.org/html5/websockets/ 14 | http://www.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-00.txt 15 | 16 | Browser Keyboard Events detailed: 17 | http://unixpapa.com/js/key.html 18 | 19 | ActionScript (Flash) WebSocket implementation: 20 | http://github.com/gimite/web-socket-js 21 | 22 | ActionScript (Flash) crypto/TLS library: 23 | http://code.google.com/p/as3crypto 24 | http://github.com/lyokato/as3crypto_patched 25 | 26 | TLS Protocol: 27 | http://en.wikipedia.org/wiki/Transport_Layer_Security 28 | 29 | Generate self-signed certificate: 30 | http://docs.python.org/dev/library/ssl.html#certificates 31 | 32 | Cursor appearance/style (for Cursor pseudo-encoding): 33 | http://en.wikipedia.org/wiki/ICO_(file_format) 34 | http://www.daubnet.com/en/file-format-cur 35 | https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property 36 | http://www.fileformat.info/format/bmp/egff.htm 37 | 38 | Icon/Cursor file format: 39 | http://msdn.microsoft.com/en-us/library/ms997538 40 | http://msdn.microsoft.com/en-us/library/aa921550.aspx 41 | http://msdn.microsoft.com/en-us/library/aa930622.aspx 42 | 43 | 44 | RDP Protocol specification: 45 | http://msdn.microsoft.com/en-us/library/cc240445(v=PROT.10).aspx 46 | 47 | 48 | Related projects: 49 | 50 | guacamole: http://guacamole.sourceforge.net/ 51 | 52 | - Web client, but Java servlet does pre-processing 53 | 54 | jsvnc: http://code.google.com/p/jsvnc/ 55 | 56 | - No releases 57 | 58 | webvnc: http://code.google.com/p/webvnc/ 59 | 60 | - Jetty web server gateway, no updates since April 2008. 61 | 62 | RealVNC Java applet: http://www.realvnc.com/support/javavncviewer.html 63 | 64 | - Java applet 65 | 66 | Flashlight-VNC: http://www.wizhelp.com/flashlight-vnc/ 67 | 68 | - Adobe Flash implementation 69 | 70 | FVNC: http://osflash.org/fvnc 71 | 72 | - Adbove Flash implementation 73 | 74 | CanVNC: http://canvnc.sourceforge.net/ 75 | 76 | - HTML client with REST to VNC python proxy. Mostly vapor. 77 | -------------------------------------------------------------------------------- /noVNC/docs/notes: -------------------------------------------------------------------------------- 1 | Rebuilding inflator.js 2 | 3 | - Download pako from npm 4 | - Install browserify using npm 5 | - browserify core/inflator.mod.js -o core/inflator.js -s Inflator 6 | -------------------------------------------------------------------------------- /noVNC/docs/novnc_proxy.1: -------------------------------------------------------------------------------- 1 | .TH novnc_proxy 1 "June 25, 2020" "version 1.2.0" "USER COMMANDS" 2 | 3 | .SH NAME 4 | novnc_proxy - noVNC proxy server 5 | .SH SYNOPSIS 6 | .B novnc_proxy [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT] [--ssl-only] 7 | 8 | Starts the WebSockets proxy and a mini-webserver and 9 | provides a cut-and-paste URL to go to. 10 | 11 | --listen PORT Port for proxy/webserver to listen on 12 | Default: 6080 13 | --vnc VNC_HOST:PORT VNC server host:port proxy target 14 | Default: localhost:5900 15 | --cert CERT Path to combined cert/key file, or just 16 | the cert file if used with --key 17 | Default: self.pem 18 | --key KEY Path to key file, when not combined with cert 19 | --web WEB Path to web files (e.g. vnc.html) 20 | Default: ./ 21 | --ssl-only Disable non-https connections. 22 | 23 | --record FILE Record traffic to FILE.session.js 24 | 25 | --syslog SERVER Can be local socket such as /dev/log, or a UDP host:port pair. 26 | 27 | --heartbeat SEC send a ping to the client every SEC seconds 28 | --timeout SEC after SEC seconds exit when not connected 29 | --idle-timeout SEC server exits after SEC seconds if there are no 30 | active connections 31 | 32 | .SH AUTHOR 33 | The noVNC Authors 34 | https://github.com/novnc/noVNC 35 | 36 | .SH SEE ALSO 37 | websockify(1), nova-novncproxy(1) 38 | -------------------------------------------------------------------------------- /noVNC/docs/rfbproto-3.3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/docs/rfbproto-3.3.pdf -------------------------------------------------------------------------------- /noVNC/docs/rfbproto-3.7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/docs/rfbproto-3.7.pdf -------------------------------------------------------------------------------- /noVNC/docs/rfbproto-3.8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/docs/rfbproto-3.8.pdf -------------------------------------------------------------------------------- /noVNC/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | 3 | // The Safari launcher is broken, so construct our own 4 | function SafariBrowser(id, baseBrowserDecorator, args) { 5 | baseBrowserDecorator(this); 6 | 7 | this._start = function(url) { 8 | this._execCommand('/usr/bin/open', ['-W', '-n', '-a', 'Safari', url]); 9 | } 10 | } 11 | 12 | SafariBrowser.prototype = { 13 | name: 'Safari' 14 | } 15 | 16 | module.exports = (config) => { 17 | let browsers = []; 18 | 19 | if (process.env.TEST_BROWSER_NAME) { 20 | browsers = process.env.TEST_BROWSER_NAME.split(','); 21 | } 22 | 23 | const my_conf = { 24 | 25 | // base path that will be used to resolve all patterns (eg. files, exclude) 26 | basePath: '', 27 | 28 | // frameworks to use 29 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 30 | frameworks: ['mocha', 'sinon-chai'], 31 | 32 | // list of files / patterns to load in the browser (loaded in order) 33 | files: [ 34 | { pattern: 'app/localization.js', included: false, type: 'module' }, 35 | { pattern: 'app/webutil.js', included: false, type: 'module' }, 36 | { pattern: 'core/**/*.js', included: false, type: 'module' }, 37 | { pattern: 'vendor/pako/**/*.js', included: false, type: 'module' }, 38 | { pattern: 'tests/test.*.js', type: 'module' }, 39 | { pattern: 'tests/fake.*.js', included: false, type: 'module' }, 40 | { pattern: 'tests/assertions.js', type: 'module' }, 41 | ], 42 | 43 | client: { 44 | mocha: { 45 | // replace Karma debug page with mocha display 46 | 'reporter': 'html', 47 | 'ui': 'bdd' 48 | } 49 | }, 50 | 51 | // list of files to exclude 52 | exclude: [ 53 | ], 54 | 55 | plugins: [ 56 | 'karma-*', 57 | '@chiragrupani/karma-chromium-edge-launcher', 58 | { 'launcher:Safari': [ 'type', SafariBrowser ] }, 59 | ], 60 | 61 | // start these browsers 62 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 63 | browsers: browsers, 64 | 65 | // test results reporter to use 66 | // possible values: 'dots', 'progress' 67 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 68 | reporters: ['mocha'], 69 | 70 | 71 | // level of logging 72 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 73 | logLevel: config.LOG_INFO, 74 | 75 | 76 | // enable / disable watching file and executing tests whenever any file changes 77 | autoWatch: false, 78 | 79 | // Continuous Integration mode 80 | // if true, Karma captures browsers, runs the tests and exits 81 | singleRun: true, 82 | }; 83 | 84 | config.set(my_conf); 85 | }; 86 | -------------------------------------------------------------------------------- /noVNC/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@novnc/novnc", 3 | "version": "1.3.0", 4 | "description": "An HTML5 VNC client", 5 | "browser": "lib/rfb", 6 | "directories": { 7 | "lib": "lib", 8 | "doc": "docs", 9 | "test": "tests" 10 | }, 11 | "files": [ 12 | "lib", 13 | "AUTHORS", 14 | "VERSION", 15 | "docs/API.md", 16 | "docs/LIBRARY.md", 17 | "docs/LICENSE*", 18 | "core", 19 | "vendor/pako" 20 | ], 21 | "scripts": { 22 | "lint": "eslint app core po/po2js po/xgettext-html tests utils", 23 | "test": "karma start karma.conf.js", 24 | "prepublish": "node ./utils/convert.js --clean" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git+https://github.com/novnc/noVNC.git" 29 | }, 30 | "author": "Joel Martin (https://github.com/kanaka)", 31 | "contributors": [ 32 | "Samuel Mannehed (https://github.com/samhed)", 33 | "Pierre Ossman (https://github.com/CendioOssman)" 34 | ], 35 | "license": "MPL-2.0", 36 | "bugs": { 37 | "url": "https://github.com/novnc/noVNC/issues" 38 | }, 39 | "homepage": "https://github.com/novnc/noVNC", 40 | "devDependencies": { 41 | "@babel/core": "*", 42 | "@babel/plugin-syntax-dynamic-import": "*", 43 | "@babel/plugin-transform-modules-commonjs": "*", 44 | "@babel/preset-env": "*", 45 | "@babel/cli": "*", 46 | "babel-plugin-import-redirect": "*", 47 | "browserify": "*", 48 | "babelify": "*", 49 | "core-js": "*", 50 | "chai": "*", 51 | "commander": "*", 52 | "es-module-loader": "*", 53 | "eslint": "*", 54 | "fs-extra": "*", 55 | "jsdom": "*", 56 | "karma": "*", 57 | "karma-mocha": "*", 58 | "karma-chrome-launcher": "*", 59 | "@chiragrupani/karma-chromium-edge-launcher": "*", 60 | "karma-firefox-launcher": "*", 61 | "karma-ie-launcher": "*", 62 | "karma-mocha-reporter": "*", 63 | "karma-safari-launcher": "*", 64 | "karma-script-launcher": "*", 65 | "karma-sinon-chai": "*", 66 | "mocha": "*", 67 | "node-getopt": "*", 68 | "po2json": "*", 69 | "sinon": "*", 70 | "sinon-chai": "*" 71 | }, 72 | "dependencies": {}, 73 | "keywords": [ 74 | "vnc", 75 | "rfb", 76 | "novnc", 77 | "websockify" 78 | ] 79 | } 80 | -------------------------------------------------------------------------------- /noVNC/po/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | }, 5 | } 6 | -------------------------------------------------------------------------------- /noVNC/po/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | .PHONY: update-po update-js update-pot 3 | .PHONY: FORCE 4 | 5 | LINGUAS := cs de el es fr it ja ko nl pl pt_BR ru sv tr zh_CN zh_TW 6 | 7 | VERSION := $(shell grep '"version"' ../package.json | cut -d '"' -f 4) 8 | 9 | POFILES := $(addsuffix .po,$(LINGUAS)) 10 | JSONFILES := $(addprefix ../app/locale/,$(addsuffix .json,$(LINGUAS))) 11 | 12 | update-po: $(POFILES) 13 | update-js: $(JSONFILES) 14 | 15 | %.po: FORCE 16 | msgmerge --update --lang=$* $@ noVNC.pot 17 | ../app/locale/%.json: FORCE 18 | ./po2js $*.po $@ 19 | 20 | update-pot: 21 | xgettext --output=noVNC.js.pot \ 22 | --copyright-holder="The noVNC Authors" \ 23 | --package-name="noVNC" \ 24 | --package-version="$(VERSION)" \ 25 | --msgid-bugs-address="novnc@googlegroups.com" \ 26 | --add-comments=TRANSLATORS: \ 27 | --from-code=UTF-8 \ 28 | --sort-by-file \ 29 | ../app/*.js \ 30 | ../core/*.js \ 31 | ../core/input/*.js 32 | ./xgettext-html --output=noVNC.html.pot \ 33 | ../vnc.html 34 | msgcat --output-file=noVNC.pot \ 35 | --sort-by-file noVNC.js.pot noVNC.html.pot 36 | rm -f noVNC.js.pot noVNC.html.pot 37 | -------------------------------------------------------------------------------- /noVNC/po/po2js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* 3 | * ps2js: gettext .po to noVNC .js converter 4 | * Copyright (C) 2018 The noVNC Authors 5 | * 6 | * This program is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with this program. If not, see . 18 | */ 19 | 20 | const getopt = require('node-getopt'); 21 | const fs = require('fs'); 22 | const po2json = require("po2json"); 23 | 24 | const opt = getopt.create([ 25 | ['h', 'help', 'display this help'], 26 | ]).bindHelp().parseSystem(); 27 | 28 | if (opt.argv.length != 2) { 29 | console.error("Incorrect number of arguments given"); 30 | process.exit(1); 31 | } 32 | 33 | const data = po2json.parseFileSync(opt.argv[0]); 34 | 35 | const bodyPart = Object.keys(data).filter(msgid => msgid !== "").map((msgid) => { 36 | if (msgid === "") return; 37 | const msgstr = data[msgid][1]; 38 | return " " + JSON.stringify(msgid) + ": " + JSON.stringify(msgstr); 39 | }).join(",\n"); 40 | 41 | const output = "{\n" + bodyPart + "\n}"; 42 | 43 | fs.writeFileSync(opt.argv[1], output); 44 | -------------------------------------------------------------------------------- /noVNC/snap/hooks/configure: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | snapctl restart novnc.novncsvc 4 | -------------------------------------------------------------------------------- /noVNC/snap/local/svc_wrapper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # `snapctl get services` returns a JSON array, example: 4 | #{ 5 | #"n6801": { 6 | # "listen": 6801, 7 | # "vnc": "localhost:5901" 8 | #}, 9 | #"n6802": { 10 | # "listen": 6802, 11 | # "vnc": "localhost:5902" 12 | #} 13 | #} 14 | snapctl get services | jq -c '.[]' | while read service; do # for each service the user sepcified.. 15 | # get the important data for the service (listen port, VNC host:port) 16 | listen_port="$(echo $service | jq --raw-output '.listen')" 17 | vnc_host_port="$(echo $service | jq --raw-output '.vnc')" # --raw-output removes any quotation marks from the output 18 | 19 | # check whether those values are valid 20 | expr "$listen_port" : '^[0-9]\+$' > /dev/null 21 | listen_port_valid=$? 22 | if [ ! $listen_port_valid ] || [ -z "$vnc_host_port" ]; then 23 | # invalid values mean the service is disabled, do nothing except for printing a message (logged in /var/log/system or systemd journal) 24 | echo "novnc: not starting service ${service} with listen_port ${listen_port} and vnc_host_port ${vnc_host_port}" 25 | else 26 | # start (and fork with '&') the service using the specified listen port and VNC host:port 27 | $SNAP/novnc_proxy --listen $listen_port --vnc $vnc_host_port & 28 | fi 29 | done 30 | -------------------------------------------------------------------------------- /noVNC/snap/snapcraft.yaml: -------------------------------------------------------------------------------- 1 | name: novnc 2 | base: core18 # the base snap is the execution environment for this snap 3 | version: git 4 | summary: Open Source VNC client using HTML5 (WebSockets, Canvas) 5 | description: | 6 | Open Source VNC client using HTML5 (WebSockets, Canvas). 7 | noVNC is both a VNC client JavaScript library as well as an 8 | application built on top of that library. noVNC runs well in any 9 | modern browser including mobile browsers (iOS and Android). 10 | 11 | grade: stable 12 | confinement: strict 13 | 14 | parts: 15 | novnc: 16 | source: . 17 | plugin: dump 18 | organize: 19 | utils/novnc_proxy: / 20 | stage: 21 | - vnc.html 22 | - app 23 | - core/**/*.js 24 | - vendor/**/*.js 25 | - novnc_proxy 26 | 27 | novnc-deps: 28 | plugin: nil 29 | stage-packages: 30 | - bash 31 | 32 | svc-script: 33 | source: snap/local 34 | plugin: dump 35 | stage: 36 | - svc_wrapper.sh 37 | 38 | svc-script-deps: 39 | plugin: nil 40 | stage-packages: 41 | - bash 42 | - jq 43 | 44 | websockify: 45 | source: https://github.com/novnc/websockify/archive/v0.9.0.tar.gz 46 | plugin: python 47 | stage-packages: 48 | - python3-numpy 49 | 50 | hooks: 51 | configure: 52 | plugs: [network, network-bind] 53 | 54 | apps: 55 | novnc: 56 | command: ./novnc_proxy 57 | plugs: [network, network-bind] 58 | novncsvc: 59 | command: ./svc_wrapper.sh 60 | daemon: forking 61 | plugs: [network, network-bind] 62 | -------------------------------------------------------------------------------- /noVNC/tests/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "mocha": true 5 | }, 6 | "globals": { 7 | "chai": false, 8 | "sinon": false 9 | }, 10 | "rules": { 11 | "prefer-arrow-callback": 0, 12 | // Too many anonymous callbacks 13 | "func-names": "off", 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /noVNC/tests/fake.websocket.js: -------------------------------------------------------------------------------- 1 | import Base64 from '../core/base64.js'; 2 | 3 | export default class FakeWebSocket { 4 | constructor(uri, protocols) { 5 | this.url = uri; 6 | this.binaryType = "arraybuffer"; 7 | this.extensions = ""; 8 | 9 | this.onerror = null; 10 | this.onmessage = null; 11 | this.onopen = null; 12 | 13 | if (!protocols || typeof protocols === 'string') { 14 | this.protocol = protocols; 15 | } else { 16 | this.protocol = protocols[0]; 17 | } 18 | 19 | this._sendQueue = new Uint8Array(20000); 20 | 21 | this.readyState = FakeWebSocket.CONNECTING; 22 | this.bufferedAmount = 0; 23 | 24 | this._isFake = true; 25 | } 26 | 27 | close(code, reason) { 28 | this.readyState = FakeWebSocket.CLOSED; 29 | if (this.onclose) { 30 | this.onclose(new CloseEvent("close", { 'code': code, 'reason': reason, 'wasClean': true })); 31 | } 32 | } 33 | 34 | send(data) { 35 | if (this.protocol == 'base64') { 36 | data = Base64.decode(data); 37 | } else { 38 | data = new Uint8Array(data); 39 | } 40 | this._sendQueue.set(data, this.bufferedAmount); 41 | this.bufferedAmount += data.length; 42 | } 43 | 44 | _getSentData() { 45 | const res = new Uint8Array(this._sendQueue.buffer, 0, this.bufferedAmount); 46 | this.bufferedAmount = 0; 47 | return res; 48 | } 49 | 50 | _open() { 51 | this.readyState = FakeWebSocket.OPEN; 52 | if (this.onopen) { 53 | this.onopen(new Event('open')); 54 | } 55 | } 56 | 57 | _receiveData(data) { 58 | // Break apart the data to expose bugs where we assume data is 59 | // neatly packaged 60 | for (let i = 0;i < data.length;i++) { 61 | let buf = data.subarray(i, i+1); 62 | this.onmessage(new MessageEvent("message", { 'data': buf })); 63 | } 64 | } 65 | } 66 | 67 | FakeWebSocket.OPEN = WebSocket.OPEN; 68 | FakeWebSocket.CONNECTING = WebSocket.CONNECTING; 69 | FakeWebSocket.CLOSING = WebSocket.CLOSING; 70 | FakeWebSocket.CLOSED = WebSocket.CLOSED; 71 | 72 | FakeWebSocket._isFake = true; 73 | 74 | FakeWebSocket.replace = () => { 75 | if (!WebSocket._isFake) { 76 | const realVersion = WebSocket; 77 | // eslint-disable-next-line no-global-assign 78 | WebSocket = FakeWebSocket; 79 | FakeWebSocket._realVersion = realVersion; 80 | } 81 | }; 82 | 83 | FakeWebSocket.restore = () => { 84 | if (WebSocket._isFake) { 85 | // eslint-disable-next-line no-global-assign 86 | WebSocket = WebSocket._realVersion; 87 | } 88 | }; 89 | -------------------------------------------------------------------------------- /noVNC/tests/test.base64.js: -------------------------------------------------------------------------------- 1 | const expect = chai.expect; 2 | 3 | import Base64 from '../core/base64.js'; 4 | 5 | describe('Base64 Tools', function () { 6 | "use strict"; 7 | 8 | const BIN_ARR = new Array(256); 9 | for (let i = 0; i < 256; i++) { 10 | BIN_ARR[i] = i; 11 | } 12 | 13 | const B64_STR = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="; 14 | 15 | 16 | describe('encode', function () { 17 | it('should encode a binary string into Base64', function () { 18 | const encoded = Base64.encode(BIN_ARR); 19 | expect(encoded).to.equal(B64_STR); 20 | }); 21 | }); 22 | 23 | describe('decode', function () { 24 | it('should decode a Base64 string into a normal string', function () { 25 | const decoded = Base64.decode(B64_STR); 26 | expect(decoded).to.deep.equal(BIN_ARR); 27 | }); 28 | 29 | it('should throw an error if we have extra characters at the end of the string', function () { 30 | expect(() => Base64.decode(B64_STR+'abcdef')).to.throw(Error); 31 | }); 32 | }); 33 | }); 34 | -------------------------------------------------------------------------------- /noVNC/tests/test.copyrect.js: -------------------------------------------------------------------------------- 1 | const expect = chai.expect; 2 | 3 | import Websock from '../core/websock.js'; 4 | import Display from '../core/display.js'; 5 | 6 | import CopyRectDecoder from '../core/decoders/copyrect.js'; 7 | 8 | import FakeWebSocket from './fake.websocket.js'; 9 | 10 | function testDecodeRect(decoder, x, y, width, height, data, display, depth) { 11 | let sock; 12 | 13 | sock = new Websock; 14 | sock.open("ws://example.com"); 15 | 16 | sock.on('message', () => { 17 | decoder.decodeRect(x, y, width, height, sock, display, depth); 18 | }); 19 | 20 | // Empty messages are filtered at multiple layers, so we need to 21 | // do a direct call 22 | if (data.length === 0) { 23 | decoder.decodeRect(x, y, width, height, sock, display, depth); 24 | } else { 25 | sock._websocket._receiveData(new Uint8Array(data)); 26 | } 27 | 28 | display.flip(); 29 | } 30 | 31 | describe('CopyRect Decoder', function () { 32 | let decoder; 33 | let display; 34 | 35 | before(FakeWebSocket.replace); 36 | after(FakeWebSocket.restore); 37 | 38 | beforeEach(function () { 39 | decoder = new CopyRectDecoder(); 40 | display = new Display(document.createElement('canvas')); 41 | display.resize(4, 4); 42 | }); 43 | 44 | it('should handle the CopyRect encoding', function () { 45 | // seed some initial data to copy 46 | display.fillRect(0, 0, 4, 4, [ 0x11, 0x22, 0x33 ]); 47 | display.fillRect(0, 0, 2, 2, [ 0x00, 0x00, 0xff ]); 48 | display.fillRect(2, 0, 2, 2, [ 0x00, 0xff, 0x00 ]); 49 | 50 | testDecodeRect(decoder, 0, 2, 2, 2, 51 | [0x00, 0x02, 0x00, 0x00], 52 | display, 24); 53 | testDecodeRect(decoder, 2, 2, 2, 2, 54 | [0x00, 0x00, 0x00, 0x00], 55 | display, 24); 56 | 57 | let targetData = new Uint8Array([ 58 | 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255, 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 59 | 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255, 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 60 | 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255, 61 | 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255 62 | ]); 63 | 64 | expect(display).to.have.displayed(targetData); 65 | }); 66 | 67 | it('should handle empty rects', function () { 68 | display.fillRect(0, 0, 4, 4, [ 0x00, 0x00, 0xff ]); 69 | display.fillRect(2, 0, 2, 2, [ 0x00, 0xff, 0x00 ]); 70 | display.fillRect(0, 2, 2, 2, [ 0x00, 0xff, 0x00 ]); 71 | 72 | testDecodeRect(decoder, 1, 2, 0, 0, [0x00, 0x00, 0x00, 0x00], display, 24); 73 | 74 | let targetData = new Uint8Array([ 75 | 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255, 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 76 | 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255, 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 77 | 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255, 78 | 0x00, 0xff, 0x00, 255, 0x00, 0xff, 0x00, 255, 0x00, 0x00, 0xff, 255, 0x00, 0x00, 0xff, 255 79 | ]); 80 | 81 | expect(display).to.have.displayed(targetData); 82 | }); 83 | }); 84 | -------------------------------------------------------------------------------- /noVNC/tests/test.deflator.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const expect = chai.expect; 3 | 4 | import { inflateInit, inflate } from "../vendor/pako/lib/zlib/inflate.js"; 5 | import ZStream from "../vendor/pako/lib/zlib/zstream.js"; 6 | import Deflator from "../core/deflator.js"; 7 | 8 | function _inflator(compText, expected) { 9 | let strm = new ZStream(); 10 | let chunkSize = 1024 * 10 * 10; 11 | strm.output = new Uint8Array(chunkSize); 12 | 13 | inflateInit(strm, 5); 14 | 15 | if (expected > chunkSize) { 16 | chunkSize = expected; 17 | strm.output = new Uint8Array(chunkSize); 18 | } 19 | 20 | /* eslint-disable camelcase */ 21 | strm.input = compText; 22 | strm.avail_in = strm.input.length; 23 | strm.next_in = 0; 24 | 25 | strm.next_out = 0; 26 | strm.avail_out = expected.length; 27 | /* eslint-enable camelcase */ 28 | 29 | let ret = inflate(strm, 0); 30 | 31 | // Check that return code is not an error 32 | expect(ret).to.be.greaterThan(-1); 33 | 34 | return new Uint8Array(strm.output.buffer, 0, strm.next_out); 35 | } 36 | 37 | describe('Deflate data', function () { 38 | 39 | it('should be able to deflate messages', function () { 40 | let deflator = new Deflator(); 41 | 42 | let text = "123asdf"; 43 | let preText = new Uint8Array(text.length); 44 | for (let i = 0; i < preText.length; i++) { 45 | preText[i] = text.charCodeAt(i); 46 | } 47 | 48 | let compText = deflator.deflate(preText); 49 | 50 | let inflatedText = _inflator(compText, text.length); 51 | expect(inflatedText).to.array.equal(preText); 52 | 53 | }); 54 | 55 | it('should be able to deflate large messages', function () { 56 | let deflator = new Deflator(); 57 | 58 | /* Generate a big string with random characters. Used because 59 | repetition of letters might be deflated more effectively than 60 | random ones. */ 61 | let text = ""; 62 | let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 63 | for (let i = 0; i < 300000; i++) { 64 | text += characters.charAt(Math.floor(Math.random() * characters.length)); 65 | } 66 | 67 | let preText = new Uint8Array(text.length); 68 | for (let i = 0; i < preText.length; i++) { 69 | preText[i] = text.charCodeAt(i); 70 | } 71 | 72 | let compText = deflator.deflate(preText); 73 | 74 | //Check that the compressed size is expected size 75 | expect(compText.length).to.be.greaterThan((1024 * 10 * 10) * 2); 76 | 77 | let inflatedText = _inflator(compText, text.length); 78 | 79 | expect(inflatedText).to.array.equal(preText); 80 | 81 | }); 82 | }); 83 | -------------------------------------------------------------------------------- /noVNC/tests/test.int.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const expect = chai.expect; 3 | 4 | import { toUnsigned32bit, toSigned32bit } from '../core/util/int.js'; 5 | 6 | describe('Integer casting', function () { 7 | it('should cast unsigned to signed', function () { 8 | let expected = 4294967286; 9 | expect(toUnsigned32bit(-10)).to.equal(expected); 10 | }); 11 | 12 | it('should cast signed to unsigned', function () { 13 | let expected = -10; 14 | expect(toSigned32bit(4294967286)).to.equal(expected); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /noVNC/tests/test.localization.js: -------------------------------------------------------------------------------- 1 | const expect = chai.expect; 2 | import { l10n } from '../app/localization.js'; 3 | 4 | describe('Localization', function () { 5 | "use strict"; 6 | 7 | describe('language selection', function () { 8 | let origNavigator; 9 | beforeEach(function () { 10 | // window.navigator is a protected read-only property in many 11 | // environments, so we need to redefine it whilst running these 12 | // tests. 13 | origNavigator = Object.getOwnPropertyDescriptor(window, "navigator"); 14 | 15 | Object.defineProperty(window, "navigator", {value: {}}); 16 | if (window.navigator.languages !== undefined) { 17 | // Object.defineProperty() doesn't work properly in old 18 | // versions of Chrome 19 | this.skip(); 20 | } 21 | 22 | window.navigator.languages = []; 23 | }); 24 | afterEach(function () { 25 | if (origNavigator !== undefined) { 26 | Object.defineProperty(window, "navigator", origNavigator); 27 | } 28 | }); 29 | 30 | it('should use English by default', function () { 31 | expect(l10n.language).to.equal('en'); 32 | }); 33 | it('should use English if no user language matches', function () { 34 | window.navigator.languages = ["nl", "de"]; 35 | l10n.setup(["es", "fr"]); 36 | expect(l10n.language).to.equal('en'); 37 | }); 38 | it('should use the most preferred user language', function () { 39 | window.navigator.languages = ["nl", "de", "fr"]; 40 | l10n.setup(["es", "fr", "de"]); 41 | expect(l10n.language).to.equal('de'); 42 | }); 43 | it('should prefer sub-languages languages', function () { 44 | window.navigator.languages = ["pt-BR"]; 45 | l10n.setup(["pt", "pt-BR"]); 46 | expect(l10n.language).to.equal('pt-BR'); 47 | }); 48 | it('should fall back to language "parents"', function () { 49 | window.navigator.languages = ["pt-BR"]; 50 | l10n.setup(["fr", "pt", "de"]); 51 | expect(l10n.language).to.equal('pt'); 52 | }); 53 | it('should not use specific language when user asks for a generic language', function () { 54 | window.navigator.languages = ["pt", "de"]; 55 | l10n.setup(["fr", "pt-BR", "de"]); 56 | expect(l10n.language).to.equal('de'); 57 | }); 58 | it('should handle underscore as a separator', function () { 59 | window.navigator.languages = ["pt-BR"]; 60 | l10n.setup(["pt_BR"]); 61 | expect(l10n.language).to.equal('pt_BR'); 62 | }); 63 | it('should handle difference in case', function () { 64 | window.navigator.languages = ["pt-br"]; 65 | l10n.setup(["pt-BR"]); 66 | expect(l10n.language).to.equal('pt-BR'); 67 | }); 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /noVNC/tests/test.util.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const expect = chai.expect; 3 | 4 | import * as Log from '../core/util/logging.js'; 5 | import { encodeUTF8, decodeUTF8 } from '../core/util/strings.js'; 6 | 7 | describe('Utils', function () { 8 | "use strict"; 9 | 10 | describe('logging functions', function () { 11 | beforeEach(function () { 12 | sinon.spy(console, 'log'); 13 | sinon.spy(console, 'debug'); 14 | sinon.spy(console, 'warn'); 15 | sinon.spy(console, 'error'); 16 | sinon.spy(console, 'info'); 17 | }); 18 | 19 | afterEach(function () { 20 | console.log.restore(); 21 | console.debug.restore(); 22 | console.warn.restore(); 23 | console.error.restore(); 24 | console.info.restore(); 25 | Log.initLogging(); 26 | }); 27 | 28 | it('should use noop for levels lower than the min level', function () { 29 | Log.initLogging('warn'); 30 | Log.Debug('hi'); 31 | Log.Info('hello'); 32 | expect(console.log).to.not.have.been.called; 33 | }); 34 | 35 | it('should use console.debug for Debug', function () { 36 | Log.initLogging('debug'); 37 | Log.Debug('dbg'); 38 | expect(console.debug).to.have.been.calledWith('dbg'); 39 | }); 40 | 41 | it('should use console.info for Info', function () { 42 | Log.initLogging('debug'); 43 | Log.Info('inf'); 44 | expect(console.info).to.have.been.calledWith('inf'); 45 | }); 46 | 47 | it('should use console.warn for Warn', function () { 48 | Log.initLogging('warn'); 49 | Log.Warn('wrn'); 50 | expect(console.warn).to.have.been.called; 51 | expect(console.warn).to.have.been.calledWith('wrn'); 52 | }); 53 | 54 | it('should use console.error for Error', function () { 55 | Log.initLogging('error'); 56 | Log.Error('err'); 57 | expect(console.error).to.have.been.called; 58 | expect(console.error).to.have.been.calledWith('err'); 59 | }); 60 | }); 61 | 62 | describe('string functions', function () { 63 | it('should decode UTF-8 to DOMString correctly', function () { 64 | const utf8string = '\xd0\x9f'; 65 | const domstring = decodeUTF8(utf8string); 66 | expect(domstring).to.equal("П"); 67 | }); 68 | 69 | it('should encode DOMString to UTF-8 correctly', function () { 70 | const domstring = "åäöa"; 71 | const utf8string = encodeUTF8(domstring); 72 | expect(utf8string).to.equal('\xc3\xa5\xc3\xa4\xc3\xb6\x61'); 73 | }); 74 | 75 | it('should allow Latin-1 strings if allowLatin1 is set when decoding', function () { 76 | const latin1string = '\xe5\xe4\xf6'; 77 | expect(() => decodeUTF8(latin1string)).to.throw(Error); 78 | expect(decodeUTF8(latin1string, true)).to.equal('åäö'); 79 | }); 80 | }); 81 | 82 | // TODO(directxman12): test the conf_default and conf_defaults methods 83 | // TODO(directxman12): test the event methods (addEvent, removeEvent, stopEvent) 84 | // TODO(directxman12): figure out a good way to test getPosition and getEventPosition 85 | // TODO(directxman12): figure out how to test the browser detection functions properly 86 | // (we can't really test them against the browsers, except for Gecko 87 | // via PhantomJS, the default test driver) 88 | }); 89 | /* eslint-enable no-console */ 90 | -------------------------------------------------------------------------------- /noVNC/tests/vnc_playback.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | VNC Playback 5 | 6 | 7 | 8 | 9 | Iterations:   10 | Perftest:  11 | Realtime:   12 | 13 |   14 | 15 |

16 | 17 | Results:
18 | 19 | 20 |

21 | 22 |
23 |
Loading
24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /noVNC/utils/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true 4 | }, 5 | "rules": { 6 | "no-console": 0 7 | } 8 | } -------------------------------------------------------------------------------- /noVNC/utils/README.md: -------------------------------------------------------------------------------- 1 | ## WebSockets Proxy/Bridge 2 | 3 | Websockify has been forked out into its own project. `novnc_proxy` will 4 | automatically download it here if it is not already present and not 5 | installed as system-wide. 6 | 7 | For more detailed description and usage information please refer to 8 | the [websockify README](https://github.com/novnc/websockify/blob/master/README.md). 9 | 10 | The other versions of websockify (C, Node.js) and the associated test 11 | programs have been moved to 12 | [websockify](https://github.com/novnc/websockify). Websockify was 13 | formerly named wsproxy. 14 | 15 | -------------------------------------------------------------------------------- /noVNC/utils/b64-to-binary.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | use MIME::Base64; 3 | 4 | for (<>) { 5 | unless (/^'([{}])(\d+)\1(.+?)',$/) { 6 | print; 7 | next; 8 | } 9 | 10 | my ($dir, $amt, $b64) = ($1, $2, $3); 11 | 12 | my $decoded = MIME::Base64::decode($b64) or die "Could not base64-decode line `$_`"; 13 | 14 | my $decoded_escaped = join "", map { "\\x$_" } unpack("(H2)*", $decoded); 15 | 16 | print "'${dir}${amt}${dir}${decoded_escaped}',\n"; 17 | } 18 | -------------------------------------------------------------------------------- /noVNC/utils/self.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5/VDEaUzfycQA 3 | /MPSjOnYFmE5t5A3uvcVC6mjpTqYcGrkKo/06UgDSS8prIksWRDlwJfRLM83+40O 4 | Z4AsyclyRn8asa+V2SgsOcQ3llFKYFFQVx3swhqg7OPhaM/SvKg/BudEutI2q40c 5 | XVlpyvT4RVsellZ/BzXefbAOuUGndljUEj2in92uAWzgMvnKkfEcb0mQ0WFM3SeI 6 | 4EUYlGdp3MawIHsW6WaZgoO2avuh1mCQ32wlrkKnPkbiEj2gY+icwdxSPGPE9D09 7 | RSQZ8nEl9OBV9qlCIbwKoNly4Oz/6N61mOy6giv1XjdhqIXEQrm9WyN6UGhLXaeV 8 | nhNZMXf1AgMBAAECggEAQNurfLLT0f6EUWvTxerJ6Ub0pLH0otqaK0aj46NM6bfa 9 | LrMA/IEVUcAFqFy4gTSWBejBiHo90OHx8KH7OqMrkqQu0to/xtuxfKqwWEodEvi/ 10 | omqezt9pddDmLsbkIjMT4NbBc2BKyjHMxaVv9sqF3sYg3mvCwg17pZji+l90G7c7 11 | TPtOZIy1ScH2RDcUsuAxGJAJAqzzGeuHg0hxfaZ6nuzj/jcpKhV1B2cYQKQva9BJ 12 | rXlK8bnsWnNnwQ3hclVmguIGm1E9F6ABlja/e5fF9O103K2/Mc7+f7jmea45Owv9 13 | 0+e17Cam5dneI5d/ORK4tzXvCvz5TInQRFiSDUJ3SQKBgQDfNi6XkAVPlbwhRjkL 14 | DtDZO6dWwexZBCfVO3hlIu5qQ4t0haQXbJdU3l0ovCAkuqH4ZS8YT2VIcNy2p3a1 15 | uhKtN4dVDF8pYGMWXAhy1uXkezvhc+zjVY92qnTEvos18clf0Mv5Zkves89ebWgU 16 | ufilunW4NBE4WdVQXXAE5AJ90wKBgQDVT2eK6/fu03qufJc8m2TtZLM6+6JRiEf6 17 | eSMWti5JQnYecn+2QGRQuAfPQK2L9wCMqv6fH1Twky1oH01iICzLjlrLaHTNgRLl 18 | ngBueXl0tcvcg98HjDavCwCd3zqY3S5W0Ng4n4wYBU6633F+xFM+TyBnTHmFjRZM 19 | zNwZ/0ruFwKBgDSFrk7xj55bcGov+Oo2MUR8efK7LN8BUFInbTv3DTyp6h2f+K2e 20 | WrmYnTkhkzqxQ72MKZnBzOZP0E+WdiNqxkxF/a0wfQ/iY052l3JWSMALk1qIiZww 21 | nNJiZ5mH8H/gBe9q1SQ5Qu8DRm9EtTHzVKPCjUKr1cV5tez0H5C3CjMLAoGBAI/o 22 | cByDMdOIDT5mg8m5tI+L3ncuiMWkwZqz2v5ZjkSSeAn2iT61lnf2kB48rli9HTvJ 23 | qNpFUxKy2HFknNpUhqQVuB9+qz5xlAQhYn0lqtEYTR7KQM9gwwu4yoO3tFqo7bhY 24 | UWdyDBuwiPr+AB3b6aUh0OSf7WQyWRcbJmrLlwulAoGBANU+3cvMNbgzLezfOdZf 25 | Ow1O1KDToqp5nkf6sLhe+FIWH5diWcUQ6ADp6fjR672xoNHK8bmXOpbLc3YVir1A 26 | Dy33v5OSQ8Jo+yRjHN1yEgew3Ikbj0q+aKjhGdNTdrqPkPK4FK0qFw/ZACFLOeoc 27 | GNxDFFbwPxXs08KBSMBbuuYV 28 | -----END PRIVATE KEY----- 29 | -----BEGIN CERTIFICATE----- 30 | MIIDazCCAlOgAwIBAgIUVdgFD1EKX3MBD7wQc7QXHMKTLkowDQYJKoZIhvcNAQEL 31 | BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM 32 | GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMjExMDUwNDM4MzJaFw0yMzEx 33 | MDUwNDM4MzJaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw 34 | HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB 35 | AQUAA4IBDwAwggEKAoIBAQC5/VDEaUzfycQA/MPSjOnYFmE5t5A3uvcVC6mjpTqY 36 | cGrkKo/06UgDSS8prIksWRDlwJfRLM83+40OZ4AsyclyRn8asa+V2SgsOcQ3llFK 37 | YFFQVx3swhqg7OPhaM/SvKg/BudEutI2q40cXVlpyvT4RVsellZ/BzXefbAOuUGn 38 | dljUEj2in92uAWzgMvnKkfEcb0mQ0WFM3SeI4EUYlGdp3MawIHsW6WaZgoO2avuh 39 | 1mCQ32wlrkKnPkbiEj2gY+icwdxSPGPE9D09RSQZ8nEl9OBV9qlCIbwKoNly4Oz/ 40 | 6N61mOy6giv1XjdhqIXEQrm9WyN6UGhLXaeVnhNZMXf1AgMBAAGjUzBRMB0GA1Ud 41 | DgQWBBQCoEpp3uZl92m8Xq6mCvqZKDTnajAfBgNVHSMEGDAWgBQCoEpp3uZl92m8 42 | Xq6mCvqZKDTnajAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBy 43 | HxknnR4ENiN5qW7QYjARpuKCC/QL49o9VfO0NgrAqDLt2XlOmfO+HMctpiq9jeK4 44 | Dvc5zGWt5wX1QBQEDOcxhNH2TTeinnlEXDfp/LFjYpmlRnyF/BEAaofFM5T7vwMc 45 | lZXKveHOUsE3uXxHshuRvMqeLT8BzRkePXro/YPm/fG1WVkbibMmS1b0CgOaOqk0 46 | ajXAQWdj2sJ4UnFprLlzOI0aXEmE014/DkEx9Vg9gxQEZE/GF3i2VoKhypauSzDd 47 | NKm/0XTFdHIx4WxClo5vfSp1lr46aBKv32myoc7BSRPePiB14cl+nZ2q7Wq7gsFO 48 | feF2fOvoErTgzf7Hn6w4 49 | -----END CERTIFICATE----- 50 | -------------------------------------------------------------------------------- /noVNC/utils/u2x11: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Convert "U+..." commented entries in /usr/include/X11/keysymdef.h 4 | # into JavaScript for use by noVNC. Note this is likely to produce 5 | # a few duplicate properties with clashing values, that will need 6 | # resolving manually. 7 | # 8 | # Colin Dean 9 | # 10 | 11 | regex="^#define[ \t]+XK_[A-Za-z0-9_]+[ \t]+0x([0-9a-fA-F]+)[ \t]+\/\*[ \t]+U\+([0-9a-fA-F]+)[ \t]+[^*]+.[ \t]+\*\/[ \t]*$" 12 | echo "unicodeTable = {" 13 | while read line; do 14 | if echo "${line}" | egrep -qs "${regex}"; then 15 | 16 | x11=$(echo "${line}" | sed -r "s/${regex}/\1/") 17 | vnc=$(echo "${line}" | sed -r "s/${regex}/\2/") 18 | 19 | if echo "${vnc}" | egrep -qs "^00[2-9A-F][0-9A-F]$"; then 20 | : # skip ISO Latin-1 (U+0020 to U+00FF) as 1-to-1 mapping 21 | else 22 | # note 1-to-1 is possible (e.g. for Euro symbol, U+20AC) 23 | echo " 0x${vnc} : 0x${x11}," 24 | fi 25 | fi 26 | done < /usr/include/X11/keysymdef.h | uniq 27 | echo "};" 28 | 29 | -------------------------------------------------------------------------------- /noVNC/utils/validate: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | RET=0 6 | 7 | OUT=`mktemp` 8 | 9 | for fn in "$@"; do 10 | echo "Validating $fn..." 11 | echo 12 | 13 | case $fn in 14 | *.html) 15 | type="text/html" 16 | ;; 17 | *.css) 18 | type="text/css" 19 | ;; 20 | *) 21 | echo "Unknown format!" 22 | echo 23 | RET=1 24 | continue 25 | ;; 26 | esac 27 | 28 | curl --silent \ 29 | --header "Content-Type: ${type}; charset=utf-8" \ 30 | --data-binary @${fn} \ 31 | https://validator.w3.org/nu/?out=text > $OUT 32 | cat $OUT 33 | echo 34 | 35 | # We don't fail the check for warnings as some warnings are 36 | # not relevant for us, and we don't currently have a way to 37 | # ignore just those 38 | if grep -q -s -E "^Error:" $OUT; then 39 | RET=1 40 | fi 41 | done 42 | 43 | rm $OUT 44 | 45 | exit $RET 46 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include CHANGES.txt README.md COPYING 2 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/Makefile: -------------------------------------------------------------------------------- 1 | TARGETS=rebind.so 2 | CFLAGS += -fPIC 3 | 4 | all: $(TARGETS) 5 | 6 | rebind.so: rebind.o 7 | $(CC) $(LDFLAGS) $^ -shared -fPIC -ldl -o $@ 8 | 9 | clean: 10 | rm -f rebind.o rebind.so 11 | 12 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/Windows/Windows Service Readme.md: -------------------------------------------------------------------------------- 1 | Running Websockify as a Windows service 2 | ======================================= 3 | 4 | Installation and configuration 5 | ------------------------------ 6 | 7 | Download the following software: 8 | 9 | * Python, from https://www.python.org/downloads/windows/ 10 | * SrvAny, from http://simpleauto.byethost8.com/Zip/SrvAny.zip 11 | 12 | Note that there is [a modern alternative for SrvAny](https://github.com/rwmjones/rhsrvany), 13 | but that project does not provide binaries. 14 | 15 | Install Python for all users, not just the current one. Extract Websockify 16 | into a directory, e.g. `C:\Program Files\websockify`, so that e.g. 17 | `README.md` ends up there. Extract the `SrvAny.zip` archive, copy the 18 | `WIN7\SrvAny.exe` file into `C:\Program Files\websockify`. 19 | 20 | Then create a batch file, `C:\Program Files\websockify\run.bat`, that runs 21 | Websockify from its directory with the correct options under the correct 22 | Python interpreter: 23 | 24 | ``` 25 | C: 26 | cd "\Program Files\websockify" 27 | "C:\Program Files\Python39\python.exe" -m websockify 5901 127.0.0.1:5900 28 | ``` 29 | 30 | Run it by hand once so that Windows asks you about a firewall exception. 31 | After confirming the exception, press `Ctrl+C` to terminate the script. 32 | 33 | Then create a Windows service for Websockify (use an Administrator command 34 | prompt for that). For paths with spaces, like in this example, double-escaping 35 | is needed: once for `cmd.exe` and once for `SrvAny.exe`. 36 | 37 | ``` 38 | C: 39 | cd "\Program Files\websockify" 40 | SrvAny.exe -install Websockify 10s \\\"C:\Program Files\websockify\run.bat\\\" 41 | ``` 42 | 43 | In the Windows Control Panel, under Services, a new "Websockify" service will 44 | appear. In its properties dialog, you can change the startup type, e.g. make 45 | it start automatically at boot. Or, you can start the service manually. 46 | 47 | Uninstallation 48 | -------------- 49 | 50 | If you want to remove the service, first set its startup type to Manual, then 51 | reboot the PC. Then run this command using the Administrator command prompt: 52 | 53 | ``` 54 | C: 55 | cd "\Program Files\websockify" 56 | SrvAny.exe -remove Websockify 57 | ``` 58 | 59 | After that, you will be able to remove the `C:\Program Files\websockify` 60 | directory completely. 61 | 62 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.6 2 | 3 | ENV VERSION 0.10.0 4 | 5 | RUN mkdir -p /opt/websockify \ 6 | && curl -SL https://github.com/novnc/websockify/archive/refs/tags/v$VERSION.tar.gz \ 7 | | tar xzC /opt/websockify 8 | 9 | RUN python -m pip install 'numpy<1.17' redis simplejson jwcrypto requests 10 | 11 | VOLUME /data 12 | 13 | EXPOSE 80 14 | EXPOSE 443 15 | 16 | WORKDIR /opt/websockify 17 | 18 | COPY docker-entrypoint.sh / 19 | 20 | ENTRYPOINT ["/docker-entrypoint.sh"] 21 | CMD ["--help"] 22 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vim: tabstop=4 shiftwidth=4 softtabstop=4 3 | 4 | set -e 5 | 6 | /opt/websockify/websockify-$VERSION/run "$@" 7 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/docs/notes: -------------------------------------------------------------------------------- 1 | Building release tarball: 2 | - not really necessary since tagged revision can be downloaded 3 | from github as tarballs 4 | 5 | git archive --format=tar --prefix=websockify-${WVER}/ v${WVER} > websockify-${WVER}.tar 6 | gzip websockify-${WVER}.tar 7 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/docs/release.txt: -------------------------------------------------------------------------------- 1 | - Update setup.py and CHANGES.txt and commit 2 | - Create version tag and tarball from tag 3 | WVER=0.1.0 4 | git tag v${WVER} 5 | git push origin master 6 | git push origin v${WVER} 7 | - Create the source distribution 8 | python3 setup.py sdist 9 | - Upload the source distribution 10 | python3 -m twine upload dist/websockify-${WVER}.tar.gz 11 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/rebind: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | usage() { 4 | echo "Usage: $(basename $0) OLD_PORT NEW_PORT COMMAND_LINE" 5 | echo 6 | echo "Launch COMMAND_LINE, but intercept system calls to bind" 7 | echo "to OLD_PORT and instead bind them to localhost:NEW_PORT" 8 | exit 2 9 | } 10 | 11 | # Parameter defaults 12 | mydir=$(readlink -f $(dirname ${0})) 13 | 14 | export REBIND_PORT_OLD="${1}"; shift 15 | export REBIND_PORT_NEW="${1}"; shift 16 | 17 | LD_PRELOAD=${mydir}/rebind.so "${@}" 18 | 19 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/rebind.c: -------------------------------------------------------------------------------- 1 | /* 2 | * rebind: Intercept bind calls and bind to a different port 3 | * Copyright 2010 Joel Martin 4 | * Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 5 | * 6 | * Overload (LD_PRELOAD) bind system call. If REBIND_PORT_OLD and 7 | * REBIND_PORT_NEW environment variables are set then bind on the new 8 | * port (of localhost) instead of the old port. 9 | * 10 | * This allows a bridge/proxy (such as websockify) to run on the old port and 11 | * translate traffic to/from the new port. 12 | * 13 | * Usage: 14 | * LD_PRELOAD=./rebind.so \ 15 | * REBIND_PORT_OLD=23 \ 16 | * REBIND_PORT_NEW=2023 \ 17 | * program 18 | */ 19 | 20 | //#define DO_DEBUG 1 21 | 22 | #include 23 | #include 24 | 25 | #define __USE_GNU 1 // Pull in RTLD_NEXT 26 | #include 27 | 28 | #include 29 | #include 30 | 31 | 32 | #if defined(DO_DEBUG) 33 | #define DEBUG(...) \ 34 | fprintf(stderr, "rebind: "); \ 35 | fprintf(stderr, __VA_ARGS__); 36 | #else 37 | #define DEBUG(...) 38 | #endif 39 | 40 | 41 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 42 | { 43 | static void * (*func)(); 44 | int do_move = 0; 45 | struct sockaddr_in * addr_in = (struct sockaddr_in *)addr; 46 | struct sockaddr_in addr_tmp; 47 | socklen_t addrlen_tmp; 48 | char * PORT_OLD, * PORT_NEW, * end1, * end2; 49 | int ret, oldport, newport, askport = htons(addr_in->sin_port); 50 | uint32_t askaddr = htons(addr_in->sin_addr.s_addr); 51 | if (!func) func = (void *(*)()) dlsym(RTLD_NEXT, "bind"); 52 | 53 | DEBUG(">> bind(%d, _, %d), askaddr %d, askport %d\n", 54 | sockfd, addrlen, askaddr, askport); 55 | 56 | /* Determine if we should move this socket */ 57 | if (addr_in->sin_family == AF_INET) { 58 | // TODO: support IPv6 59 | PORT_OLD = getenv("REBIND_OLD_PORT"); 60 | PORT_NEW = getenv("REBIND_NEW_PORT"); 61 | if (PORT_OLD && (*PORT_OLD != '\0') && 62 | PORT_NEW && (*PORT_NEW != '\0')) { 63 | oldport = strtol(PORT_OLD, &end1, 10); 64 | newport = strtol(PORT_NEW, &end2, 10); 65 | if (oldport && (*end1 == '\0') && 66 | newport && (*end2 == '\0') && 67 | (oldport == askport)) { 68 | do_move = 1; 69 | } 70 | } 71 | } 72 | 73 | if (! do_move) { 74 | /* Just pass everything right through to the real bind */ 75 | ret = (long) func(sockfd, addr, addrlen); 76 | DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret); 77 | return ret; 78 | } 79 | 80 | DEBUG("binding fd %d on localhost:%d instead of 0x%x:%d\n", 81 | sockfd, newport, ntohl(addr_in->sin_addr.s_addr), oldport); 82 | 83 | /* Use a temporary location for the new address information */ 84 | addrlen_tmp = sizeof(addr_tmp); 85 | memcpy(&addr_tmp, addr, addrlen_tmp); 86 | 87 | /* Bind to other port on the loopback instead */ 88 | addr_tmp.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 89 | addr_tmp.sin_port = htons(newport); 90 | ret = (long) func(sockfd, &addr_tmp, addrlen_tmp); 91 | 92 | DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret); 93 | return ret; 94 | } 95 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | set -e 3 | cd "$(dirname "$0")" 4 | exec python3 -m websockify "$@" 5 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | version = '0.10.0' 4 | name = 'websockify' 5 | long_description = open("README.md").read() + "\n" + \ 6 | open("CHANGES.txt").read() + "\n" 7 | 8 | setup(name=name, 9 | version=version, 10 | description="Websockify.", 11 | long_description=long_description, 12 | long_description_content_type="text/markdown", 13 | classifiers=[ 14 | "Programming Language :: Python", 15 | "Programming Language :: Python :: 3", 16 | "Programming Language :: Python :: 3 :: Only", 17 | "Programming Language :: Python :: 3.4", 18 | "Programming Language :: Python :: 3.5", 19 | "Programming Language :: Python :: 3.6", 20 | "Programming Language :: Python :: 3.7", 21 | "Programming Language :: Python :: 3.8", 22 | "Programming Language :: Python :: 3.9", 23 | ], 24 | keywords='noVNC websockify', 25 | license='LGPLv3', 26 | url="https://github.com/novnc/websockify", 27 | author="Joel Martin", 28 | author_email="github@martintribe.org", 29 | 30 | packages=['websockify'], 31 | include_package_data=True, 32 | install_requires=['numpy'], 33 | zip_safe=False, 34 | entry_points={ 35 | 'console_scripts': [ 36 | 'websockify = websockify.websocketproxy:websockify_init', 37 | ] 38 | }, 39 | ) 40 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/test-requirements.txt: -------------------------------------------------------------------------------- 1 | mock 2 | nose 3 | jwcrypto 4 | six 5 | redis 6 | simplejson 7 | wrapt<=1.12.1;python_version<="3.4" 8 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/echo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | A WebSocket server that echos back whatever it receives from the client. 5 | Copyright 2010 Joel Martin 6 | Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 7 | 8 | You can make a cert/key with openssl using: 9 | openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem 10 | as taken from http://docs.python.org/dev/library/ssl.html#certificates 11 | ''' 12 | 13 | import os, sys, select, optparse, logging 14 | sys.path.insert(0,os.path.join(os.path.dirname(__file__), "..")) 15 | from websockify.websockifyserver import WebSockifyServer, WebSockifyRequestHandler 16 | 17 | class WebSocketEcho(WebSockifyRequestHandler): 18 | """ 19 | WebSockets server that echos back whatever is received from the 20 | client. """ 21 | buffer_size = 8096 22 | 23 | def new_websocket_client(self): 24 | """ 25 | Echo back whatever is received. 26 | """ 27 | 28 | cqueue = [] 29 | c_pend = 0 30 | cpartial = "" 31 | rlist = [self.request] 32 | 33 | while True: 34 | wlist = [] 35 | 36 | if cqueue or c_pend: wlist.append(self.request) 37 | ins, outs, excepts = select.select(rlist, wlist, [], 1) 38 | if excepts: raise Exception("Socket exception") 39 | 40 | if self.request in outs: 41 | # Send queued target data to the client 42 | c_pend = self.send_frames(cqueue) 43 | cqueue = [] 44 | 45 | if self.request in ins: 46 | # Receive client data, decode it, and send it back 47 | frames, closed = self.recv_frames() 48 | cqueue.extend(frames) 49 | 50 | if closed: 51 | break 52 | 53 | if __name__ == '__main__': 54 | parser = optparse.OptionParser(usage="%prog [options] listen_port") 55 | parser.add_option("--verbose", "-v", action="store_true", 56 | help="verbose messages and per frame traffic") 57 | parser.add_option("--cert", default="self.pem", 58 | help="SSL certificate file") 59 | parser.add_option("--key", default=None, 60 | help="SSL key file (if separate from cert)") 61 | parser.add_option("--ssl-only", action="store_true", 62 | help="disallow non-encrypted connections") 63 | (opts, args) = parser.parse_args() 64 | 65 | try: 66 | if len(args) != 1: raise ValueError 67 | opts.listen_port = int(args[0]) 68 | except ValueError: 69 | parser.error("Invalid arguments") 70 | 71 | logging.basicConfig(level=logging.INFO) 72 | 73 | opts.web = "." 74 | server = WebSockifyServer(WebSocketEcho, **opts.__dict__) 75 | server.start_server() 76 | 77 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/echo_client.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os 4 | import sys 5 | import optparse 6 | import select 7 | 8 | sys.path.insert(0,os.path.join(os.path.dirname(__file__), "..")) 9 | from websockify.websocket import WebSocket, \ 10 | WebSocketWantReadError, WebSocketWantWriteError 11 | 12 | parser = optparse.OptionParser(usage="%prog URL") 13 | (opts, args) = parser.parse_args() 14 | 15 | if len(args) == 1: 16 | URL = args[0] 17 | else: 18 | parser.error("Invalid arguments") 19 | 20 | sock = WebSocket() 21 | print("Connecting to %s..." % URL) 22 | sock.connect(URL) 23 | print("Connected.") 24 | 25 | def send(msg): 26 | while True: 27 | try: 28 | sock.sendmsg(msg) 29 | break 30 | except WebSocketWantReadError: 31 | msg = '' 32 | ins, outs, excepts = select.select([sock], [], []) 33 | if excepts: raise Exception("Socket exception") 34 | except WebSocketWantWriteError: 35 | msg = '' 36 | ins, outs, excepts = select.select([], [sock], []) 37 | if excepts: raise Exception("Socket exception") 38 | 39 | def read(): 40 | while True: 41 | try: 42 | return sock.recvmsg() 43 | except WebSocketWantReadError: 44 | ins, outs, excepts = select.select([sock], [], []) 45 | if excepts: raise Exception("Socket exception") 46 | except WebSocketWantWriteError: 47 | ins, outs, excepts = select.select([], [sock], []) 48 | if excepts: raise Exception("Socket exception") 49 | 50 | counter = 1 51 | while True: 52 | msg = "Message #%d" % counter 53 | counter += 1 54 | send(msg) 55 | print("Sent message: %r" % msg) 56 | 57 | while True: 58 | ins, outs, excepts = select.select([sock], [], [], 1.0) 59 | if excepts: raise Exception("Socket exception") 60 | 61 | if ins == []: 62 | break 63 | 64 | while True: 65 | msg = read() 66 | print("Received message: %r" % msg) 67 | 68 | if not sock.pending(): 69 | break 70 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/fixtures/private.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEArwNQal2INbSfoVT50dZ0s8lQ+yMhu45TDc91iuwtDjlFBJ50 3 | E4m3/M6ESBW0S7UTP1bIOGkd/M+u38h0Aruo4qkngdguu9N3BnsU2kOeicdjxc+v 4 | tqRc7/kbkTdT4SrpG8EFP6T2U9U1gtBpLnau02gPrzjaQzyYDLGOBq+Ozt/mN0YJ 5 | UhJ3hlwi18dNKreTzWgJ6mmXQWS0eAmHx8TIs2Nz9x3EfRo9CIMuaaeUjRogIEg5 6 | Tg4xC00ZtDO0/EfgpFkeHJGVQA2DgdBJsr6rq69MjhMfFxRJItxJMJzP6an2HkJ8 7 | onUPBtjEBmk3/fnfiaflzRyEb5zdii6r2TD8TwIDAQABAoIBAGDrzu742WQUoYqx 8 | CqDAyWR/is9px1adHTW6vHexD8qewLAsKFBhpnjkzbE2A+EhaIVdRAipfifxxAC+ 9 | fDC/SGouD2kDFe6Cz5nRM90kMXpP59s2hzL4l1d2d2PWZid+ohXysTtr2dbXbokB 10 | bh6DL5J4QKdjLsypk/MDqYneU5IQ1k9ezWzcRgM8/V3M+t+1dLRFLIWsSLbNUgbF 11 | px81efNw8E0voV/d7kZ+6RwUThPHqR0eyLm6djPwHE7/FarZIx4AImwV+9ex44CH 12 | OkrTFOVYenF6jEtYoUuqYCouaWtG7jNVM/f1fksoR8SD6PTq2vn7F4wTLXG1b+K7 13 | 45PKMhECgYEA22NH8mK9ICFVd7S6caeAnki+K9cpwmiOUWEIuDInmPn5FOlv7awE 14 | uBFN86v14PqDBtF7Aagyib0NUPo7rIw5+V5SCBZv8gQatjZUkT0vZvpxPU5jmB++ 15 | w58yfK7zgdAWCepLxIPyTA7CAT1dmiVmuosz2pJjbo4fecVG222IE10CgYEAzDg+ 16 | RVlvMYGy04UMmUoUNeeRlW6km/W6dqQ7EtcxfDv4O7boRDTBSRBzfIsRdXHZhcHN 17 | gCeB2Uiz8IO3s0Yt0+y/6cTI60uJ4S7Mb2JvWJvDCKWhS3pE1BL+LJJC4Hn7khJH 18 | yHYFOLOfnuCbOs8VA7IMmbdTPHirIKWTT5j5H5sCgYEAygK/KweUUlOfWVyHGUQ9 19 | gIJG6iNzhlm0QmbxGnrET25N1t2kfNsadUsp1igPfhvuLocRltMDxiTYcCoabKWq 20 | dF5PdrcCWX1CA2o/sIUAcvhE8UiPGHKSu5qJaJnIC05KHNMq9UbyAurL5UxWNiwe 21 | TcMD+k01VYV0ojHvLvnKhNkCgYArkoh+xXE7D+A2zzl771lWkvz19DB88jYBoFLW 22 | V0HArw7str7h5pui2ja5yPZFp6/woQQWptdGpAN4erIUNxIKGIZt+0WfJnPZruGB 23 | lnAJaNp5GtXKQ+ExmofOvLo2KPCrHulf9QZyLakN/gBA0PQ74J5docbJrTld8tX2 24 | cr4cpwKBgHqr2zybmywAmjn8wY0bUjRAyhdN8eiwYaGPtOSFt6IcWxEnNbAo5Jc2 25 | KsywpagjFsXZsi4Obn2XsqR7VX5bNbpNXIyLaMwBOy7MixyecgPF8tu7I4zo/CWm 26 | 7gewTKBhwVPTDAOzHqIpJGrOnUgzJM3ijkCWMn3eAh4ccOjsrKq9 27 | -----END RSA PRIVATE KEY----- -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/fixtures/public.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwNQal2INbSfoVT50dZ0 3 | s8lQ+yMhu45TDc91iuwtDjlFBJ50E4m3/M6ESBW0S7UTP1bIOGkd/M+u38h0Aruo 4 | 4qkngdguu9N3BnsU2kOeicdjxc+vtqRc7/kbkTdT4SrpG8EFP6T2U9U1gtBpLnau 5 | 02gPrzjaQzyYDLGOBq+Ozt/mN0YJUhJ3hlwi18dNKreTzWgJ6mmXQWS0eAmHx8TI 6 | s2Nz9x3EfRo9CIMuaaeUjRogIEg5Tg4xC00ZtDO0/EfgpFkeHJGVQA2DgdBJsr6r 7 | q69MjhMfFxRJItxJMJzP6an2HkJ8onUPBtjEBmk3/fnfiaflzRyEb5zdii6r2TD8 8 | TwIDAQAB 9 | -----END PUBLIC KEY----- 10 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/fixtures/symmetric.key: -------------------------------------------------------------------------------- 1 | secret_sauce -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/latency.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | A WebSocket server that echos back whatever it receives from the client. 5 | Copyright 2010 Joel Martin 6 | Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 7 | 8 | You can make a cert/key with openssl using: 9 | openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem 10 | as taken from http://docs.python.org/dev/library/ssl.html#certificates 11 | ''' 12 | 13 | import os, sys, select, optparse, logging 14 | sys.path.insert(0,os.path.join(os.path.dirname(__file__), "..")) 15 | from websockify.websockifyserver import WebSockifyServer, WebSockifyRequestHandler 16 | 17 | class WebSocketEcho(WebSockifyRequestHandler): 18 | """ 19 | WebSockets server that echos back whatever is received from the 20 | client. """ 21 | buffer_size = 8096 22 | 23 | def new_websocket_client(self): 24 | """ 25 | Echo back whatever is received. 26 | """ 27 | 28 | cqueue = [] 29 | c_pend = 0 30 | cpartial = "" 31 | rlist = [self.request] 32 | 33 | while True: 34 | wlist = [] 35 | 36 | if cqueue or c_pend: wlist.append(self.request) 37 | ins, outs, excepts = select.select(rlist, wlist, [], 1) 38 | if excepts: raise Exception("Socket exception") 39 | 40 | if self.request in outs: 41 | # Send queued target data to the client 42 | c_pend = self.send_frames(cqueue) 43 | cqueue = [] 44 | 45 | if self.request in ins: 46 | # Receive client data, decode it, and send it back 47 | frames, closed = self.recv_frames() 48 | cqueue.extend(frames) 49 | 50 | if closed: 51 | break 52 | 53 | if __name__ == '__main__': 54 | parser = optparse.OptionParser(usage="%prog [options] listen_port") 55 | parser.add_option("--verbose", "-v", action="store_true", 56 | help="verbose messages and per frame traffic") 57 | parser.add_option("--cert", default="self.pem", 58 | help="SSL certificate file") 59 | parser.add_option("--key", default=None, 60 | help="SSL key file (if separate from cert)") 61 | parser.add_option("--ssl-only", action="store_true", 62 | help="disallow non-encrypted connections") 63 | (opts, args) = parser.parse_args() 64 | 65 | try: 66 | if len(args) != 1: raise ValueError 67 | opts.listen_port = int(args[0]) 68 | except ValueError: 69 | parser.error("Invalid arguments") 70 | 71 | logging.basicConfig(level=logging.INFO) 72 | 73 | opts.web = "." 74 | server = WebSockifyServer(WebSocketEcho, **opts.__dict__) 75 | server.start_server() 76 | 77 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/simple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Websock Simple Client 5 | 6 | 7 | 8 | WebSocket/websockify URI:   9 | 11 |

12 |   13 |   15 |

16 | Log:
17 | 18 | 19 | 20 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tests/test_auth_plugins.py: -------------------------------------------------------------------------------- 1 | # vim: tabstop=4 shiftwidth=4 softtabstop=4 2 | 3 | """ Unit tests for Authentication plugins""" 4 | 5 | from websockify.auth_plugins import BasicHTTPAuth, AuthenticationError 6 | import unittest 7 | 8 | 9 | class BasicHTTPAuthTestCase(unittest.TestCase): 10 | 11 | def setUp(self): 12 | self.plugin = BasicHTTPAuth('Aladdin:open sesame') 13 | 14 | def test_no_auth(self): 15 | headers = {} 16 | self.assertRaises(AuthenticationError, self.plugin.authenticate, headers, 'localhost', '1234') 17 | 18 | def test_invalid_password(self): 19 | headers = {'Authorization': 'Basic QWxhZGRpbjpzZXNhbWUgc3RyZWV0'} 20 | self.assertRaises(AuthenticationError, self.plugin.authenticate, headers, 'localhost', '1234') 21 | 22 | def test_valid_password(self): 23 | headers = {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='} 24 | self.plugin.authenticate(headers, 'localhost', '1234') 25 | 26 | def test_garbage_auth(self): 27 | headers = {'Authorization': 'Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx'} 28 | self.assertRaises(AuthenticationError, self.plugin.authenticate, headers, 'localhost', '1234') 29 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/tox.ini: -------------------------------------------------------------------------------- 1 | # Tox (http://tox.testrun.org/) is a tool for running tests 2 | # in multiple virtualenvs. This configuration file will run the 3 | # test suite on all supported python versions. To use it, "pip install tox" 4 | # and then run "tox" from this directory. 5 | 6 | [tox] 7 | envlist = py34 8 | 9 | [testenv] 10 | commands = nosetests {posargs} 11 | deps = -r{toxinidir}/test-requirements.txt 12 | 13 | # At some point we should enable this since tox expects it to exist but 14 | # the code will need pep8ising first. 15 | #[testenv:pep8] 16 | #commands = flake8 17 | #dep = flake8 18 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | set -e 3 | cd "$(dirname "$0")" 4 | exec python3 -m websockify "$@" 5 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__init__.py: -------------------------------------------------------------------------------- 1 | from websockify.websocket import * 2 | from websockify.websocketproxy import * 3 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__main__.py: -------------------------------------------------------------------------------- 1 | import websockify 2 | 3 | if __name__ == '__main__': 4 | websockify.websocketproxy.websockify_init() 5 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/__main__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/__main__.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/auth_plugins.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/auth_plugins.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/websocket.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/websocket.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/websocketproxy.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/websocketproxy.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/websocketserver.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/websocketserver.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/__pycache__/websockifyserver.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/noVNC/utils/websockify/websockify/__pycache__/websockifyserver.cpython-39.pyc -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/auth_plugins.py: -------------------------------------------------------------------------------- 1 | class BasePlugin(): 2 | def __init__(self, src=None): 3 | self.source = src 4 | 5 | def authenticate(self, headers, target_host, target_port): 6 | pass 7 | 8 | 9 | class AuthenticationError(Exception): 10 | def __init__(self, log_msg=None, response_code=403, response_headers={}, response_msg=None): 11 | self.code = response_code 12 | self.headers = response_headers 13 | self.msg = response_msg 14 | 15 | if log_msg is None: 16 | log_msg = response_msg 17 | 18 | super().__init__('%s %s' % (self.code, log_msg)) 19 | 20 | 21 | class InvalidOriginError(AuthenticationError): 22 | def __init__(self, expected, actual): 23 | self.expected_origin = expected 24 | self.actual_origin = actual 25 | 26 | super().__init__( 27 | response_msg='Invalid Origin', 28 | log_msg="Invalid Origin Header: Expected one of " 29 | "%s, got '%s'" % (expected, actual)) 30 | 31 | 32 | class BasicHTTPAuth(): 33 | """Verifies Basic Auth headers. Specify src as username:password""" 34 | 35 | def __init__(self, src=None): 36 | self.src = src 37 | 38 | def authenticate(self, headers, target_host, target_port): 39 | import base64 40 | auth_header = headers.get('Authorization') 41 | if auth_header: 42 | if not auth_header.startswith('Basic '): 43 | self.auth_error() 44 | 45 | try: 46 | user_pass_raw = base64.b64decode(auth_header[6:]) 47 | except TypeError: 48 | self.auth_error() 49 | 50 | try: 51 | # http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication 52 | user_pass_as_text = user_pass_raw.decode('ISO-8859-1') 53 | except UnicodeDecodeError: 54 | self.auth_error() 55 | 56 | user_pass = user_pass_as_text.split(':', 1) 57 | if len(user_pass) != 2: 58 | self.auth_error() 59 | 60 | if not self.validate_creds(*user_pass): 61 | self.demand_auth() 62 | 63 | else: 64 | self.demand_auth() 65 | 66 | def validate_creds(self, username, password): 67 | if '%s:%s' % (username, password) == self.src: 68 | return True 69 | else: 70 | return False 71 | 72 | def auth_error(self): 73 | raise AuthenticationError(response_code=403) 74 | 75 | def demand_auth(self): 76 | raise AuthenticationError(response_code=401, 77 | response_headers={'WWW-Authenticate': 'Basic realm="Websockify"'}) 78 | 79 | class ExpectOrigin(): 80 | def __init__(self, src=None): 81 | if src is None: 82 | self.source = [] 83 | else: 84 | self.source = src.split() 85 | 86 | def authenticate(self, headers, target_host, target_port): 87 | origin = headers.get('Origin', None) 88 | if origin is None or origin not in self.source: 89 | raise InvalidOriginError(expected=self.source, actual=origin) 90 | 91 | class ClientCertCNAuth(): 92 | """Verifies client by SSL certificate. Specify src as whitespace separated list of common names.""" 93 | 94 | def __init__(self, src=None): 95 | if src is None: 96 | self.source = [] 97 | else: 98 | self.source = src.split() 99 | 100 | def authenticate(self, headers, target_host, target_port): 101 | if headers.get('SSL_CLIENT_S_DN_CN', None) not in self.source: 102 | raise AuthenticationError(response_code=403) 103 | -------------------------------------------------------------------------------- /noVNC/utils/websockify/websockify/websocketserver.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | Python WebSocket server base 5 | Copyright 2011 Joel Martin 6 | Copyright 2016-2018 Pierre Ossman 7 | Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 8 | ''' 9 | 10 | import sys 11 | from http.server import BaseHTTPRequestHandler, HTTPServer 12 | 13 | from websockify.websocket import WebSocket, WebSocketWantReadError, WebSocketWantWriteError 14 | 15 | class WebSocketRequestHandlerMixIn: 16 | """WebSocket request handler mix-in class 17 | 18 | This class modifies and existing request handler to handle 19 | WebSocket requests. The request handler will continue to function 20 | as before, except that WebSocket requests are intercepted and the 21 | methods handle_upgrade() and handle_websocket() are called. The 22 | standard do_GET() will be called for normal requests. 23 | 24 | The class instance SocketClass can be overridden with the class to 25 | use for the WebSocket connection. 26 | """ 27 | 28 | SocketClass = WebSocket 29 | 30 | def handle_one_request(self): 31 | """Extended request handler 32 | 33 | This is where WebSocketRequestHandler redirects requests to the 34 | new methods. Any sub-classes must call this method in order for 35 | the calls to function. 36 | """ 37 | self._real_do_GET = self.do_GET 38 | self.do_GET = self._websocket_do_GET 39 | try: 40 | super().handle_one_request() 41 | finally: 42 | self.do_GET = self._real_do_GET 43 | 44 | def _websocket_do_GET(self): 45 | # Checks if it is a websocket request and redirects 46 | self.do_GET = self._real_do_GET 47 | 48 | if (self.headers.get('upgrade') and 49 | self.headers.get('upgrade').lower() == 'websocket'): 50 | self.handle_upgrade() 51 | else: 52 | self.do_GET() 53 | 54 | def handle_upgrade(self): 55 | """Initial handler for a WebSocket request 56 | 57 | This method is called when a WebSocket is requested. By default 58 | it will create a WebSocket object and perform the negotiation. 59 | The WebSocket object will then replace the request object and 60 | handle_websocket() will be called. 61 | """ 62 | websocket = self.SocketClass() 63 | try: 64 | websocket.accept(self.request, self.headers) 65 | except Exception: 66 | exc = sys.exc_info()[1] 67 | self.send_error(400, str(exc)) 68 | return 69 | 70 | self.log_request(101) 71 | 72 | self.request = websocket 73 | 74 | # Other requests cannot follow Websocket data 75 | self.close_connection = True 76 | 77 | self.handle_websocket() 78 | 79 | def handle_websocket(self): 80 | """Handle a WebSocket connection. 81 | 82 | This is called when the WebSocket is ready to be used. A 83 | sub-class should perform the necessary communication here and 84 | return once done. 85 | """ 86 | pass 87 | 88 | # Convenient ready made classes 89 | 90 | class WebSocketRequestHandler(WebSocketRequestHandlerMixIn, 91 | BaseHTTPRequestHandler): 92 | pass 93 | 94 | class WebSocketServer(HTTPServer): 95 | pass 96 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/LICENSE: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (C) 2014-2016 by Vitaly Puzrin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/README.md: -------------------------------------------------------------------------------- 1 | This is an ES6-modules-compatible version of 2 | https://github.com/nodeca/pako, based on pako version 1.0.3. 3 | 4 | It's more-or-less a direct translation of the original, with unused parts 5 | removed, and the dynamic support for non-typed arrays removed (since ES6 6 | modules don't work well with dynamic exports). 7 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/utils/common.js: -------------------------------------------------------------------------------- 1 | // reduce buffer size, avoiding mem copy 2 | export function shrinkBuf (buf, size) { 3 | if (buf.length === size) { return buf; } 4 | if (buf.subarray) { return buf.subarray(0, size); } 5 | buf.length = size; 6 | return buf; 7 | }; 8 | 9 | 10 | export function arraySet (dest, src, src_offs, len, dest_offs) { 11 | if (src.subarray && dest.subarray) { 12 | dest.set(src.subarray(src_offs, src_offs + len), dest_offs); 13 | return; 14 | } 15 | // Fallback to ordinary array 16 | for (var i = 0; i < len; i++) { 17 | dest[dest_offs + i] = src[src_offs + i]; 18 | } 19 | } 20 | 21 | // Join array of chunks to single array. 22 | export function flattenChunks (chunks) { 23 | var i, l, len, pos, chunk, result; 24 | 25 | // calculate data length 26 | len = 0; 27 | for (i = 0, l = chunks.length; i < l; i++) { 28 | len += chunks[i].length; 29 | } 30 | 31 | // join chunks 32 | result = new Uint8Array(len); 33 | pos = 0; 34 | for (i = 0, l = chunks.length; i < l; i++) { 35 | chunk = chunks[i]; 36 | result.set(chunk, pos); 37 | pos += chunk.length; 38 | } 39 | 40 | return result; 41 | } 42 | 43 | export var Buf8 = Uint8Array; 44 | export var Buf16 = Uint16Array; 45 | export var Buf32 = Int32Array; 46 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/zlib/adler32.js: -------------------------------------------------------------------------------- 1 | // Note: adler32 takes 12% for level 0 and 2% for level 6. 2 | // It doesn't worth to make additional optimizationa as in original. 3 | // Small size is preferable. 4 | 5 | export default function adler32(adler, buf, len, pos) { 6 | var s1 = (adler & 0xffff) |0, 7 | s2 = ((adler >>> 16) & 0xffff) |0, 8 | n = 0; 9 | 10 | while (len !== 0) { 11 | // Set limit ~ twice less than 5552, to keep 12 | // s2 in 31-bits, because we force signed ints. 13 | // in other case %= will fail. 14 | n = len > 2000 ? 2000 : len; 15 | len -= n; 16 | 17 | do { 18 | s1 = (s1 + buf[pos++]) |0; 19 | s2 = (s2 + s1) |0; 20 | } while (--n); 21 | 22 | s1 %= 65521; 23 | s2 %= 65521; 24 | } 25 | 26 | return (s1 | (s2 << 16)) |0; 27 | } 28 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/zlib/constants.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | /* Allowed flush values; see deflate() and inflate() below for details */ 4 | Z_NO_FLUSH: 0, 5 | Z_PARTIAL_FLUSH: 1, 6 | Z_SYNC_FLUSH: 2, 7 | Z_FULL_FLUSH: 3, 8 | Z_FINISH: 4, 9 | Z_BLOCK: 5, 10 | Z_TREES: 6, 11 | 12 | /* Return codes for the compression/decompression functions. Negative values 13 | * are errors, positive values are used for special but normal events. 14 | */ 15 | Z_OK: 0, 16 | Z_STREAM_END: 1, 17 | Z_NEED_DICT: 2, 18 | Z_ERRNO: -1, 19 | Z_STREAM_ERROR: -2, 20 | Z_DATA_ERROR: -3, 21 | //Z_MEM_ERROR: -4, 22 | Z_BUF_ERROR: -5, 23 | //Z_VERSION_ERROR: -6, 24 | 25 | /* compression levels */ 26 | Z_NO_COMPRESSION: 0, 27 | Z_BEST_SPEED: 1, 28 | Z_BEST_COMPRESSION: 9, 29 | Z_DEFAULT_COMPRESSION: -1, 30 | 31 | 32 | Z_FILTERED: 1, 33 | Z_HUFFMAN_ONLY: 2, 34 | Z_RLE: 3, 35 | Z_FIXED: 4, 36 | Z_DEFAULT_STRATEGY: 0, 37 | 38 | /* Possible values of the data_type field (though see inflate()) */ 39 | Z_BINARY: 0, 40 | Z_TEXT: 1, 41 | //Z_ASCII: 1, // = Z_TEXT (deprecated) 42 | Z_UNKNOWN: 2, 43 | 44 | /* The deflate compression method */ 45 | Z_DEFLATED: 8 46 | //Z_NULL: null // Use -1 or null inline, depending on var type 47 | }; 48 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/zlib/crc32.js: -------------------------------------------------------------------------------- 1 | // Note: we can't get significant speed boost here. 2 | // So write code to minimize size - no pregenerated tables 3 | // and array tools dependencies. 4 | 5 | 6 | // Use ordinary array, since untyped makes no boost here 7 | export default function makeTable() { 8 | var c, table = []; 9 | 10 | for (var n = 0; n < 256; n++) { 11 | c = n; 12 | for (var k = 0; k < 8; k++) { 13 | c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); 14 | } 15 | table[n] = c; 16 | } 17 | 18 | return table; 19 | } 20 | 21 | // Create table on load. Just 255 signed longs. Not a problem. 22 | var crcTable = makeTable(); 23 | 24 | 25 | function crc32(crc, buf, len, pos) { 26 | var t = crcTable, 27 | end = pos + len; 28 | 29 | crc ^= -1; 30 | 31 | for (var i = pos; i < end; i++) { 32 | crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; 33 | } 34 | 35 | return (crc ^ (-1)); // >>> 0; 36 | } 37 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/zlib/gzheader.js: -------------------------------------------------------------------------------- 1 | export default function GZheader() { 2 | /* true if compressed data believed to be text */ 3 | this.text = 0; 4 | /* modification time */ 5 | this.time = 0; 6 | /* extra flags (not used when writing a gzip file) */ 7 | this.xflags = 0; 8 | /* operating system */ 9 | this.os = 0; 10 | /* pointer to extra field or Z_NULL if none */ 11 | this.extra = null; 12 | /* extra field length (valid if extra != Z_NULL) */ 13 | this.extra_len = 0; // Actually, we don't need it in JS, 14 | // but leave for few code modifications 15 | 16 | // 17 | // Setup limits is not necessary because in js we should not preallocate memory 18 | // for inflate use constant limit in 65536 bytes 19 | // 20 | 21 | /* space at extra (only when reading header) */ 22 | // this.extra_max = 0; 23 | /* pointer to zero-terminated file name or Z_NULL */ 24 | this.name = ''; 25 | /* space at name (only when reading header) */ 26 | // this.name_max = 0; 27 | /* pointer to zero-terminated comment or Z_NULL */ 28 | this.comment = ''; 29 | /* space at comment (only when reading header) */ 30 | // this.comm_max = 0; 31 | /* true if there was or will be a header crc */ 32 | this.hcrc = 0; 33 | /* true when done reading gzip header (not used when writing a gzip file) */ 34 | this.done = false; 35 | } 36 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/zlib/messages.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 2: 'need dictionary', /* Z_NEED_DICT 2 */ 3 | 1: 'stream end', /* Z_STREAM_END 1 */ 4 | 0: '', /* Z_OK 0 */ 5 | '-1': 'file error', /* Z_ERRNO (-1) */ 6 | '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ 7 | '-3': 'data error', /* Z_DATA_ERROR (-3) */ 8 | '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ 9 | '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ 10 | '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ 11 | }; 12 | -------------------------------------------------------------------------------- /noVNC/vendor/pako/lib/zlib/zstream.js: -------------------------------------------------------------------------------- 1 | export default function ZStream() { 2 | /* next input byte */ 3 | this.input = null; // JS specific, because we have no pointers 4 | this.next_in = 0; 5 | /* number of bytes available at input */ 6 | this.avail_in = 0; 7 | /* total number of input bytes read so far */ 8 | this.total_in = 0; 9 | /* next output byte should be put there */ 10 | this.output = null; // JS specific, because we have no pointers 11 | this.next_out = 0; 12 | /* remaining free space at output */ 13 | this.avail_out = 0; 14 | /* total number of bytes output so far */ 15 | this.total_out = 0; 16 | /* last error message, NULL if no error */ 17 | this.msg = ''/*Z_NULL*/; 18 | /* not visible by applications */ 19 | this.state = null; 20 | /* best guess about the data type: binary or text */ 21 | this.data_type = 2/*Z_UNKNOWN*/; 22 | /* adler32 value of the uncompressed data */ 23 | this.adler = 0; 24 | } 25 | -------------------------------------------------------------------------------- /vscode-go/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM gotoeasy/ubuntu-desktop:1.10.1-base 3 | # 维护者信息 4 | MAINTAINER gotoeasy 5 | 6 | # 安装 7 | RUN \ 8 | # VsCode 9 | curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg && \ 10 | mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg && \ 11 | echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list && \ 12 | apt-get clean && \ 13 | apt-get -y update && \ 14 | apt-get install -y code && \ 15 | apt-get install -y build-essential && \ 16 | apt-get install -y tree && \ 17 | sed -i 's/--unity-launch/--no-sandbox --unity-launch/' /usr/share/applications/code.desktop && \ 18 | # go 19 | cd && \ 20 | wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz && \ 21 | tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz && \ 22 | rm -f go1.19.linux-amd64.tar.gz && \ 23 | echo '' >> ~/.bashrc && \ 24 | echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc && \ 25 | echo 'export GO111MODULE=on' >> ~/.bashrc && \ 26 | echo 'export GOPROXY=https://goproxy.cn,direct' >> ~/.bashrc && \ 27 | chmod 777 ~/.bashrc && \ 28 | /usr/local/go/bin/go env -w GO111MODULE=on && \ 29 | /usr/local/go/bin/go env -w GOPROXY=https://goproxy.io,direct && \ 30 | mkdir -p ~/Desktop/project/hello && \ 31 | cd ~/Desktop/project/hello && \ 32 | /usr/local/go/bin/go mod init hello && \ 33 | echo 'package main' > ~/Desktop/project/hello/main.go && \ 34 | echo 'import "fmt"' >> ~/Desktop/project/hello/main.go && \ 35 | echo 'func main() {' >> ~/Desktop/project/hello/main.go && \ 36 | echo ' fmt.Println("hello")' >> ~/Desktop/project/hello/main.go && \ 37 | echo '}' >> ~/Desktop/project/hello/main.go && \ 38 | /usr/local/go/bin/go install -v golang.org/x/tools/gopls@latest && \ 39 | /usr/local/go/bin/go install -v github.com/go-delve/delve/cmd/dlv@latest && \ 40 | # clean 41 | apt-get -y clean && \ 42 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 43 | -------------------------------------------------------------------------------- /xfce/.config/autostart/novnc.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Encoding=UTF-8 3 | Version=0.9.4 4 | Type=Application 5 | Name=novnc 6 | Comment=autostart 7 | Exec=/opt/noVNC/utils/novnc_proxy --vnc 127.0.0.1:5900 --listen 0.0.0.0:6090 8 | OnlyShowIn=XFCE; 9 | StartupNotify=false 10 | Terminal=false 11 | Hidden=false 12 | 13 | -------------------------------------------------------------------------------- /xfce/.config/autostart/obsidian.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Encoding=UTF-8 3 | Version=0.9.4 4 | Type=Application 5 | Name=obsidian 6 | Comment=ob 7 | Exec=/opt/obsidian.AppImage --no-sandbox 8 | OnlyShowIn=XFCE; 9 | StartupNotify=false 10 | Terminal=false 11 | Hidden=false 12 | 13 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WHG555/obsidian-docker/35a0b614d4c3406747c417e5f6ca4fe49b843f3c/xfce/.config/xfce4/background.jpg -------------------------------------------------------------------------------- /xfce/.config/xfce4/desktop/icons.screen0-1344x672.rc: -------------------------------------------------------------------------------- 1 | [xfdesktop-version-4.10.3+-rcfile_format] 2 | 4.10.3+=true 3 | 4 | [Trash] 5 | row=0 6 | col=0 7 | 8 | [/] 9 | row=1 10 | col=0 11 | 12 | [/root] 13 | row=2 14 | col=0 15 | 16 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/desktop/icons.screen0-1344x721.rc: -------------------------------------------------------------------------------- 1 | [xfdesktop-version-4.10.3+-rcfile_format] 2 | 4.10.3+=true 3 | 4 | [Trash] 5 | row=0 6 | col=0 7 | 8 | [/] 9 | row=1 10 | col=0 11 | 12 | [/root] 13 | row=2 14 | col=0 15 | 16 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/desktop/icons.screen0-1344x752.rc: -------------------------------------------------------------------------------- 1 | [xfdesktop-version-4.10.3+-rcfile_format] 2 | 4.10.3+=true 3 | 4 | [Trash] 5 | row=0 6 | col=0 7 | 8 | [/] 9 | row=1 10 | col=0 11 | 12 | [/root] 13 | row=2 14 | col=0 15 | 16 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /xfce/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | --------------------------------------------------------------------------------