commit 712def7a62a0ce0276782131be7df8216efa66d6 Author: Cecylia Bocovich cohosh@torproject.org Date: Thu Apr 16 10:17:31 2020 -0400
Move proxy code to top level directory --- proxy/.eslintignore => .eslintignore | 0 proxy/.eslintrc.json => .eslintrc.json | 0 .gitmodules | 2 +- README.md | 189 ++++++++++----------- proxy/broker.js => broker.js | 0 proxy/config.js => config.js | 0 proxy/init-badge.js => init-badge.js | 0 proxy/init-node.js => init-node.js | 0 proxy/init-testing.js => init-testing.js | 0 proxy/init-webext.js => init-webext.js | 0 proxy/make.js => make.js | 0 proxy/package.json => package.json | 0 proxy/README.md | 143 ---------------- proxy/proxypair.js => proxypair.js | 0 proxy/shims.js => shims.js | 0 proxy/snowflake.js => snowflake.js | 0 {proxy/spec => spec}/broker.spec.js | 0 {proxy/spec => spec}/init.spec.js | 0 {proxy/spec => spec}/proxypair.spec.js | 0 {proxy/spec => spec}/snowflake.spec.js | 0 {proxy/spec => spec}/ui.spec.js | 0 {proxy/spec => spec}/util.spec.js | 0 {proxy/spec => spec}/websocket.spec.js | 0 {proxy/static => static}/.htaccess | 0 {proxy/static => static}/SourceSansPro-Regular.ttf | Bin .../static => static}/_locales/en_US/messages.json | 0 .../assets/arrowhead-right-12.svg | 0 .../assets/arrowhead-right-dark-12.svg | 0 {proxy/static => static}/assets/favicon.ico | Bin .../static => static}/assets/status-off-dark.svg | 0 {proxy/static => static}/assets/status-off.svg | 0 {proxy/static => static}/assets/status-on-dark.svg | 0 {proxy/static => static}/assets/status-on.svg | 0 {proxy/static => static}/assets/status-running.svg | 0 {proxy/static => static}/assets/toolbar-off-48.png | Bin {proxy/static => static}/assets/toolbar-off-96.png | Bin {proxy/static => static}/assets/toolbar-off.ico | Bin {proxy/static => static}/assets/toolbar-off.svg | 0 {proxy/static => static}/assets/toolbar-on-48.png | Bin {proxy/static => static}/assets/toolbar-on-96.png | Bin {proxy/static => static}/assets/toolbar-on.ico | Bin {proxy/static => static}/assets/toolbar-on.svg | 0 .../assets/toolbar-running-48.png | Bin .../assets/toolbar-running-96.png | Bin .../static => static}/assets/toolbar-running.ico | Bin .../static => static}/assets/toolbar-running.svg | 0 {proxy/static => static}/bootstrap.css | 0 {proxy/static => static}/chrome150.jpg | Bin {proxy/static => static}/embed.css | 0 {proxy/static => static}/embed.html | 0 {proxy/static => static}/firefox150.jpg | Bin {proxy/static => static}/index.css | 0 {proxy/static => static}/index.html | 0 {proxy/static => static}/index.js | 0 {proxy/static => static}/popup.js | 0 {proxy/static => static}/screenshot.png | Bin {proxy/static => static}/tor-logo@2x.png | Bin proxy/translation => translation | 0 proxy/ui.js => ui.js | 0 proxy/util.js => util.js | 0 {proxy/webext => webext}/embed.js | 0 {proxy/webext => webext}/manifest.json | 0 proxy/websocket.js => websocket.js | 0 63 files changed, 93 insertions(+), 241 deletions(-)
diff --git a/proxy/.eslintignore b/.eslintignore similarity index 100% rename from proxy/.eslintignore rename to .eslintignore diff --git a/proxy/.eslintrc.json b/.eslintrc.json similarity index 100% rename from proxy/.eslintrc.json rename to .eslintrc.json diff --git a/.gitmodules b/.gitmodules index 5f79304..fe6b18b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "proxy/translation"] - path = proxy/translation + path = translation url = https://git.torproject.org/translation.git branch = snowflakeaddon-messages.json_completed diff --git a/README.md b/README.md index 05fb5f7..33b8738 100644 --- a/README.md +++ b/README.md @@ -1,148 +1,143 @@ -# Snowflake +This is the browser proxy component of Snowflake.
-[![Build Status](https://travis-ci.org/keroserene/snowflake.svg?branch=master)%5D(https://tra...) +### Embedding
-Pluggable Transport using WebRTC, inspired by Flashproxy. - -<!-- START doctoc generated TOC please keep comment here to allow auto update --> -<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> -**Table of Contents** - -- [Usage](#usage) - - [Dependencies](#dependencies) - - [More Info](#more-info) - - [Building](#building) - - [Test Environment](#test-environment) -- [FAQ](#faq) -- [Appendix](#appendix) - - [-- Testing with Standalone Proxy --](#---testing-with-standalone-proxy---) - -<!-- END doctoc generated TOC please keep comment here to allow auto update --> +See https://snowflake.torproject.org/ for more info: +``` +<iframe src="https://snowflake.torproject.org/embed.html" width="88" height="16" frameborder="0" scrolling="no"></iframe> +```
-### Usage +### Building the badge / snowflake.torproject.org
``` -cd client/ -go get -go build -tor -f torrc +npm install +npm run build ``` -This should start the client plugin, bootstrapping to 100% using WebRTC.
-#### Dependencies +which outputs to the `build/` directory.
-Client: -- [pion/webrtc](https://github.com/pion/webrtc) -- Go 1.10+ +### Building the webextension
-Proxy: -- JavaScript - ---- +``` +npm install +npm run webext +```
-#### More Info +and then load the `webext/` directory as an unpacked extension. + * https://developer.mozilla.org/en-US/docs/Tools/about:debugging#Loading_a_tem... + * https://developer.chrome.com/extensions/getstarted#manifest
-Tor can plug in the Snowflake client via a correctly configured `torrc`. -For example: +### Testing
+Unit testing with Jasmine are available with: ``` -ClientTransportPlugin snowflake exec ./client \ --url https://snowflake-broker.azureedge.net/ \ --front ajax.aspnetcdn.com \ --ice stun:stun.l.google.com:19302 --max 3 +npm install +npm test ```
-The flags `-url` and `-front` allow the Snowflake client to speak to the Broker, -in order to get connected with some volunteer's browser proxy. `-ice` is a -comma-separated list of ICE servers, which are required for NAT traversal. +To run locally, start an http server in `build/` and navigate to `/embed.html`.
-For logging, run `tail -F snowflake.log` in a second terminal. +### Preparing to deploy
-You can modify the `torrc` to use your own broker: +Background information: + * https://bugs.torproject.org/23947#comment:8 + * https://help.torproject.org/tsa/doc/static-sites/ + * https://help.torproject.org/tsa/doc/ssh-jump-host/ + +You need to be in LDAP group "snowflake" and have set up an SSH key with your LDAP account. +In your ~/.ssh/config file, you should have something like:
``` -ClientTransportPlugin snowflake exec ./client --meek +Host staticiforme +HostName staticiforme.torproject.org +User <your user name> +ProxyJump people.torproject.org +IdentityFile ~/.ssh/tor ```
- -#### Building - -This describes how to build the in-browser snowflake. For the client, see Usage, -above. - -The client will only work if there are browser snowflakes available. -To run your own: +### Deploying
``` -cd proxy/ +npm install npm run build ```
-Then, start a local http server in the `proxy/build/` in any way you like. -For instance: +Do a "dry run" rsync with `-n` to check that only expected files are being changed. If you don't understand why a file would be updated, you can add the `-i` option to see the reason.
``` -cd build/ -python -m http.server +rsync -n --chown=:snowflake --chmod ug=rw,D+x --perms --delete -crv build/ staticiforme:/srv/snowflake.torproject.org/htdocs/ ```
-Then, open a browser tab to `http://127.0.0.1:8000/embed.html%60 to view -the debug-console of the snowflake., -So long as that tab is open, you are an ephemeral Tor bridge. +If it looks good, then repeat the rsync without `-n`.
+``` +rsync --chown=:snowflake --chmod ug=rw,D+x --perms --delete -crv build/ staticiforme:/srv/snowflake.torproject.org/htdocs/ +```
-#### Test Environment +You can ignore errors of the form `rsync: failed to set permissions on "<dirname>/": Operation not permitted (1)`.
-There is a Docker-based test environment at https://github.com/cohosh/snowbox. +Then run the command to copy the new files to the live web servers:
+``` +ssh staticiforme 'static-update-component snowflake.torproject.org' +```
-### FAQ +### Parameters
-**Q: How does it work?** +With no parameters, +snowflake uses the default relay `snowflake.freehaven.net:443` and +uses automatic signaling with the default broker at +`https://snowflake-broker.freehaven.net/%60.
-In the Tor use-case: +### Reuse as a library
-1. Volunteers visit websites which host the "snowflake" proxy. (just -like flashproxy) -2. Tor clients automatically find available browser proxies via the Broker -(the domain fronted signaling channel). -3. Tor client and browser proxy establish a WebRTC peer connection. -4. Proxy connects to some relay. -5. Tor occurs. +The badge and the webextension make use of the same underlying library and +only differ in their UI. That same library can be produced for use with other +interfaces, such as [Cupcake][1], by running,
-More detailed information about how clients, snowflake proxies, and the Broker -fit together on the way... +``` +npm install +npm run library +```
-**Q: What are the benefits of this PT compared with other PTs?** +which outputs a `./snowflake-library.js`.
-Snowflake combines the advantages of flashproxy and meek. Primarily: +You'd then want to create a subclass of `UI` to perform various actions as +the state of the snowflake changes,
-- It has the convenience of Meek, but can support magnitudes more -users with negligible CDN costs. (Domain fronting is only used for brief -signalling / NAT-piercing to setup the P2P WebRTC DataChannels which handle -the actual traffic.) +``` +class MyUI extends UI { + ... +} +```
-- Arbitrarily high numbers of volunteer proxies are possible like in -flashproxy, but NATs are no longer a usability barrier - no need for -manual port forwarding! +See `WebExtUI` in `init-webext.js` and `BadgeUI` in `init-badge.js` for +examples.
-**Q: Why is this called Snowflake?** +Finally, initialize the snowflake with,
-It utilizes the "ICE" negotiation via WebRTC, and also involves a great -abundance of ephemeral and short-lived (and special!) volunteer proxies... +``` +var log = function(msg) { + return console.log('Snowflake: ' + msg); +}; +var dbg = log;
-### Appendix +var config = new Config("myui"); // NOTE: Set a unique proxy type for metrics +var ui = new MyUI(); // NOTE: Using the class defined above +var broker = new Broker(config.brokerUrl);
-##### -- Testing with Standalone Proxy -- +var snowflake = new Snowflake(config, ui, broker);
+snowflake.setRelayAddr(config.relayAddr); +snowflake.beginWebRTC(); ``` -cd proxy-go -go build -./proxy-go -```
-More documentation on the way. +This minimal setup is pretty much what's currently in `init-node.js`. + +When configuring the snowflake, set a unique `proxyType` (first argument +to `Config`) that will be used when recording metrics at the broker. Also, +it would be helpful to get in touch with the [Anti-Censorship Team][2] at the +Tor Project to let them know about your tool.
-Also available at: -[torproject.org/pluggable-transports/snowflake](https://gitweb.torproject.org/pluggable-transports/snowflake.git/) +[1]: https://chrome.google.com/webstore/detail/cupcake/dajjbehmbnbppjkcnpdkaniapg... +[2]: https://trac.torproject.org/projects/tor/wiki/org/teams/AntiCensorshipTeam diff --git a/proxy/broker.js b/broker.js similarity index 100% rename from proxy/broker.js rename to broker.js diff --git a/proxy/config.js b/config.js similarity index 100% rename from proxy/config.js rename to config.js diff --git a/proxy/init-badge.js b/init-badge.js similarity index 100% rename from proxy/init-badge.js rename to init-badge.js diff --git a/proxy/init-node.js b/init-node.js similarity index 100% rename from proxy/init-node.js rename to init-node.js diff --git a/proxy/init-testing.js b/init-testing.js similarity index 100% rename from proxy/init-testing.js rename to init-testing.js diff --git a/proxy/init-webext.js b/init-webext.js similarity index 100% rename from proxy/init-webext.js rename to init-webext.js diff --git a/proxy/make.js b/make.js similarity index 100% rename from proxy/make.js rename to make.js diff --git a/proxy/package.json b/package.json similarity index 100% rename from proxy/package.json rename to package.json diff --git a/proxy/README.md b/proxy/README.md deleted file mode 100644 index 33b8738..0000000 --- a/proxy/README.md +++ /dev/null @@ -1,143 +0,0 @@ -This is the browser proxy component of Snowflake. - -### Embedding - -See https://snowflake.torproject.org/ for more info: -``` -<iframe src="https://snowflake.torproject.org/embed.html" width="88" height="16" frameborder="0" scrolling="no"></iframe> -``` - -### Building the badge / snowflake.torproject.org - -``` -npm install -npm run build -``` - -which outputs to the `build/` directory. - -### Building the webextension - -``` -npm install -npm run webext -``` - -and then load the `webext/` directory as an unpacked extension. - * https://developer.mozilla.org/en-US/docs/Tools/about:debugging#Loading_a_tem... - * https://developer.chrome.com/extensions/getstarted#manifest - -### Testing - -Unit testing with Jasmine are available with: -``` -npm install -npm test -``` - -To run locally, start an http server in `build/` and navigate to `/embed.html`. - -### Preparing to deploy - -Background information: - * https://bugs.torproject.org/23947#comment:8 - * https://help.torproject.org/tsa/doc/static-sites/ - * https://help.torproject.org/tsa/doc/ssh-jump-host/ - -You need to be in LDAP group "snowflake" and have set up an SSH key with your LDAP account. -In your ~/.ssh/config file, you should have something like: - -``` -Host staticiforme -HostName staticiforme.torproject.org -User <your user name> -ProxyJump people.torproject.org -IdentityFile ~/.ssh/tor -``` - -### Deploying - -``` -npm install -npm run build -``` - -Do a "dry run" rsync with `-n` to check that only expected files are being changed. If you don't understand why a file would be updated, you can add the `-i` option to see the reason. - -``` -rsync -n --chown=:snowflake --chmod ug=rw,D+x --perms --delete -crv build/ staticiforme:/srv/snowflake.torproject.org/htdocs/ -``` - -If it looks good, then repeat the rsync without `-n`. - -``` -rsync --chown=:snowflake --chmod ug=rw,D+x --perms --delete -crv build/ staticiforme:/srv/snowflake.torproject.org/htdocs/ -``` - -You can ignore errors of the form `rsync: failed to set permissions on "<dirname>/": Operation not permitted (1)`. - -Then run the command to copy the new files to the live web servers: - -``` -ssh staticiforme 'static-update-component snowflake.torproject.org' -``` - -### Parameters - -With no parameters, -snowflake uses the default relay `snowflake.freehaven.net:443` and -uses automatic signaling with the default broker at -`https://snowflake-broker.freehaven.net/%60. - -### Reuse as a library - -The badge and the webextension make use of the same underlying library and -only differ in their UI. That same library can be produced for use with other -interfaces, such as [Cupcake][1], by running, - -``` -npm install -npm run library -``` - -which outputs a `./snowflake-library.js`. - -You'd then want to create a subclass of `UI` to perform various actions as -the state of the snowflake changes, - -``` -class MyUI extends UI { - ... -} -``` - -See `WebExtUI` in `init-webext.js` and `BadgeUI` in `init-badge.js` for -examples. - -Finally, initialize the snowflake with, - -``` -var log = function(msg) { - return console.log('Snowflake: ' + msg); -}; -var dbg = log; - -var config = new Config("myui"); // NOTE: Set a unique proxy type for metrics -var ui = new MyUI(); // NOTE: Using the class defined above -var broker = new Broker(config.brokerUrl); - -var snowflake = new Snowflake(config, ui, broker); - -snowflake.setRelayAddr(config.relayAddr); -snowflake.beginWebRTC(); -``` - -This minimal setup is pretty much what's currently in `init-node.js`. - -When configuring the snowflake, set a unique `proxyType` (first argument -to `Config`) that will be used when recording metrics at the broker. Also, -it would be helpful to get in touch with the [Anti-Censorship Team][2] at the -Tor Project to let them know about your tool. - -[1]: https://chrome.google.com/webstore/detail/cupcake/dajjbehmbnbppjkcnpdkaniapg... -[2]: https://trac.torproject.org/projects/tor/wiki/org/teams/AntiCensorshipTeam diff --git a/proxy/proxypair.js b/proxypair.js similarity index 100% rename from proxy/proxypair.js rename to proxypair.js diff --git a/proxy/shims.js b/shims.js similarity index 100% rename from proxy/shims.js rename to shims.js diff --git a/proxy/snowflake.js b/snowflake.js similarity index 100% rename from proxy/snowflake.js rename to snowflake.js diff --git a/proxy/spec/broker.spec.js b/spec/broker.spec.js similarity index 100% rename from proxy/spec/broker.spec.js rename to spec/broker.spec.js diff --git a/proxy/spec/init.spec.js b/spec/init.spec.js similarity index 100% rename from proxy/spec/init.spec.js rename to spec/init.spec.js diff --git a/proxy/spec/proxypair.spec.js b/spec/proxypair.spec.js similarity index 100% rename from proxy/spec/proxypair.spec.js rename to spec/proxypair.spec.js diff --git a/proxy/spec/snowflake.spec.js b/spec/snowflake.spec.js similarity index 100% rename from proxy/spec/snowflake.spec.js rename to spec/snowflake.spec.js diff --git a/proxy/spec/ui.spec.js b/spec/ui.spec.js similarity index 100% rename from proxy/spec/ui.spec.js rename to spec/ui.spec.js diff --git a/proxy/spec/util.spec.js b/spec/util.spec.js similarity index 100% rename from proxy/spec/util.spec.js rename to spec/util.spec.js diff --git a/proxy/spec/websocket.spec.js b/spec/websocket.spec.js similarity index 100% rename from proxy/spec/websocket.spec.js rename to spec/websocket.spec.js diff --git a/proxy/static/.htaccess b/static/.htaccess similarity index 100% rename from proxy/static/.htaccess rename to static/.htaccess diff --git a/proxy/static/SourceSansPro-Regular.ttf b/static/SourceSansPro-Regular.ttf similarity index 100% rename from proxy/static/SourceSansPro-Regular.ttf rename to static/SourceSansPro-Regular.ttf diff --git a/proxy/static/_locales/en_US/messages.json b/static/_locales/en_US/messages.json similarity index 100% rename from proxy/static/_locales/en_US/messages.json rename to static/_locales/en_US/messages.json diff --git a/proxy/static/assets/arrowhead-right-12.svg b/static/assets/arrowhead-right-12.svg similarity index 100% rename from proxy/static/assets/arrowhead-right-12.svg rename to static/assets/arrowhead-right-12.svg diff --git a/proxy/static/assets/arrowhead-right-dark-12.svg b/static/assets/arrowhead-right-dark-12.svg similarity index 100% rename from proxy/static/assets/arrowhead-right-dark-12.svg rename to static/assets/arrowhead-right-dark-12.svg diff --git a/proxy/static/assets/favicon.ico b/static/assets/favicon.ico similarity index 100% rename from proxy/static/assets/favicon.ico rename to static/assets/favicon.ico diff --git a/proxy/static/assets/status-off-dark.svg b/static/assets/status-off-dark.svg similarity index 100% rename from proxy/static/assets/status-off-dark.svg rename to static/assets/status-off-dark.svg diff --git a/proxy/static/assets/status-off.svg b/static/assets/status-off.svg similarity index 100% rename from proxy/static/assets/status-off.svg rename to static/assets/status-off.svg diff --git a/proxy/static/assets/status-on-dark.svg b/static/assets/status-on-dark.svg similarity index 100% rename from proxy/static/assets/status-on-dark.svg rename to static/assets/status-on-dark.svg diff --git a/proxy/static/assets/status-on.svg b/static/assets/status-on.svg similarity index 100% rename from proxy/static/assets/status-on.svg rename to static/assets/status-on.svg diff --git a/proxy/static/assets/status-running.svg b/static/assets/status-running.svg similarity index 100% rename from proxy/static/assets/status-running.svg rename to static/assets/status-running.svg diff --git a/proxy/static/assets/toolbar-off-48.png b/static/assets/toolbar-off-48.png similarity index 100% rename from proxy/static/assets/toolbar-off-48.png rename to static/assets/toolbar-off-48.png diff --git a/proxy/static/assets/toolbar-off-96.png b/static/assets/toolbar-off-96.png similarity index 100% rename from proxy/static/assets/toolbar-off-96.png rename to static/assets/toolbar-off-96.png diff --git a/proxy/static/assets/toolbar-off.ico b/static/assets/toolbar-off.ico similarity index 100% rename from proxy/static/assets/toolbar-off.ico rename to static/assets/toolbar-off.ico diff --git a/proxy/static/assets/toolbar-off.svg b/static/assets/toolbar-off.svg similarity index 100% rename from proxy/static/assets/toolbar-off.svg rename to static/assets/toolbar-off.svg diff --git a/proxy/static/assets/toolbar-on-48.png b/static/assets/toolbar-on-48.png similarity index 100% rename from proxy/static/assets/toolbar-on-48.png rename to static/assets/toolbar-on-48.png diff --git a/proxy/static/assets/toolbar-on-96.png b/static/assets/toolbar-on-96.png similarity index 100% rename from proxy/static/assets/toolbar-on-96.png rename to static/assets/toolbar-on-96.png diff --git a/proxy/static/assets/toolbar-on.ico b/static/assets/toolbar-on.ico similarity index 100% rename from proxy/static/assets/toolbar-on.ico rename to static/assets/toolbar-on.ico diff --git a/proxy/static/assets/toolbar-on.svg b/static/assets/toolbar-on.svg similarity index 100% rename from proxy/static/assets/toolbar-on.svg rename to static/assets/toolbar-on.svg diff --git a/proxy/static/assets/toolbar-running-48.png b/static/assets/toolbar-running-48.png similarity index 100% rename from proxy/static/assets/toolbar-running-48.png rename to static/assets/toolbar-running-48.png diff --git a/proxy/static/assets/toolbar-running-96.png b/static/assets/toolbar-running-96.png similarity index 100% rename from proxy/static/assets/toolbar-running-96.png rename to static/assets/toolbar-running-96.png diff --git a/proxy/static/assets/toolbar-running.ico b/static/assets/toolbar-running.ico similarity index 100% rename from proxy/static/assets/toolbar-running.ico rename to static/assets/toolbar-running.ico diff --git a/proxy/static/assets/toolbar-running.svg b/static/assets/toolbar-running.svg similarity index 100% rename from proxy/static/assets/toolbar-running.svg rename to static/assets/toolbar-running.svg diff --git a/proxy/static/bootstrap.css b/static/bootstrap.css similarity index 100% rename from proxy/static/bootstrap.css rename to static/bootstrap.css diff --git a/proxy/static/chrome150.jpg b/static/chrome150.jpg similarity index 100% rename from proxy/static/chrome150.jpg rename to static/chrome150.jpg diff --git a/proxy/static/embed.css b/static/embed.css similarity index 100% rename from proxy/static/embed.css rename to static/embed.css diff --git a/proxy/static/embed.html b/static/embed.html similarity index 100% rename from proxy/static/embed.html rename to static/embed.html diff --git a/proxy/static/firefox150.jpg b/static/firefox150.jpg similarity index 100% rename from proxy/static/firefox150.jpg rename to static/firefox150.jpg diff --git a/proxy/static/index.css b/static/index.css similarity index 100% rename from proxy/static/index.css rename to static/index.css diff --git a/proxy/static/index.html b/static/index.html similarity index 100% rename from proxy/static/index.html rename to static/index.html diff --git a/proxy/static/index.js b/static/index.js similarity index 100% rename from proxy/static/index.js rename to static/index.js diff --git a/proxy/static/popup.js b/static/popup.js similarity index 100% rename from proxy/static/popup.js rename to static/popup.js diff --git a/proxy/static/screenshot.png b/static/screenshot.png similarity index 100% rename from proxy/static/screenshot.png rename to static/screenshot.png diff --git a/proxy/static/tor-logo@2x.png b/static/tor-logo@2x.png similarity index 100% rename from proxy/static/tor-logo@2x.png rename to static/tor-logo@2x.png diff --git a/proxy/translation b/translation similarity index 100% rename from proxy/translation rename to translation diff --git a/proxy/ui.js b/ui.js similarity index 100% rename from proxy/ui.js rename to ui.js diff --git a/proxy/util.js b/util.js similarity index 100% rename from proxy/util.js rename to util.js diff --git a/proxy/webext/embed.js b/webext/embed.js similarity index 100% rename from proxy/webext/embed.js rename to webext/embed.js diff --git a/proxy/webext/manifest.json b/webext/manifest.json similarity index 100% rename from proxy/webext/manifest.json rename to webext/manifest.json diff --git a/proxy/websocket.js b/websocket.js similarity index 100% rename from proxy/websocket.js rename to websocket.js
tor-commits@lists.torproject.org