├── .gitignore
├── Dockerfile
├── README.md
├── build
├── docker-compose.yml
├── elixir-intellij-noVNC.jpg
├── intellij-elixir.zip
├── intellij
└── run
├── jdk.table.xml
├── license
├── noVNC-master.zip
├── noVNC
├── .gitignore
├── .gitmodules
├── .npmignore
├── .travis.yml
├── LICENSE.txt
├── README.md
├── app
│ ├── images
│ │ ├── alt.svg
│ │ ├── clipboard.svg
│ │ ├── connect.svg
│ │ ├── ctrl.svg
│ │ ├── ctrlaltdel.svg
│ │ ├── disconnect.svg
│ │ ├── drag.svg
│ │ ├── error.svg
│ │ ├── esc.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
│ │ ├── mouse_left.svg
│ │ ├── mouse_middle.svg
│ │ ├── mouse_none.svg
│ │ ├── mouse_right.svg
│ │ ├── power.svg
│ │ ├── settings.svg
│ │ ├── tab.svg
│ │ ├── toggleextrakeys.svg
│ │ └── warning.svg
│ ├── sounds
│ │ ├── CREDITS
│ │ ├── bell.mp3
│ │ └── bell.oga
│ ├── styles
│ │ ├── Orbitron700.ttf
│ │ ├── Orbitron700.woff
│ │ └── base.css
│ ├── ui.js
│ └── webutil.js
├── core
│ ├── base64.js
│ ├── des.js
│ ├── display.js
│ ├── inflator.js
│ ├── input
│ │ ├── keysym.js
│ │ ├── keysymdef.js
│ │ ├── util.js
│ │ └── xtscancodes.js
│ ├── rfb.js
│ └── websock.js
├── docs
│ ├── LICENSE.BSD-2-Clause
│ ├── LICENSE.BSD-3-Clause
│ ├── LICENSE.MPL-2.0
│ ├── LICENSE.OFL-1.1
│ ├── flash_policy.txt
│ ├── links
│ ├── notes
│ ├── rfb_notes
│ ├── rfbproto-3.3.pdf
│ ├── rfbproto-3.7.pdf
│ └── rfbproto-3.8.pdf
├── karma.conf.js
├── package.json
├── tests
│ ├── assertions.js
│ ├── fake.websocket.js
│ ├── playback.js
│ ├── test.base64.js
│ ├── test.display.js
│ ├── test.helper.js
│ ├── test.keyboard.js
│ ├── test.rfb.js
│ ├── test.util.js
│ ├── test.websock.js
│ └── vnc_playback.html
├── utils
│ ├── README.md
│ ├── b64-to-binary.pl
│ ├── img2js.py
│ ├── json2graph.py
│ ├── launch.sh
│ ├── u2x11
│ └── use_require.js
└── vnc.html
├── openbox-config
└── .config
│ ├── gtk-2.0
│ └── gtkfilechooser.ini
│ ├── gtk-3.0
│ └── settings.ini
│ ├── libfm
│ ├── dir-settings.conf
│ └── libfm.conf
│ ├── libreoffice
│ └── 4
│ │ └── user
│ │ ├── autotext
│ │ └── mytexts.bau
│ │ ├── basic
│ │ ├── Standard
│ │ │ ├── Module1.xba
│ │ │ ├── dialog.xlb
│ │ │ └── script.xlb
│ │ ├── dialog.xlc
│ │ └── script.xlc
│ │ ├── config
│ │ ├── arrowhd.soe
│ │ ├── autotbl.fmt
│ │ ├── classic.sog
│ │ ├── cmyk.soc
│ │ ├── gallery.soc
│ │ ├── hatching.soh
│ │ ├── html.soc
│ │ ├── javasettings_Linux_X86_64.xml
│ │ ├── libreoffice.soc
│ │ ├── modern.sog
│ │ ├── palette.soc
│ │ ├── scribus.soc
│ │ ├── standard.sob
│ │ ├── standard.soc
│ │ ├── standard.sod
│ │ ├── standard.soe
│ │ ├── standard.sog
│ │ ├── standard.soh
│ │ ├── styles.sod
│ │ ├── tango.soc
│ │ └── web.soc
│ │ ├── database
│ │ ├── biblio.odb
│ │ ├── biblio
│ │ │ ├── biblio.dbf
│ │ │ └── biblio.dbt
│ │ └── evolocal.odb
│ │ ├── extensions
│ │ ├── buildid
│ │ ├── bundled
│ │ │ ├── lastsynchronized
│ │ │ └── registry
│ │ │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend
│ │ │ │ └── backenddb.xml
│ │ │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend
│ │ │ │ └── backenddb.xml
│ │ ├── shared
│ │ │ ├── lastsynchronized
│ │ │ └── registry
│ │ │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend
│ │ │ │ └── backenddb.xml
│ │ │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend
│ │ │ │ └── backenddb.xml
│ │ └── tmp
│ │ │ └── registry
│ │ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend
│ │ │ └── backenddb.xml
│ │ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend
│ │ │ └── backenddb.xml
│ │ ├── gallery
│ │ ├── sg30.sdv
│ │ └── sg30.thm
│ │ ├── psprint
│ │ └── pspfontcache
│ │ ├── registrymodifications.xcu
│ │ └── uno_packages
│ │ └── cache
│ │ ├── log.txt
│ │ └── registry
│ │ ├── com.sun.star.comp.deployment.configuration.PackageRegistryBackend
│ │ └── backenddb.xml
│ │ └── com.sun.star.comp.deployment.help.PackageRegistryBackend
│ │ └── backenddb.xml
│ ├── lxpanel
│ └── LXDE
│ │ ├── config
│ │ └── panels
│ │ └── panel
│ ├── lxsession
│ └── LXDE
│ │ ├── autostart
│ │ └── desktop.conf
│ ├── lxterminal
│ └── lxterminal.conf
│ ├── openbox
│ ├── lxde-rc.xml
│ └── menu.xml
│ ├── pcmanfm
│ └── LXDE
│ │ ├── desktop-items-0.conf
│ │ └── pcmanfm.conf
│ └── xarchiver
│ └── xarchiverrc
├── run
├── startup.sh
├── supervisord.conf.xorg
└── xorg.conf
/.gitignore:
--------------------------------------------------------------------------------
1 | /noVNC/self.pem
2 |
--------------------------------------------------------------------------------
/build:
--------------------------------------------------------------------------------
1 | sudo docker build -t stefan/phoenix . | tee build.log
2 |
3 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | # docker-compose.yml
2 | version: '2'
3 |
4 | services:
5 | web:
6 | image: stefan/phoenix
7 | environment:
8 | DATABASE_URL: postgres://rumbl:rumbl@db/rumbl_dev
9 | PORT: 5432
10 | MIX_ENV: "dev"
11 | VIRTUAL_HEIGHT: 929
12 | VIRTUAL_WIDTH: 1920
13 | # UBUNTUPASS: "override"
14 | # VNCPASS: "also override"
15 | ENABLE_HTTP: "Y"
16 | DISPLAY: $DISPLAY
17 | links:
18 | - postgres
19 | ports:
20 | - 4000:4000
21 | - 6080:6080
22 | volumes:
23 | - /var/lib/docker/volumes/volume_name_onhost/_data:/folder_name_in_container
24 | # - /var/lib/docker/volumes/intellij/_data/.IdeaIC2017.3/config:/home/ubuntu/.IdeaIC2017.3/config
25 | # - /var/lib/docker/volumes/openbox/_data:/home/ubuntu/.config/openbox
26 | - /tmp/.X11-unix:/tmp/.X11-unix
27 | stdin_open: true
28 | postgres:
29 | image: postgres
30 | environment:
31 | LC_ALL: C.UTF-8
32 | POSTGRES_USER: postgres
33 | POSTGRES_PASSWORD: postgres
34 | volumes:
35 | - "volume_name_onhost:/var/lib/postgresql/data"
36 | volumes:
37 | folder_name_in_container:
38 | volume_name_onhost:
39 |
40 |
--------------------------------------------------------------------------------
/elixir-intellij-noVNC.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/elixir-intellij-noVNC.jpg
--------------------------------------------------------------------------------
/intellij-elixir.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/intellij-elixir.zip
--------------------------------------------------------------------------------
/intellij/run:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | function delayedPluginInstall {
4 | sudo mkdir -p /home/ubuntu/.IdeaIC2016.2/config/plugins
5 | sudo mkdir -p /home/ubuntu/.IdeaIC2016.2/config/options
6 | sudo chown ubuntu:ubuntu -R /home/ubuntu/.IdeaIC2016.2
7 |
8 | cd /home/ubuntu/.IdeaIC2016.2/config/plugins/
9 |
10 | echo 'Installing Markdown support plugin'
11 | wget https://plugins.jetbrains.com/files/7793/25156/markdown-2016.1.20160405.zip -O markdown.zip -q && unzip -q markdown.zip && rm markdown.zip
12 |
13 | }
14 |
15 | if [ ! -d /home/ubuntu/.IdeaIC2016.2/config/plugins/intellij-elixir ]; then
16 | # We are running with a non-Docker contained volume for IntelliJ prefs so we need to setup the plugin again
17 | delayedPluginInstall
18 | fi
19 |
20 | if [ -d /home/ubuntu/.IdeaIC2016.2 ]; then
21 | # Ensure proper permissions
22 | sudo chown ubuntu:ubuntu -R /home/ubuntu/.IdeaIC2016.2
23 | fi
24 |
25 | exec /opt/intellij/bin/idea.sh
26 |
27 |
--------------------------------------------------------------------------------
/jdk.table.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 |
--------------------------------------------------------------------------------
/license:
--------------------------------------------------------------------------------
1 | Do whatever you like with this repo. If you find anything improvements, please let me know.
2 |
--------------------------------------------------------------------------------
/noVNC-master.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC-master.zip
--------------------------------------------------------------------------------
/noVNC/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | *.o
3 | tests/data_*.js
4 | utils/rebind.so
5 | utils/websockify
6 | /node_modules
7 | /build
8 | /lib
9 | recordings
10 | *.swp
11 | *~
12 | noVNC-*.tgz
13 |
--------------------------------------------------------------------------------
/noVNC/.gitmodules:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/.gitmodules
--------------------------------------------------------------------------------
/noVNC/.npmignore:
--------------------------------------------------------------------------------
1 | # infra JS
2 | /build/
3 | /node_modules/
4 | /tests/
5 | /utils/
6 | /recordings/
7 | /vendor/sinon.js
8 |
9 | # noVNC application files
10 | /app
11 | /vendor/browser-es-module-loader
12 | /vendor/promise.js
13 | /vnc.html
14 | /vnc_lite.html
15 |
16 | # raw translation files
17 | /po
18 |
19 | # config files
20 | /.travis.yml
21 | /karma.conf.js
22 |
23 | # various other files
24 | /.gitmodules
25 | .*
26 | *~
27 | *.swp
28 | *.swo
29 |
30 | # documentation (except licenses)
31 | /docs/notes
32 | /docs/links
33 | /docs/release.txt
34 | /docs/rfb_notes
35 | /docs/*.pdf
36 | /docs/flash_policy.txt
37 | /CONTRIBUTING.md
38 |
--------------------------------------------------------------------------------
/noVNC/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | sudo: false
3 | cache:
4 | directories:
5 | - node_modules
6 | node_js:
7 | - 6
8 | env:
9 | matrix:
10 | - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Windows 10'
11 | # FIXME Skip tests in Linux since Sauce Labs browser versions are ancient.
12 | # - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Linux'
13 | - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='OS X 10.11'
14 | - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Windows 10'
15 | # - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Linux'
16 | - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='OS X 10.11'
17 | - TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 10'
18 | - TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 7'
19 | - TEST_BROWSER_NAME=microsoftedge TEST_BROWSER_OS='Windows 10'
20 | - TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.11'
21 | before_script: npm install -g karma-cli
22 | addons:
23 | sauce_connect:
24 | username: "directxman12"
25 | jwt:
26 | secure: "d3ekMYslpn6R4f0ajtRMt9SUFmNGDiItHpqaXC5T4KI0KMEsxgvEOfJot5PiFFJWg1DSpJZH6oaW2UxGZ3duJLZrXIEd/JePY8a6NtT35BNgiDPgcp+eu2Bu3rhrSNg7/HEsD1ma+JeUTnv18Ai5oMFfCCQJx2J6osIxyl/ZVxA="
27 | stages:
28 | - lint
29 | - test
30 | - name: deploy
31 | if: tag is PRESENT
32 | jobs:
33 | include:
34 | - stage: lint
35 | env:
36 | addons:
37 | before_script:
38 | script: npm run lint
39 | - stage: deploy
40 | script: skip
41 | before_script: skip
42 | deploy:
43 | provider: npm
44 | email: directxman12+npm@gmail.com
45 | api_key:
46 | secure: cIidkFmvkdmdwWsqBpxyPUCzBqgK8LhPiNxTrIfhwbUunMsJep9MiiBJtv8poVYG2Y4yfiZmqGn4nfetUdc/LDctd73j+/EM4Z/NUDexVAhJ+9/qCogvpJsSQ96VQo7yBceW4E1fBM3WCU0kcGToYIVSSrwvvRDtJfeYJf2Qqw0=
47 | on:
48 | tags: true
49 | repo: novnc/noVNC
50 |
51 |
52 |
--------------------------------------------------------------------------------
/noVNC/LICENSE.txt:
--------------------------------------------------------------------------------
1 | noVNC is Copyright (C) 2011 Joel Martin
2 |
3 | The noVNC core library files are licensed under the MPL 2.0 (Mozilla
4 | Public License 2.0). The noVNC core library is composed of the
5 | Javascript code necessary for full noVNC operation. This includes (but
6 | is not limited to):
7 |
8 | core/**/*.js
9 | app/*.js
10 | test/playback.js
11 |
12 | The HTML, CSS, font and images files that included with the noVNC
13 | source distibution (or repository) are not considered part of the
14 | noVNC core library and are licensed under more permissive licenses.
15 | The intent is to allow easy integration of noVNC into existing web
16 | sites and web applications.
17 |
18 | The HTML, CSS, font and image files are licensed as follows:
19 |
20 | *.html : 2-Clause BSD license
21 |
22 | app/styles/*.css : 2-Clause BSD license
23 |
24 | app/styles/Orbitron* : SIL Open Font License 1.1
25 | (Copyright 2009 Matt McInerney)
26 |
27 | app/images/ : Creative Commons Attribution-ShareAlike
28 | http://creativecommons.org/licenses/by-sa/3.0/
29 |
30 | Some portions of noVNC are copyright to their individual authors.
31 | Please refer to the individual source files and/or to the noVNC commit
32 | history: https://github.com/novnc/noVNC/commits/master
33 |
34 | The are several files and projects that have been incorporated into
35 | the noVNC core library. Here is a list of those files and the original
36 | licenses (all MPL 2.0 compatible):
37 |
38 | core/base64.js : MPL 2.0
39 |
40 | core/des.js : Various BSD style licenses
41 |
42 | vendor/pako/ : MIT
43 |
44 | vendor/browser-es-module-loader/src/ : MIT
45 |
46 | vendor/browser-es-module-loader/dist/ : Various BSD style licenses
47 |
48 | vendor/promise.js : MIT
49 |
50 | Any other files not mentioned above are typically marked with
51 | a copyright/license header at the top of the file. The default noVNC
52 | license is MPL-2.0.
53 |
54 | The following license texts are included:
55 |
56 | docs/LICENSE.MPL-2.0
57 | docs/LICENSE.OFL-1.1
58 | docs/LICENSE.BSD-3-Clause (New BSD)
59 | docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD)
60 | vendor/pako/LICENSE (MIT)
61 |
62 | Or alternatively the license texts may be found here:
63 |
64 | http://www.mozilla.org/MPL/2.0/
65 | http://scripts.sil.org/OFL
66 | http://en.wikipedia.org/wiki/BSD_licenses
67 | https://opensource.org/licenses/MIT
68 |
--------------------------------------------------------------------------------
/noVNC/README.md:
--------------------------------------------------------------------------------
1 | ## noVNC: HTML VNC Client Library and Application
2 |
3 | [](https://travis-ci.org/novnc/noVNC)
4 |
5 | ### Description
6 |
7 | noVNC is both a HTML VNC client JavaScript library and an application built on
8 | top of that library. noVNC runs well in any modern browser including mobile
9 | browsers (iOS and Android).
10 |
11 | Many companies, projects and products have integrated noVNC including
12 | [OpenStack](http://www.openstack.org),
13 | [OpenNebula](http://opennebula.org/),
14 | [LibVNCServer](http://libvncserver.sourceforge.net), and
15 | [ThinLinc](https://cendio.com/thinlinc). See
16 | [the Projects and Companies wiki page](https://github.com/novnc/noVNC/wiki/Projects-and-companies-using-noVNC)
17 | for a more complete list with additional info and links.
18 |
19 | ### Table of Contents
20 |
21 | - [News/help/contact](#newshelpcontact)
22 | - [Features](#features)
23 | - [Screenshots](#screenshots)
24 | - [Browser Requirements](#browser-requirements)
25 | - [Server Requirements](#server-requirements)
26 | - [Quick Start](#quick-start)
27 | - [Integration and Deployment](#integration-and-deployment)
28 | - [Authors/Contributors](#authorscontributors)
29 |
30 | ### News/help/contact
31 |
32 | The project website is found at [novnc.com](http://novnc.com).
33 | Notable commits, announcements and news are posted to
34 | [@noVNC](http://www.twitter.com/noVNC).
35 |
36 | If you are a noVNC developer/integrator/user (or want to be) please join the
37 | [noVNC discussion group](https://groups.google.com/forum/?fromgroups#!forum/novnc).
38 |
39 | Bugs and feature requests can be submitted via
40 | [github issues](https://github.com/novnc/noVNC/issues). If you have questions
41 | about using noVNC then please first use the
42 | [discussion group](https://groups.google.com/forum/?fromgroups#!forum/novnc).
43 | We also have a [wiki](https://github.com/novnc/noVNC/wiki/) with lots of
44 | helpful information.
45 |
46 | If you are looking for a place to start contributing to noVNC, a good place to
47 | start would be the issues that are marked as
48 | ["patchwelcome"](https://github.com/novnc/noVNC/issues?labels=patchwelcome).
49 | Please check our
50 | [contribution guide](https://github.com/novnc/noVNC/wiki/Contributing) though.
51 |
52 | If you want to show appreciation for noVNC you could donate to a great non-
53 | profits such as:
54 | [Compassion International](http://www.compassion.com/),
55 | [SIL](http://www.sil.org),
56 | [Habitat for Humanity](http://www.habitat.org),
57 | [Electronic Frontier Foundation](https://www.eff.org/),
58 | [Against Malaria Foundation](http://www.againstmalaria.com/),
59 | [Nothing But Nets](http://www.nothingbutnets.net/), etc.
60 | Please tweet [@noVNC](http://www.twitter.com/noVNC) if you do.
61 |
62 |
63 | ### Features
64 |
65 | * Supports all modern browsers including mobile (iOS, Android)
66 | * Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG
67 | * Supports scaling, clipping and resizing the desktop
68 | * Local cursor rendering
69 | * Clipboard copy/paste
70 | * Licensed mainly under the [MPL 2.0](http://www.mozilla.org/MPL/2.0/), see
71 | [the license document](LICENSE.txt) for details
72 |
73 | ### Screenshots
74 |
75 | Running in Firefox before and after connecting:
76 |
77 |
78 |
79 |
80 | See more screenshots
81 | [here](http://novnc.com/screenshots.html).
82 |
83 |
84 | ### Browser Requirements
85 |
86 | noVNC uses many modern web technologies so a formal requirement list is
87 | not available. However these are the minimum versions we are currently
88 | aware of:
89 |
90 | * Chrome 49, Firefox 44, Safari 10, Opera 36, IE 11, Edge 12
91 |
92 |
93 | ### Server Requirements
94 |
95 | noVNC follows the standard VNC protocol, but unlike other VNC clients it does
96 | require WebSockets support. Many servers include support (e.g.
97 | [x11vnc/libvncserver](http://libvncserver.sourceforge.net/),
98 | [QEMU](http://www.qemu.org/), and
99 | [MobileVNC](http://www.smartlab.at/mobilevnc/)), but for the others you need to
100 | use a WebSockets to TCP socket proxy. noVNC has a sister project
101 | [websockify](https://github.com/novnc/websockify) that provides a simple such
102 | proxy.
103 |
104 |
105 | ### Quick Start
106 |
107 | * Use the launch script to automatically download and start websockify, which
108 | includes a mini-webserver and the WebSockets proxy. The `--vnc` option is
109 | used to specify the location of a running VNC server:
110 |
111 | `./utils/launch.sh --vnc localhost:5901`
112 |
113 | * Point your browser to the cut-and-paste URL that is output by the launch
114 | script. Hit the Connect button, enter a password if the VNC server has one
115 | configured, and enjoy!
116 |
117 |
118 | ### Integration and Deployment
119 |
120 | Please see our other documents for how to integrate noVNC in your own software,
121 | or deploying the noVNC application in production environments:
122 |
123 | * [Embedding](docs/EMBEDDING.md) - For the noVNC application
124 | * [Library](docs/LIBRARY.md) - For the noVNC JavaScript library
125 |
126 |
127 | ### Authors/Contributors
128 |
129 | * Core team:
130 | * [Joel Martin](https://github.com/kanaka)
131 | * [Samuel Mannehed](https://github.com/samhed) (Cendio)
132 | * [Peter Åstrand](https://github.com/astrand) (Cendio)
133 | * [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack)
134 | * [Pierre Ossman](https://github.com/CendioOssman) (Cendio)
135 |
136 | * Notable contributions:
137 | * UI and Icons : Pierre Ossman, Chris Gordon
138 | * Original Logo : Michael Sersen
139 | * tight encoding : Michael Tinglof (Mercuri.ca)
140 |
141 | * Included libraries:
142 | * base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
143 | * DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs)
144 | * Pako : Vitaly Puzrin (https://github.com/nodeca/pako)
145 |
146 | Do you want to be on this list? Check out our
147 | [contribution guide](https://github.com/novnc/noVNC/wiki/Contributing) and
148 | start hacking!
149 |
--------------------------------------------------------------------------------
/noVNC/app/images/alt.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
93 |
--------------------------------------------------------------------------------
/noVNC/app/images/clipboard.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
107 |
--------------------------------------------------------------------------------
/noVNC/app/images/connect.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
97 |
--------------------------------------------------------------------------------
/noVNC/app/images/ctrl.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
97 |
--------------------------------------------------------------------------------
/noVNC/app/images/ctrlaltdel.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
101 |
--------------------------------------------------------------------------------
/noVNC/app/images/disconnect.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
95 |
--------------------------------------------------------------------------------
/noVNC/app/images/drag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
77 |
--------------------------------------------------------------------------------
/noVNC/app/images/error.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
82 |
--------------------------------------------------------------------------------
/noVNC/app/images/esc.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
93 |
--------------------------------------------------------------------------------
/noVNC/app/images/fullscreen.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
94 |
--------------------------------------------------------------------------------
/noVNC/app/images/handle.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-120x120.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-144x144.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-152x152.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-16x16.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-192x192.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-24x24.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-32x32.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-48x48.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-60x60.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-64x64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-64x64.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-72x72.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-76x76.png
--------------------------------------------------------------------------------
/noVNC/app/images/icons/novnc-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/images/icons/novnc-96x96.png
--------------------------------------------------------------------------------
/noVNC/app/images/info.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
82 |
--------------------------------------------------------------------------------
/noVNC/app/images/keyboard.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
89 |
--------------------------------------------------------------------------------
/noVNC/app/images/power.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
88 |
--------------------------------------------------------------------------------
/noVNC/app/images/settings.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
77 |
--------------------------------------------------------------------------------
/noVNC/app/images/tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
87 |
--------------------------------------------------------------------------------
/noVNC/app/images/toggleextrakeys.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
91 |
--------------------------------------------------------------------------------
/noVNC/app/images/warning.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
82 |
--------------------------------------------------------------------------------
/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/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/sounds/bell.mp3
--------------------------------------------------------------------------------
/noVNC/app/sounds/bell.oga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/sounds/bell.oga
--------------------------------------------------------------------------------
/noVNC/app/styles/Orbitron700.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/styles/Orbitron700.ttf
--------------------------------------------------------------------------------
/noVNC/app/styles/Orbitron700.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/app/styles/Orbitron700.woff
--------------------------------------------------------------------------------
/noVNC/core/base64.js:
--------------------------------------------------------------------------------
1 | /* This Source Code Form is subject to the terms of the Mozilla Public
2 | * License, v. 2.0. If a copy of the MPL was not distributed with this
3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 |
5 | // From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js
6 |
7 | import * as Log from './util/logging.js';
8 |
9 | export default {
10 | /* Convert data (an array of integers) to a Base64 string. */
11 | toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''),
12 | base64Pad : '=',
13 |
14 | encode: function (data) {
15 | "use strict";
16 | let result = '';
17 | const length = data.length;
18 | const lengthpad = (length % 3);
19 | // Convert every three bytes to 4 ascii characters.
20 |
21 | for (let i = 0; i < (length - 2); i += 3) {
22 | result += this.toBase64Table[data[i] >> 2];
23 | result += this.toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)];
24 | result += this.toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)];
25 | result += this.toBase64Table[data[i + 2] & 0x3f];
26 | }
27 |
28 | // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
29 | const j = length - lengthpad;
30 | if (lengthpad === 2) {
31 | result += this.toBase64Table[data[j] >> 2];
32 | result += this.toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)];
33 | result += this.toBase64Table[(data[j + 1] & 0x0f) << 2];
34 | result += this.toBase64Table[64];
35 | } else if (lengthpad === 1) {
36 | result += this.toBase64Table[data[j] >> 2];
37 | result += this.toBase64Table[(data[j] & 0x03) << 4];
38 | result += this.toBase64Table[64];
39 | result += this.toBase64Table[64];
40 | }
41 |
42 | return result;
43 | },
44 |
45 | /* Convert Base64 data to a string */
46 | toBinaryTable : [
47 | -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
48 | -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
49 | -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
50 | 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,
51 | -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
52 | 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
53 | -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
54 | 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
55 | ],
56 |
57 | decode: function (data, offset) {
58 | "use strict";
59 | offset = typeof(offset) !== 'undefined' ? offset : 0;
60 |
61 | let data_length = data.indexOf('=') - offset;
62 | if (data_length < 0) { data_length = data.length - offset; }
63 |
64 | /* Every four characters is 3 resulting numbers */
65 | const result_length = (data_length >> 2) * 3 + Math.floor((data_length % 4) / 1.5);
66 | const result = new Array(result_length);
67 |
68 | // Convert one by one.
69 |
70 | let leftbits = 0; // number of bits decoded, but yet to be appended
71 | let leftdata = 0; // bits decoded, but yet to be appended
72 | for (let idx = 0, i = offset; i < data.length; i++) {
73 | const c = this.toBinaryTable[data.charCodeAt(i) & 0x7f];
74 | const padding = (data.charAt(i) === this.base64Pad);
75 | // Skip illegal characters and whitespace
76 | if (c === -1) {
77 | Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i);
78 | continue;
79 | }
80 |
81 | // Collect data into leftdata, update bitcount
82 | leftdata = (leftdata << 6) | c;
83 | leftbits += 6;
84 |
85 | // If we have 8 or more bits, append 8 bits to the result
86 | if (leftbits >= 8) {
87 | leftbits -= 8;
88 | // Append if not padding.
89 | if (!padding) {
90 | result[idx++] = (leftdata >> leftbits) & 0xff;
91 | }
92 | leftdata &= (1 << leftbits) - 1;
93 | }
94 | }
95 |
96 | // If there are any bits left, the base64 string was corrupted
97 | if (leftbits) {
98 | const err = new Error('Corrupted base64 string');
99 | err.name = 'Base64-Error';
100 | throw err;
101 | }
102 |
103 | return result;
104 | }
105 | }; /* End of Base64 namespace */
106 |
--------------------------------------------------------------------------------
/noVNC/core/inflator.js:
--------------------------------------------------------------------------------
1 | import { inflateInit, inflate, inflateReset } from "../vendor/pako/lib/zlib/inflate.js";
2 | import ZStream from "../vendor/pako/lib/zlib/zstream.js";
3 |
4 | Inflate.prototype = {
5 | inflate: function (data, flush, expected) {
6 | this.strm.input = data;
7 | this.strm.avail_in = this.strm.input.length;
8 | this.strm.next_in = 0;
9 | this.strm.next_out = 0;
10 |
11 | // resize our output buffer if it's too small
12 | // (we could just use multiple chunks, but that would cause an extra
13 | // allocation each time to flatten the chunks)
14 | if (expected > this.chunkSize) {
15 | this.chunkSize = expected;
16 | this.strm.output = new Uint8Array(this.chunkSize);
17 | }
18 |
19 | this.strm.avail_out = this.chunkSize;
20 |
21 | inflate(this.strm, flush);
22 |
23 | return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out);
24 | },
25 |
26 | reset: function () {
27 | inflateReset(this.strm);
28 | }
29 | };
30 |
31 | export default function Inflate() {
32 | this.strm = new ZStream();
33 | this.chunkSize = 1024 * 10 * 10;
34 | this.strm.output = new Uint8Array(this.chunkSize);
35 | this.windowBits = 5;
36 |
37 | inflateInit(this.strm, this.windowBits);
38 | }
39 |
--------------------------------------------------------------------------------
/noVNC/core/input/util.js:
--------------------------------------------------------------------------------
1 | import keysyms from "./keysymdef.js";
2 | import vkeys from "./vkeys.js";
3 | import fixedkeys from "./fixedkeys.js";
4 | import DOMKeyTable from "./domkeytable.js";
5 | import * as browser from "../util/browser.js";
6 |
7 | // Get 'KeyboardEvent.code', handling legacy browsers
8 | export function getKeycode(evt){
9 | // Are we getting proper key identifiers?
10 | // (unfortunately Firefox and Chrome are crappy here and gives
11 | // us an empty string on some platforms, rather than leaving it
12 | // undefined)
13 | if (evt.code) {
14 | // Mozilla isn't fully in sync with the spec yet
15 | switch (evt.code) {
16 | case 'OSLeft': return 'MetaLeft';
17 | case 'OSRight': return 'MetaRight';
18 | }
19 |
20 | return evt.code;
21 | }
22 |
23 | // The de-facto standard is to use Windows Virtual-Key codes
24 | // in the 'keyCode' field for non-printable characters. However
25 | // Webkit sets it to the same as charCode in 'keypress' events.
26 | if ((evt.type !== 'keypress') && (evt.keyCode in vkeys)) {
27 | let code = vkeys[evt.keyCode];
28 |
29 | // macOS has messed up this code for some reason
30 | if (browser.isMac() && (code === 'ContextMenu')) {
31 | code = 'MetaRight';
32 | }
33 |
34 | // The keyCode doesn't distinguish between left and right
35 | // for the standard modifiers
36 | if (evt.location === 2) {
37 | switch (code) {
38 | case 'ShiftLeft': return 'ShiftRight';
39 | case 'ControlLeft': return 'ControlRight';
40 | case 'AltLeft': return 'AltRight';
41 | }
42 | }
43 |
44 | // Nor a bunch of the numpad keys
45 | if (evt.location === 3) {
46 | switch (code) {
47 | case 'Delete': return 'NumpadDecimal';
48 | case 'Insert': return 'Numpad0';
49 | case 'End': return 'Numpad1';
50 | case 'ArrowDown': return 'Numpad2';
51 | case 'PageDown': return 'Numpad3';
52 | case 'ArrowLeft': return 'Numpad4';
53 | case 'ArrowRight': return 'Numpad6';
54 | case 'Home': return 'Numpad7';
55 | case 'ArrowUp': return 'Numpad8';
56 | case 'PageUp': return 'Numpad9';
57 | case 'Enter': return 'NumpadEnter';
58 | }
59 | }
60 |
61 | return code;
62 | }
63 |
64 | return 'Unidentified';
65 | }
66 |
67 | // Get 'KeyboardEvent.key', handling legacy browsers
68 | export function getKey(evt) {
69 | // Are we getting a proper key value?
70 | if (evt.key !== undefined) {
71 | // IE and Edge use some ancient version of the spec
72 | // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
73 | switch (evt.key) {
74 | case 'Spacebar': return ' ';
75 | case 'Esc': return 'Escape';
76 | case 'Scroll': return 'ScrollLock';
77 | case 'Win': return 'Meta';
78 | case 'Apps': return 'ContextMenu';
79 | case 'Up': return 'ArrowUp';
80 | case 'Left': return 'ArrowLeft';
81 | case 'Right': return 'ArrowRight';
82 | case 'Down': return 'ArrowDown';
83 | case 'Del': return 'Delete';
84 | case 'Divide': return '/';
85 | case 'Multiply': return '*';
86 | case 'Subtract': return '-';
87 | case 'Add': return '+';
88 | case 'Decimal': return evt.char;
89 | }
90 |
91 | // Mozilla isn't fully in sync with the spec yet
92 | switch (evt.key) {
93 | case 'OS': return 'Meta';
94 | }
95 |
96 | // iOS leaks some OS names
97 | switch (evt.key) {
98 | case 'UIKeyInputUpArrow': return 'ArrowUp';
99 | case 'UIKeyInputDownArrow': return 'ArrowDown';
100 | case 'UIKeyInputLeftArrow': return 'ArrowLeft';
101 | case 'UIKeyInputRightArrow': return 'ArrowRight';
102 | case 'UIKeyInputEscape': return 'Escape';
103 | }
104 |
105 | // IE and Edge have broken handling of AltGraph so we cannot
106 | // trust them for printable characters
107 | if ((evt.key.length !== 1) || (!browser.isIE() && !browser.isEdge())) {
108 | return evt.key;
109 | }
110 | }
111 |
112 | // Try to deduce it based on the physical key
113 | const code = getKeycode(evt);
114 | if (code in fixedkeys) {
115 | return fixedkeys[code];
116 | }
117 |
118 | // If that failed, then see if we have a printable character
119 | if (evt.charCode) {
120 | return String.fromCharCode(evt.charCode);
121 | }
122 |
123 | // At this point we have nothing left to go on
124 | return 'Unidentified';
125 | }
126 |
127 | // Get the most reliable keysym value we can get from a key event
128 | export function getKeysym(evt){
129 | const key = getKey(evt);
130 |
131 | if (key === 'Unidentified') {
132 | return null;
133 | }
134 |
135 | // First look up special keys
136 | if (key in DOMKeyTable) {
137 | let location = evt.location;
138 |
139 | // Safari screws up location for the right cmd key
140 | if ((key === 'Meta') && (location === 0)) {
141 | location = 2;
142 | }
143 |
144 | if ((location === undefined) || (location > 3)) {
145 | location = 0;
146 | }
147 |
148 | return DOMKeyTable[key][location];
149 | }
150 |
151 | // Now we need to look at the Unicode symbol instead
152 |
153 | // Special key? (FIXME: Should have been caught earlier)
154 | if (key.length !== 1) {
155 | return null;
156 | }
157 |
158 | const codepoint = key.charCodeAt();
159 | if (codepoint) {
160 | return keysyms.lookup(codepoint);
161 | }
162 |
163 | return null;
164 | }
165 |
--------------------------------------------------------------------------------
/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/LICENSE.OFL-1.1:
--------------------------------------------------------------------------------
1 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
2 | This license is copied below, and is also available with a FAQ at:
3 | http://scripts.sil.org/OFL
4 |
5 |
6 | -----------------------------------------------------------
7 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
8 | -----------------------------------------------------------
9 |
10 | PREAMBLE
11 | The goals of the Open Font License (OFL) are to stimulate worldwide
12 | development of collaborative font projects, to support the font creation
13 | efforts of academic and linguistic communities, and to provide a free and
14 | open framework in which fonts may be shared and improved in partnership
15 | with others.
16 |
17 | The OFL allows the licensed fonts to be used, studied, modified and
18 | redistributed freely as long as they are not sold by themselves. The
19 | fonts, including any derivative works, can be bundled, embedded,
20 | redistributed and/or sold with any software provided that any reserved
21 | names are not used by derivative works. The fonts and derivatives,
22 | however, cannot be released under any other type of license. The
23 | requirement for fonts to remain under this license does not apply
24 | to any document created using the fonts or their derivatives.
25 |
26 | DEFINITIONS
27 | "Font Software" refers to the set of files released by the Copyright
28 | Holder(s) under this license and clearly marked as such. This may
29 | include source files, build scripts and documentation.
30 |
31 | "Reserved Font Name" refers to any names specified as such after the
32 | copyright statement(s).
33 |
34 | "Original Version" refers to the collection of Font Software components as
35 | distributed by the Copyright Holder(s).
36 |
37 | "Modified Version" refers to any derivative made by adding to, deleting,
38 | or substituting -- in part or in whole -- any of the components of the
39 | Original Version, by changing formats or by porting the Font Software to a
40 | new environment.
41 |
42 | "Author" refers to any designer, engineer, programmer, technical
43 | writer or other person who contributed to the Font Software.
44 |
45 | PERMISSION & CONDITIONS
46 | Permission is hereby granted, free of charge, to any person obtaining
47 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
48 | redistribute, and sell modified and unmodified copies of the Font
49 | Software, subject to the following conditions:
50 |
51 | 1) Neither the Font Software nor any of its individual components,
52 | in Original or Modified Versions, may be sold by itself.
53 |
54 | 2) Original or Modified Versions of the Font Software may be bundled,
55 | redistributed and/or sold with any software, provided that each copy
56 | contains the above copyright notice and this license. These can be
57 | included either as stand-alone text files, human-readable headers or
58 | in the appropriate machine-readable metadata fields within text or
59 | binary files as long as those fields can be easily viewed by the user.
60 |
61 | 3) No Modified Version of the Font Software may use the Reserved Font
62 | Name(s) unless explicit written permission is granted by the corresponding
63 | Copyright Holder. This restriction only applies to the primary font name as
64 | presented to the users.
65 |
66 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
67 | Software shall not be used to promote, endorse or advertise any
68 | Modified Version, except to acknowledge the contribution(s) of the
69 | Copyright Holder(s) and the Author(s) or with their explicit written
70 | permission.
71 |
72 | 5) The Font Software, modified or unmodified, in part or in whole,
73 | must be distributed entirely under this license, and must not be
74 | distributed under any other license. The requirement for fonts to
75 | remain under this license does not apply to any document created
76 | using the Font Software.
77 |
78 | TERMINATION
79 | This license becomes null and void if any of the above conditions are
80 | not met.
81 |
82 | DISCLAIMER
83 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
84 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
85 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
86 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
87 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
88 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
89 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
90 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
91 | OTHER DEALINGS IN THE FONT SOFTWARE.
92 |
--------------------------------------------------------------------------------
/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/rfb_notes:
--------------------------------------------------------------------------------
1 | 5.1.1 ProtocolVersion: 12, 12 bytes
2 |
3 | - Sent by server, max supported
4 | 12 ascii - "RFB 003.008\n"
5 | - Response by client, version to use
6 | 12 ascii - "RFB 003.003\n"
7 |
8 | 5.1.2 Authentication: >=4, [16, 4] bytes
9 |
10 | - Sent by server
11 | CARD32 - authentication-scheme
12 | 0 - connection failed
13 | CARD32 - length
14 | length - reason
15 | 1 - no authentication
16 |
17 | 2 - VNC authentication
18 | 16 CARD8 - challenge (random bytes)
19 |
20 | - Response by client (if VNC authentication)
21 | 16 CARD8 - client encrypts the challenge with DES, using user
22 | password as key, sends resulting 16 byte response
23 |
24 | - Response by server (if VNC authentication)
25 | CARD32 - 0 - OK
26 | 1 - failed
27 | 2 - too-many
28 |
29 | 5.1.3 ClientInitialisation: 1 byte
30 | - Sent by client
31 | CARD8 - shared-flag, 0 exclusive, non-zero shared
32 |
33 | 5.1.4 ServerInitialisation: >=24 bytes
34 | - Sent by server
35 | CARD16 - framebuffer-width
36 | CARD16 - framebuffer-height
37 | 16 byte PIXEL_FORMAT - server-pixel-format
38 | CARD8 - bits-per-pixel
39 | CARD8 - depth
40 | CARD8 - big-endian-flag, non-zero is big endian
41 | CARD8 - true-color-flag, non-zero then next 6 apply
42 | CARD16 - red-max
43 | CARD16 - green-max
44 | CARD16 - blue-max
45 | CARD8 - red-shift
46 | CARD8 - green-shift
47 | CARD8 - blue-shift
48 | 3 bytes - padding
49 | CARD32 - name-length
50 |
51 | CARD8[length] - name-string
52 |
53 |
54 |
55 | Client to Server Messages:
56 |
57 | 5.2.1 SetPixelFormat: 20 bytes
58 | CARD8: 0 - message-type
59 | ...
60 |
61 | 5.2.2 FixColourMapEntries: >=6 bytes
62 | CARD8: 1 - message-type
63 | ...
64 |
65 | 5.2.3 SetEncodings: >=8 bytes
66 | CARD8: 2 - message-type
67 | CARD8 - padding
68 | CARD16 - numer-of-encodings
69 |
70 | CARD32 - encoding-type in preference order
71 | 0 - raw
72 | 1 - copy-rectangle
73 | 2 - RRE
74 | 4 - CoRRE
75 | 5 - hextile
76 |
77 | 5.2.4 FramebufferUpdateRequest (10 bytes)
78 | CARD8: 3 - message-type
79 | CARD8 - incremental (0 for full-update, non-zero for incremental)
80 | CARD16 - x-position
81 | CARD16 - y-position
82 | CARD16 - width
83 | CARD16 - height
84 |
85 |
86 | 5.2.5 KeyEvent: 8 bytes
87 | CARD8: 4 - message-type
88 | CARD8 - down-flag
89 | 2 bytes - padding
90 | CARD32 - key (X-Windows keysym values)
91 |
92 | 5.2.6 PointerEvent: 6 bytes
93 | CARD8: 5 - message-type
94 | CARD8 - button-mask
95 | CARD16 - x-position
96 | CARD16 - y-position
97 |
98 | 5.2.7 ClientCutText: >=9 bytes
99 | CARD8: 6 - message-type
100 | ...
101 |
102 |
103 | Server to Client Messages:
104 |
105 | 5.3.1 FramebufferUpdate
106 | CARD8: 0 - message-type
107 | 1 byte - padding
108 | CARD16 - number-of-rectangles
109 |
110 | CARD16 - x-position
111 | CARD16 - y-position
112 | CARD16 - width
113 | CARD16 - height
114 | CARD16 - encoding-type:
115 | 0 - raw
116 | 1 - copy rectangle
117 | 2 - RRE
118 | 4 - CoRRE
119 | 5 - hextile
120 |
121 | raw:
122 | - width x height pixel values
123 |
124 | copy rectangle:
125 | CARD16 - src-x-position
126 | CARD16 - src-y-position
127 |
128 | RRE:
129 | CARD32 - N number-of-subrectangles
130 | Nxd bytes - background-pixel-value (d bits-per-pixel)
131 |
132 | ...
133 |
134 | 5.3.2 SetColourMapEntries (no support)
135 | CARD8: 1 - message-type
136 | ...
137 |
138 | 5.3.3 Bell
139 | CARD8: 2 - message-type
140 |
141 | 5.3.4 ServerCutText
142 | CARD8: 3 - message-type
143 |
144 |
145 |
146 |
147 |
148 |
--------------------------------------------------------------------------------
/noVNC/docs/rfbproto-3.3.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/docs/rfbproto-3.3.pdf
--------------------------------------------------------------------------------
/noVNC/docs/rfbproto-3.7.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/docs/rfbproto-3.7.pdf
--------------------------------------------------------------------------------
/noVNC/docs/rfbproto-3.8.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StefanHoutzager/elixir-dev-anywhere-docker/5e7a60988a6d911e4847b709018da1e37f01911d/noVNC/docs/rfbproto-3.8.pdf
--------------------------------------------------------------------------------
/noVNC/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration
2 |
3 | module.exports = function(config) {
4 | const customLaunchers = {};
5 | let browsers = [];
6 | let useSauce = false;
7 | let transpileToES5 = ['internet explorer'].includes(process.env.TEST_BROWSER_NAME);
8 |
9 | // use Sauce when running on Travis
10 | if (process.env.TRAVIS_JOB_NUMBER) {
11 | useSauce = true;
12 | }
13 |
14 | if (useSauce && process.env.TEST_BROWSER_NAME && process.env.TEST_BROWSER_NAME != 'PhantomJS') {
15 | const names = process.env.TEST_BROWSER_NAME.split(',');
16 | const platforms = process.env.TEST_BROWSER_OS.split(',');
17 | const versions = process.env.TEST_BROWSER_VERSION
18 | ? process.env.TEST_BROWSER_VERSION.split(',')
19 | : [null];
20 |
21 | for (let i = 0; i < names.length; i++) {
22 | for (let j = 0; j < platforms.length; j++) {
23 | for (let k = 0; k < versions.length; k++) {
24 | let launcher_name = 'sl_' + platforms[j].replace(/[^a-zA-Z0-9]/g, '') + '_' + names[i];
25 | if (versions[k]) {
26 | launcher_name += '_' + versions[k];
27 | }
28 |
29 | customLaunchers[launcher_name] = {
30 | base: 'SauceLabs',
31 | browserName: names[i],
32 | platform: platforms[j],
33 | };
34 |
35 | if (versions[i]) {
36 | customLaunchers[launcher_name].version = versions[k];
37 | }
38 | }
39 | }
40 | }
41 |
42 | browsers = Object.keys(customLaunchers);
43 | } else {
44 | useSauce = false;
45 | //browsers = ['PhantomJS'];
46 | browsers = [];
47 | }
48 |
49 | const my_conf = {
50 |
51 | // base path that will be used to resolve all patterns (eg. files, exclude)
52 | basePath: '',
53 |
54 | // frameworks to use
55 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
56 | frameworks: ['requirejs', 'mocha', 'chai'],
57 |
58 | // list of files / patterns to load in the browser (loaded in order)
59 | files: [
60 | { pattern: 'vendor/sinon.js', included: false },
61 | { pattern: 'node_modules/sinon-chai/lib/sinon-chai.js', included: false },
62 | { pattern: 'app/localization.js', included: false },
63 | { pattern: 'app/webutil.js', included: false },
64 | { pattern: 'core/**/*.js', included: false },
65 | { pattern: 'vendor/pako/**/*.js', included: false },
66 | { pattern: 'tests/test.*.js', included: false },
67 | { pattern: 'tests/fake.*.js', included: false },
68 | { pattern: 'tests/assertions.js', included: false },
69 | 'tests/karma-test-main.js',
70 | ],
71 |
72 | client: {
73 | mocha: {
74 | // replace Karma debug page with mocha display
75 | 'reporter': 'html',
76 | 'ui': 'bdd'
77 | }
78 | },
79 |
80 | // list of files to exclude
81 | exclude: [
82 | ],
83 |
84 | customLaunchers: customLaunchers,
85 |
86 | // start these browsers
87 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
88 | browsers: browsers,
89 |
90 | // preprocess matching files before serving them to the browser
91 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
92 | preprocessors: {
93 | 'app/localization.js': ['babel'],
94 | 'app/webutil.js': ['babel'],
95 | 'core/**/*.js': ['babel'],
96 | 'tests/test.*.js': ['babel'],
97 | 'tests/fake.*.js': ['babel'],
98 | 'tests/assertions.js': ['babel'],
99 | 'vendor/pako/**/*.js': ['babel'],
100 | },
101 |
102 | babelPreprocessor: {
103 | options: {
104 | presets: transpileToES5 ? ['es2015'] : [],
105 | plugins: ['transform-es2015-modules-amd', 'syntax-dynamic-import'],
106 | sourceMap: 'inline',
107 | },
108 | },
109 |
110 | // test results reporter to use
111 | // possible values: 'dots', 'progress'
112 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter
113 | reporters: ['mocha'],
114 |
115 |
116 | // web server port
117 | port: 9876,
118 |
119 |
120 | // enable / disable colors in the output (reporters and logs)
121 | colors: true,
122 |
123 |
124 | // level of logging
125 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
126 | logLevel: config.LOG_INFO,
127 |
128 |
129 | // enable / disable watching file and executing tests whenever any file changes
130 | autoWatch: false,
131 |
132 | // Continuous Integration mode
133 | // if true, Karma captures browsers, runs the tests and exits
134 | singleRun: true,
135 |
136 | // Increase timeout in case connection is slow/we run more browsers than possible
137 | // (we currently get 3 for free, and we try to run 7, so it can take a while)
138 | captureTimeout: 240000,
139 |
140 | // similarly to above
141 | browserNoActivityTimeout: 100000,
142 | };
143 |
144 | if (useSauce) {
145 | my_conf.reporters.push('saucelabs');
146 | my_conf.captureTimeout = 0; // use SL timeout
147 | my_conf.sauceLabs = {
148 | testName: 'noVNC Tests (all)',
149 | startConnect: false,
150 | tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER
151 | };
152 | }
153 |
154 | config.set(my_conf);
155 | };
156 |
--------------------------------------------------------------------------------
/noVNC/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@novnc/novnc",
3 | "version": "1.0.0",
4 | "description": "An HTML5 VNC client",
5 | "directories": {
6 | "doc": "docs",
7 | "test": "tests"
8 | },
9 | "scripts": {
10 | "lint": "eslint app core po tests utils",
11 | "test": "karma start karma.conf.js",
12 | "prepare": "node ./utils/use_require.js --as commonjs --clean"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/novnc/noVNC.git"
17 | },
18 | "author": "Joel Martin (https://github.com/kanaka)",
19 | "contributors": [
20 | "Solly Ross (https://github.com/directxman12)",
21 | "Peter Åstrand (https://github.com/astrand)",
22 | "Samuel Mannehed (https://github.com/samhed)",
23 | "Pierre Ossman (https://github.com/CendioOssman)"
24 | ],
25 | "license": "MPL-2.0",
26 | "bugs": {
27 | "url": "https://github.com/novnc/noVNC/issues"
28 | },
29 | "homepage": "https://github.com/novnc/noVNC",
30 | "devDependencies": {
31 | "babel-core": "^6.22.1",
32 | "babel-plugin-add-module-exports": "^0.2.1",
33 | "babel-plugin-import-redirect": "*",
34 | "babel-plugin-syntax-dynamic-import": "^6.18.0",
35 | "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
36 | "babel-plugin-transform-es2015-modules-commonjs": "^6.18.0",
37 | "babel-plugin-transform-es2015-modules-systemjs": "^6.22.0",
38 | "babel-plugin-transform-es2015-modules-umd": "^6.22.0",
39 | "babel-preset-es2015": "^6.24.1",
40 | "babelify": "^7.3.0",
41 | "browserify": "^13.1.0",
42 | "chai": "^3.5.0",
43 | "commander": "^2.9.0",
44 | "es-module-loader": "^2.1.0",
45 | "eslint": "^4.16.0",
46 | "fs-extra": "^1.0.0",
47 | "jsdom": "*",
48 | "karma": "^1.3.0",
49 | "karma-babel-preprocessor": "^6.0.1",
50 | "karma-chai": "^0.1.0",
51 | "karma-mocha": "^1.3.0",
52 | "karma-mocha-reporter": "^2.2.0",
53 | "karma-requirejs": "^1.1.0",
54 | "karma-sauce-launcher": "^1.0.0",
55 | "mocha": "^3.1.2",
56 | "node-getopt": "*",
57 | "po2json": "*",
58 | "requirejs": "^2.3.2",
59 | "rollup": "^0.41.4",
60 | "rollup-plugin-node-resolve": "^2.0.0",
61 | "sinon-chai": "^2.8.0"
62 | },
63 | "dependencies": {},
64 | "keywords": [
65 | "vnc",
66 | "rfb",
67 | "novnc",
68 | "websockify"
69 | ]
70 | }
71 |
--------------------------------------------------------------------------------
/noVNC/tests/assertions.js:
--------------------------------------------------------------------------------
1 | // Assertions that make it easier to use sinon
2 | import sinonChai from '../node_modules/sinon-chai/lib/sinon-chai.js';
3 | chai.use(sinonChai);
4 |
5 | // noVNC specific assertions
6 | chai.use(function (_chai, utils) {
7 | _chai.Assertion.addMethod('displayed', function (target_data) {
8 | const obj = this._obj;
9 | const ctx = obj._target.getContext('2d');
10 | const data_cl = ctx.getImageData(0, 0, obj._target.width, obj._target.height).data;
11 | // NB(directxman12): PhantomJS 1.x doesn't implement Uint8ClampedArray, so work around that
12 | const data = new Uint8Array(data_cl);
13 | const len = data_cl.length;
14 | new chai.Assertion(len).to.be.equal(target_data.length, "unexpected display size");
15 | let same = true;
16 | for (let i = 0; i < len; i++) {
17 | if (data[i] != target_data[i]) {
18 | same = false;
19 | break;
20 | }
21 | }
22 | if (!same) {
23 | // eslint-disable-next-line no-console
24 | console.log("expected data: %o, actual data: %o", target_data, data);
25 | }
26 | this.assert(same,
27 | "expected #{this} to have displayed the image #{exp}, but instead it displayed #{act}",
28 | "expected #{this} not to have displayed the image #{act}",
29 | target_data,
30 | data);
31 | });
32 |
33 | _chai.Assertion.addMethod('sent', function (target_data) {
34 | const obj = this._obj;
35 | obj.inspect = function () {
36 | const res = { _websocket: obj._websocket, rQi: obj._rQi, _rQ: new Uint8Array(obj._rQ.buffer, 0, obj._rQlen),
37 | _sQ: new Uint8Array(obj._sQ.buffer, 0, obj._sQlen) };
38 | res.prototype = obj;
39 | return res;
40 | };
41 | const data = obj._websocket._get_sent_data();
42 | let same = true;
43 | if (data.length != target_data.length) {
44 | same = false;
45 | } else {
46 | for (let i = 0; i < data.length; i++) {
47 | if (data[i] != target_data[i]) {
48 | same = false;
49 | break;
50 | }
51 | }
52 | }
53 | if (!same) {
54 | // eslint-disable-next-line no-console
55 | console.log("expected data: %o, actual data: %o", target_data, data);
56 | }
57 | this.assert(same,
58 | "expected #{this} to have sent the data #{exp}, but it actually sent #{act}",
59 | "expected #{this} not to have sent the data #{act}",
60 | Array.prototype.slice.call(target_data),
61 | Array.prototype.slice.call(data));
62 | });
63 |
64 | _chai.Assertion.addProperty('array', function () {
65 | utils.flag(this, 'array', true);
66 | });
67 |
68 | _chai.Assertion.overwriteMethod('equal', function (_super) {
69 | return function assertArrayEqual(target) {
70 | if (utils.flag(this, 'array')) {
71 | const obj = this._obj;
72 |
73 | let same = true;
74 |
75 | if (utils.flag(this, 'deep')) {
76 | for (let i = 0; i < obj.length; i++) {
77 | if (!utils.eql(obj[i], target[i])) {
78 | same = false;
79 | break;
80 | }
81 | }
82 |
83 | this.assert(same,
84 | "expected #{this} to have elements deeply equal to #{exp}",
85 | "expected #{this} not to have elements deeply equal to #{exp}",
86 | Array.prototype.slice.call(target));
87 | } else {
88 | for (let i = 0; i < obj.length; i++) {
89 | if (obj[i] != target[i]) {
90 | same = false;
91 | break;
92 | }
93 | }
94 |
95 | this.assert(same,
96 | "expected #{this} to have elements equal to #{exp}",
97 | "expected #{this} not to have elements equal to #{exp}",
98 | Array.prototype.slice.call(target));
99 | }
100 | } else {
101 | _super.apply(this, arguments);
102 | }
103 | };
104 | });
105 | });
106 |
--------------------------------------------------------------------------------
/noVNC/tests/fake.websocket.js:
--------------------------------------------------------------------------------
1 | import Base64 from '../core/base64.js';
2 |
3 | // PhantomJS can't create Event objects directly, so we need to use this
4 | function make_event(name, props) {
5 | const evt = document.createEvent('Event');
6 | evt.initEvent(name, true, true);
7 | if (props) {
8 | for (let prop in props) {
9 | evt[prop] = props[prop];
10 | }
11 | }
12 | return evt;
13 | }
14 |
15 | export default function FakeWebSocket (uri, protocols) {
16 | this.url = uri;
17 | this.binaryType = "arraybuffer";
18 | this.extensions = "";
19 |
20 | if (!protocols || typeof protocols === 'string') {
21 | this.protocol = protocols;
22 | } else {
23 | this.protocol = protocols[0];
24 | }
25 |
26 | this._send_queue = new Uint8Array(20000);
27 |
28 | this.readyState = FakeWebSocket.CONNECTING;
29 | this.bufferedAmount = 0;
30 |
31 | this.__is_fake = true;
32 | }
33 |
34 | FakeWebSocket.prototype = {
35 | close: function (code, reason) {
36 | this.readyState = FakeWebSocket.CLOSED;
37 | if (this.onclose) {
38 | this.onclose(make_event("close", { 'code': code, 'reason': reason, 'wasClean': true }));
39 | }
40 | },
41 |
42 | send: function (data) {
43 | if (this.protocol == 'base64') {
44 | data = Base64.decode(data);
45 | } else {
46 | data = new Uint8Array(data);
47 | }
48 | this._send_queue.set(data, this.bufferedAmount);
49 | this.bufferedAmount += data.length;
50 | },
51 |
52 | _get_sent_data: function () {
53 | const res = new Uint8Array(this._send_queue.buffer, 0, this.bufferedAmount);
54 | this.bufferedAmount = 0;
55 | return res;
56 | },
57 |
58 | _open: function (data) {
59 | this.readyState = FakeWebSocket.OPEN;
60 | if (this.onopen) {
61 | this.onopen(make_event('open'));
62 | }
63 | },
64 |
65 | _receive_data: function (data) {
66 | this.onmessage(make_event("message", { 'data': data }));
67 | }
68 | };
69 |
70 | FakeWebSocket.OPEN = WebSocket.OPEN;
71 | FakeWebSocket.CONNECTING = WebSocket.CONNECTING;
72 | FakeWebSocket.CLOSING = WebSocket.CLOSING;
73 | FakeWebSocket.CLOSED = WebSocket.CLOSED;
74 |
75 | FakeWebSocket.__is_fake = true;
76 |
77 | FakeWebSocket.replace = function () {
78 | if (!WebSocket.__is_fake) {
79 | const real_version = WebSocket;
80 | // eslint-disable-next-line no-global-assign
81 | WebSocket = FakeWebSocket;
82 | FakeWebSocket.__real_version = real_version;
83 | }
84 | };
85 |
86 | FakeWebSocket.restore = function () {
87 | if (WebSocket.__is_fake) {
88 | // eslint-disable-next-line no-global-assign
89 | WebSocket = WebSocket.__real_version;
90 | }
91 | };
92 |
--------------------------------------------------------------------------------
/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(function () { Base64.decode(B64_STR+'abcdef'); }).to.throw(Error);
31 | });
32 | });
33 | });
34 |
--------------------------------------------------------------------------------
/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 |
6 | import sinon from '../vendor/sinon.js';
7 |
8 | describe('Utils', function() {
9 | "use strict";
10 |
11 | describe('logging functions', function () {
12 | beforeEach(function () {
13 | sinon.spy(console, 'log');
14 | sinon.spy(console, 'debug');
15 | sinon.spy(console, 'warn');
16 | sinon.spy(console, 'error');
17 | sinon.spy(console, 'info');
18 | });
19 |
20 | afterEach(function () {
21 | console.log.restore();
22 | console.debug.restore();
23 | console.warn.restore();
24 | console.error.restore();
25 | console.info.restore();
26 | Log.init_logging();
27 | });
28 |
29 | it('should use noop for levels lower than the min level', function () {
30 | Log.init_logging('warn');
31 | Log.Debug('hi');
32 | Log.Info('hello');
33 | expect(console.log).to.not.have.been.called;
34 | });
35 |
36 | it('should use console.debug for Debug', function () {
37 | Log.init_logging('debug');
38 | Log.Debug('dbg');
39 | expect(console.debug).to.have.been.calledWith('dbg');
40 | });
41 |
42 | it('should use console.info for Info', function () {
43 | Log.init_logging('debug');
44 | Log.Info('inf');
45 | expect(console.info).to.have.been.calledWith('inf');
46 | });
47 |
48 | it('should use console.warn for Warn', function () {
49 | Log.init_logging('warn');
50 | Log.Warn('wrn');
51 | expect(console.warn).to.have.been.called;
52 | expect(console.warn).to.have.been.calledWith('wrn');
53 | });
54 |
55 | it('should use console.error for Error', function () {
56 | Log.init_logging('error');
57 | Log.Error('err');
58 | expect(console.error).to.have.been.called;
59 | expect(console.error).to.have.been.calledWith('err');
60 | });
61 | });
62 |
63 | // TODO(directxman12): test the conf_default and conf_defaults methods
64 | // TODO(directxman12): test decodeUTF8
65 | // TODO(directxman12): test the event methods (addEvent, removeEvent, stopEvent)
66 | // TODO(directxman12): figure out a good way to test getPosition and getEventPosition
67 | // TODO(directxman12): figure out how to test the browser detection functions properly
68 | // (we can't really test them against the browsers, except for Gecko
69 | // via PhantomJS, the default test driver)
70 | });
71 | /* eslint-enable no-console */
72 |
--------------------------------------------------------------------------------
/noVNC/tests/vnc_playback.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | VNC Playback
5 |
6 |
7 |
8 |
9 |
10 | Iterations:
11 | Perftest:
12 | Realtime:
13 |
14 |
15 |
16 |
17 |
18 | Results:
19 |
20 |
21 |
22 |
23 |
30 |
31 |
32 |
33 |
37 |
38 |