From e5d9ec110e65b595e76d4ea7c279f677df2d27f0 Mon Sep 17 00:00:00 2001 From: Myles Horton Date: Mon, 9 Dec 2024 14:29:06 -0700 Subject: [PATCH] Initialize all domain fronting code one time on startup (#1452) * Initialize fronted early using global config * Use new fronting API --- .github/workflows/go.yml | 28 +- .github_changelog_generator | 1 - .gitmodules | 0 CHANGELOG-BEAM.md | 2515 -------------------------------- CHANGELOG.md | 1745 ---------------------- chained/broflake_impl.go | 7 +- chained/broflake_impl_test.go | 46 + chained/https_impl.go | 2 +- chained/proxy.go | 1 - chained/tls_file_cache_test.go | 2 +- chained/tlsmasq_impl.go | 2 +- client/handler.go | 3 +- config/config.go | 127 +- config/config_test.go | 11 +- config/initializer.go | 26 +- dialer/fastconnect.go | 1 - email/email.go | 18 +- email/email_test.go | 57 +- flashlight.go | 354 ++--- go.mod | 23 +- go.sum | 10 +- issue/issue.go | 15 +- issue/issue_test.go | 42 +- kcptun/proxies.yaml | 56 - pro/http.go | 29 - pro/migrate.go | 18 - pro/proxy.go | 22 +- pro/proxy_test.go | 2 +- pro/user_data.go | 8 +- proxied/fronted.go | 24 +- proxied/proxied.go | 110 +- proxied/proxied_test.go | 74 +- services/bypass.go | 4 +- services/config.go | 13 +- 34 files changed, 566 insertions(+), 4830 deletions(-) delete mode 100644 .github_changelog_generator delete mode 100644 .gitmodules delete mode 100644 CHANGELOG-BEAM.md delete mode 100644 CHANGELOG.md delete mode 100644 kcptun/proxies.yaml delete mode 100644 pro/http.go delete mode 100644 pro/migrate.go diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 82996ff13..f4b6239ec 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -3,6 +3,9 @@ name: Build and Test on: push: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + jobs: build: @@ -15,24 +18,17 @@ jobs: uses: actions/setup-go@v5 with: go-version-file: "go.mod" - - name: Set up gotestfmt - uses: gotesttools/gotestfmt-action@v2 - with: - # Optional: pass GITHUB_TOKEN to avoid rate limiting. - token: ${{ secrets.GITHUB_TOKEN }} + - name: Install go go-ctrf-json-reporter + run: go install github.com/ctrf-io/go-ctrf-json-reporter/cmd/go-ctrf-json-reporter@latest - name: Run tests - run: | - set -euo pipefail - go test -json -race -failfast -tags="headless" -coverprofile=profile.cov -v ./... 2>&1 | tee /tmp/gotest.log | gotestfmt -nofail - - # Upload the original go test log as an artifact for later review. - - name: Upload test log - uses: actions/upload-artifact@v3 - if: always() + run: go test -json -race -tags="headless" -coverprofile=profile.cov ./... | go-ctrf-json-reporter -output ctrf-report.json + - name: Upload test results + uses: actions/upload-artifact@v4 with: - name: test-log - path: /tmp/gotest.log - if-no-files-found: error + name: ctrf-report + path: ctrf-report.json + - name: Publish Test Summary Results + run: npx github-actions-ctrf ctrf-report.json - name: Install goveralls run: go install github.com/mattn/goveralls@latest - name: Send coverage diff --git a/.github_changelog_generator b/.github_changelog_generator deleted file mode 100644 index 2117851cc..000000000 --- a/.github_changelog_generator +++ /dev/null @@ -1 +0,0 @@ -exclude-tags-regex=^[0-3]\.\d\.\d+.*|^\D+.* diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 diff --git a/CHANGELOG-BEAM.md b/CHANGELOG-BEAM.md deleted file mode 100644 index 970154d8f..000000000 --- a/CHANGELOG-BEAM.md +++ /dev/null @@ -1,2515 +0,0 @@ - - -## [beam-0.1.19](https://github.com/getlantern/flashlight/compare/beam-0.1.18...beam-0.1.19) - -> 2020-11-26 - - - -## [beam-0.1.18](https://github.com/getlantern/flashlight/compare/lantern-6.2.4...beam-0.1.18) - -> 2020-11-26 - -### Pull Requests - -* Merge pull request [#954](https://github.com/getlantern/flashlight/issues/954) from getlantern/4538-create-cache-dir -* Merge pull request [#955](https://github.com/getlantern/flashlight/issues/955) from getlantern/appdirs-replica - - - -## [lantern-6.2.4](https://github.com/getlantern/flashlight/compare/beam-0.1.17...lantern-6.2.4) - -> 2020-11-25 - -### Pull Requests - -* Merge pull request [#953](https://github.com/getlantern/flashlight/issues/953) from getlantern/typescript-ui-updates -* Merge pull request [#952](https://github.com/getlantern/flashlight/issues/952) from getlantern/4449-report-issue-app-name - - - -## [beam-0.1.17](https://github.com/getlantern/flashlight/compare/beam-0.1.16...beam-0.1.17) - -> 2020-11-25 - - - -## [beam-0.1.16](https://github.com/getlantern/flashlight/compare/lantern-6.2.3...beam-0.1.16) - -> 2020-11-25 - - - -## [lantern-6.2.3](https://github.com/getlantern/flashlight/compare/lantern-6.2.2...lantern-6.2.3) - -> 2020-11-21 - -### Pull Requests - -* Merge pull request [#951](https://github.com/getlantern/flashlight/issues/951) from getlantern/ui-6.2.3 - - - -## [lantern-6.2.2](https://github.com/getlantern/flashlight/compare/beam-0.1.15...lantern-6.2.2) - -> 2020-11-19 - - - -## [beam-0.1.15](https://github.com/getlantern/flashlight/compare/lantern-6.2.1...beam-0.1.15) - -> 2020-11-19 - - - -## [lantern-6.2.1](https://github.com/getlantern/flashlight/compare/lantern-6.2.0...lantern-6.2.1) - -> 2020-11-19 - -### Pull Requests - -* Merge pull request [#950](https://github.com/getlantern/flashlight/issues/950) from getlantern/ui-fix-6.2.1 -* Merge pull request [#948](https://github.com/getlantern/flashlight/issues/948) from getlantern/4453-allow-caching-thumbnail -* Merge pull request [#947](https://github.com/getlantern/flashlight/issues/947) from getlantern/ui-6.2.1 - - - -## [lantern-6.2.0](https://github.com/getlantern/flashlight/compare/lantern-6.1.4...lantern-6.2.0) - -> 2020-11-16 - -### Pull Requests - -* Merge pull request [#946](https://github.com/getlantern/flashlight/issues/946) from getlantern/systray-ts-ui -* Merge pull request [#945](https://github.com/getlantern/flashlight/issues/945) from getlantern/user-agent - - - -## [lantern-6.1.4](https://github.com/getlantern/flashlight/compare/beam-0.1.14...lantern-6.1.4) - -> 2020-11-16 - - - -## [beam-0.1.14](https://github.com/getlantern/flashlight/compare/beam-0.1.13...beam-0.1.14) - -> 2020-11-13 - - - -## [beam-0.1.13](https://github.com/getlantern/flashlight/compare/beam-0.1.12...beam-0.1.13) - -> 2020-11-11 - - - -## [beam-0.1.12](https://github.com/getlantern/flashlight/compare/beam-0.1.11...beam-0.1.12) - -> 2020-11-07 - -### Pull Requests - -* Merge pull request [#941](https://github.com/getlantern/flashlight/issues/941) from getlantern/4403-update-golog - - - -## [beam-0.1.11](https://github.com/getlantern/flashlight/compare/beam-0.1.10...beam-0.1.11) - -> 2020-11-04 - -### Pull Requests - -* Merge pull request [#942](https://github.com/getlantern/flashlight/issues/942) from getlantern/ox/issue4410 -* Merge pull request [#940](https://github.com/getlantern/flashlight/issues/940) from getlantern/harry/make-fix - - - -## [beam-0.1.10](https://github.com/getlantern/flashlight/compare/6.1.0...beam-0.1.10) - -> 2020-11-02 - -### Reverts - -* Update anacrolix/torrent - -### Pull Requests - -* Merge pull request [#939](https://github.com/getlantern/flashlight/issues/939) from getlantern/changlelog-tweaks -* Merge pull request [#938](https://github.com/getlantern/flashlight/issues/938) from getlantern/lantern-ui-6.1.3-2 -* Merge pull request [#937](https://github.com/getlantern/flashlight/issues/937) from getlantern/lantern-ui-6.1.3 -* Merge pull request [#934](https://github.com/getlantern/flashlight/issues/934) from getlantern/revert-932-fix-replica-arbitrary-file-write -* Merge pull request [#933](https://github.com/getlantern/flashlight/issues/933) from getlantern/fix-systray-tooltip -* Merge pull request [#932](https://github.com/getlantern/flashlight/issues/932) from getlantern/fix-replica-arbitrary-file-write -* Merge pull request [#931](https://github.com/getlantern/flashlight/issues/931) from getlantern/upgrade-multipath -* Merge pull request [#930](https://github.com/getlantern/flashlight/issues/930) from getlantern/systray-old-ui -* Merge pull request [#904](https://github.com/getlantern/flashlight/issues/904) from getlantern/quic_18 - - - -## [6.1.0](https://github.com/getlantern/flashlight/compare/6.1.1...6.1.0) - -> 2020-11-02 - - - -## [6.1.1](https://github.com/getlantern/flashlight/compare/6.1.2...6.1.1) - -> 2020-11-02 - - - -## [6.1.2](https://github.com/getlantern/flashlight/compare/6.1.3...6.1.2) - -> 2020-11-02 - - - -## [6.1.3](https://github.com/getlantern/flashlight/compare/lantern-6.1.3...6.1.3) - -> 2020-11-02 - - - -## [lantern-6.1.3](https://github.com/getlantern/flashlight/compare/lantern-6.1.2...lantern-6.1.3) - -> 2020-10-30 - -### Pull Requests - -* Merge pull request [#938](https://github.com/getlantern/flashlight/issues/938) from getlantern/lantern-ui-6.1.3-2 -* Merge pull request [#937](https://github.com/getlantern/flashlight/issues/937) from getlantern/lantern-ui-6.1.3 - - - -## [lantern-6.1.2](https://github.com/getlantern/flashlight/compare/lantern-6.1.1...lantern-6.1.2) - -> 2020-10-28 - -### Reverts - -* Update anacrolix/torrent - -### Pull Requests - -* Merge pull request [#934](https://github.com/getlantern/flashlight/issues/934) from getlantern/revert-932-fix-replica-arbitrary-file-write -* Merge pull request [#933](https://github.com/getlantern/flashlight/issues/933) from getlantern/fix-systray-tooltip -* Merge pull request [#932](https://github.com/getlantern/flashlight/issues/932) from getlantern/fix-replica-arbitrary-file-write - - - -## [lantern-6.1.1](https://github.com/getlantern/flashlight/compare/lantern-6.1.0...lantern-6.1.1) - -> 2020-10-27 - -### Pull Requests - -* Merge pull request [#931](https://github.com/getlantern/flashlight/issues/931) from getlantern/upgrade-multipath -* Merge pull request [#930](https://github.com/getlantern/flashlight/issues/930) from getlantern/systray-old-ui -* Merge pull request [#904](https://github.com/getlantern/flashlight/issues/904) from getlantern/quic_18 - - - -## [lantern-6.1.0](https://github.com/getlantern/flashlight/compare/6.0.11...lantern-6.1.0) - -> 2020-10-24 - -### Pull Requests - -* Merge pull request [#929](https://github.com/getlantern/flashlight/issues/929) from getlantern/lantern-ui-6.1.0 -* Merge pull request [#926](https://github.com/getlantern/flashlight/issues/926) from getlantern/ox/beam-borda-app -* Merge pull request [#925](https://github.com/getlantern/flashlight/issues/925) from getlantern/replica-cors-take2 -* Merge pull request [#927](https://github.com/getlantern/flashlight/issues/927) from getlantern/replica-cors-take2-joesis -* Merge pull request [#924](https://github.com/getlantern/flashlight/issues/924) from getlantern/add-hi-def-beam-icos -* Merge pull request [#923](https://github.com/getlantern/flashlight/issues/923) from getlantern/generate-highres-icons -* Merge pull request [#922](https://github.com/getlantern/flashlight/issues/922) from getlantern/beam-ui-0.1.9 -* Merge pull request [#919](https://github.com/getlantern/flashlight/issues/919) from getlantern/4319-hi-def-windows-icons -* Merge pull request [#921](https://github.com/getlantern/flashlight/issues/921) from getlantern/ox/ipproxy-update -* Merge pull request [#920](https://github.com/getlantern/flashlight/issues/920) from getlantern/beam-ui-0.1.8 -* Merge pull request [#918](https://github.com/getlantern/flashlight/issues/918) from getlantern/beam-ui-0.1.7 -* Merge pull request [#916](https://github.com/getlantern/flashlight/issues/916) from getlantern/beam-ui-0.1.6 -* Merge pull request [#915](https://github.com/getlantern/flashlight/issues/915) from getlantern/beam-ui-0.1.5 -* Merge pull request [#914](https://github.com/getlantern/flashlight/issues/914) from getlantern/update-by-app-name -* Merge pull request [#913](https://github.com/getlantern/flashlight/issues/913) from getlantern/maxb/issue-4267 -* Merge pull request [#912](https://github.com/getlantern/flashlight/issues/912) from getlantern/beam-ui-0.1.4 -* Merge pull request [#911](https://github.com/getlantern/flashlight/issues/911) from getlantern/4277-use-custom-sqlite -* Merge pull request [#908](https://github.com/getlantern/flashlight/issues/908) from getlantern/config-dir-create -* Merge pull request [#903](https://github.com/getlantern/flashlight/issues/903) from getlantern/build-windows -* Merge pull request [#902](https://github.com/getlantern/flashlight/issues/902) from getlantern/feature-by-application -* Merge pull request [#910](https://github.com/getlantern/flashlight/issues/910) from getlantern/harry/4304-simplification -* Merge pull request [#909](https://github.com/getlantern/flashlight/issues/909) from getlantern/beam-ui-0.1.3 -* Merge pull request [#907](https://github.com/getlantern/flashlight/issues/907) from getlantern/4300-autoupdate -* Merge pull request [#905](https://github.com/getlantern/flashlight/issues/905) from getlantern/beam-ui-fixes -* Merge pull request [#900](https://github.com/getlantern/flashlight/issues/900) from getlantern/maxb/replica-flag-fix -* Merge pull request [#901](https://github.com/getlantern/flashlight/issues/901) from getlantern/beam-global-config -* Merge pull request [#899](https://github.com/getlantern/flashlight/issues/899) from getlantern/beam-ui-0.1.0 -* Merge pull request [#898](https://github.com/getlantern/flashlight/issues/898) from getlantern/combine-app-domains -* Merge pull request [#896](https://github.com/getlantern/flashlight/issues/896) from getlantern/beam-tray-icons -* Merge pull request [#893](https://github.com/getlantern/flashlight/issues/893) from getlantern/maxb/tray-quit-translation-fix -* Merge pull request [#897](https://github.com/getlantern/flashlight/issues/897) from getlantern/beam-tray-icons-joesis -* Merge pull request [#895](https://github.com/getlantern/flashlight/issues/895) from getlantern/reliable-ios-test -* Merge pull request [#892](https://github.com/getlantern/flashlight/issues/892) from getlantern/force-proxying-ss7hc6jm.io -* Merge pull request [#891](https://github.com/getlantern/flashlight/issues/891) from getlantern/maxb/fix-translation-string -* Merge pull request [#887](https://github.com/getlantern/flashlight/issues/887) from getlantern/maxb/issue-4250 -* Merge pull request [#890](https://github.com/getlantern/flashlight/issues/890) from getlantern/add-pro-available -* Merge pull request [#889](https://github.com/getlantern/flashlight/issues/889) from getlantern/beam-backend-services -* Merge pull request [#888](https://github.com/getlantern/flashlight/issues/888) from getlantern/ox/logging-test -* Merge pull request [#885](https://github.com/getlantern/flashlight/issues/885) from getlantern/beam-ui-resources - - - -## [6.0.11](https://github.com/getlantern/flashlight/compare/6.0.10...6.0.11) - -> 2020-10-07 - -### Pull Requests - -* Merge pull request [#884](https://github.com/getlantern/flashlight/issues/884) from getlantern/ox/conntrack_build_fix -* Merge pull request [#882](https://github.com/getlantern/flashlight/issues/882) from getlantern/ox/beam -* Merge pull request [#881](https://github.com/getlantern/flashlight/issues/881) from getlantern/ox/dynamicdnsgrab -* Merge pull request [#870](https://github.com/getlantern/flashlight/issues/870) from getlantern/4005-support-multipath -* Merge pull request [#880](https://github.com/getlantern/flashlight/issues/880) from getlantern/ox/issue4121-2 -* Merge pull request [#879](https://github.com/getlantern/flashlight/issues/879) from getlantern/exclude-zero-user-id - - - -## [6.0.10](https://github.com/getlantern/flashlight/compare/6.0.9...6.0.10) - -> 2020-09-18 - -### Pull Requests - -* Merge pull request [#877](https://github.com/getlantern/flashlight/issues/877) from getlantern/maxb/issue-4170 -* Merge pull request [#875](https://github.com/getlantern/flashlight/issues/875) from getlantern/ox/upgrade_netstack -* Merge pull request [#859](https://github.com/getlantern/flashlight/issues/859) from getlantern/ox/issue4121 -* Merge pull request [#868](https://github.com/getlantern/flashlight/issues/868) from getlantern/update-dependencies - - - -## [6.0.9](https://github.com/getlantern/flashlight/compare/6.0.8...6.0.9) - -> 2020-09-10 - - - -## [6.0.8](https://github.com/getlantern/flashlight/compare/6.0.7...6.0.8) - -> 2020-09-09 - -### Pull Requests - -* Merge pull request [#872](https://github.com/getlantern/flashlight/issues/872) from getlantern/ui-translations-fix - - - -## [6.0.7](https://github.com/getlantern/flashlight/compare/6.0.6...6.0.7) - -> 2020-09-08 - -### Pull Requests - -* Merge pull request [#871](https://github.com/getlantern/flashlight/issues/871) from getlantern/ui-version-fix - - - -## [6.0.6](https://github.com/getlantern/flashlight/compare/6.0.5...6.0.6) - -> 2020-09-06 - -### Pull Requests - -* Merge pull request [#869](https://github.com/getlantern/flashlight/issues/869) from getlantern/ui-update-6.0.6 -* Merge pull request [#866](https://github.com/getlantern/flashlight/issues/866) from getlantern/harry/4073-addition -* Merge pull request [#862](https://github.com/getlantern/flashlight/issues/862) from getlantern/harry/4073 -* Merge pull request [#858](https://github.com/getlantern/flashlight/issues/858) from getlantern/psmux -* Merge pull request [#863](https://github.com/getlantern/flashlight/issues/863) from getlantern/ox/issue4126 -* Merge pull request [#861](https://github.com/getlantern/flashlight/issues/861) from getlantern/upgrade-quicwrapper -* Merge pull request [#860](https://github.com/getlantern/flashlight/issues/860) from getlantern/issue-4125 -* Merge pull request [#856](https://github.com/getlantern/flashlight/issues/856) from getlantern/4005-refactor -* Merge pull request [#857](https://github.com/getlantern/flashlight/issues/857) from getlantern/ox/issue4100 -* Merge pull request [#848](https://github.com/getlantern/flashlight/issues/848) from getlantern/replica-testing - - - -## [6.0.5](https://github.com/getlantern/flashlight/compare/6.0.4...6.0.5) - -> 2020-08-21 - -### Pull Requests - -* Merge pull request [#852](https://github.com/getlantern/flashlight/issues/852) from getlantern/ox/mitm_chinese_browsers -* Merge pull request [#854](https://github.com/getlantern/flashlight/issues/854) from getlantern/genconfig-no-fatal - - - -## [6.0.4](https://github.com/getlantern/flashlight/compare/6.0.3...6.0.4) - -> 2020-08-13 - -### Pull Requests - -* Merge pull request [#851](https://github.com/getlantern/flashlight/issues/851) from getlantern/fixed-vertical-cn - - - -## [6.0.3](https://github.com/getlantern/flashlight/compare/6.0.2...6.0.3) - -> 2020-08-12 - -### Pull Requests - -* Merge pull request [#850](https://github.com/getlantern/flashlight/issues/850) from getlantern/ui-hotfix - - - -## [6.0.2](https://github.com/getlantern/flashlight/compare/6.0.1...6.0.2) - -> 2020-08-11 - -### Pull Requests - -* Merge pull request [#849](https://github.com/getlantern/flashlight/issues/849) from getlantern/ui-display-version - - - -## [6.0.1](https://github.com/getlantern/flashlight/compare/6.0.0...6.0.1) - -> 2020-08-08 - -### Pull Requests - -* Merge pull request [#846](https://github.com/getlantern/flashlight/issues/846) from getlantern/ui-features-survey -* Merge pull request [#844](https://github.com/getlantern/flashlight/issues/844) from getlantern/ox/issue4013 - - - -## [6.0.0](https://github.com/getlantern/flashlight/compare/5.10.0...6.0.0) - -> 2020-07-30 - -### Pull Requests - -* Merge pull request [#686](https://github.com/getlantern/flashlight/issues/686) from getlantern/replica -* Merge pull request [#838](https://github.com/getlantern/flashlight/issues/838) from getlantern/maxb/merge-devel -* Merge pull request [#836](https://github.com/getlantern/flashlight/issues/836) from getlantern/maxb/pull-prod-ui -* Merge pull request [#834](https://github.com/getlantern/flashlight/issues/834) from getlantern/replica-no-plaintext -* Merge pull request [#831](https://github.com/getlantern/flashlight/issues/831) from getlantern/bucket-config -* Merge pull request [#820](https://github.com/getlantern/flashlight/issues/820) from getlantern/configure-http-client -* Merge pull request [#819](https://github.com/getlantern/flashlight/issues/819) from getlantern/bcm/allow-options-take2 -* Merge pull request [#818](https://github.com/getlantern/flashlight/issues/818) from getlantern/bcm/allow-options -* Merge pull request [#814](https://github.com/getlantern/flashlight/issues/814) from getlantern/explicit-s3-torrenting -* Merge pull request [#812](https://github.com/getlantern/flashlight/issues/812) from getlantern/replica-merge-from-devel -* Merge pull request [#808](https://github.com/getlantern/flashlight/issues/808) from getlantern/maxb/merge-devel-replica -* Merge pull request [#800](https://github.com/getlantern/flashlight/issues/800) from getlantern/maxb/fix-replica-api-paths -* Merge pull request [#795](https://github.com/getlantern/flashlight/issues/795) from getlantern/features-enable-replica -* Merge pull request [#785](https://github.com/getlantern/flashlight/issues/785) from getlantern/3440-replica-as-feature -* Merge pull request [#787](https://github.com/getlantern/flashlight/issues/787) from getlantern/myles-replica-as-feature -* Merge pull request [#784](https://github.com/getlantern/flashlight/issues/784) from getlantern/fix-filenames -* Merge pull request [#786](https://github.com/getlantern/flashlight/issues/786) from getlantern/merge-master -* Merge pull request [#783](https://github.com/getlantern/flashlight/issues/783) from getlantern/maxb/replica-download-url-fix -* Merge pull request [#776](https://github.com/getlantern/flashlight/issues/776) from getlantern/maxb/replica-camelCase -* Merge pull request [#766](https://github.com/getlantern/flashlight/issues/766) from getlantern/replica-ui-refactor -* Merge pull request [#754](https://github.com/getlantern/flashlight/issues/754) from getlantern/replica-retry-bind - - - -## [5.10.0](https://github.com/getlantern/flashlight/compare/5.9.19...5.10.0) - -> 2020-07-20 - - - -## [5.9.19](https://github.com/getlantern/flashlight/compare/5.9.18...5.9.19) - -> 2020-07-14 - - - -## [5.9.18](https://github.com/getlantern/flashlight/compare/5.9.17...5.9.18) - -> 2020-07-09 - -### Pull Requests - -* Merge pull request [#840](https://github.com/getlantern/flashlight/issues/840) from getlantern/quic-hotfix - - - -## [5.9.17](https://github.com/getlantern/flashlight/compare/5.9.16...5.9.17) - -> 2020-07-08 - -### Pull Requests - -* Merge pull request [#839](https://github.com/getlantern/flashlight/issues/839) from getlantern/3906-include-utls-fix -* Merge pull request [#837](https://github.com/getlantern/flashlight/issues/837) from getlantern/maxb/issue-3907 -* Merge pull request [#835](https://github.com/getlantern/flashlight/issues/835) from getlantern/3894-ga-regularly - - - -## [5.9.16](https://github.com/getlantern/flashlight/compare/5.9.15...5.9.16) - -> 2020-07-02 - -### Pull Requests - -* Merge pull request [#833](https://github.com/getlantern/flashlight/issues/833) from getlantern/ox/proxybench-id3 - - - -## [5.9.15](https://github.com/getlantern/flashlight/compare/5.9.14...5.9.15) - -> 2020-06-23 - - - -## [5.9.14](https://github.com/getlantern/flashlight/compare/5.9.13...5.9.14) - -> 2020-06-15 - -### Pull Requests - -* Merge pull request [#830](https://github.com/getlantern/flashlight/issues/830) from getlantern/harry/tlsmasq-test-fix - - - -## [5.9.13](https://github.com/getlantern/flashlight/compare/5.9.12...5.9.13) - -> 2020-06-11 - -### Pull Requests - -* Merge pull request [#829](https://github.com/getlantern/flashlight/issues/829) from getlantern/systray-osx-crash - - - -## [5.9.12](https://github.com/getlantern/flashlight/compare/5.9.11...5.9.12) - -> 2020-06-09 - -### Pull Requests - -* Merge pull request [#827](https://github.com/getlantern/flashlight/issues/827) from getlantern/update-utls-chrome-auto -* Merge pull request [#828](https://github.com/getlantern/flashlight/issues/828) from getlantern/maxb/chromeextensiontest-fix - - - -## [5.9.11](https://github.com/getlantern/flashlight/compare/5.9.10...5.9.11) - -> 2020-06-05 - - - -## [5.9.10](https://github.com/getlantern/flashlight/compare/5.9.9...5.9.10) - -> 2020-06-02 - -### Pull Requests - -* Merge pull request [#825](https://github.com/getlantern/flashlight/issues/825) from getlantern/harry/3795 - - - -## [5.9.9](https://github.com/getlantern/flashlight/compare/5.9.8...5.9.9) - -> 2020-06-02 - -### Pull Requests - -* Merge pull request [#823](https://github.com/getlantern/flashlight/issues/823) from getlantern/update-utls -* Merge pull request [#822](https://github.com/getlantern/flashlight/issues/822) from getlantern/wss_ips -* Merge pull request [#821](https://github.com/getlantern/flashlight/issues/821) from getlantern/harry/3780 -* Merge pull request [#815](https://github.com/getlantern/flashlight/issues/815) from getlantern/3655-fix-timer -* Merge pull request [#817](https://github.com/getlantern/flashlight/issues/817) from getlantern/ox/borda-privacy -* Merge pull request [#816](https://github.com/getlantern/flashlight/issues/816) from getlantern/3679-systray -* Merge pull request [#810](https://github.com/getlantern/flashlight/issues/810) from getlantern/ox/issue3604 - - - -## [5.9.8](https://github.com/getlantern/flashlight/compare/5.9.7...5.9.8) - -> 2020-05-12 - -### Pull Requests - -* Merge pull request [#811](https://github.com/getlantern/flashlight/issues/811) from getlantern/ox/issue3702 -* Merge pull request [#809](https://github.com/getlantern/flashlight/issues/809) from getlantern/maxb/issue-3666 -* Merge pull request [#807](https://github.com/getlantern/flashlight/issues/807) from getlantern/3607-initialization-timeout - - - -## [5.9.7](https://github.com/getlantern/flashlight/compare/5.9.6...5.9.7) - -> 2020-04-29 - -### Pull Requests - -* Merge pull request [#806](https://github.com/getlantern/flashlight/issues/806) from getlantern/maxb/sentry-reporting-fix - - - -## [5.9.6](https://github.com/getlantern/flashlight/compare/5.9.5...5.9.6) - -> 2020-04-29 - -### Pull Requests - -* Merge pull request [#805](https://github.com/getlantern/flashlight/issues/805) from getlantern/3654-update-borda -* Merge pull request [#804](https://github.com/getlantern/flashlight/issues/804) from getlantern/ox/issue3638 -* Merge pull request [#801](https://github.com/getlantern/flashlight/issues/801) from getlantern/3579-iran-block - - - -## [5.9.5](https://github.com/getlantern/flashlight/compare/5.9.4...5.9.5) - -> 2020-04-24 - -### Pull Requests - -* Merge pull request [#803](https://github.com/getlantern/flashlight/issues/803) from getlantern/maxb/issue-3651 -* Merge pull request [#802](https://github.com/getlantern/flashlight/issues/802) from getlantern/uiserver-on-chan -* Merge pull request [#797](https://github.com/getlantern/flashlight/issues/797) from getlantern/ox/hardcodedproxies - - - -## [5.9.4](https://github.com/getlantern/flashlight/compare/5.9.3...5.9.4) - -> 2020-04-20 - -### Pull Requests - -* Merge pull request [#798](https://github.com/getlantern/flashlight/issues/798) from getlantern/systray-nil-pointer -* Merge pull request [#796](https://github.com/getlantern/flashlight/issues/796) from getlantern/3603-cmux - - - -## [5.9.3](https://github.com/getlantern/flashlight/compare/5.9.2...5.9.3) - -> 2020-04-16 - -### Pull Requests - -* Merge pull request [#788](https://github.com/getlantern/flashlight/issues/788) from getlantern/ox/issue3326 -* Merge pull request [#794](https://github.com/getlantern/flashlight/issues/794) from getlantern/ox/issue3582 - - - -## [5.9.2](https://github.com/getlantern/flashlight/compare/5.9.1...5.9.2) - -> 2020-04-15 - -### Reverts - -* Add duplicate and missing field checks to config checker - -### Pull Requests - -* Merge pull request [#793](https://github.com/getlantern/flashlight/issues/793) from getlantern/maxb/issue-3584 -* Merge pull request [#791](https://github.com/getlantern/flashlight/issues/791) from getlantern/ox/whitelistonly -* Merge pull request [#790](https://github.com/getlantern/flashlight/issues/790) from getlantern/harry/config-validator-update -* Merge pull request [#789](https://github.com/getlantern/flashlight/issues/789) from getlantern/ox/yamlvalidate - - - -## [5.9.1](https://github.com/getlantern/flashlight/compare/5.9.0...5.9.1) - -> 2020-04-07 - -### Pull Requests - -* Merge pull request [#782](https://github.com/getlantern/flashlight/issues/782) from getlantern/3551-active-probing - - - -## [5.9.0](https://github.com/getlantern/flashlight/compare/5.8.6...5.9.0) - -> 2020-04-03 - -### Pull Requests - -* Merge pull request [#777](https://github.com/getlantern/flashlight/issues/777) from getlantern/ox/precise_stealth -* Merge pull request [#779](https://github.com/getlantern/flashlight/issues/779) from getlantern/ox/issue3532 -* Merge pull request [#778](https://github.com/getlantern/flashlight/issues/778) from getlantern/chrome-extension-too-many-files -* Merge pull request [#775](https://github.com/getlantern/flashlight/issues/775) from getlantern/ox/ios-proxystats - - - -## [5.8.6](https://github.com/getlantern/flashlight/compare/5.8.5...5.8.6) - -> 2020-03-17 - -### Pull Requests - -* Merge pull request [#774](https://github.com/getlantern/flashlight/issues/774) from getlantern/harry/tlsmasq-1-3-ciphers - - - -## [5.8.5](https://github.com/getlantern/flashlight/compare/5.8.4...5.8.5) - -> 2020-03-16 - -### Pull Requests - -* Merge pull request [#773](https://github.com/getlantern/flashlight/issues/773) from getlantern/3455-check-nil-session-ticket -* Merge pull request [#772](https://github.com/getlantern/flashlight/issues/772) from getlantern/maxb/update-systray -* Merge pull request [#768](https://github.com/getlantern/flashlight/issues/768) from getlantern/3363-features -* Merge pull request [#769](https://github.com/getlantern/flashlight/issues/769) from getlantern/build-all-tests -* Merge pull request [#760](https://github.com/getlantern/flashlight/issues/760) from getlantern/harry/expiring-session-tickets -* Merge pull request [#770](https://github.com/getlantern/flashlight/issues/770) from getlantern/ox/expiring-session-tickets -* Merge pull request [#765](https://github.com/getlantern/flashlight/issues/765) from getlantern/ox/issue3410 - - - -## [5.8.4](https://github.com/getlantern/flashlight/compare/5.8.3...5.8.4) - -> 2020-03-06 - -### Pull Requests - -* Merge pull request [#767](https://github.com/getlantern/flashlight/issues/767) from getlantern/3396-disable-chrome-extension -* Merge pull request [#764](https://github.com/getlantern/flashlight/issues/764) from getlantern/maxb/sentry-report-osversion -* Merge pull request [#734](https://github.com/getlantern/flashlight/issues/734) from getlantern/harry/tlsmasq-integration -* Merge pull request [#758](https://github.com/getlantern/flashlight/issues/758) from getlantern/maxb/issue-3325 - - - -## [5.8.3](https://github.com/getlantern/flashlight/compare/5.8.2...5.8.3) - -> 2020-02-12 - -### Pull Requests - -* Merge pull request [#757](https://github.com/getlantern/flashlight/issues/757) from getlantern/concurrent-session-states -* Merge pull request [#756](https://github.com/getlantern/flashlight/issues/756) from getlantern/lock-session-states -* Merge pull request [#755](https://github.com/getlantern/flashlight/issues/755) from getlantern/exit-on-existing - - - -## [5.8.2](https://github.com/getlantern/flashlight/compare/5.8.1...5.8.2) - -> 2020-02-11 - -### Pull Requests - -* Merge pull request [#753](https://github.com/getlantern/flashlight/issues/753) from getlantern/ox/issue3329 -* Merge pull request [#752](https://github.com/getlantern/flashlight/issues/752) from getlantern/sentry-0.5.1 - - - -## [5.8.1](https://github.com/getlantern/flashlight/compare/5.8.0...5.8.1) - -> 2020-02-07 - -### Pull Requests - -* Merge pull request [#751](https://github.com/getlantern/flashlight/issues/751) from getlantern/disable-chrome-extension -* Merge pull request [#750](https://github.com/getlantern/flashlight/issues/750) from getlantern/1.13.7-mod-tidy - - - -## [5.8.0](https://github.com/getlantern/flashlight/compare/5.7.2...5.8.0) - -> 2020-02-07 - -### Pull Requests - -* Merge pull request [#749](https://github.com/getlantern/flashlight/issues/749) from getlantern/changelog-tag-excludes -* Merge pull request [#715](https://github.com/getlantern/flashlight/issues/715) from getlantern/wss_fake_sni -* Merge pull request [#748](https://github.com/getlantern/flashlight/issues/748) from getlantern/maxb/sentry-reporting-panic -* Merge pull request [#747](https://github.com/getlantern/flashlight/issues/747) from getlantern/ox/issue3304 -* Merge pull request [#746](https://github.com/getlantern/flashlight/issues/746) from getlantern/switch-back-to-upstream-smux -* Merge pull request [#744](https://github.com/getlantern/flashlight/issues/744) from getlantern/ox/ioscrashfix -* Merge pull request [#743](https://github.com/getlantern/flashlight/issues/743) from getlantern/ox/back_to_free -* Merge pull request [#729](https://github.com/getlantern/flashlight/issues/729) from getlantern/quic_wg24 -* Merge pull request [#742](https://github.com/getlantern/flashlight/issues/742) from getlantern/exit-cleanup -* Merge pull request [#741](https://github.com/getlantern/flashlight/issues/741) from getlantern/3247-update-cmux -* Merge pull request [#738](https://github.com/getlantern/flashlight/issues/738) from getlantern/3257-override-shortcut-resolver -* Merge pull request [#739](https://github.com/getlantern/flashlight/issues/739) from getlantern/gen-from-geolite2 -* Merge pull request [#737](https://github.com/getlantern/flashlight/issues/737) from getlantern/3247-smux-fix -* Merge pull request [#735](https://github.com/getlantern/flashlight/issues/735) from getlantern/ox/moreiospro -* Merge pull request [#730](https://github.com/getlantern/flashlight/issues/730) from getlantern/install-chrome-extension -* Merge pull request [#733](https://github.com/getlantern/flashlight/issues/733) from getlantern/ox/iosmemory -* Merge pull request [#732](https://github.com/getlantern/flashlight/issues/732) from getlantern/ox/utp_ios -* Merge pull request [#731](https://github.com/getlantern/flashlight/issues/731) from getlantern/ox/issue3202 -* Merge pull request [#727](https://github.com/getlantern/flashlight/issues/727) from getlantern/chrome-extension-settings -* Merge pull request [#726](https://github.com/getlantern/flashlight/issues/726) from getlantern/maxb/issue2111 -* Merge pull request [#725](https://github.com/getlantern/flashlight/issues/725) from getlantern/allow-ssh-port -* Merge pull request [#721](https://github.com/getlantern/flashlight/issues/721) from getlantern/3178-grayscale-release -* Merge pull request [#723](https://github.com/getlantern/flashlight/issues/723) from getlantern/3180-initialize-option -* Merge pull request [#724](https://github.com/getlantern/flashlight/issues/724) from getlantern/goprivate -* Merge pull request [#722](https://github.com/getlantern/flashlight/issues/722) from getlantern/ox/issue3201 -* Merge pull request [#719](https://github.com/getlantern/flashlight/issues/719) from getlantern/upgrade-go-ping -* Merge pull request [#720](https://github.com/getlantern/flashlight/issues/720) from getlantern/ox/update-dnsgrab -* Merge pull request [#718](https://github.com/getlantern/flashlight/issues/718) from getlantern/update-detour -* Merge pull request [#716](https://github.com/getlantern/flashlight/issues/716) from getlantern/ox/update-netstack -* Merge pull request [#717](https://github.com/getlantern/flashlight/issues/717) from getlantern/3181-systray-update -* Merge pull request [#714](https://github.com/getlantern/flashlight/issues/714) from getlantern/ox/issue3158 - - - -## [5.7.2](https://github.com/getlantern/flashlight/compare/5.7.1...5.7.2) - -> 2019-12-12 - - - -## [5.7.1](https://github.com/getlantern/flashlight/compare/5.7.0...5.7.1) - -> 2019-12-04 - - - -## [5.7.0](https://github.com/getlantern/flashlight/compare/5.6.4...5.7.0) - -> 2019-12-03 - -### Pull Requests - -* Merge pull request [#713](https://github.com/getlantern/flashlight/issues/713) from getlantern/disable-packet-capture -* Merge pull request [#712](https://github.com/getlantern/flashlight/issues/712) from getlantern/disable-packet-capture -* Merge pull request [#711](https://github.com/getlantern/flashlight/issues/711) from getlantern/ox/windows-gui-performance-tweak -* Merge pull request [#709](https://github.com/getlantern/flashlight/issues/709) from getlantern/ox/issue3108 -* Merge pull request [#708](https://github.com/getlantern/flashlight/issues/708) from getlantern/ox/force-config-country-mobile -* Merge pull request [#679](https://github.com/getlantern/flashlight/issues/679) from getlantern/ox/issue452 -* Merge pull request [#682](https://github.com/getlantern/flashlight/issues/682) from getlantern/harry/2485-capture-all-the-time -* Merge pull request [#707](https://github.com/getlantern/flashlight/issues/707) from getlantern/ox/issue3068 -* Merge pull request [#706](https://github.com/getlantern/flashlight/issues/706) from getlantern/close-hasSucceedingDialer - - - -## [5.6.4](https://github.com/getlantern/flashlight/compare/5.6.3...5.6.4) - -> 2019-10-29 - -### Pull Requests - -* Merge pull request [#705](https://github.com/getlantern/flashlight/issues/705) from getlantern/myleshorton-global-test -* Merge pull request [#704](https://github.com/getlantern/flashlight/issues/704) from getlantern/embedded-global-test -* Merge pull request [#702](https://github.com/getlantern/flashlight/issues/702) from getlantern/update-global-config -* Merge pull request [#703](https://github.com/getlantern/flashlight/issues/703) from getlantern/3083-config-test - - - -## [5.6.3](https://github.com/getlantern/flashlight/compare/5.6.2...5.6.3) - -> 2019-10-28 - -### Pull Requests - -* Merge pull request [#700](https://github.com/getlantern/flashlight/issues/700) from getlantern/proxy-connection-again -* Merge pull request [#701](https://github.com/getlantern/flashlight/issues/701) from getlantern/2986-more-ci-fixes -* Merge pull request [#699](https://github.com/getlantern/flashlight/issues/699) from getlantern/ci-fixes - - - -## [5.6.2](https://github.com/getlantern/flashlight/compare/5.6.1...5.6.2) - -> 2019-10-21 - -### Pull Requests - -* Merge pull request [#698](https://github.com/getlantern/flashlight/issues/698) from getlantern/fix-direct-headers - - - -## [5.6.1](https://github.com/getlantern/flashlight/compare/5.6.0...5.6.1) - -> 2019-10-18 - -### Reverts - -* Simpler fix for not sending version header to origin sites - -### Pull Requests - -* Merge pull request [#697](https://github.com/getlantern/flashlight/issues/697) from getlantern/ui-fixed-recovery -* Merge pull request [#696](https://github.com/getlantern/flashlight/issues/696) from getlantern/ox/more-version-header-fixes - - - -## [5.6.0](https://github.com/getlantern/flashlight/compare/5.5.8...5.6.0) - -> 2019-10-17 - -### Reverts - -* Merge pull request [#690](https://github.com/getlantern/flashlight/issues/690) from getlantern/1920-lantern-headers - -### Pull Requests - -* Merge pull request [#695](https://github.com/getlantern/flashlight/issues/695) from getlantern/modern-go-deps -* Merge pull request [#694](https://github.com/getlantern/flashlight/issues/694) from getlantern/server-sets-trusted -* Merge pull request [#693](https://github.com/getlantern/flashlight/issues/693) from getlantern/ox/issue1920 -* Merge pull request [#692](https://github.com/getlantern/flashlight/issues/692) from getlantern/ox/commonconfig -* Merge pull request [#691](https://github.com/getlantern/flashlight/issues/691) from getlantern/latest-proxy -* Merge pull request [#690](https://github.com/getlantern/flashlight/issues/690) from getlantern/1920-lantern-headers -* Merge pull request [#689](https://github.com/getlantern/flashlight/issues/689) from getlantern/ox/issue1558 -* Merge pull request [#687](https://github.com/getlantern/flashlight/issues/687) from getlantern/ox/issue3022 -* Merge pull request [#688](https://github.com/getlantern/flashlight/issues/688) from getlantern/ox/ping-on-autoreport -* Merge pull request [#684](https://github.com/getlantern/flashlight/issues/684) from getlantern/update-utls -* Merge pull request [#681](https://github.com/getlantern/flashlight/issues/681) from getlantern/hit-multiple-proxy -* Merge pull request [#680](https://github.com/getlantern/flashlight/issues/680) from getlantern/quic_fake_sni - - - -## [5.5.8](https://github.com/getlantern/flashlight/compare/5.5.7...5.5.8) - -> 2019-09-24 - -### Pull Requests - -* Merge pull request [#676](https://github.com/getlantern/flashlight/issues/676) from getlantern/no-embedded-proxies -* Merge pull request [#677](https://github.com/getlantern/flashlight/issues/677) from getlantern/goroutines-800 - - - -## [5.5.7](https://github.com/getlantern/flashlight/compare/5.5.6...5.5.7) - -> 2019-09-19 - -### Pull Requests - -* Merge pull request [#675](https://github.com/getlantern/flashlight/issues/675) from getlantern/ox/ping -* Merge pull request [#673](https://github.com/getlantern/flashlight/issues/673) from getlantern/ox/percentilefix -* Merge pull request [#650](https://github.com/getlantern/flashlight/issues/650) from getlantern/bcm/email-reportissue-screenshot -* Merge pull request [#674](https://github.com/getlantern/flashlight/issues/674) from getlantern/2986-check-ci-failure -* Merge pull request [#670](https://github.com/getlantern/flashlight/issues/670) from getlantern/go1.13-timestamps -* Merge pull request [#668](https://github.com/getlantern/flashlight/issues/668) from getlantern/bcm/update-apache-thrift -* Merge pull request [#666](https://github.com/getlantern/flashlight/issues/666) from getlantern/2554-write-log-in-parent -* Merge pull request [#667](https://github.com/getlantern/flashlight/issues/667) from getlantern/2554-restart-on-unresponsive -* Merge pull request [#663](https://github.com/getlantern/flashlight/issues/663) from getlantern/ox/nostagingconfig - - - -## [5.5.6](https://github.com/getlantern/flashlight/compare/5.5.5...5.5.6) - -> 2019-08-31 - - - -## [5.5.5](https://github.com/getlantern/flashlight/compare/5.5.4...5.5.5) - -> 2019-08-27 - - - -## [5.5.4](https://github.com/getlantern/flashlight/compare/5.5.3...5.5.4) - -> 2019-08-23 - -### Pull Requests - -* Merge pull request [#662](https://github.com/getlantern/flashlight/issues/662) from getlantern/2929-redial-session-in-quicwrapper -* Merge pull request [#661](https://github.com/getlantern/flashlight/issues/661) from getlantern/issue_2962 -* Merge pull request [#660](https://github.com/getlantern/flashlight/issues/660) from getlantern/wss_validate -* Merge pull request [#658](https://github.com/getlantern/flashlight/issues/658) from getlantern/log-session-keys -* Merge pull request [#651](https://github.com/getlantern/flashlight/issues/651) from getlantern/hit-proxy-direct - - - -## [5.5.3](https://github.com/getlantern/flashlight/compare/5.5.2...5.5.3) - -> 2019-08-21 - -### Pull Requests - -* Merge pull request [#659](https://github.com/getlantern/flashlight/issues/659) from getlantern/ui-update-5.5.3 -* Merge pull request [#653](https://github.com/getlantern/flashlight/issues/653) from getlantern/oquic - - - -## [5.5.2](https://github.com/getlantern/flashlight/compare/5.5.1...5.5.2) - -> 2019-08-21 - -### Pull Requests - -* Merge pull request [#657](https://github.com/getlantern/flashlight/issues/657) from getlantern/harry/expose-proxies -* Merge pull request [#655](https://github.com/getlantern/flashlight/issues/655) from getlantern/harry/add-diagnostics -* Merge pull request [#656](https://github.com/getlantern/flashlight/issues/656) from getlantern/tom/logProxies -* Merge pull request [#654](https://github.com/getlantern/flashlight/issues/654) from getlantern/ox/issue2282-configurable -* Merge pull request [#652](https://github.com/getlantern/flashlight/issues/652) from getlantern/2939-golog-use-prefixer -* Merge pull request [#649](https://github.com/getlantern/flashlight/issues/649) from getlantern/tom/logFix -* Merge pull request [#648](https://github.com/getlantern/flashlight/issues/648) from getlantern/run-as-cache - - - -## [5.5.1](https://github.com/getlantern/flashlight/compare/5.5.0...5.5.1) - -> 2019-07-30 - -### Pull Requests - -* Merge pull request [#646](https://github.com/getlantern/flashlight/issues/646) from getlantern/2926-ctx-fixes -* Merge pull request [#645](https://github.com/getlantern/flashlight/issues/645) from getlantern/ox/runasimprovements -* Merge pull request [#644](https://github.com/getlantern/flashlight/issues/644) from getlantern/2788-update-quicwrapper -* Merge pull request [#643](https://github.com/getlantern/flashlight/issues/643) from getlantern/ox/issue2914 -* Merge pull request [#642](https://github.com/getlantern/flashlight/issues/642) from getlantern/2913-run-on-behalf-of-user -* Merge pull request [#641](https://github.com/getlantern/flashlight/issues/641) from getlantern/smux-v1.3.4 -* Merge pull request [#640](https://github.com/getlantern/flashlight/issues/640) from getlantern/smux-mem-usage - - - -## [5.5.0](https://github.com/getlantern/flashlight/compare/5.4.7...5.5.0) - -> 2019-07-08 - -### Pull Requests - -* Merge pull request [#639](https://github.com/getlantern/flashlight/issues/639) from getlantern/fix-arista-sum -* Merge pull request [#637](https://github.com/getlantern/flashlight/issues/637) from getlantern/2866-update-tinywss-pull-12 -* Merge pull request [#563](https://github.com/getlantern/flashlight/issues/563) from getlantern/ox/gotun2socks -* Merge pull request [#635](https://github.com/getlantern/flashlight/issues/635) from getlantern/ox/issue2780 -* Merge pull request [#634](https://github.com/getlantern/flashlight/issues/634) from getlantern/ox/ios_report_issue_test -* Merge pull request [#633](https://github.com/getlantern/flashlight/issues/633) from getlantern/mod-fix -* Merge pull request [#617](https://github.com/getlantern/flashlight/issues/617) from getlantern/ox/gotun2socks-updates - - - -## [5.4.7](https://github.com/getlantern/flashlight/compare/5.4.6...5.4.7) - -> 2019-06-20 - -### Pull Requests - -* Merge pull request [#632](https://github.com/getlantern/flashlight/issues/632) from getlantern/ox/utpios -* Merge pull request [#619](https://github.com/getlantern/flashlight/issues/619) from getlantern/ox/iosdemofix - - - -## [5.4.6](https://github.com/getlantern/flashlight/compare/5.4.5...5.4.6) - -> 2019-06-12 - -### Pull Requests - -* Merge pull request [#631](https://github.com/getlantern/flashlight/issues/631) from getlantern/bcm/disable-utp-linux - - - -## [5.4.5](https://github.com/getlantern/flashlight/compare/5.4.4...5.4.5) - -> 2019-06-11 - -### Pull Requests - -* Merge pull request [#630](https://github.com/getlantern/flashlight/issues/630) from getlantern/2841-disable-utp-android - - - -## [5.4.4](https://github.com/getlantern/flashlight/compare/5.4.3...5.4.4) - -> 2019-06-10 - -### Pull Requests - -* Merge pull request [#624](https://github.com/getlantern/flashlight/issues/624) from getlantern/dynamic-config-fetch -* Merge pull request [#629](https://github.com/getlantern/flashlight/issues/629) from getlantern/fix_utls_branch - - - -## [5.4.3](https://github.com/getlantern/flashlight/compare/5.4.2...5.4.3) - -> 2019-06-07 - -### Pull Requests - -* Merge pull request [#628](https://github.com/getlantern/flashlight/issues/628) from getlantern/utp-windows-xp -* Merge pull request [#627](https://github.com/getlantern/flashlight/issues/627) from getlantern/wss_fronting -* Merge pull request [#616](https://github.com/getlantern/flashlight/issues/616) from getlantern/use-go-modules -* Merge pull request [#618](https://github.com/getlantern/flashlight/issues/618) from getlantern/harry/go-modules-1-11-support - - - -## [5.4.2](https://github.com/getlantern/flashlight/compare/5.4.1...5.4.2) - -> 2019-06-05 - -### Reverts - -* Disable cgocheck to improve utp cpu usage - -### Pull Requests - -* Merge pull request [#626](https://github.com/getlantern/flashlight/issues/626) from getlantern/removed-unused-proxied -* Merge pull request [#609](https://github.com/getlantern/flashlight/issues/609) from getlantern/ox/utplampshade - - - -## [5.4.1](https://github.com/getlantern/flashlight/compare/5.4.0...5.4.1) - -> 2019-06-02 - -### Pull Requests - -* Merge pull request [#625](https://github.com/getlantern/flashlight/issues/625) from getlantern/tinywss-panic -* Merge pull request [#623](https://github.com/getlantern/flashlight/issues/623) from getlantern/ox/fix_ios_test -* Merge pull request [#622](https://github.com/getlantern/flashlight/issues/622) from getlantern/ios-config-ci -* Merge pull request [#621](https://github.com/getlantern/flashlight/issues/621) from getlantern/cors-ci-fix -* Merge pull request [#620](https://github.com/getlantern/flashlight/issues/620) from getlantern/2733-borda-reporting -* Merge pull request [#588](https://github.com/getlantern/flashlight/issues/588) from getlantern/ox/issue2635 -* Merge pull request [#607](https://github.com/getlantern/flashlight/issues/607) from getlantern/platform-ios - - - -## [5.4.0](https://github.com/getlantern/flashlight/compare/5.3.8...5.4.0) - -> 2019-05-10 - -### Pull Requests - -* Merge pull request [#615](https://github.com/getlantern/flashlight/issues/615) from getlantern/ui-update-540 -* Merge pull request [#612](https://github.com/getlantern/flashlight/issues/612) from getlantern/wss -* Merge pull request [#614](https://github.com/getlantern/flashlight/issues/614) from getlantern/update-go-update-again -* Merge pull request [#613](https://github.com/getlantern/flashlight/issues/613) from getlantern/update-go-update -* Merge pull request [#610](https://github.com/getlantern/flashlight/issues/610) from getlantern/2720-add-comment -* Merge pull request [#611](https://github.com/getlantern/flashlight/issues/611) from getlantern/ox/issue2720 - - - -## [5.3.8](https://github.com/getlantern/flashlight/compare/5.3.7...5.3.8) - -> 2019-04-24 - -### Pull Requests - -* Merge pull request [#608](https://github.com/getlantern/flashlight/issues/608) from getlantern/2612 -* Merge pull request [#605](https://github.com/getlantern/flashlight/issues/605) from getlantern/ox/issue2737 -* Merge pull request [#598](https://github.com/getlantern/flashlight/issues/598) from getlantern/client-beam - - - -## [5.3.7](https://github.com/getlantern/flashlight/compare/5.3.6...5.3.7) - -> 2019-04-23 - - - -## [5.3.6](https://github.com/getlantern/flashlight/compare/5.3.5...5.3.6) - -> 2019-04-18 - -### Pull Requests - -* Merge pull request [#599](https://github.com/getlantern/flashlight/issues/599) from getlantern/uae-blacklist -* Merge pull request [#603](https://github.com/getlantern/flashlight/issues/603) from getlantern/2724-fix-panic - - - -## [5.3.5](https://github.com/getlantern/flashlight/compare/5.3.4...5.3.5) - -> 2019-04-12 - -### Pull Requests - -* Merge pull request [#606](https://github.com/getlantern/flashlight/issues/606) from getlantern/ui-5.3.5 -* Merge pull request [#604](https://github.com/getlantern/flashlight/issues/604) from getlantern/2734-ditch-easylist - - - -## [5.3.4](https://github.com/getlantern/flashlight/compare/5.3.3...5.3.4) - -> 2019-04-02 - -### Pull Requests - -* Merge pull request [#602](https://github.com/getlantern/flashlight/issues/602) from getlantern/flags-crash - - - -## [5.3.3](https://github.com/getlantern/flashlight/compare/5.3.2...5.3.3) - -> 2019-04-02 - -### Pull Requests - -* Merge pull request [#601](https://github.com/getlantern/flashlight/issues/601) from getlantern/fix-reset-timer -* Merge pull request [#600](https://github.com/getlantern/flashlight/issues/600) from getlantern/ignore-touchbar -* Merge pull request [#521](https://github.com/getlantern/flashlight/issues/521) from getlantern/ox/genglobalfromcloud -* Merge pull request [#597](https://github.com/getlantern/flashlight/issues/597) from getlantern/httpse-test-fix -* Merge pull request [#593](https://github.com/getlantern/flashlight/issues/593) from getlantern/datacap-logs -* Merge pull request [#596](https://github.com/getlantern/flashlight/issues/596) from getlantern/ox/ignore_rtt_deadline - - - -## [5.3.2](https://github.com/getlantern/flashlight/compare/5.3.1...5.3.2) - -> 2019-03-12 - -### Pull Requests - -* Merge pull request [#594](https://github.com/getlantern/flashlight/issues/594) from getlantern/2678-quic-panic -* Merge pull request [#595](https://github.com/getlantern/flashlight/issues/595) from getlantern/ox/borda_no_verbose -* Merge pull request [#592](https://github.com/getlantern/flashlight/issues/592) from getlantern/2663-shortcut-fixes -* Merge pull request [#591](https://github.com/getlantern/flashlight/issues/591) from getlantern/update-gopacket - - - -## [5.3.1](https://github.com/getlantern/flashlight/compare/5.3.0...5.3.1) - -> 2019-02-26 - -### Pull Requests - -* Merge pull request [#590](https://github.com/getlantern/flashlight/issues/590) from getlantern/2574-larger-idle-timeout -* Merge pull request [#517](https://github.com/getlantern/flashlight/issues/517) from getlantern/ox/server_connect_timeout -* Merge pull request [#586](https://github.com/getlantern/flashlight/issues/586) from getlantern/2628-reliable-connection-states -* Merge pull request [#589](https://github.com/getlantern/flashlight/issues/589) from getlantern/2565-avoid-borda-infinite-loop - - - -## [5.3.0](https://github.com/getlantern/flashlight/compare/5.2.8...5.3.0) - -> 2019-02-20 - -### Pull Requests - -* Merge pull request [#587](https://github.com/getlantern/flashlight/issues/587) from getlantern/lampshade-pr-34 -* Merge pull request [#585](https://github.com/getlantern/flashlight/issues/585) from getlantern/add-probe-test -* Merge pull request [#584](https://github.com/getlantern/flashlight/issues/584) from getlantern/2619-probing-accuracy -* Merge pull request [#583](https://github.com/getlantern/flashlight/issues/583) from getlantern/remove-misleading-log -* Merge pull request [#582](https://github.com/getlantern/flashlight/issues/582) from getlantern/fix_qtls_dep - - - -## [5.2.8](https://github.com/getlantern/flashlight/compare/5.2.7...5.2.8) - -> 2019-01-31 - -### Pull Requests - -* Merge pull request [#581](https://github.com/getlantern/flashlight/issues/581) from getlantern/ui-5.2.8 -* Merge pull request [#580](https://github.com/getlantern/flashlight/issues/580) from getlantern/ox/latest-quic -* Merge pull request [#564](https://github.com/getlantern/flashlight/issues/564) from getlantern/ox/balancer_dial_details -* Merge pull request [#577](https://github.com/getlantern/flashlight/issues/577) from getlantern/update_quic -* Merge pull request [#579](https://github.com/getlantern/flashlight/issues/579) from getlantern/update_quic_no_test -* Merge pull request [#576](https://github.com/getlantern/flashlight/issues/576) from getlantern/2575-no-direct-addrs -* Merge pull request [#572](https://github.com/getlantern/flashlight/issues/572) from getlantern/2534-new-lampshade -* Merge pull request [#575](https://github.com/getlantern/flashlight/issues/575) from getlantern/2564-latest-shortcut - - - -## [5.2.7](https://github.com/getlantern/flashlight/compare/5.2.6...5.2.7) - -> 2019-01-18 - -### Pull Requests - -* Merge pull request [#574](https://github.com/getlantern/flashlight/issues/574) from getlantern/context-digest - - - -## [5.2.6](https://github.com/getlantern/flashlight/compare/5.2.5...5.2.6) - -> 2019-01-17 - -### Pull Requests - -* Merge pull request [#573](https://github.com/getlantern/flashlight/issues/573) from getlantern/ui-5.2.6 -* Merge pull request [#490](https://github.com/getlantern/flashlight/issues/490) from getlantern/issue_1579 - - - -## [5.2.5](https://github.com/getlantern/flashlight/compare/5.2.4...5.2.5) - -> 2019-01-16 - -### Pull Requests - -* Merge pull request [#571](https://github.com/getlantern/flashlight/issues/571) from getlantern/dep-ensure-yaml -* Merge pull request [#570](https://github.com/getlantern/flashlight/issues/570) from getlantern/ui-5.2.5 -* Merge pull request [#569](https://github.com/getlantern/flashlight/issues/569) from getlantern/update-context - - - -## [5.2.4](https://github.com/getlantern/flashlight/compare/5.2.3...5.2.4) - -> 2019-01-08 - -### Pull Requests - -* Merge pull request [#568](https://github.com/getlantern/flashlight/issues/568) from getlantern/ox/issue2496 -* Merge pull request [#567](https://github.com/getlantern/flashlight/issues/567) from getlantern/2535-pipe-stdout-and-stderr - - - -## [5.2.3](https://github.com/getlantern/flashlight/compare/5.2.2...5.2.3) - -> 2019-01-04 - -### Pull Requests - -* Merge pull request [#565](https://github.com/getlantern/flashlight/issues/565) from getlantern/add-mail-ports -* Merge pull request [#566](https://github.com/getlantern/flashlight/issues/566) from getlantern/ui-5.2.3 -* Merge pull request [#562](https://github.com/getlantern/flashlight/issues/562) from getlantern/global_config_test -* Merge pull request [#536](https://github.com/getlantern/flashlight/issues/536) from getlantern/ox/memhelper - - - -## [5.2.2](https://github.com/getlantern/flashlight/compare/5.2.1...5.2.2) - -> 2018-12-13 - -### Pull Requests - -* Merge pull request [#561](https://github.com/getlantern/flashlight/issues/561) from getlantern/ui-5.2.2 -* Merge pull request [#560](https://github.com/getlantern/flashlight/issues/560) from getlantern/lampshade-upgrade -* Merge pull request [#559](https://github.com/getlantern/flashlight/issues/559) from getlantern/bcmertz/icons-dependency -* Merge pull request [#558](https://github.com/getlantern/flashlight/issues/558) from getlantern/hitproxy-wsl -* Merge pull request [#557](https://github.com/getlantern/flashlight/issues/557) from getlantern/systray-update -* Merge pull request [#556](https://github.com/getlantern/flashlight/issues/556) from getlantern/bcmertz/update-icons - - - -## [5.2.1](https://github.com/getlantern/flashlight/compare/5.2.0...5.2.1) - -> 2018-12-07 - -### Pull Requests - -* Merge pull request [#555](https://github.com/getlantern/flashlight/issues/555) from getlantern/ui-5.2.1 -* Merge pull request [#553](https://github.com/getlantern/flashlight/issues/553) from getlantern/correct-locale -* Merge pull request [#552](https://github.com/getlantern/flashlight/issues/552) from getlantern/ox/numproxies - - - -## [5.2.0](https://github.com/getlantern/flashlight/compare/5.1.0...5.2.0) - -> 2018-12-04 - -### Pull Requests - -* Merge pull request [#551](https://github.com/getlantern/flashlight/issues/551) from getlantern/afisk-issue-2471 - - - -## [5.1.0](https://github.com/getlantern/flashlight/compare/5.0.4...5.1.0) - -> 2018-12-03 - - - -## [5.0.4](https://github.com/getlantern/flashlight/compare/5.0.3...5.0.4) - -> 2018-12-03 - -### Pull Requests - -* Merge pull request [#548](https://github.com/getlantern/flashlight/issues/548) from getlantern/x-forwarded-for-pro-server - - - -## [5.0.3](https://github.com/getlantern/flashlight/compare/5.0.2...5.0.3) - -> 2018-12-03 - - - -## [5.0.2](https://github.com/getlantern/flashlight/compare/5.0.1...5.0.2) - -> 2018-12-03 - -### Pull Requests - -* Merge pull request [#547](https://github.com/getlantern/flashlight/issues/547) from getlantern/yinbi-ui-11 - - - -## [5.0.1](https://github.com/getlantern/flashlight/compare/5.0.0...5.0.1) - -> 2018-12-01 - -### Pull Requests - -* Merge pull request [#545](https://github.com/getlantern/flashlight/issues/545) from getlantern/ox/memlimit - - - -## [5.0.0](https://github.com/getlantern/flashlight/compare/4.9.1-yinbi...5.0.0) - -> 2018-11-30 - -### Pull Requests - -* Merge pull request [#544](https://github.com/getlantern/flashlight/issues/544) from getlantern/yinbi-ui-10 -* Merge pull request [#543](https://github.com/getlantern/flashlight/issues/543) from getlantern/ox/lampshadeidleinterval -* Merge pull request [#542](https://github.com/getlantern/flashlight/issues/542) from getlantern/ox/probe_eof -* Merge pull request [#541](https://github.com/getlantern/flashlight/issues/541) from getlantern/yinbi-ui-9 -* Merge pull request [#539](https://github.com/getlantern/flashlight/issues/539) from getlantern/1775-fetch-user-data-more-often -* Merge pull request [#540](https://github.com/getlantern/flashlight/issues/540) from getlantern/myles-yinbi-17 -* Merge pull request [#523](https://github.com/getlantern/flashlight/issues/523) from getlantern/2339-dev-not-hit-outdated-page -* Merge pull request [#538](https://github.com/getlantern/flashlight/issues/538) from getlantern/fix-ci -* Merge pull request [#533](https://github.com/getlantern/flashlight/issues/533) from getlantern/hh/yinbi-154 -* Merge pull request [#532](https://github.com/getlantern/flashlight/issues/532) from getlantern/ox/issue2415 -* Merge pull request [#531](https://github.com/getlantern/flashlight/issues/531) from getlantern/ox/issue2416 - - - -## [4.9.1-yinbi](https://github.com/getlantern/flashlight/compare/4.9.0...4.9.1-yinbi) - -> 2018-11-05 - -### Pull Requests - -* Merge pull request [#530](https://github.com/getlantern/flashlight/issues/530) from getlantern/yinbi-updates -* Merge pull request [#529](https://github.com/getlantern/flashlight/issues/529) from getlantern/ox/embedglobal -* Merge pull request [#528](https://github.com/getlantern/flashlight/issues/528) from getlantern/ox/issue2369 -* Merge pull request [#527](https://github.com/getlantern/flashlight/issues/527) from getlantern/ox/latestlampshade - - - -## [4.9.0](https://github.com/getlantern/flashlight/compare/4.8.4...4.9.0) - -> 2018-10-24 - -### Pull Requests - -* Merge pull request [#519](https://github.com/getlantern/flashlight/issues/519) from getlantern/ox/multiplexed -* Merge pull request [#526](https://github.com/getlantern/flashlight/issues/526) from getlantern/2371-panicking-on-close - - - -## [4.8.4](https://github.com/getlantern/flashlight/compare/4.8.3...4.8.4) - -> 2018-10-19 - -### Pull Requests - -* Merge pull request [#525](https://github.com/getlantern/flashlight/issues/525) from getlantern/cas_by_provider -* Merge pull request [#524](https://github.com/getlantern/flashlight/issues/524) from getlantern/ox/updateproxybench - - - -## [4.8.3](https://github.com/getlantern/flashlight/compare/4.8.2...4.8.3) - -> 2018-10-12 - -### Pull Requests - -* Merge pull request [#522](https://github.com/getlantern/flashlight/issues/522) from getlantern/yinbi-ad-update -* Merge pull request [#514](https://github.com/getlantern/flashlight/issues/514) from getlantern/2295-buffered-log-channel -* Merge pull request [#507](https://github.com/getlantern/flashlight/issues/507) from getlantern/issue1383-rename-fetchcfg -* Merge pull request [#520](https://github.com/getlantern/flashlight/issues/520) from getlantern/ox/noprobelock -* Merge pull request [#518](https://github.com/getlantern/flashlight/issues/518) from getlantern/ox/chainedconfig -* Merge pull request [#516](https://github.com/getlantern/flashlight/issues/516) from getlantern/ox/time_connects_plus -* Merge pull request [#515](https://github.com/getlantern/flashlight/issues/515) from getlantern/ox/time_connects - - - -## [4.8.2](https://github.com/getlantern/flashlight/compare/4.8.1...4.8.2) - -> 2018-09-28 - -### Pull Requests - -* Merge pull request [#512](https://github.com/getlantern/flashlight/issues/512) from getlantern/2312-balancer-fix -* Merge pull request [#511](https://github.com/getlantern/flashlight/issues/511) from getlantern/ox/fix_android_test -* Merge pull request [#509](https://github.com/getlantern/flashlight/issues/509) from getlantern/net_err -* Merge pull request [#503](https://github.com/getlantern/flashlight/issues/503) from getlantern/768-use-location-info -* Merge pull request [#506](https://github.com/getlantern/flashlight/issues/506) from getlantern/add-missing-google-meet-port -* Merge pull request [#502](https://github.com/getlantern/flashlight/issues/502) from getlantern/binary-name-staging - - - -## [4.8.1](https://github.com/getlantern/flashlight/compare/4.8.0...4.8.1) - -> 2018-09-13 - -### Pull Requests - -* Merge pull request [#505](https://github.com/getlantern/flashlight/issues/505) from getlantern/ui-update-yinbi -* Merge pull request [#504](https://github.com/getlantern/flashlight/issues/504) from getlantern/ox/pbenproxy -* Merge pull request [#500](https://github.com/getlantern/flashlight/issues/500) from getlantern/ox/issue2265 -* Merge pull request [#501](https://github.com/getlantern/flashlight/issues/501) from getlantern/walk-error-check -* Merge pull request [#495](https://github.com/getlantern/flashlight/issues/495) from getlantern/fix-ci -* Merge pull request [#499](https://github.com/getlantern/flashlight/issues/499) from getlantern/report-issue-updates -* Merge pull request [#498](https://github.com/getlantern/flashlight/issues/498) from getlantern/akamai_dsa -* Merge pull request [#497](https://github.com/getlantern/flashlight/issues/497) from getlantern/hh/update-dclocs-dofra1 -* Merge pull request [#496](https://github.com/getlantern/flashlight/issues/496) from getlantern/use-go-stack -* Merge pull request [#493](https://github.com/getlantern/flashlight/issues/493) from getlantern/systraynodll -* Merge pull request [#494](https://github.com/getlantern/flashlight/issues/494) from getlantern/ox/record_proxied_dial -* Merge pull request [#492](https://github.com/getlantern/flashlight/issues/492) from getlantern/2079-skip-private-ips -* Merge pull request [#491](https://github.com/getlantern/flashlight/issues/491) from getlantern/pull-479-fixes -* Merge pull request [#484](https://github.com/getlantern/flashlight/issues/484) from getlantern/issue_2199 - - - -## [4.8.0](https://github.com/getlantern/flashlight/compare/4.7.13...4.8.0) - -> 2018-08-09 - -### Pull Requests - -* Merge pull request [#479](https://github.com/getlantern/flashlight/issues/479) from getlantern/1689-simplify-balancer - - - -## [4.7.13](https://github.com/getlantern/flashlight/compare/4.7.12...4.7.13) - -> 2018-08-08 - -### Pull Requests - -* Merge pull request [#489](https://github.com/getlantern/flashlight/issues/489) from getlantern/ui-yinbi-ad -* Merge pull request [#488](https://github.com/getlantern/flashlight/issues/488) from getlantern/pprof-no-timeout -* Merge pull request [#486](https://github.com/getlantern/flashlight/issues/486) from getlantern/request-timeout-as-struct-member -* Merge pull request [#487](https://github.com/getlantern/flashlight/issues/487) from getlantern/ui-device-name - - - -## [4.7.12](https://github.com/getlantern/flashlight/compare/4.7.11...4.7.12) - -> 2018-08-08 - - - -## [4.7.11](https://github.com/getlantern/flashlight/compare/4.7.10...4.7.11) - -> 2018-08-01 - -### Pull Requests - -* Merge pull request [#485](https://github.com/getlantern/flashlight/issues/485) from getlantern/ui-update - - - -## [4.7.10](https://github.com/getlantern/flashlight/compare/4.7.9...4.7.10) - -> 2018-07-26 - -### Reverts - -* Revert "show critical alerts on systray and as system notification" -* show critical alerts on systray and as system notification - -### Pull Requests - -* Merge pull request [#483](https://github.com/getlantern/flashlight/issues/483) from getlantern/ui-updates -* Merge pull request [#482](https://github.com/getlantern/flashlight/issues/482) from getlantern/ox/borda-userid -* Merge pull request [#471](https://github.com/getlantern/flashlight/issues/471) from getlantern/issue_1891 -* Merge pull request [#480](https://github.com/getlantern/flashlight/issues/480) from getlantern/ox/issue2176 -* Merge pull request [#481](https://github.com/getlantern/flashlight/issues/481) from getlantern/issue-2079-update -* Merge pull request [#478](https://github.com/getlantern/flashlight/issues/478) from getlantern/918-notify-user-critical-errors -* Merge pull request [#477](https://github.com/getlantern/flashlight/issues/477) from getlantern/revert-473-918-notify-user-critical-errors -* Merge pull request [#473](https://github.com/getlantern/flashlight/issues/473) from getlantern/918-notify-user-critical-errors -* Merge pull request [#476](https://github.com/getlantern/flashlight/issues/476) from getlantern/no-proxiedsites-file - - - -## [4.7.9](https://github.com/getlantern/flashlight/compare/4.7.8...4.7.9) - -> 2018-07-11 - -### Pull Requests - -* Merge pull request [#475](https://github.com/getlantern/flashlight/issues/475) from getlantern/2123-android-no-private-hosts -* Merge pull request [#474](https://github.com/getlantern/flashlight/issues/474) from getlantern/ox/issue2165 - - - -## [4.7.8](https://github.com/getlantern/flashlight/compare/4.7.7...4.7.8) - -> 2018-07-09 - -### Pull Requests - -* Merge pull request [#469](https://github.com/getlantern/flashlight/issues/469) from getlantern/1867-time-cap-exit-funcs - - - -## [4.7.7](https://github.com/getlantern/flashlight/compare/4.5.0...4.7.7) - -> 2018-07-05 - -### Reverts - -* break nextPreconnected properly - -### Pull Requests - -* Merge pull request [#472](https://github.com/getlantern/flashlight/issues/472) from getlantern/ga-ecommerce-ui -* Merge pull request [#470](https://github.com/getlantern/flashlight/issues/470) from getlantern/ox/global_proxy_dims -* Merge pull request [#466](https://github.com/getlantern/flashlight/issues/466) from getlantern/ox/probeerrors -* Merge pull request [#468](https://github.com/getlantern/flashlight/issues/468) from getlantern/ox/issue2115 -* Merge pull request [#467](https://github.com/getlantern/flashlight/issues/467) from getlantern/2067-error-message -* Merge pull request [#465](https://github.com/getlantern/flashlight/issues/465) from getlantern/ox/issue2098 -* Merge pull request [#464](https://github.com/getlantern/flashlight/issues/464) from getlantern/ratetracking-log -* Merge pull request [#463](https://github.com/getlantern/flashlight/issues/463) from getlantern/update-fronted -* Merge pull request [#462](https://github.com/getlantern/flashlight/issues/462) from getlantern/rand_proxybench -* Merge pull request [#461](https://github.com/getlantern/flashlight/issues/461) from getlantern/ui-4.7.4 -* Merge pull request [#460](https://github.com/getlantern/flashlight/issues/460) from getlantern/myles-locale-fix -* Merge pull request [#458](https://github.com/getlantern/flashlight/issues/458) from getlantern/706-fix-accessing-proxy-port -* Merge pull request [#459](https://github.com/getlantern/flashlight/issues/459) from getlantern/platform-header -* Merge pull request [#456](https://github.com/getlantern/flashlight/issues/456) from getlantern/ox/issue2015 -* Merge pull request [#455](https://github.com/getlantern/flashlight/issues/455) from getlantern/ox/issue1979 -* Merge pull request [#454](https://github.com/getlantern/flashlight/issues/454) from getlantern/ox/issue1970 -* Merge pull request [#453](https://github.com/getlantern/flashlight/issues/453) from getlantern/genproxies-4.6.15 -* Merge pull request [#452](https://github.com/getlantern/flashlight/issues/452) from getlantern/genconfig-global-4.6.15 -* Merge pull request [#451](https://github.com/getlantern/flashlight/issues/451) from getlantern/ox/fixprobe -* Merge pull request [#450](https://github.com/getlantern/flashlight/issues/450) from getlantern/genproxies-ir -* Merge pull request [#449](https://github.com/getlantern/flashlight/issues/449) from getlantern/ox/fixproxynameregex -* Merge pull request [#448](https://github.com/getlantern/flashlight/issues/448) from getlantern/issue-1915 -* Merge pull request [#447](https://github.com/getlantern/flashlight/issues/447) from getlantern/ox/dial-for-balancer-details -* Merge pull request [#445](https://github.com/getlantern/flashlight/issues/445) from getlantern/genconfig-4.6.11 -* Merge pull request [#442](https://github.com/getlantern/flashlight/issues/442) from getlantern/1878-invalid-addr -* Merge pull request [#441](https://github.com/getlantern/flashlight/issues/441) from getlantern/fix-stats-tracking -* Merge pull request [#444](https://github.com/getlantern/flashlight/issues/444) from getlantern/adyen-iran-pro-ui-tweaks -* Merge pull request [#443](https://github.com/getlantern/flashlight/issues/443) from getlantern/ox/issue-1880 -* Merge pull request [#440](https://github.com/getlantern/flashlight/issues/440) from getlantern/1868-fix-gunzip -* Merge pull request [#438](https://github.com/getlantern/flashlight/issues/438) from getlantern/1689-fix-check-connectivity -* Merge pull request [#436](https://github.com/getlantern/flashlight/issues/436) from getlantern/ox/issue1838 -* Merge pull request [#434](https://github.com/getlantern/flashlight/issues/434) from getlantern/no-opencensus -* Merge pull request [#435](https://github.com/getlantern/flashlight/issues/435) from getlantern/myleshorton-wercker-doc -* Merge pull request [#432](https://github.com/getlantern/flashlight/issues/432) from getlantern/ox/issue1826 -* Merge pull request [#431](https://github.com/getlantern/flashlight/issues/431) from getlantern/glide-to-dep -* Merge pull request [#433](https://github.com/getlantern/flashlight/issues/433) from getlantern/issue-1851 -* Merge pull request [#429](https://github.com/getlantern/flashlight/issues/429) from getlantern/ox/lazy-lampshade -* Merge pull request [#430](https://github.com/getlantern/flashlight/issues/430) from getlantern/loconf-log -* Merge pull request [#423](https://github.com/getlantern/flashlight/issues/423) from getlantern/issue_1698 -* Merge pull request [#428](https://github.com/getlantern/flashlight/issues/428) from getlantern/fixes -* Merge pull request [#426](https://github.com/getlantern/flashlight/issues/426) from getlantern/ox/issue-1792 -* Merge pull request [#425](https://github.com/getlantern/flashlight/issues/425) from getlantern/android-timeout-1808 -* Merge pull request [#424](https://github.com/getlantern/flashlight/issues/424) from getlantern/staging-settings -* Merge pull request [#422](https://github.com/getlantern/flashlight/issues/422) from getlantern/internal-1715 -* Merge pull request [#421](https://github.com/getlantern/flashlight/issues/421) from getlantern/ui-4.6.0-rc2 -* Merge pull request [#420](https://github.com/getlantern/flashlight/issues/420) from getlantern/deps-4.6.0-rc1 -* Merge pull request [#419](https://github.com/getlantern/flashlight/issues/419) from getlantern/release-4.5.7 -* Merge pull request [#418](https://github.com/getlantern/flashlight/issues/418) from getlantern/ui-4.5.9 -* Merge pull request [#417](https://github.com/getlantern/flashlight/issues/417) from getlantern/ox/proxybench-full -* Merge pull request [#415](https://github.com/getlantern/flashlight/issues/415) from getlantern/app-to-desktop -* Merge pull request [#416](https://github.com/getlantern/flashlight/issues/416) from getlantern/issue-1651 -* Merge pull request [#414](https://github.com/getlantern/flashlight/issues/414) from getlantern/updatedeps-20180403 -* Merge pull request [#413](https://github.com/getlantern/flashlight/issues/413) from getlantern/ox/borda-trim -* Merge pull request [#412](https://github.com/getlantern/flashlight/issues/412) from getlantern/4.5.8-deps -* Merge pull request [#411](https://github.com/getlantern/flashlight/issues/411) from getlantern/ox/timeout-cleanup -* Merge pull request [#408](https://github.com/getlantern/flashlight/issues/408) from getlantern/fwp-android-changes -* Merge pull request [#410](https://github.com/getlantern/flashlight/issues/410) from getlantern/ox/issue1659 -* Merge pull request [#409](https://github.com/getlantern/flashlight/issues/409) from getlantern/hh/issue-1523 -* Merge pull request [#407](https://github.com/getlantern/flashlight/issues/407) from getlantern/ox/issue-1648 -* Merge pull request [#393](https://github.com/getlantern/flashlight/issues/393) from getlantern/hh/issue-1489 -* Merge pull request [#405](https://github.com/getlantern/flashlight/issues/405) from getlantern/ox/notesthang -* Merge pull request [#406](https://github.com/getlantern/flashlight/issues/406) from getlantern/ox/config_from_cloud -* Merge pull request [#403](https://github.com/getlantern/flashlight/issues/403) from getlantern/ox/issue-1489 -* Merge pull request [#398](https://github.com/getlantern/flashlight/issues/398) from getlantern/ox/nopreroll -* Merge pull request [#402](https://github.com/getlantern/flashlight/issues/402) from getlantern/only-show-ads-certain-regions -* Merge pull request [#400](https://github.com/getlantern/flashlight/issues/400) from getlantern/add-whitelist-option -* Merge pull request [#399](https://github.com/getlantern/flashlight/issues/399) from getlantern/ox/issue-1533 -* Merge pull request [#401](https://github.com/getlantern/flashlight/issues/401) from getlantern/ox/issue1532 -* Merge pull request [#397](https://github.com/getlantern/flashlight/issues/397) from getlantern/ox/config-tests-without-files -* Merge pull request [#394](https://github.com/getlantern/flashlight/issues/394) from getlantern/add-show-ads-after-days-option -* Merge pull request [#396](https://github.com/getlantern/flashlight/issues/396) from getlantern/noblock -* Merge pull request [#395](https://github.com/getlantern/flashlight/issues/395) from getlantern/ox/issue-1494 -* Merge pull request [#385](https://github.com/getlantern/flashlight/issues/385) from getlantern/hh/issue-1455 -* Merge pull request [#381](https://github.com/getlantern/flashlight/issues/381) from getlantern/internal-1462 -* Merge pull request [#391](https://github.com/getlantern/flashlight/issues/391) from getlantern/issue1499 -* Merge pull request [#384](https://github.com/getlantern/flashlight/issues/384) from getlantern/issue-382 -* Merge pull request [#390](https://github.com/getlantern/flashlight/issues/390) from getlantern/issue1496 -* Merge pull request [#388](https://github.com/getlantern/flashlight/issues/388) from getlantern/issue1490 -* Merge pull request [#389](https://github.com/getlantern/flashlight/issues/389) from getlantern/issue1490-myles - - - -## [4.5.0](https://github.com/getlantern/flashlight/compare/4.5.1...4.5.0) - -> 2018-06-25 - - - -## [4.5.1](https://github.com/getlantern/flashlight/compare/4.5.2...4.5.1) - -> 2018-06-25 - - - -## [4.5.2](https://github.com/getlantern/flashlight/compare/4.5.3...4.5.2) - -> 2018-06-25 - - - -## [4.5.3](https://github.com/getlantern/flashlight/compare/4.5.4...4.5.3) - -> 2018-06-25 - - - -## [4.5.4](https://github.com/getlantern/flashlight/compare/4.5.5...4.5.4) - -> 2018-06-25 - - - -## [4.5.5](https://github.com/getlantern/flashlight/compare/4.5.7...4.5.5) - -> 2018-06-25 - - - -## [4.5.7](https://github.com/getlantern/flashlight/compare/4.5.8...4.5.7) - -> 2018-06-25 - - - -## [4.5.8](https://github.com/getlantern/flashlight/compare/4.5.9...4.5.8) - -> 2018-06-25 - - - -## [4.5.9](https://github.com/getlantern/flashlight/compare/4.6.0...4.5.9) - -> 2018-06-25 - - - -## [4.6.0](https://github.com/getlantern/flashlight/compare/4.6.1...4.6.0) - -> 2018-06-25 - - - -## [4.6.1](https://github.com/getlantern/flashlight/compare/4.6.2...4.6.1) - -> 2018-06-25 - - - -## [4.6.2](https://github.com/getlantern/flashlight/compare/4.6.3...4.6.2) - -> 2018-06-25 - - - -## [4.6.3](https://github.com/getlantern/flashlight/compare/4.6.4...4.6.3) - -> 2018-06-25 - - - -## [4.6.4](https://github.com/getlantern/flashlight/compare/4.6.6...4.6.4) - -> 2018-06-25 - - - -## [4.6.6](https://github.com/getlantern/flashlight/compare/4.6.7...4.6.6) - -> 2018-06-25 - - - -## [4.6.7](https://github.com/getlantern/flashlight/compare/4.6.8...4.6.7) - -> 2018-06-25 - - - -## [4.6.8](https://github.com/getlantern/flashlight/compare/4.6.9...4.6.8) - -> 2018-06-25 - - - -## [4.6.9](https://github.com/getlantern/flashlight/compare/4.6.10...4.6.9) - -> 2018-06-25 - - - -## [4.6.10](https://github.com/getlantern/flashlight/compare/4.7.6...4.6.10) - -> 2018-06-25 - - - -## [4.7.6](https://github.com/getlantern/flashlight/compare/4.7.5...4.7.6) - -> 2018-06-21 - -### Pull Requests - -* Merge pull request [#468](https://github.com/getlantern/flashlight/issues/468) from getlantern/ox/issue2115 -* Merge pull request [#467](https://github.com/getlantern/flashlight/issues/467) from getlantern/2067-error-message -* Merge pull request [#465](https://github.com/getlantern/flashlight/issues/465) from getlantern/ox/issue2098 -* Merge pull request [#464](https://github.com/getlantern/flashlight/issues/464) from getlantern/ratetracking-log - - - -## [4.7.5](https://github.com/getlantern/flashlight/compare/4.7.4...4.7.5) - -> 2018-06-11 - -### Pull Requests - -* Merge pull request [#463](https://github.com/getlantern/flashlight/issues/463) from getlantern/update-fronted -* Merge pull request [#462](https://github.com/getlantern/flashlight/issues/462) from getlantern/rand_proxybench - - - -## [4.7.4](https://github.com/getlantern/flashlight/compare/4.7.3...4.7.4) - -> 2018-06-06 - -### Pull Requests - -* Merge pull request [#461](https://github.com/getlantern/flashlight/issues/461) from getlantern/ui-4.7.4 -* Merge pull request [#460](https://github.com/getlantern/flashlight/issues/460) from getlantern/myles-locale-fix -* Merge pull request [#458](https://github.com/getlantern/flashlight/issues/458) from getlantern/706-fix-accessing-proxy-port -* Merge pull request [#459](https://github.com/getlantern/flashlight/issues/459) from getlantern/platform-header - - - -## [4.7.3](https://github.com/getlantern/flashlight/compare/3.7.6...4.7.3) - -> 2018-05-31 - -### Reverts - -* break nextPreconnected properly - -### Pull Requests - -* Merge pull request [#456](https://github.com/getlantern/flashlight/issues/456) from getlantern/ox/issue2015 -* Merge pull request [#455](https://github.com/getlantern/flashlight/issues/455) from getlantern/ox/issue1979 -* Merge pull request [#454](https://github.com/getlantern/flashlight/issues/454) from getlantern/ox/issue1970 -* Merge pull request [#453](https://github.com/getlantern/flashlight/issues/453) from getlantern/genproxies-4.6.15 -* Merge pull request [#452](https://github.com/getlantern/flashlight/issues/452) from getlantern/genconfig-global-4.6.15 -* Merge pull request [#451](https://github.com/getlantern/flashlight/issues/451) from getlantern/ox/fixprobe -* Merge pull request [#450](https://github.com/getlantern/flashlight/issues/450) from getlantern/genproxies-ir -* Merge pull request [#449](https://github.com/getlantern/flashlight/issues/449) from getlantern/ox/fixproxynameregex -* Merge pull request [#448](https://github.com/getlantern/flashlight/issues/448) from getlantern/issue-1915 -* Merge pull request [#447](https://github.com/getlantern/flashlight/issues/447) from getlantern/ox/dial-for-balancer-details -* Merge pull request [#445](https://github.com/getlantern/flashlight/issues/445) from getlantern/genconfig-4.6.11 -* Merge pull request [#442](https://github.com/getlantern/flashlight/issues/442) from getlantern/1878-invalid-addr -* Merge pull request [#441](https://github.com/getlantern/flashlight/issues/441) from getlantern/fix-stats-tracking -* Merge pull request [#444](https://github.com/getlantern/flashlight/issues/444) from getlantern/adyen-iran-pro-ui-tweaks -* Merge pull request [#443](https://github.com/getlantern/flashlight/issues/443) from getlantern/ox/issue-1880 -* Merge pull request [#440](https://github.com/getlantern/flashlight/issues/440) from getlantern/1868-fix-gunzip -* Merge pull request [#438](https://github.com/getlantern/flashlight/issues/438) from getlantern/1689-fix-check-connectivity -* Merge pull request [#436](https://github.com/getlantern/flashlight/issues/436) from getlantern/ox/issue1838 -* Merge pull request [#434](https://github.com/getlantern/flashlight/issues/434) from getlantern/no-opencensus -* Merge pull request [#435](https://github.com/getlantern/flashlight/issues/435) from getlantern/myleshorton-wercker-doc -* Merge pull request [#432](https://github.com/getlantern/flashlight/issues/432) from getlantern/ox/issue1826 -* Merge pull request [#431](https://github.com/getlantern/flashlight/issues/431) from getlantern/glide-to-dep -* Merge pull request [#433](https://github.com/getlantern/flashlight/issues/433) from getlantern/issue-1851 -* Merge pull request [#429](https://github.com/getlantern/flashlight/issues/429) from getlantern/ox/lazy-lampshade -* Merge pull request [#430](https://github.com/getlantern/flashlight/issues/430) from getlantern/loconf-log -* Merge pull request [#423](https://github.com/getlantern/flashlight/issues/423) from getlantern/issue_1698 -* Merge pull request [#428](https://github.com/getlantern/flashlight/issues/428) from getlantern/fixes -* Merge pull request [#426](https://github.com/getlantern/flashlight/issues/426) from getlantern/ox/issue-1792 -* Merge pull request [#425](https://github.com/getlantern/flashlight/issues/425) from getlantern/android-timeout-1808 -* Merge pull request [#424](https://github.com/getlantern/flashlight/issues/424) from getlantern/staging-settings -* Merge pull request [#422](https://github.com/getlantern/flashlight/issues/422) from getlantern/internal-1715 -* Merge pull request [#421](https://github.com/getlantern/flashlight/issues/421) from getlantern/ui-4.6.0-rc2 -* Merge pull request [#420](https://github.com/getlantern/flashlight/issues/420) from getlantern/deps-4.6.0-rc1 -* Merge pull request [#419](https://github.com/getlantern/flashlight/issues/419) from getlantern/release-4.5.7 -* Merge pull request [#418](https://github.com/getlantern/flashlight/issues/418) from getlantern/ui-4.5.9 -* Merge pull request [#417](https://github.com/getlantern/flashlight/issues/417) from getlantern/ox/proxybench-full -* Merge pull request [#415](https://github.com/getlantern/flashlight/issues/415) from getlantern/app-to-desktop -* Merge pull request [#416](https://github.com/getlantern/flashlight/issues/416) from getlantern/issue-1651 -* Merge pull request [#414](https://github.com/getlantern/flashlight/issues/414) from getlantern/updatedeps-20180403 -* Merge pull request [#413](https://github.com/getlantern/flashlight/issues/413) from getlantern/ox/borda-trim -* Merge pull request [#412](https://github.com/getlantern/flashlight/issues/412) from getlantern/4.5.8-deps -* Merge pull request [#411](https://github.com/getlantern/flashlight/issues/411) from getlantern/ox/timeout-cleanup -* Merge pull request [#408](https://github.com/getlantern/flashlight/issues/408) from getlantern/fwp-android-changes -* Merge pull request [#410](https://github.com/getlantern/flashlight/issues/410) from getlantern/ox/issue1659 -* Merge pull request [#409](https://github.com/getlantern/flashlight/issues/409) from getlantern/hh/issue-1523 -* Merge pull request [#407](https://github.com/getlantern/flashlight/issues/407) from getlantern/ox/issue-1648 -* Merge pull request [#393](https://github.com/getlantern/flashlight/issues/393) from getlantern/hh/issue-1489 -* Merge pull request [#405](https://github.com/getlantern/flashlight/issues/405) from getlantern/ox/notesthang -* Merge pull request [#406](https://github.com/getlantern/flashlight/issues/406) from getlantern/ox/config_from_cloud -* Merge pull request [#403](https://github.com/getlantern/flashlight/issues/403) from getlantern/ox/issue-1489 -* Merge pull request [#398](https://github.com/getlantern/flashlight/issues/398) from getlantern/ox/nopreroll -* Merge pull request [#402](https://github.com/getlantern/flashlight/issues/402) from getlantern/only-show-ads-certain-regions -* Merge pull request [#400](https://github.com/getlantern/flashlight/issues/400) from getlantern/add-whitelist-option -* Merge pull request [#399](https://github.com/getlantern/flashlight/issues/399) from getlantern/ox/issue-1533 -* Merge pull request [#401](https://github.com/getlantern/flashlight/issues/401) from getlantern/ox/issue1532 -* Merge pull request [#397](https://github.com/getlantern/flashlight/issues/397) from getlantern/ox/config-tests-without-files -* Merge pull request [#394](https://github.com/getlantern/flashlight/issues/394) from getlantern/add-show-ads-after-days-option -* Merge pull request [#396](https://github.com/getlantern/flashlight/issues/396) from getlantern/noblock -* Merge pull request [#395](https://github.com/getlantern/flashlight/issues/395) from getlantern/ox/issue-1494 -* Merge pull request [#385](https://github.com/getlantern/flashlight/issues/385) from getlantern/hh/issue-1455 -* Merge pull request [#381](https://github.com/getlantern/flashlight/issues/381) from getlantern/internal-1462 -* Merge pull request [#391](https://github.com/getlantern/flashlight/issues/391) from getlantern/issue1499 -* Merge pull request [#384](https://github.com/getlantern/flashlight/issues/384) from getlantern/issue-382 -* Merge pull request [#390](https://github.com/getlantern/flashlight/issues/390) from getlantern/issue1496 -* Merge pull request [#388](https://github.com/getlantern/flashlight/issues/388) from getlantern/issue1490 -* Merge pull request [#389](https://github.com/getlantern/flashlight/issues/389) from getlantern/issue1490-myles -* Merge pull request [#376](https://github.com/getlantern/flashlight/issues/376) from getlantern/unblock_exoclick -* Merge pull request [#386](https://github.com/getlantern/flashlight/issues/386) from getlantern/unblock_exoclick_mitm -* Merge pull request [#387](https://github.com/getlantern/flashlight/issues/387) from getlantern/fix_loconf_test -* Merge pull request [#351](https://github.com/getlantern/flashlight/issues/351) from getlantern/enhttp -* Merge pull request [#378](https://github.com/getlantern/flashlight/issues/378) from getlantern/internal-1450 -* Merge pull request [#383](https://github.com/getlantern/flashlight/issues/383) from getlantern/ads-integration -* Merge pull request [#379](https://github.com/getlantern/flashlight/issues/379) from getlantern/internal-1460 -* Merge pull request [#380](https://github.com/getlantern/flashlight/issues/380) from getlantern/newbordadomain -* Merge pull request [#372](https://github.com/getlantern/flashlight/issues/372) from getlantern/genconfig -* Merge pull request [#377](https://github.com/getlantern/flashlight/issues/377) from getlantern/deps-4.5.3 -* Merge pull request [#371](https://github.com/getlantern/flashlight/issues/371) from getlantern/ws-tweak -* Merge pull request [#329](https://github.com/getlantern/flashlight/issues/329) from getlantern/internal-1290 -* Merge pull request [#370](https://github.com/getlantern/flashlight/issues/370) from getlantern/balancer_dial -* Merge pull request [#369](https://github.com/getlantern/flashlight/issues/369) from getlantern/deps-update -* Merge pull request [#368](https://github.com/getlantern/flashlight/issues/368) from getlantern/issue1403 -* Merge pull request [#366](https://github.com/getlantern/flashlight/issues/366) from getlantern/issue1421 -* Merge pull request [#367](https://github.com/getlantern/flashlight/issues/367) from getlantern/issue1421_readable -* Merge pull request [#365](https://github.com/getlantern/flashlight/issues/365) from getlantern/issue1337-pool -* Merge pull request [#358](https://github.com/getlantern/flashlight/issues/358) from getlantern/issue1359 -* Merge pull request [#364](https://github.com/getlantern/flashlight/issues/364) from getlantern/issue-1357 -* Merge pull request [#362](https://github.com/getlantern/flashlight/issues/362) from getlantern/internal-1337-print-goroutines -* Merge pull request [#361](https://github.com/getlantern/flashlight/issues/361) from getlantern/update-protected-regex-issue -* Merge pull request [#359](https://github.com/getlantern/flashlight/issues/359) from getlantern/issue1391 -* Merge pull request [#360](https://github.com/getlantern/flashlight/issues/360) from getlantern/remove-token-reset -* Merge pull request [#356](https://github.com/getlantern/flashlight/issues/356) from getlantern/issue-internal-1283 -* Merge pull request [#352](https://github.com/getlantern/flashlight/issues/352) from getlantern/ipv6 -* Merge pull request [#350](https://github.com/getlantern/flashlight/issues/350) from getlantern/remove-dns-grab-from-settings -* Merge pull request [#348](https://github.com/getlantern/flashlight/issues/348) from getlantern/send-user-params-payment-gateway -* Merge pull request [#347](https://github.com/getlantern/flashlight/issues/347) from getlantern/internal-1139 -* Merge pull request [#338](https://github.com/getlantern/flashlight/issues/338) from getlantern/internal-1328 -* Merge pull request [#345](https://github.com/getlantern/flashlight/issues/345) from getlantern/issue1277 -* Merge pull request [#342](https://github.com/getlantern/flashlight/issues/342) from getlantern/issue1332 -* Merge pull request [#340](https://github.com/getlantern/flashlight/issues/340) from getlantern/kcp-go-fix -* Merge pull request [#337](https://github.com/getlantern/flashlight/issues/337) from getlantern/protected -* Merge pull request [#336](https://github.com/getlantern/flashlight/issues/336) from getlantern/dependencies -* Merge pull request [#331](https://github.com/getlantern/flashlight/issues/331) from getlantern/issue1291 -* Merge pull request [#335](https://github.com/getlantern/flashlight/issues/335) from getlantern/add-force-redial -* Merge pull request [#332](https://github.com/getlantern/flashlight/issues/332) from getlantern/internal-1290-joesis -* Merge pull request [#330](https://github.com/getlantern/flashlight/issues/330) from getlantern/internal-1290-joesis -* Merge pull request [#328](https://github.com/getlantern/flashlight/issues/328) from getlantern/lampshadeleak -* Merge pull request [#327](https://github.com/getlantern/flashlight/issues/327) from getlantern/revert-search-domain -* Merge pull request [#324](https://github.com/getlantern/flashlight/issues/324) from getlantern/kcp-1280 -* Merge pull request [#325](https://github.com/getlantern/flashlight/issues/325) from getlantern/kcp-1280-ox -* Merge pull request [#322](https://github.com/getlantern/flashlight/issues/322) from getlantern/nopaniclampshade -* Merge pull request [#320](https://github.com/getlantern/flashlight/issues/320) from getlantern/internal-1273 -* Merge pull request [#321](https://github.com/getlantern/flashlight/issues/321) from getlantern/internal-1273-joesis -* Merge pull request [#317](https://github.com/getlantern/flashlight/issues/317) from getlantern/search-damain -* Merge pull request [#314](https://github.com/getlantern/flashlight/issues/314) from getlantern/dnsgrab -* Merge pull request [#318](https://github.com/getlantern/flashlight/issues/318) from getlantern/dnsgrab-settings-config -* Merge pull request [#319](https://github.com/getlantern/flashlight/issues/319) from getlantern/issue1258 -* Merge pull request [#316](https://github.com/getlantern/flashlight/issues/316) from getlantern/dnsgrab-check-play -* Merge pull request [#315](https://github.com/getlantern/flashlight/issues/315) from getlantern/issue-1228 -* Merge pull request [#313](https://github.com/getlantern/flashlight/issues/313) from getlantern/refresh-systray -* Merge pull request [#312](https://github.com/getlantern/flashlight/issues/312) from getlantern/issue1206 -* Merge pull request [#311](https://github.com/getlantern/flashlight/issues/311) from getlantern/issue1059 -* Merge pull request [#310](https://github.com/getlantern/flashlight/issues/310) from getlantern/proxied-test -* Merge pull request [#307](https://github.com/getlantern/flashlight/issues/307) from getlantern/rename-get-device-id -* Merge pull request [#303](https://github.com/getlantern/flashlight/issues/303) from getlantern/issue881 -* Merge pull request [#305](https://github.com/getlantern/flashlight/issues/305) from getlantern/internal-756 -* Merge pull request [#306](https://github.com/getlantern/flashlight/issues/306) from getlantern/internal-756-myles -* Merge pull request [#304](https://github.com/getlantern/flashlight/issues/304) from getlantern/internal-1156 -* Merge pull request [#291](https://github.com/getlantern/flashlight/issues/291) from getlantern/issue1106 -* Merge pull request [#302](https://github.com/getlantern/flashlight/issues/302) from getlantern/add-back-logrus -* Merge pull request [#301](https://github.com/getlantern/flashlight/issues/301) from getlantern/issue1177 -* Merge pull request [#299](https://github.com/getlantern/flashlight/issues/299) from getlantern/internal-1051 -* Merge pull request [#294](https://github.com/getlantern/flashlight/issues/294) from getlantern/issue1088 -* Merge pull request [#292](https://github.com/getlantern/flashlight/issues/292) from getlantern/issue995 -* Merge pull request [#276](https://github.com/getlantern/flashlight/issues/276) from getlantern/issue979-2 -* Merge pull request [#298](https://github.com/getlantern/flashlight/issues/298) from getlantern/renewal-updates -* Merge pull request [#297](https://github.com/getlantern/flashlight/issues/297) from getlantern/issue285 -* Merge pull request [#296](https://github.com/getlantern/flashlight/issues/296) from getlantern/issue1121 -* Merge pull request [#293](https://github.com/getlantern/flashlight/issues/293) from getlantern/totalreceived -* Merge pull request [#290](https://github.com/getlantern/flashlight/issues/290) from getlantern/internal-1081 -* Merge pull request [#289](https://github.com/getlantern/flashlight/issues/289) from getlantern/1066 -* Merge pull request [#269](https://github.com/getlantern/flashlight/issues/269) from getlantern/mobile-4.0 -* Merge pull request [#283](https://github.com/getlantern/flashlight/issues/283) from getlantern/desktop-274-3 -* Merge pull request [#287](https://github.com/getlantern/flashlight/issues/287) from getlantern/desktop-274-3-myles -* Merge pull request [#288](https://github.com/getlantern/flashlight/issues/288) from getlantern/issue-1036 -* Merge pull request [#284](https://github.com/getlantern/flashlight/issues/284) from getlantern/proxiedsites-doha - - - -## [3.7.6](https://github.com/getlantern/flashlight/compare/4.7.2...3.7.6) - -> 2018-05-29 - - - -## [4.7.2](https://github.com/getlantern/flashlight/compare/4.7.1...4.7.2) - -> 2018-05-29 - -### Pull Requests - -* Merge pull request [#456](https://github.com/getlantern/flashlight/issues/456) from getlantern/ox/issue2015 - - - -## [4.7.1](https://github.com/getlantern/flashlight/compare/4.7.0...4.7.1) - -> 2018-05-18 - -### Pull Requests - -* Merge pull request [#455](https://github.com/getlantern/flashlight/issues/455) from getlantern/ox/issue1979 - - - -## [4.7.0](https://github.com/getlantern/flashlight/compare/4.6.15...4.7.0) - -> 2018-05-17 - -### Pull Requests - -* Merge pull request [#454](https://github.com/getlantern/flashlight/issues/454) from getlantern/ox/issue1970 - - - -## [4.6.15](https://github.com/getlantern/flashlight/compare/4.6.14...4.6.15) - -> 2018-05-16 - -### Pull Requests - -* Merge pull request [#453](https://github.com/getlantern/flashlight/issues/453) from getlantern/genproxies-4.6.15 -* Merge pull request [#452](https://github.com/getlantern/flashlight/issues/452) from getlantern/genconfig-global-4.6.15 -* Merge pull request [#451](https://github.com/getlantern/flashlight/issues/451) from getlantern/ox/fixprobe -* Merge pull request [#450](https://github.com/getlantern/flashlight/issues/450) from getlantern/genproxies-ir -* Merge pull request [#449](https://github.com/getlantern/flashlight/issues/449) from getlantern/ox/fixproxynameregex - - - -## [4.6.14](https://github.com/getlantern/flashlight/compare/4.6.13...4.6.14) - -> 2018-05-07 - -### Pull Requests - -* Merge pull request [#448](https://github.com/getlantern/flashlight/issues/448) from getlantern/issue-1915 -* Merge pull request [#447](https://github.com/getlantern/flashlight/issues/447) from getlantern/ox/dial-for-balancer-details - - - -## [4.6.13](https://github.com/getlantern/flashlight/compare/4.6.12...4.6.13) - -> 2018-05-02 - - - -## [4.6.12](https://github.com/getlantern/flashlight/compare/4.6.11...4.6.12) - -> 2018-05-02 - - - -## [4.6.11](https://github.com/getlantern/flashlight/compare/4.2.0...4.6.11) - -> 2018-05-01 - -### Reverts - -* break nextPreconnected properly - -### Pull Requests - -* Merge pull request [#445](https://github.com/getlantern/flashlight/issues/445) from getlantern/genconfig-4.6.11 -* Merge pull request [#442](https://github.com/getlantern/flashlight/issues/442) from getlantern/1878-invalid-addr -* Merge pull request [#441](https://github.com/getlantern/flashlight/issues/441) from getlantern/fix-stats-tracking -* Merge pull request [#444](https://github.com/getlantern/flashlight/issues/444) from getlantern/adyen-iran-pro-ui-tweaks -* Merge pull request [#443](https://github.com/getlantern/flashlight/issues/443) from getlantern/ox/issue-1880 -* Merge pull request [#440](https://github.com/getlantern/flashlight/issues/440) from getlantern/1868-fix-gunzip -* Merge pull request [#438](https://github.com/getlantern/flashlight/issues/438) from getlantern/1689-fix-check-connectivity -* Merge pull request [#436](https://github.com/getlantern/flashlight/issues/436) from getlantern/ox/issue1838 -* Merge pull request [#434](https://github.com/getlantern/flashlight/issues/434) from getlantern/no-opencensus -* Merge pull request [#435](https://github.com/getlantern/flashlight/issues/435) from getlantern/myleshorton-wercker-doc -* Merge pull request [#432](https://github.com/getlantern/flashlight/issues/432) from getlantern/ox/issue1826 -* Merge pull request [#431](https://github.com/getlantern/flashlight/issues/431) from getlantern/glide-to-dep -* Merge pull request [#433](https://github.com/getlantern/flashlight/issues/433) from getlantern/issue-1851 -* Merge pull request [#429](https://github.com/getlantern/flashlight/issues/429) from getlantern/ox/lazy-lampshade -* Merge pull request [#430](https://github.com/getlantern/flashlight/issues/430) from getlantern/loconf-log -* Merge pull request [#423](https://github.com/getlantern/flashlight/issues/423) from getlantern/issue_1698 -* Merge pull request [#428](https://github.com/getlantern/flashlight/issues/428) from getlantern/fixes -* Merge pull request [#426](https://github.com/getlantern/flashlight/issues/426) from getlantern/ox/issue-1792 -* Merge pull request [#425](https://github.com/getlantern/flashlight/issues/425) from getlantern/android-timeout-1808 -* Merge pull request [#424](https://github.com/getlantern/flashlight/issues/424) from getlantern/staging-settings -* Merge pull request [#422](https://github.com/getlantern/flashlight/issues/422) from getlantern/internal-1715 -* Merge pull request [#421](https://github.com/getlantern/flashlight/issues/421) from getlantern/ui-4.6.0-rc2 -* Merge pull request [#420](https://github.com/getlantern/flashlight/issues/420) from getlantern/deps-4.6.0-rc1 -* Merge pull request [#419](https://github.com/getlantern/flashlight/issues/419) from getlantern/release-4.5.7 -* Merge pull request [#418](https://github.com/getlantern/flashlight/issues/418) from getlantern/ui-4.5.9 -* Merge pull request [#417](https://github.com/getlantern/flashlight/issues/417) from getlantern/ox/proxybench-full -* Merge pull request [#415](https://github.com/getlantern/flashlight/issues/415) from getlantern/app-to-desktop -* Merge pull request [#416](https://github.com/getlantern/flashlight/issues/416) from getlantern/issue-1651 -* Merge pull request [#414](https://github.com/getlantern/flashlight/issues/414) from getlantern/updatedeps-20180403 -* Merge pull request [#413](https://github.com/getlantern/flashlight/issues/413) from getlantern/ox/borda-trim -* Merge pull request [#412](https://github.com/getlantern/flashlight/issues/412) from getlantern/4.5.8-deps -* Merge pull request [#411](https://github.com/getlantern/flashlight/issues/411) from getlantern/ox/timeout-cleanup -* Merge pull request [#408](https://github.com/getlantern/flashlight/issues/408) from getlantern/fwp-android-changes -* Merge pull request [#410](https://github.com/getlantern/flashlight/issues/410) from getlantern/ox/issue1659 -* Merge pull request [#409](https://github.com/getlantern/flashlight/issues/409) from getlantern/hh/issue-1523 -* Merge pull request [#407](https://github.com/getlantern/flashlight/issues/407) from getlantern/ox/issue-1648 -* Merge pull request [#393](https://github.com/getlantern/flashlight/issues/393) from getlantern/hh/issue-1489 -* Merge pull request [#405](https://github.com/getlantern/flashlight/issues/405) from getlantern/ox/notesthang -* Merge pull request [#406](https://github.com/getlantern/flashlight/issues/406) from getlantern/ox/config_from_cloud -* Merge pull request [#403](https://github.com/getlantern/flashlight/issues/403) from getlantern/ox/issue-1489 -* Merge pull request [#398](https://github.com/getlantern/flashlight/issues/398) from getlantern/ox/nopreroll -* Merge pull request [#402](https://github.com/getlantern/flashlight/issues/402) from getlantern/only-show-ads-certain-regions -* Merge pull request [#400](https://github.com/getlantern/flashlight/issues/400) from getlantern/add-whitelist-option -* Merge pull request [#399](https://github.com/getlantern/flashlight/issues/399) from getlantern/ox/issue-1533 -* Merge pull request [#401](https://github.com/getlantern/flashlight/issues/401) from getlantern/ox/issue1532 -* Merge pull request [#397](https://github.com/getlantern/flashlight/issues/397) from getlantern/ox/config-tests-without-files -* Merge pull request [#394](https://github.com/getlantern/flashlight/issues/394) from getlantern/add-show-ads-after-days-option -* Merge pull request [#396](https://github.com/getlantern/flashlight/issues/396) from getlantern/noblock -* Merge pull request [#395](https://github.com/getlantern/flashlight/issues/395) from getlantern/ox/issue-1494 -* Merge pull request [#385](https://github.com/getlantern/flashlight/issues/385) from getlantern/hh/issue-1455 -* Merge pull request [#381](https://github.com/getlantern/flashlight/issues/381) from getlantern/internal-1462 -* Merge pull request [#391](https://github.com/getlantern/flashlight/issues/391) from getlantern/issue1499 -* Merge pull request [#384](https://github.com/getlantern/flashlight/issues/384) from getlantern/issue-382 -* Merge pull request [#390](https://github.com/getlantern/flashlight/issues/390) from getlantern/issue1496 -* Merge pull request [#388](https://github.com/getlantern/flashlight/issues/388) from getlantern/issue1490 -* Merge pull request [#389](https://github.com/getlantern/flashlight/issues/389) from getlantern/issue1490-myles -* Merge pull request [#376](https://github.com/getlantern/flashlight/issues/376) from getlantern/unblock_exoclick -* Merge pull request [#386](https://github.com/getlantern/flashlight/issues/386) from getlantern/unblock_exoclick_mitm -* Merge pull request [#387](https://github.com/getlantern/flashlight/issues/387) from getlantern/fix_loconf_test -* Merge pull request [#351](https://github.com/getlantern/flashlight/issues/351) from getlantern/enhttp -* Merge pull request [#378](https://github.com/getlantern/flashlight/issues/378) from getlantern/internal-1450 -* Merge pull request [#383](https://github.com/getlantern/flashlight/issues/383) from getlantern/ads-integration -* Merge pull request [#379](https://github.com/getlantern/flashlight/issues/379) from getlantern/internal-1460 -* Merge pull request [#380](https://github.com/getlantern/flashlight/issues/380) from getlantern/newbordadomain -* Merge pull request [#372](https://github.com/getlantern/flashlight/issues/372) from getlantern/genconfig -* Merge pull request [#377](https://github.com/getlantern/flashlight/issues/377) from getlantern/deps-4.5.3 -* Merge pull request [#371](https://github.com/getlantern/flashlight/issues/371) from getlantern/ws-tweak -* Merge pull request [#329](https://github.com/getlantern/flashlight/issues/329) from getlantern/internal-1290 -* Merge pull request [#370](https://github.com/getlantern/flashlight/issues/370) from getlantern/balancer_dial -* Merge pull request [#369](https://github.com/getlantern/flashlight/issues/369) from getlantern/deps-update -* Merge pull request [#368](https://github.com/getlantern/flashlight/issues/368) from getlantern/issue1403 -* Merge pull request [#366](https://github.com/getlantern/flashlight/issues/366) from getlantern/issue1421 -* Merge pull request [#367](https://github.com/getlantern/flashlight/issues/367) from getlantern/issue1421_readable -* Merge pull request [#365](https://github.com/getlantern/flashlight/issues/365) from getlantern/issue1337-pool -* Merge pull request [#358](https://github.com/getlantern/flashlight/issues/358) from getlantern/issue1359 -* Merge pull request [#364](https://github.com/getlantern/flashlight/issues/364) from getlantern/issue-1357 -* Merge pull request [#362](https://github.com/getlantern/flashlight/issues/362) from getlantern/internal-1337-print-goroutines -* Merge pull request [#361](https://github.com/getlantern/flashlight/issues/361) from getlantern/update-protected-regex-issue -* Merge pull request [#359](https://github.com/getlantern/flashlight/issues/359) from getlantern/issue1391 -* Merge pull request [#360](https://github.com/getlantern/flashlight/issues/360) from getlantern/remove-token-reset -* Merge pull request [#356](https://github.com/getlantern/flashlight/issues/356) from getlantern/issue-internal-1283 -* Merge pull request [#352](https://github.com/getlantern/flashlight/issues/352) from getlantern/ipv6 -* Merge pull request [#350](https://github.com/getlantern/flashlight/issues/350) from getlantern/remove-dns-grab-from-settings -* Merge pull request [#348](https://github.com/getlantern/flashlight/issues/348) from getlantern/send-user-params-payment-gateway -* Merge pull request [#347](https://github.com/getlantern/flashlight/issues/347) from getlantern/internal-1139 -* Merge pull request [#338](https://github.com/getlantern/flashlight/issues/338) from getlantern/internal-1328 -* Merge pull request [#345](https://github.com/getlantern/flashlight/issues/345) from getlantern/issue1277 -* Merge pull request [#342](https://github.com/getlantern/flashlight/issues/342) from getlantern/issue1332 -* Merge pull request [#340](https://github.com/getlantern/flashlight/issues/340) from getlantern/kcp-go-fix -* Merge pull request [#337](https://github.com/getlantern/flashlight/issues/337) from getlantern/protected -* Merge pull request [#336](https://github.com/getlantern/flashlight/issues/336) from getlantern/dependencies -* Merge pull request [#331](https://github.com/getlantern/flashlight/issues/331) from getlantern/issue1291 -* Merge pull request [#335](https://github.com/getlantern/flashlight/issues/335) from getlantern/add-force-redial -* Merge pull request [#332](https://github.com/getlantern/flashlight/issues/332) from getlantern/internal-1290-joesis -* Merge pull request [#330](https://github.com/getlantern/flashlight/issues/330) from getlantern/internal-1290-joesis -* Merge pull request [#328](https://github.com/getlantern/flashlight/issues/328) from getlantern/lampshadeleak -* Merge pull request [#327](https://github.com/getlantern/flashlight/issues/327) from getlantern/revert-search-domain -* Merge pull request [#322](https://github.com/getlantern/flashlight/issues/322) from getlantern/nopaniclampshade -* Merge pull request [#320](https://github.com/getlantern/flashlight/issues/320) from getlantern/internal-1273 -* Merge pull request [#321](https://github.com/getlantern/flashlight/issues/321) from getlantern/internal-1273-joesis -* Merge pull request [#317](https://github.com/getlantern/flashlight/issues/317) from getlantern/search-damain -* Merge pull request [#314](https://github.com/getlantern/flashlight/issues/314) from getlantern/dnsgrab -* Merge pull request [#318](https://github.com/getlantern/flashlight/issues/318) from getlantern/dnsgrab-settings-config -* Merge pull request [#319](https://github.com/getlantern/flashlight/issues/319) from getlantern/issue1258 -* Merge pull request [#316](https://github.com/getlantern/flashlight/issues/316) from getlantern/dnsgrab-check-play - - - -## [4.2.0](https://github.com/getlantern/flashlight/compare/4.1.3...4.2.0) - -> 2017-10-11 - -### Pull Requests - -* Merge pull request [#324](https://github.com/getlantern/flashlight/issues/324) from getlantern/kcp-1280 -* Merge pull request [#325](https://github.com/getlantern/flashlight/issues/325) from getlantern/kcp-1280-ox - - - -## [4.1.3](https://github.com/getlantern/flashlight/compare/4.1.2...4.1.3) - -> 2017-10-10 - - - -## [4.1.2](https://github.com/getlantern/flashlight/compare/4.0.1...4.1.2) - -> 2017-09-28 - -### Pull Requests - -* Merge pull request [#315](https://github.com/getlantern/flashlight/issues/315) from getlantern/issue-1228 -* Merge pull request [#313](https://github.com/getlantern/flashlight/issues/313) from getlantern/refresh-systray -* Merge pull request [#312](https://github.com/getlantern/flashlight/issues/312) from getlantern/issue1206 -* Merge pull request [#311](https://github.com/getlantern/flashlight/issues/311) from getlantern/issue1059 -* Merge pull request [#310](https://github.com/getlantern/flashlight/issues/310) from getlantern/proxied-test -* Merge pull request [#307](https://github.com/getlantern/flashlight/issues/307) from getlantern/rename-get-device-id -* Merge pull request [#303](https://github.com/getlantern/flashlight/issues/303) from getlantern/issue881 -* Merge pull request [#305](https://github.com/getlantern/flashlight/issues/305) from getlantern/internal-756 -* Merge pull request [#306](https://github.com/getlantern/flashlight/issues/306) from getlantern/internal-756-myles -* Merge pull request [#304](https://github.com/getlantern/flashlight/issues/304) from getlantern/internal-1156 -* Merge pull request [#291](https://github.com/getlantern/flashlight/issues/291) from getlantern/issue1106 -* Merge pull request [#302](https://github.com/getlantern/flashlight/issues/302) from getlantern/add-back-logrus -* Merge pull request [#301](https://github.com/getlantern/flashlight/issues/301) from getlantern/issue1177 -* Merge pull request [#299](https://github.com/getlantern/flashlight/issues/299) from getlantern/internal-1051 -* Merge pull request [#294](https://github.com/getlantern/flashlight/issues/294) from getlantern/issue1088 -* Merge pull request [#292](https://github.com/getlantern/flashlight/issues/292) from getlantern/issue995 -* Merge pull request [#276](https://github.com/getlantern/flashlight/issues/276) from getlantern/issue979-2 - - - -## [4.0.1](https://github.com/getlantern/flashlight/compare/3.5.12...4.0.1) - -> 2017-09-05 - -### Reverts - -* Check for error creating domain-fronting request - -### Pull Requests - -* Merge pull request [#298](https://github.com/getlantern/flashlight/issues/298) from getlantern/renewal-updates -* Merge pull request [#297](https://github.com/getlantern/flashlight/issues/297) from getlantern/issue285 -* Merge pull request [#296](https://github.com/getlantern/flashlight/issues/296) from getlantern/issue1121 -* Merge pull request [#293](https://github.com/getlantern/flashlight/issues/293) from getlantern/totalreceived -* Merge pull request [#290](https://github.com/getlantern/flashlight/issues/290) from getlantern/internal-1081 -* Merge pull request [#289](https://github.com/getlantern/flashlight/issues/289) from getlantern/1066 -* Merge pull request [#269](https://github.com/getlantern/flashlight/issues/269) from getlantern/mobile-4.0 -* Merge pull request [#283](https://github.com/getlantern/flashlight/issues/283) from getlantern/desktop-274-3 -* Merge pull request [#287](https://github.com/getlantern/flashlight/issues/287) from getlantern/desktop-274-3-myles -* Merge pull request [#288](https://github.com/getlantern/flashlight/issues/288) from getlantern/issue-1036 -* Merge pull request [#284](https://github.com/getlantern/flashlight/issues/284) from getlantern/proxiedsites-doha -* Merge pull request [#277](https://github.com/getlantern/flashlight/issues/277) from getlantern/internal-924-detour -* Merge pull request [#278](https://github.com/getlantern/flashlight/issues/278) from getlantern/internal-905 -* Merge pull request [#281](https://github.com/getlantern/flashlight/issues/281) from getlantern/user-payment-gateway -* Merge pull request [#279](https://github.com/getlantern/flashlight/issues/279) from getlantern/new-pw-sdk -* Merge pull request [#275](https://github.com/getlantern/flashlight/issues/275) from getlantern/forceads -* Merge pull request [#260](https://github.com/getlantern/flashlight/issues/260) from getlantern/new-pw-sdk -* Merge pull request [#270](https://github.com/getlantern/flashlight/issues/270) from getlantern/internal-963 -* Merge pull request [#271](https://github.com/getlantern/flashlight/issues/271) from getlantern/proxied-data-race -* Merge pull request [#259](https://github.com/getlantern/flashlight/issues/259) from getlantern/internal-924-borda -* Merge pull request [#268](https://github.com/getlantern/flashlight/issues/268) from getlantern/genconfiglimit -* Merge pull request [#261](https://github.com/getlantern/flashlight/issues/261) from getlantern/issue-942 -* Merge pull request [#264](https://github.com/getlantern/flashlight/issues/264) from getlantern/chinamasquerades -* Merge pull request [#263](https://github.com/getlantern/flashlight/issues/263) from getlantern/issue936 -* Merge pull request [#254](https://github.com/getlantern/flashlight/issues/254) from getlantern/internal-904 -* Merge pull request [#252](https://github.com/getlantern/flashlight/issues/252) from getlantern/issue657 -* Merge pull request [#256](https://github.com/getlantern/flashlight/issues/256) from getlantern/mobile-4.0-stats-tracker -* Merge pull request [#257](https://github.com/getlantern/flashlight/issues/257) from getlantern/mobile-4.0-stats-tracker-joesis -* Merge pull request [#255](https://github.com/getlantern/flashlight/issues/255) from getlantern/internal-924 -* Merge pull request [#253](https://github.com/getlantern/flashlight/issues/253) from getlantern/hotfix-pull-247 -* Merge pull request [#250](https://github.com/getlantern/flashlight/issues/250) from getlantern/internal-901 -* Merge pull request [#247](https://github.com/getlantern/flashlight/issues/247) from getlantern/issue903 -* Merge pull request [#249](https://github.com/getlantern/flashlight/issues/249) from getlantern/plans-page -* Merge pull request [#244](https://github.com/getlantern/flashlight/issues/244) from getlantern/issue853 -* Merge pull request [#248](https://github.com/getlantern/flashlight/issues/248) from getlantern/issue910 -* Merge pull request [#246](https://github.com/getlantern/flashlight/issues/246) from getlantern/trackback-all -* Merge pull request [#245](https://github.com/getlantern/flashlight/issues/245) from getlantern/issue900 -* Merge pull request [#242](https://github.com/getlantern/flashlight/issues/242) from getlantern/track-all-opens -* Merge pull request [#241](https://github.com/getlantern/flashlight/issues/241) from getlantern/issue889 -* Merge pull request [#240](https://github.com/getlantern/flashlight/issues/240) from getlantern/bust-loconf-cache -* Merge pull request [#239](https://github.com/getlantern/flashlight/issues/239) from getlantern/issue-891 -* Merge pull request [#236](https://github.com/getlantern/flashlight/issues/236) from getlantern/internal-831 -* Merge pull request [#238](https://github.com/getlantern/flashlight/issues/238) from getlantern/issue889 -* Merge pull request [#237](https://github.com/getlantern/flashlight/issues/237) from getlantern/coverage -* Merge pull request [#235](https://github.com/getlantern/flashlight/issues/235) from getlantern/issue-856 -* Merge pull request [#231](https://github.com/getlantern/flashlight/issues/231) from getlantern/add-email-exists-call -* Merge pull request [#229](https://github.com/getlantern/flashlight/issues/229) from getlantern/issue-869 -* Merge pull request [#233](https://github.com/getlantern/flashlight/issues/233) from getlantern/issue866 -* Merge pull request [#228](https://github.com/getlantern/flashlight/issues/228) from getlantern/issue796 -* Merge pull request [#225](https://github.com/getlantern/flashlight/issues/225) from getlantern/uninstall-survey3 -* Merge pull request [#227](https://github.com/getlantern/flashlight/issues/227) from getlantern/dialtimes -* Merge pull request [#226](https://github.com/getlantern/flashlight/issues/226) from getlantern/internal-832 -* Merge pull request [#221](https://github.com/getlantern/flashlight/issues/221) from getlantern/issue839 -* Merge pull request [#224](https://github.com/getlantern/flashlight/issues/224) from getlantern/bypass -* Merge pull request [#222](https://github.com/getlantern/flashlight/issues/222) from getlantern/issue810 -* Merge pull request [#220](https://github.com/getlantern/flashlight/issues/220) from getlantern/issue811 -* Merge pull request [#218](https://github.com/getlantern/flashlight/issues/218) from getlantern/errorlog -* Merge pull request [#219](https://github.com/getlantern/flashlight/issues/219) from getlantern/remove-check-dodial -* Merge pull request [#217](https://github.com/getlantern/flashlight/issues/217) from getlantern/settings-screen -* Merge pull request [#198](https://github.com/getlantern/flashlight/issues/198) from getlantern/issue-4182 -* Merge pull request [#216](https://github.com/getlantern/flashlight/issues/216) from getlantern/reenable-httpse -* Merge pull request [#215](https://github.com/getlantern/flashlight/issues/215) from getlantern/auto-update-domain-fronting -* Merge pull request [#214](https://github.com/getlantern/flashlight/issues/214) from getlantern/trackconfigupdate -* Merge pull request [#203](https://github.com/getlantern/flashlight/issues/203) from getlantern/sysproxy -* Merge pull request [#213](https://github.com/getlantern/flashlight/issues/213) from getlantern/sysproxy-joesis -* Merge pull request [#208](https://github.com/getlantern/flashlight/issues/208) from getlantern/issue-764 -* Merge pull request [#212](https://github.com/getlantern/flashlight/issues/212) from getlantern/logcert -* Merge pull request [#211](https://github.com/getlantern/flashlight/issues/211) from getlantern/statsnoblock -* Merge pull request [#209](https://github.com/getlantern/flashlight/issues/209) from getlantern/internal-754 -* Merge pull request [#210](https://github.com/getlantern/flashlight/issues/210) from getlantern/issue771 -* Merge pull request [#207](https://github.com/getlantern/flashlight/issues/207) from getlantern/issue204 -* Merge pull request [#205](https://github.com/getlantern/flashlight/issues/205) from getlantern/issue204 -* Merge pull request [#206](https://github.com/getlantern/flashlight/issues/206) from getlantern/disable-httpse -* Merge pull request [#202](https://github.com/getlantern/flashlight/issues/202) from getlantern/issue750 -* Merge pull request [#195](https://github.com/getlantern/flashlight/issues/195) from getlantern/proxyselectrefa -* Merge pull request [#200](https://github.com/getlantern/flashlight/issues/200) from getlantern/pro-backend-staging-mode -* Merge pull request [#201](https://github.com/getlantern/flashlight/issues/201) from getlantern/pro-backend-staging-mode-joesis -* Merge pull request [#199](https://github.com/getlantern/flashlight/issues/199) from getlantern/issue737 -* Merge pull request [#192](https://github.com/getlantern/flashlight/issues/192) from getlantern/internal-704 -* Merge pull request [#188](https://github.com/getlantern/flashlight/issues/188) from getlantern/internal-691 -* Merge pull request [#197](https://github.com/getlantern/flashlight/issues/197) from getlantern/issue-196 -* Merge pull request [#194](https://github.com/getlantern/flashlight/issues/194) from getlantern/issue-736-fffw -* Merge pull request [#193](https://github.com/getlantern/flashlight/issues/193) from getlantern/revert-191-issue-736 -* Merge pull request [#191](https://github.com/getlantern/flashlight/issues/191) from getlantern/issue-736 -* Merge pull request [#190](https://github.com/getlantern/flashlight/issues/190) from getlantern/devel-add-set-country -* Merge pull request [#187](https://github.com/getlantern/flashlight/issues/187) from getlantern/protected-update -* Merge pull request [#183](https://github.com/getlantern/flashlight/issues/183) from getlantern/devel-android-local-config -* Merge pull request [#186](https://github.com/getlantern/flashlight/issues/186) from getlantern/devel-android-loca-config-myles -* Merge pull request [#185](https://github.com/getlantern/flashlight/issues/185) from getlantern/ackstats -* Merge pull request [#184](https://github.com/getlantern/flashlight/issues/184) from getlantern/internal-678 -* Merge pull request [#133](https://github.com/getlantern/flashlight/issues/133) from getlantern/adblock -* Merge pull request [#177](https://github.com/getlantern/flashlight/issues/177) from getlantern/lampshade -* Merge pull request [#181](https://github.com/getlantern/flashlight/issues/181) from getlantern/issue-697 -* Merge pull request [#182](https://github.com/getlantern/flashlight/issues/182) from getlantern/issue-697-joesis -* Merge pull request [#180](https://github.com/getlantern/flashlight/issues/180) from getlantern/issue-695 -* Merge pull request [#170](https://github.com/getlantern/flashlight/issues/170) from getlantern/overhead -* Merge pull request [#173](https://github.com/getlantern/flashlight/issues/173) from getlantern/integrate-lanternlib -* Merge pull request [#179](https://github.com/getlantern/flashlight/issues/179) from getlantern/integrate-lanternlib-myles -* Merge pull request [#178](https://github.com/getlantern/flashlight/issues/178) from getlantern/integrate-lanternlib-myles -* Merge pull request [#171](https://github.com/getlantern/flashlight/issues/171) from getlantern/issue668 -* Merge pull request [#154](https://github.com/getlantern/flashlight/issues/154) from getlantern/internal-394 -* Merge pull request [#169](https://github.com/getlantern/flashlight/issues/169) from getlantern/ws-cleanup -* Merge pull request [#175](https://github.com/getlantern/flashlight/issues/175) from getlantern/ws-cleanup-joesis -* Merge pull request [#172](https://github.com/getlantern/flashlight/issues/172) from getlantern/issue670 -* Merge pull request [#168](https://github.com/getlantern/flashlight/issues/168) from getlantern/ui-cleanup -* Merge pull request [#165](https://github.com/getlantern/flashlight/issues/165) from getlantern/internal-575-again -* Merge pull request [#167](https://github.com/getlantern/flashlight/issues/167) from getlantern/internal-650-joesis -* Merge pull request [#166](https://github.com/getlantern/flashlight/issues/166) from getlantern/internal-650 -* Merge pull request [#164](https://github.com/getlantern/flashlight/issues/164) from getlantern/internal-647 -* Merge pull request [#162](https://github.com/getlantern/flashlight/issues/162) from getlantern/proxybench_tweak -* Merge pull request [#158](https://github.com/getlantern/flashlight/issues/158) from getlantern/issue41 -* Merge pull request [#160](https://github.com/getlantern/flashlight/issues/160) from getlantern/internal-615 -* Merge pull request [#153](https://github.com/getlantern/flashlight/issues/153) from getlantern/issue579-test-cover -* Merge pull request [#157](https://github.com/getlantern/flashlight/issues/157) from getlantern/internal-575 -* Merge pull request [#159](https://github.com/getlantern/flashlight/issues/159) from getlantern/interna-589 -* Merge pull request [#156](https://github.com/getlantern/flashlight/issues/156) from getlantern/internal-601 -* Merge pull request [#155](https://github.com/getlantern/flashlight/issues/155) from getlantern/internal-552 -* Merge pull request [#150](https://github.com/getlantern/flashlight/issues/150) from getlantern/issue578 -* Merge pull request [#151](https://github.com/getlantern/flashlight/issues/151) from getlantern/issue579 -* Merge pull request [#148](https://github.com/getlantern/flashlight/issues/148) from getlantern/issue4946 -* Merge pull request [#130](https://github.com/getlantern/flashlight/issues/130) from getlantern/issue5415 -* Merge pull request [#146](https://github.com/getlantern/flashlight/issues/146) from getlantern/issue256 -* Merge pull request [#147](https://github.com/getlantern/flashlight/issues/147) from getlantern/trackinproxy -* Merge pull request [#144](https://github.com/getlantern/flashlight/issues/144) from getlantern/countingema -* Merge pull request [#143](https://github.com/getlantern/flashlight/issues/143) from getlantern/proxyselection -* Merge pull request [#145](https://github.com/getlantern/flashlight/issues/145) from getlantern/proxyselection-joesis - - - -## [3.5.12](https://github.com/getlantern/flashlight/compare/0.0.3...3.5.12) - -> 2017-01-06 - -### Reverts - -* Merge pull request [#120](https://github.com/getlantern/flashlight/issues/120) from getlantern/issue-391 -* Biasing results for Chinese users towards KCP - -### Pull Requests - -* Merge pull request [#142](https://github.com/getlantern/flashlight/issues/142) from getlantern/issue5526 -* Merge pull request [#139](https://github.com/getlantern/flashlight/issues/139) from getlantern/berr -* Merge pull request [#137](https://github.com/getlantern/flashlight/issues/137) from getlantern/issue-5514 -* Merge pull request [#136](https://github.com/getlantern/flashlight/issues/136) from getlantern/internal-511 -* Merge pull request [#134](https://github.com/getlantern/flashlight/issues/134) from getlantern/issue-5447 -* Merge pull request [#113](https://github.com/getlantern/flashlight/issues/113) from getlantern/internal-187 -* Merge pull request [#132](https://github.com/getlantern/flashlight/issues/132) from getlantern/issue510-bias -* Merge pull request [#131](https://github.com/getlantern/flashlight/issues/131) from getlantern/issue-129 -* Merge pull request [#128](https://github.com/getlantern/flashlight/issues/128) from getlantern/feature/location-based-configuration -* Merge pull request [#127](https://github.com/getlantern/flashlight/issues/127) from getlantern/proto -* Merge pull request [#126](https://github.com/getlantern/flashlight/issues/126) from getlantern/issue458 -* Merge pull request [#112](https://github.com/getlantern/flashlight/issues/112) from getlantern/internal-187-refactor -* Merge pull request [#122](https://github.com/getlantern/flashlight/issues/122) from getlantern/issue-391 -* Merge pull request [#121](https://github.com/getlantern/flashlight/issues/121) from getlantern/protectkcp -* Merge pull request [#120](https://github.com/getlantern/flashlight/issues/120) from getlantern/issue-391 -* Merge pull request [#119](https://github.com/getlantern/flashlight/issues/119) from getlantern/devel-socks5-changes -* Merge pull request [#118](https://github.com/getlantern/flashlight/issues/118) from getlantern/issue-5445 -* Merge pull request [#117](https://github.com/getlantern/flashlight/issues/117) from getlantern/fix-pr-116 -* Merge pull request [#116](https://github.com/getlantern/flashlight/issues/116) from getlantern/issue-5425 -* Merge pull request [#75](https://github.com/getlantern/flashlight/issues/75) from getlantern/issue-4869 -* Merge pull request [#115](https://github.com/getlantern/flashlight/issues/115) from getlantern/issue5393 -* Merge pull request [#114](https://github.com/getlantern/flashlight/issues/114) from getlantern/issue-4869-myles -* Merge pull request [#111](https://github.com/getlantern/flashlight/issues/111) from getlantern/issue-5384 -* Merge pull request [#110](https://github.com/getlantern/flashlight/issues/110) from getlantern/issue-5392 -* Merge pull request [#109](https://github.com/getlantern/flashlight/issues/109) from getlantern/obfs4convert -* Merge pull request [#106](https://github.com/getlantern/flashlight/issues/106) from getlantern/switch_to_proxy -* Merge pull request [#107](https://github.com/getlantern/flashlight/issues/107) from getlantern/kcptimeout -* Merge pull request [#104](https://github.com/getlantern/flashlight/issues/104) from getlantern/issue138 -* Merge pull request [#105](https://github.com/getlantern/flashlight/issues/105) from getlantern/revert-interceptor -* Merge pull request [#103](https://github.com/getlantern/flashlight/issues/103) from getlantern/issue135 -* Merge pull request [#90](https://github.com/getlantern/flashlight/issues/90) from getlantern/issue89 -* Merge pull request [#102](https://github.com/getlantern/flashlight/issues/102) from getlantern/revert-101-biaskcp-devel -* Merge pull request [#101](https://github.com/getlantern/flashlight/issues/101) from getlantern/biaskcp-devel -* Merge pull request [#100](https://github.com/getlantern/flashlight/issues/100) from getlantern/biaskcp -* Merge pull request [#99](https://github.com/getlantern/flashlight/issues/99) from getlantern/kcp2-devel -* Merge pull request [#98](https://github.com/getlantern/flashlight/issues/98) from getlantern/kcp2-devel -* Merge pull request [#96](https://github.com/getlantern/flashlight/issues/96) from getlantern/issue-5346 -* Merge pull request [#95](https://github.com/getlantern/flashlight/issues/95) from getlantern/issue5365 -* Merge pull request [#93](https://github.com/getlantern/flashlight/issues/93) from getlantern/issue-5351 -* Merge pull request [#92](https://github.com/getlantern/flashlight/issues/92) from getlantern/hotfix/better-autoupdate-error-messages -* Merge pull request [#61](https://github.com/getlantern/flashlight/issues/61) from getlantern/feature/go-update -* Merge pull request [#91](https://github.com/getlantern/flashlight/issues/91) from getlantern/issue-255 -* Merge pull request [#89](https://github.com/getlantern/flashlight/issues/89) from getlantern/tweaks -* Merge pull request [#86](https://github.com/getlantern/flashlight/issues/86) from getlantern/issue265 -* Merge pull request [#85](https://github.com/getlantern/flashlight/issues/85) from getlantern/issue5174 -* Merge pull request [#87](https://github.com/getlantern/flashlight/issues/87) from getlantern/issue5174-myles -* Merge pull request [#80](https://github.com/getlantern/flashlight/issues/80) from getlantern/issue-79 -* Merge pull request [#84](https://github.com/getlantern/flashlight/issues/84) from getlantern/issue-252 -* Merge pull request [#83](https://github.com/getlantern/flashlight/issues/83) from getlantern/issue5280 -* Merge pull request [#82](https://github.com/getlantern/flashlight/issues/82) from getlantern/issue137 -* Merge pull request [#81](https://github.com/getlantern/flashlight/issues/81) from getlantern/syncdeps -* Merge pull request [#76](https://github.com/getlantern/flashlight/issues/76) from getlantern/issue-191 -* Merge pull request [#69](https://github.com/getlantern/flashlight/issues/69) from getlantern/feature/loconf-survey -* Merge pull request [#74](https://github.com/getlantern/flashlight/issues/74) from getlantern/internal-224 -* Merge pull request [#73](https://github.com/getlantern/flashlight/issues/73) from getlantern/issue-5284 -* Merge pull request [#72](https://github.com/getlantern/flashlight/issues/72) from getlantern/ddf-query-strings -* Merge pull request [#71](https://github.com/getlantern/flashlight/issues/71) from getlantern/hotfix/bypass-port-check-on-development -* Merge pull request [#70](https://github.com/getlantern/flashlight/issues/70) from getlantern/issue-5276 -* Merge pull request [#68](https://github.com/getlantern/flashlight/issues/68) from getlantern/feature/port-randomization-tests -* Merge pull request [#67](https://github.com/getlantern/flashlight/issues/67) from getlantern/adding-wercker -* Merge pull request [#66](https://github.com/getlantern/flashlight/issues/66) from getlantern/issue-5196 -* Merge pull request [#65](https://github.com/getlantern/flashlight/issues/65) from getlantern/release-3.1.4-merge -* Merge pull request [#62](https://github.com/getlantern/flashlight/issues/62) from getlantern/dialtime -* Merge pull request [#63](https://github.com/getlantern/flashlight/issues/63) from getlantern/loggingdemo -* Merge pull request [#53](https://github.com/getlantern/flashlight/issues/53) from getlantern/glide - - - -## [0.0.3](https://github.com/getlantern/flashlight/compare/v1.5.12...0.0.3) - -> 2014-12-21 - -### Pull Requests - -* Merge pull request [#9](https://github.com/getlantern/flashlight/issues/9) from getlantern/2105 -* Merge pull request [#51](https://github.com/getlantern/flashlight/issues/51) from getlantern/2081 - - - -## [v1.5.12](https://github.com/getlantern/flashlight/compare/natty-beta2...v1.5.12) - -> 2014-12-01 - -### Pull Requests - -* Merge pull request [#47](https://github.com/getlantern/flashlight/issues/47) from getlantern/1981_2 - - - -## [natty-beta2](https://github.com/getlantern/flashlight/compare/natty-beta1...natty-beta2) - -> 2014-11-10 - - - -## [natty-beta1](https://github.com/getlantern/flashlight/compare/natty...natty-beta1) - -> 2014-11-10 - - - -## [natty](https://github.com/getlantern/flashlight/compare/v1.6.0...natty) - -> 2014-11-10 - - - -## [v1.6.0](https://github.com/getlantern/flashlight/compare/v1.5.8...v1.6.0) - -> 2014-11-09 - -### Pull Requests - -* Merge pull request [#42](https://github.com/getlantern/flashlight/issues/42) from getlantern/use-masquerade-ip-2 -* Merge pull request [#43](https://github.com/getlantern/flashlight/issues/43) from getlantern/use-masquerades-ip-2_ox -* Merge pull request [#41](https://github.com/getlantern/flashlight/issues/41) from getlantern/1941 -* Merge pull request [#40](https://github.com/getlantern/flashlight/issues/40) from getlantern/1941_code -* Merge pull request [#32](https://github.com/getlantern/flashlight/issues/32) from getlantern/1606_ox -* Merge pull request [#33](https://github.com/getlantern/flashlight/issues/33) from getlantern/1606_atavism - - - -## [v1.5.8](https://github.com/getlantern/flashlight/compare/ipreify-test...v1.5.8) - -> 2014-11-04 - -### Pull Requests - -* Merge pull request [#38](https://github.com/getlantern/flashlight/issues/38) from getlantern/1935 -* Merge pull request [#37](https://github.com/getlantern/flashlight/issues/37) from getlantern/1930 -* Merge pull request [#36](https://github.com/getlantern/flashlight/issues/36) from getlantern/1913 -* Merge pull request [#35](https://github.com/getlantern/flashlight/issues/35) from getlantern/add-masquerades -* Merge pull request [#34](https://github.com/getlantern/flashlight/issues/34) from getlantern/1895 -* Merge pull request [#31](https://github.com/getlantern/flashlight/issues/31) from getlantern/connectionpool - - - -## [ipreify-test](https://github.com/getlantern/flashlight/compare/v2.2...ipreify-test) - -> 2014-10-04 - -### Pull Requests - -* Merge pull request [#30](https://github.com/getlantern/flashlight/issues/30) from getlantern/cn-alexa-sites -* Merge pull request [#29](https://github.com/getlantern/flashlight/issues/29) from getlantern/1875 -* Merge pull request [#27](https://github.com/getlantern/flashlight/issues/27) from getlantern/1841 - - - -## [v2.2](https://github.com/getlantern/flashlight/compare/v2.1...v2.2) - -> 2014-09-27 - - - -## [v2.1](https://github.com/getlantern/flashlight/compare/v2.0...v2.1) - -> 2014-09-27 - - - -## [v2.0](https://github.com/getlantern/flashlight/compare/docker...v2.0) - -> 2014-09-27 - - - -## [docker](https://github.com/getlantern/flashlight/compare/vdocker...docker) - -> 2014-09-27 - - - -## [vdocker](https://github.com/getlantern/flashlight/compare/0.0.2...vdocker) - -> 2014-09-27 - -### Pull Requests - -* Merge pull request [#26](https://github.com/getlantern/flashlight/issues/26) from getlantern/1767 -* Merge pull request [#25](https://github.com/getlantern/flashlight/issues/25) from getlantern/1832 -* Merge pull request [#23](https://github.com/getlantern/flashlight/issues/23) from getlantern/nil-masquerades -* Merge pull request [#22](https://github.com/getlantern/flashlight/issues/22) from getlantern/filesplit -* Merge pull request [#21](https://github.com/getlantern/flashlight/issues/21) from getlantern/http-client-config -* Merge pull request [#20](https://github.com/getlantern/flashlight/issues/20) from getlantern/1776 -* Merge pull request [#19](https://github.com/getlantern/flashlight/issues/19) from getlantern/1777_3 -* Merge pull request [#16](https://github.com/getlantern/flashlight/issues/16) from getlantern/1762 -* Merge pull request [#15](https://github.com/getlantern/flashlight/issues/15) from getlantern/1762_ox -* Merge pull request [#14](https://github.com/getlantern/flashlight/issues/14) from getlantern/liveyaml - - - -## [0.0.2](https://github.com/getlantern/flashlight/compare/0.0.1...0.0.2) - -> 2014-08-18 - -### Pull Requests - -* Merge pull request [#13](https://github.com/getlantern/flashlight/issues/13) from getlantern/stats - - - -## 0.0.1 - -> 2014-07-31 - -### Pull Requests - -* Merge pull request [#12](https://github.com/getlantern/flashlight/issues/12) from getlantern/fastly -* Merge pull request [#11](https://github.com/getlantern/flashlight/issues/11) from getlantern/roundrobin -* Merge pull request [#10](https://github.com/getlantern/flashlight/issues/10) from getlantern/roundrobin - diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index dc8fcc844..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,1745 +0,0 @@ - - -## [lantern-6.7.0](https://github.com/getlantern/flashlight/compare/lantern-6.6.1...lantern-6.7.0) - -> 2021-06-03 - -### Pull Requests - -* Merge pull request [#1095](https://github.com/getlantern/flashlight/issues/1095) from getlantern/no-onion-domains -* Merge pull request [#1097](https://github.com/getlantern/flashlight/issues/1097) from getlantern/jm/replica-cache-control-headers - - - -## [lantern-6.6.1](https://github.com/getlantern/flashlight/compare/lantern-6.6.0...lantern-6.6.1) - -> 2021-05-14 - -### Pull Requests - -* Merge pull request [#1086](https://github.com/getlantern/flashlight/issues/1086) from getlantern/jm/replica-link-info-endpoint -* Merge pull request [#1090](https://github.com/getlantern/flashlight/issues/1090) from getlantern/myles-github-actions-ci - - - -## [lantern-6.6.0](https://github.com/getlantern/flashlight/compare/lantern-6.5.9...lantern-6.6.0) - -> 2021-05-07 - -### Pull Requests - -* Merge pull request [#1089](https://github.com/getlantern/flashlight/issues/1089) from getlantern/ui-6.6.0 -* Merge pull request [#1087](https://github.com/getlantern/flashlight/issues/1087) from getlantern/fix_ss_connected -* Merge pull request [#1085](https://github.com/getlantern/flashlight/issues/1085) from getlantern/reflog/flag_rework -* Merge pull request [#1077](https://github.com/getlantern/flashlight/issues/1077) from getlantern/shadowsocks -* Merge pull request [#1084](https://github.com/getlantern/flashlight/issues/1084) from getlantern/cors-preflight-fix -* Merge pull request [#1082](https://github.com/getlantern/flashlight/issues/1082) from getlantern/fileIndex-rework -* Merge pull request [#1071](https://github.com/getlantern/flashlight/issues/1071) from getlantern/use-providers -* Merge pull request [#1079](https://github.com/getlantern/flashlight/issues/1079) from getlantern/feature/viper -* Merge pull request [#1078](https://github.com/getlantern/flashlight/issues/1078) from getlantern/netstack-build-fix -* Merge pull request [#1058](https://github.com/getlantern/flashlight/issues/1058) from getlantern/atavism/yinbi-client-updates -* Merge pull request [#1066](https://github.com/getlantern/flashlight/issues/1066) from getlantern/harry/shush-noisy-tl-errors -* Merge pull request [#1076](https://github.com/getlantern/flashlight/issues/1076) from getlantern/ox/issue1074 -* Merge pull request [#1075](https://github.com/getlantern/flashlight/issues/1075) from getlantern/myles/yinbi-client-updates-suggestions -* Merge pull request [#1073](https://github.com/getlantern/flashlight/issues/1073) from getlantern/envvar-features -* Merge pull request [#1072](https://github.com/getlantern/flashlight/issues/1072) from getlantern/sentry-v0.10.0 -* Merge pull request [#1068](https://github.com/getlantern/flashlight/issues/1068) from getlantern/new-replica-upload-endpoint - - - -## [lantern-6.5.9](https://github.com/getlantern/flashlight/compare/lantern-6.5.8...lantern-6.5.9) - -> 2021-04-22 - -### Pull Requests - -* Merge pull request [#1069](https://github.com/getlantern/flashlight/issues/1069) from getlantern/ui-6.5.9 - - - -## [lantern-6.5.8](https://github.com/getlantern/flashlight/compare/lantern-6.5.7...lantern-6.5.8) - -> 2021-04-20 - -### Pull Requests - -* Merge pull request [#1067](https://github.com/getlantern/flashlight/issues/1067) from getlantern/ui-6.5.8 -* Merge pull request [#1062](https://github.com/getlantern/flashlight/issues/1062) from getlantern/update-matomo-server-address -* Merge pull request [#1061](https://github.com/getlantern/flashlight/issues/1061) from getlantern/thumbnail-overhaul -* Merge pull request [#1060](https://github.com/getlantern/flashlight/issues/1060) from getlantern/durations -* Merge pull request [#1055](https://github.com/getlantern/flashlight/issues/1055) from getlantern/add-support-for-matomo-analytics-engine - - - -## [lantern-6.5.7](https://github.com/getlantern/flashlight/compare/lantern-6.5.6...lantern-6.5.7) - -> 2021-04-06 - -### Pull Requests - -* Merge pull request [#1059](https://github.com/getlantern/flashlight/issues/1059) from getlantern/ui-6.5.7 - - - -## [lantern-6.5.6](https://github.com/getlantern/flashlight/compare/lantern-6.5.5...lantern-6.5.6) - -> 2021-04-02 - -### Pull Requests - -* Merge pull request [#1057](https://github.com/getlantern/flashlight/issues/1057) from getlantern/ui-6.5.6 - - - -## [lantern-6.5.5](https://github.com/getlantern/flashlight/compare/lantern-6.5.4...lantern-6.5.5) - -> 2021-04-01 - -### Pull Requests - -* Merge pull request [#1054](https://github.com/getlantern/flashlight/issues/1054) from getlantern/ui-6.5.5 - - - -## [lantern-6.5.4](https://github.com/getlantern/flashlight/compare/lantern-6.5.3...lantern-6.5.4) - -> 2021-04-01 - -### Pull Requests - -* Merge pull request [#1053](https://github.com/getlantern/flashlight/issues/1053) from getlantern/ui-6.5.4 - - - -## [lantern-6.5.3](https://github.com/getlantern/flashlight/compare/lantern-6.5.2...lantern-6.5.3) - -> 2021-03-30 - -### Pull Requests - -* Merge pull request [#1052](https://github.com/getlantern/flashlight/issues/1052) from getlantern/ui-6.5.3 - - - -## [lantern-6.5.2](https://github.com/getlantern/flashlight/compare/lantern-6.5.1-yinbi...lantern-6.5.2) - -> 2021-03-29 - -### Pull Requests - -* Merge pull request [#1051](https://github.com/getlantern/flashlight/issues/1051) from getlantern/ui-6.5.2 - - - -## [lantern-6.5.1-yinbi](https://github.com/getlantern/flashlight/compare/lantern-6.5.1...lantern-6.5.1-yinbi) - -> 2021-03-26 - - - -## [lantern-6.5.1](https://github.com/getlantern/flashlight/compare/lantern-6.5.0...lantern-6.5.1) - -> 2021-03-26 - -### Pull Requests - -* Merge pull request [#1050](https://github.com/getlantern/flashlight/issues/1050) from getlantern/ui-6.5.1 -* Merge pull request [#1044](https://github.com/getlantern/flashlight/issues/1044) from getlantern/atavism/updates-auth-handler -* Merge pull request [#1047](https://github.com/getlantern/flashlight/issues/1047) from getlantern/atavism/updates-cors-middleware - - - -## [lantern-6.5.0](https://github.com/getlantern/flashlight/compare/lantern-6.4.5...lantern-6.5.0) - -> 2021-03-24 - -### Pull Requests - -* Merge pull request [#1049](https://github.com/getlantern/flashlight/issues/1049) from getlantern/ui-6.5.0 -* Merge pull request [#1046](https://github.com/getlantern/flashlight/issues/1046) from getlantern/harry/1038 -* Merge pull request [#1048](https://github.com/getlantern/flashlight/issues/1048) from getlantern/update-torrent - - - -## [lantern-6.4.5](https://github.com/getlantern/flashlight/compare/lantern-6.4.4-yinbi...lantern-6.4.5) - -> 2021-03-08 - -### Pull Requests - -* Merge pull request [#1045](https://github.com/getlantern/flashlight/issues/1045) from getlantern/ui-6.4.5 -* Merge pull request [#1040](https://github.com/getlantern/flashlight/issues/1040) from getlantern/harry/tlsdialer-upgrade -* Merge pull request [#1037](https://github.com/getlantern/flashlight/issues/1037) from getlantern/harry/tlsmasq-9 -* Merge pull request [#1010](https://github.com/getlantern/flashlight/issues/1010) from getlantern/harry/2485-addendum - - - -## [lantern-6.4.4-yinbi](https://github.com/getlantern/flashlight/compare/lantern-6.4.3-yinbi...lantern-6.4.4-yinbi) - -> 2021-02-22 - -### Pull Requests - -* Merge pull request [#1036](https://github.com/getlantern/flashlight/issues/1036) from getlantern/ui-6.4.4-2 - - - -## [lantern-6.4.3-yinbi](https://github.com/getlantern/flashlight/compare/lantern-6.4.3...lantern-6.4.3-yinbi) - -> 2021-02-21 - - - -## [lantern-6.4.3](https://github.com/getlantern/flashlight/compare/lantern-6.4.2...lantern-6.4.3) - -> 2021-02-18 - -### Pull Requests - -* Merge pull request [#1033](https://github.com/getlantern/flashlight/issues/1033) from getlantern/check-enabled-features-start-service -* Merge pull request [#1030](https://github.com/getlantern/flashlight/issues/1030) from getlantern/replica-sqlite-reorder-openconn-busy-timeout - - - -## [lantern-6.4.2](https://github.com/getlantern/flashlight/compare/lantern-6.4.1...lantern-6.4.2) - -> 2021-02-11 - -### Pull Requests - -* Merge pull request [#1023](https://github.com/getlantern/flashlight/issues/1023) from getlantern/updates-use-yinbi-production-defaults -* Merge pull request [#990](https://github.com/getlantern/flashlight/issues/990) from getlantern/ox/make-lantern-default - - - -## [lantern-6.4.1](https://github.com/getlantern/flashlight/compare/lantern-6.4.0...lantern-6.4.1) - -> 2021-02-11 - -### Pull Requests - -* Merge pull request [#1027](https://github.com/getlantern/flashlight/issues/1027) from getlantern/ui-6.4.1 -* Merge pull request [#1004](https://github.com/getlantern/flashlight/issues/1004) from getlantern/too-many-open-files-settings -* Merge pull request [#1013](https://github.com/getlantern/flashlight/issues/1013) from getlantern/serp-web-results-2 -* Merge pull request [#1006](https://github.com/getlantern/flashlight/issues/1006) from getlantern/harry/require-git-lfs - - - -## [lantern-6.4.0](https://github.com/getlantern/flashlight/compare/lantern-6.3.9...lantern-6.4.0) - -> 2021-01-28 - -### Pull Requests - -* Merge pull request [#1001](https://github.com/getlantern/flashlight/issues/1001) from getlantern/ui-6.4.0-2 -* Merge pull request [#1000](https://github.com/getlantern/flashlight/issues/1000) from getlantern/ui-6.4.0 - - - -## [lantern-6.3.9](https://github.com/getlantern/flashlight/compare/lantern-6.3.8...lantern-6.3.9) - -> 2021-01-27 - -### Pull Requests - -* Merge pull request [#999](https://github.com/getlantern/flashlight/issues/999) from getlantern/ui-6.3.9-2 -* Merge pull request [#998](https://github.com/getlantern/flashlight/issues/998) from getlantern/ui-6.3.9 - - - -## [lantern-6.3.8](https://github.com/getlantern/flashlight/compare/lantern-6.3.6...lantern-6.3.8) - -> 2021-01-26 - -### Pull Requests - -* Merge pull request [#997](https://github.com/getlantern/flashlight/issues/997) from getlantern/ui-6.3.8 -* Merge pull request [#995](https://github.com/getlantern/flashlight/issues/995) from getlantern/dht-rate-limit-fix -* Merge pull request [#996](https://github.com/getlantern/flashlight/issues/996) from getlantern/ui-6.3.7 - - - -## [lantern-6.3.6](https://github.com/getlantern/flashlight/compare/lantern-6.3.5...lantern-6.3.6) - -> 2021-01-26 - -### Pull Requests - -* Merge pull request [#994](https://github.com/getlantern/flashlight/issues/994) from getlantern/ui-6.3.6 -* Merge pull request [#991](https://github.com/getlantern/flashlight/issues/991) from getlantern/replica-sqlite-cantopen-isdir -* Merge pull request [#989](https://github.com/getlantern/flashlight/issues/989) from getlantern/update-replica -* Merge pull request [#993](https://github.com/getlantern/flashlight/issues/993) from getlantern/fix-testutils-issue -* Merge pull request [#878](https://github.com/getlantern/flashlight/issues/878) from getlantern/yinbi-wallet -* Merge pull request [#979](https://github.com/getlantern/flashlight/issues/979) from getlantern/p2p-traffic-metric - - - -## [lantern-6.3.5](https://github.com/getlantern/flashlight/compare/lantern-6.3.4...lantern-6.3.5) - -> 2021-01-21 - -### Pull Requests - -* Merge pull request [#988](https://github.com/getlantern/flashlight/issues/988) from getlantern/ox/hidedatacap -* Merge pull request [#980](https://github.com/getlantern/flashlight/issues/980) from getlantern/cache-thumbnails - - - -## [lantern-6.3.4](https://github.com/getlantern/flashlight/compare/lantern-6.3.3...lantern-6.3.4) - -> 2021-01-20 - -### Pull Requests - -* Merge pull request [#987](https://github.com/getlantern/flashlight/issues/987) from getlantern/ui-6.3.4 -* Merge pull request [#982](https://github.com/getlantern/flashlight/issues/982) from getlantern/fix-upload-delete -* Merge pull request [#984](https://github.com/getlantern/flashlight/issues/984) from getlantern/ox/issue-ios-60 - - - -## [lantern-6.3.3](https://github.com/getlantern/flashlight/compare/lantern-6.3.2...lantern-6.3.3) - -> 2021-01-19 - -### Pull Requests - -* Merge pull request [#981](https://github.com/getlantern/flashlight/issues/981) from getlantern/ui-6.3.3 - - - -## [lantern-6.3.2](https://github.com/getlantern/flashlight/compare/lantern-6.3.1...lantern-6.3.2) - -> 2021-01-15 - -### Reverts - -* Revert "Add the TTLS param to bandwidth updates" - -### Pull Requests - -* Merge pull request [#977](https://github.com/getlantern/flashlight/issues/977) from getlantern/ox/fix-android-timezone-2 - - - -## [lantern-6.3.1](https://github.com/getlantern/flashlight/compare/lantern-6.3.0...lantern-6.3.1) - -> 2021-01-13 - -### Pull Requests - -* Merge pull request [#975](https://github.com/getlantern/flashlight/issues/975) from getlantern/ui-6.3.1 - - - -## [lantern-6.3.0](https://github.com/getlantern/flashlight/compare/lantern-6.2.10...lantern-6.3.0) - -> 2021-01-12 - -### Reverts - -* Add the TTLS param to bandwidth updates - -### Pull Requests - -* Merge pull request [#974](https://github.com/getlantern/flashlight/issues/974) from getlantern/ui-6.3.0 -* Merge pull request [#973](https://github.com/getlantern/flashlight/issues/973) from getlantern/sentry-0.9.0 -* Merge pull request [#972](https://github.com/getlantern/flashlight/issues/972) from getlantern/ui-6.2.11 -* Merge pull request [#969](https://github.com/getlantern/flashlight/issues/969) from getlantern/markhor/issue4656 -* Merge pull request [#971](https://github.com/getlantern/flashlight/issues/971) from getlantern/ox/ignore-idle-errors -* Merge pull request [#970](https://github.com/getlantern/flashlight/issues/970) from getlantern/notifier-plans-fix - - - -## [lantern-6.2.10](https://github.com/getlantern/flashlight/compare/lantern-6.2.9...lantern-6.2.10) - -> 2021-01-06 - -### Pull Requests - -* Merge pull request [#968](https://github.com/getlantern/flashlight/issues/968) from getlantern/ui-6.2.9 -* Merge pull request [#967](https://github.com/getlantern/flashlight/issues/967) from getlantern/modifier-open-nonenglish - - - -## [lantern-6.2.9](https://github.com/getlantern/flashlight/compare/lantern-6.2.8...lantern-6.2.9) - -> 2020-12-21 - -### Pull Requests - -* Merge pull request [#963](https://github.com/getlantern/flashlight/issues/963) from getlantern/big-sur-ui-fix -* Merge pull request [#962](https://github.com/getlantern/flashlight/issues/962) from getlantern/4474-replica-ga -* Merge pull request [#961](https://github.com/getlantern/flashlight/issues/961) from getlantern/httpseverywhere-test-fix - - - -## [lantern-6.2.8](https://github.com/getlantern/flashlight/compare/lantern-6.2.7...lantern-6.2.8) - -> 2020-12-08 - -### Pull Requests - -* Merge pull request [#960](https://github.com/getlantern/flashlight/issues/960) from getlantern/lantern-ui-6.2.8 - - - -## [lantern-6.2.7](https://github.com/getlantern/flashlight/compare/lantern-6.2.5...lantern-6.2.7) - -> 2020-12-04 - -### Pull Requests - -* Merge pull request [#959](https://github.com/getlantern/flashlight/issues/959) from getlantern/update-netstack-go1.15 -* Merge pull request [#958](https://github.com/getlantern/flashlight/issues/958) from getlantern/ui-6.2.7 -* Merge pull request [#956](https://github.com/getlantern/flashlight/issues/956) from getlantern/ui-6.2.6 - - - -## [lantern-6.2.5](https://github.com/getlantern/flashlight/compare/beam-0.1.19...lantern-6.2.5) - -> 2020-11-27 - - - -## [beam-0.1.19](https://github.com/getlantern/flashlight/compare/beam-0.1.18...beam-0.1.19) - -> 2020-11-26 - - - -## [beam-0.1.18](https://github.com/getlantern/flashlight/compare/lantern-6.2.4...beam-0.1.18) - -> 2020-11-26 - -### Pull Requests - -* Merge pull request [#954](https://github.com/getlantern/flashlight/issues/954) from getlantern/4538-create-cache-dir -* Merge pull request [#955](https://github.com/getlantern/flashlight/issues/955) from getlantern/appdirs-replica - - - -## [lantern-6.2.4](https://github.com/getlantern/flashlight/compare/beam-0.1.17...lantern-6.2.4) - -> 2020-11-25 - -### Pull Requests - -* Merge pull request [#953](https://github.com/getlantern/flashlight/issues/953) from getlantern/typescript-ui-updates -* Merge pull request [#952](https://github.com/getlantern/flashlight/issues/952) from getlantern/4449-report-issue-app-name - - - -## [beam-0.1.17](https://github.com/getlantern/flashlight/compare/beam-0.1.16...beam-0.1.17) - -> 2020-11-25 - - - -## [beam-0.1.16](https://github.com/getlantern/flashlight/compare/lantern-6.2.3...beam-0.1.16) - -> 2020-11-25 - - - -## [lantern-6.2.3](https://github.com/getlantern/flashlight/compare/lantern-6.2.2...lantern-6.2.3) - -> 2020-11-21 - -### Pull Requests - -* Merge pull request [#951](https://github.com/getlantern/flashlight/issues/951) from getlantern/ui-6.2.3 - - - -## [lantern-6.2.2](https://github.com/getlantern/flashlight/compare/beam-0.1.15...lantern-6.2.2) - -> 2020-11-19 - - - -## [beam-0.1.15](https://github.com/getlantern/flashlight/compare/lantern-6.2.1...beam-0.1.15) - -> 2020-11-19 - - - -## [lantern-6.2.1](https://github.com/getlantern/flashlight/compare/lantern-6.2.0...lantern-6.2.1) - -> 2020-11-19 - -### Pull Requests - -* Merge pull request [#950](https://github.com/getlantern/flashlight/issues/950) from getlantern/ui-fix-6.2.1 -* Merge pull request [#948](https://github.com/getlantern/flashlight/issues/948) from getlantern/4453-allow-caching-thumbnail -* Merge pull request [#947](https://github.com/getlantern/flashlight/issues/947) from getlantern/ui-6.2.1 - - - -## [lantern-6.2.0](https://github.com/getlantern/flashlight/compare/lantern-6.1.4...lantern-6.2.0) - -> 2020-11-16 - -### Pull Requests - -* Merge pull request [#946](https://github.com/getlantern/flashlight/issues/946) from getlantern/systray-ts-ui -* Merge pull request [#945](https://github.com/getlantern/flashlight/issues/945) from getlantern/user-agent - - - -## [lantern-6.1.4](https://github.com/getlantern/flashlight/compare/beam-0.1.14...lantern-6.1.4) - -> 2020-11-16 - - - -## [beam-0.1.14](https://github.com/getlantern/flashlight/compare/beam-0.1.13...beam-0.1.14) - -> 2020-11-13 - - - -## [beam-0.1.13](https://github.com/getlantern/flashlight/compare/beam-0.1.12...beam-0.1.13) - -> 2020-11-11 - - - -## [beam-0.1.12](https://github.com/getlantern/flashlight/compare/beam-0.1.11...beam-0.1.12) - -> 2020-11-07 - -### Pull Requests - -* Merge pull request [#941](https://github.com/getlantern/flashlight/issues/941) from getlantern/4403-update-golog - - - -## [beam-0.1.11](https://github.com/getlantern/flashlight/compare/beam-0.1.10...beam-0.1.11) - -> 2020-11-04 - -### Pull Requests - -* Merge pull request [#942](https://github.com/getlantern/flashlight/issues/942) from getlantern/ox/issue4410 -* Merge pull request [#940](https://github.com/getlantern/flashlight/issues/940) from getlantern/harry/make-fix - - - -## [beam-0.1.10](https://github.com/getlantern/flashlight/compare/6.1.0...beam-0.1.10) - -> 2020-11-02 - -### Reverts - -* Update anacrolix/torrent - -### Pull Requests - -* Merge pull request [#939](https://github.com/getlantern/flashlight/issues/939) from getlantern/changlelog-tweaks -* Merge pull request [#938](https://github.com/getlantern/flashlight/issues/938) from getlantern/lantern-ui-6.1.3-2 -* Merge pull request [#937](https://github.com/getlantern/flashlight/issues/937) from getlantern/lantern-ui-6.1.3 -* Merge pull request [#934](https://github.com/getlantern/flashlight/issues/934) from getlantern/revert-932-fix-replica-arbitrary-file-write -* Merge pull request [#933](https://github.com/getlantern/flashlight/issues/933) from getlantern/fix-systray-tooltip -* Merge pull request [#932](https://github.com/getlantern/flashlight/issues/932) from getlantern/fix-replica-arbitrary-file-write -* Merge pull request [#931](https://github.com/getlantern/flashlight/issues/931) from getlantern/upgrade-multipath -* Merge pull request [#930](https://github.com/getlantern/flashlight/issues/930) from getlantern/systray-old-ui -* Merge pull request [#904](https://github.com/getlantern/flashlight/issues/904) from getlantern/quic_18 - - - -## [6.1.0](https://github.com/getlantern/flashlight/compare/6.1.1...6.1.0) - -> 2020-11-02 - - - -## [6.1.1](https://github.com/getlantern/flashlight/compare/6.1.2...6.1.1) - -> 2020-11-02 - - - -## [6.1.2](https://github.com/getlantern/flashlight/compare/6.1.3...6.1.2) - -> 2020-11-02 - - - -## [6.1.3](https://github.com/getlantern/flashlight/compare/lantern-6.1.3...6.1.3) - -> 2020-11-02 - - - -## [lantern-6.1.3](https://github.com/getlantern/flashlight/compare/lantern-6.1.2...lantern-6.1.3) - -> 2020-10-30 - -### Pull Requests - -* Merge pull request [#938](https://github.com/getlantern/flashlight/issues/938) from getlantern/lantern-ui-6.1.3-2 -* Merge pull request [#937](https://github.com/getlantern/flashlight/issues/937) from getlantern/lantern-ui-6.1.3 - - - -## [lantern-6.1.2](https://github.com/getlantern/flashlight/compare/lantern-6.1.1...lantern-6.1.2) - -> 2020-10-28 - -### Reverts - -* Update anacrolix/torrent - -### Pull Requests - -* Merge pull request [#934](https://github.com/getlantern/flashlight/issues/934) from getlantern/revert-932-fix-replica-arbitrary-file-write -* Merge pull request [#933](https://github.com/getlantern/flashlight/issues/933) from getlantern/fix-systray-tooltip -* Merge pull request [#932](https://github.com/getlantern/flashlight/issues/932) from getlantern/fix-replica-arbitrary-file-write - - - -## [lantern-6.1.1](https://github.com/getlantern/flashlight/compare/lantern-6.1.0...lantern-6.1.1) - -> 2020-10-27 - -### Pull Requests - -* Merge pull request [#931](https://github.com/getlantern/flashlight/issues/931) from getlantern/upgrade-multipath -* Merge pull request [#930](https://github.com/getlantern/flashlight/issues/930) from getlantern/systray-old-ui -* Merge pull request [#904](https://github.com/getlantern/flashlight/issues/904) from getlantern/quic_18 - - - -## [lantern-6.1.0](https://github.com/getlantern/flashlight/compare/6.0.11...lantern-6.1.0) - -> 2020-10-24 - -### Pull Requests - -* Merge pull request [#929](https://github.com/getlantern/flashlight/issues/929) from getlantern/lantern-ui-6.1.0 -* Merge pull request [#926](https://github.com/getlantern/flashlight/issues/926) from getlantern/ox/beam-borda-app -* Merge pull request [#925](https://github.com/getlantern/flashlight/issues/925) from getlantern/replica-cors-take2 -* Merge pull request [#927](https://github.com/getlantern/flashlight/issues/927) from getlantern/replica-cors-take2-joesis -* Merge pull request [#924](https://github.com/getlantern/flashlight/issues/924) from getlantern/add-hi-def-beam-icos -* Merge pull request [#923](https://github.com/getlantern/flashlight/issues/923) from getlantern/generate-highres-icons -* Merge pull request [#922](https://github.com/getlantern/flashlight/issues/922) from getlantern/beam-ui-0.1.9 -* Merge pull request [#919](https://github.com/getlantern/flashlight/issues/919) from getlantern/4319-hi-def-windows-icons -* Merge pull request [#921](https://github.com/getlantern/flashlight/issues/921) from getlantern/ox/ipproxy-update -* Merge pull request [#920](https://github.com/getlantern/flashlight/issues/920) from getlantern/beam-ui-0.1.8 -* Merge pull request [#918](https://github.com/getlantern/flashlight/issues/918) from getlantern/beam-ui-0.1.7 -* Merge pull request [#916](https://github.com/getlantern/flashlight/issues/916) from getlantern/beam-ui-0.1.6 -* Merge pull request [#915](https://github.com/getlantern/flashlight/issues/915) from getlantern/beam-ui-0.1.5 -* Merge pull request [#914](https://github.com/getlantern/flashlight/issues/914) from getlantern/update-by-app-name -* Merge pull request [#913](https://github.com/getlantern/flashlight/issues/913) from getlantern/maxb/issue-4267 -* Merge pull request [#912](https://github.com/getlantern/flashlight/issues/912) from getlantern/beam-ui-0.1.4 -* Merge pull request [#911](https://github.com/getlantern/flashlight/issues/911) from getlantern/4277-use-custom-sqlite -* Merge pull request [#908](https://github.com/getlantern/flashlight/issues/908) from getlantern/config-dir-create -* Merge pull request [#903](https://github.com/getlantern/flashlight/issues/903) from getlantern/build-windows -* Merge pull request [#902](https://github.com/getlantern/flashlight/issues/902) from getlantern/feature-by-application -* Merge pull request [#910](https://github.com/getlantern/flashlight/issues/910) from getlantern/harry/4304-simplification -* Merge pull request [#909](https://github.com/getlantern/flashlight/issues/909) from getlantern/beam-ui-0.1.3 -* Merge pull request [#907](https://github.com/getlantern/flashlight/issues/907) from getlantern/4300-autoupdate -* Merge pull request [#905](https://github.com/getlantern/flashlight/issues/905) from getlantern/beam-ui-fixes -* Merge pull request [#900](https://github.com/getlantern/flashlight/issues/900) from getlantern/maxb/replica-flag-fix -* Merge pull request [#901](https://github.com/getlantern/flashlight/issues/901) from getlantern/beam-global-config -* Merge pull request [#899](https://github.com/getlantern/flashlight/issues/899) from getlantern/beam-ui-0.1.0 -* Merge pull request [#898](https://github.com/getlantern/flashlight/issues/898) from getlantern/combine-app-domains -* Merge pull request [#896](https://github.com/getlantern/flashlight/issues/896) from getlantern/beam-tray-icons -* Merge pull request [#893](https://github.com/getlantern/flashlight/issues/893) from getlantern/maxb/tray-quit-translation-fix -* Merge pull request [#897](https://github.com/getlantern/flashlight/issues/897) from getlantern/beam-tray-icons-joesis -* Merge pull request [#895](https://github.com/getlantern/flashlight/issues/895) from getlantern/reliable-ios-test -* Merge pull request [#892](https://github.com/getlantern/flashlight/issues/892) from getlantern/force-proxying-ss7hc6jm.io -* Merge pull request [#891](https://github.com/getlantern/flashlight/issues/891) from getlantern/maxb/fix-translation-string -* Merge pull request [#887](https://github.com/getlantern/flashlight/issues/887) from getlantern/maxb/issue-4250 -* Merge pull request [#890](https://github.com/getlantern/flashlight/issues/890) from getlantern/add-pro-available -* Merge pull request [#889](https://github.com/getlantern/flashlight/issues/889) from getlantern/beam-backend-services -* Merge pull request [#888](https://github.com/getlantern/flashlight/issues/888) from getlantern/ox/logging-test -* Merge pull request [#885](https://github.com/getlantern/flashlight/issues/885) from getlantern/beam-ui-resources - - - -## [6.0.11](https://github.com/getlantern/flashlight/compare/6.0.10...6.0.11) - -> 2020-10-07 - -### Pull Requests - -* Merge pull request [#884](https://github.com/getlantern/flashlight/issues/884) from getlantern/ox/conntrack_build_fix -* Merge pull request [#882](https://github.com/getlantern/flashlight/issues/882) from getlantern/ox/beam -* Merge pull request [#881](https://github.com/getlantern/flashlight/issues/881) from getlantern/ox/dynamicdnsgrab -* Merge pull request [#870](https://github.com/getlantern/flashlight/issues/870) from getlantern/4005-support-multipath -* Merge pull request [#880](https://github.com/getlantern/flashlight/issues/880) from getlantern/ox/issue4121-2 -* Merge pull request [#879](https://github.com/getlantern/flashlight/issues/879) from getlantern/exclude-zero-user-id - - - -## [6.0.10](https://github.com/getlantern/flashlight/compare/6.0.9...6.0.10) - -> 2020-09-18 - -### Pull Requests - -* Merge pull request [#877](https://github.com/getlantern/flashlight/issues/877) from getlantern/maxb/issue-4170 -* Merge pull request [#875](https://github.com/getlantern/flashlight/issues/875) from getlantern/ox/upgrade_netstack -* Merge pull request [#859](https://github.com/getlantern/flashlight/issues/859) from getlantern/ox/issue4121 -* Merge pull request [#868](https://github.com/getlantern/flashlight/issues/868) from getlantern/update-dependencies - - - -## [6.0.9](https://github.com/getlantern/flashlight/compare/6.0.8...6.0.9) - -> 2020-09-10 - - - -## [6.0.8](https://github.com/getlantern/flashlight/compare/6.0.7...6.0.8) - -> 2020-09-09 - -### Pull Requests - -* Merge pull request [#872](https://github.com/getlantern/flashlight/issues/872) from getlantern/ui-translations-fix - - - -## [6.0.7](https://github.com/getlantern/flashlight/compare/6.0.6...6.0.7) - -> 2020-09-08 - -### Pull Requests - -* Merge pull request [#871](https://github.com/getlantern/flashlight/issues/871) from getlantern/ui-version-fix - - - -## [6.0.6](https://github.com/getlantern/flashlight/compare/6.0.5...6.0.6) - -> 2020-09-06 - -### Pull Requests - -* Merge pull request [#869](https://github.com/getlantern/flashlight/issues/869) from getlantern/ui-update-6.0.6 -* Merge pull request [#866](https://github.com/getlantern/flashlight/issues/866) from getlantern/harry/4073-addition -* Merge pull request [#862](https://github.com/getlantern/flashlight/issues/862) from getlantern/harry/4073 -* Merge pull request [#858](https://github.com/getlantern/flashlight/issues/858) from getlantern/psmux -* Merge pull request [#863](https://github.com/getlantern/flashlight/issues/863) from getlantern/ox/issue4126 -* Merge pull request [#861](https://github.com/getlantern/flashlight/issues/861) from getlantern/upgrade-quicwrapper -* Merge pull request [#860](https://github.com/getlantern/flashlight/issues/860) from getlantern/issue-4125 -* Merge pull request [#856](https://github.com/getlantern/flashlight/issues/856) from getlantern/4005-refactor -* Merge pull request [#857](https://github.com/getlantern/flashlight/issues/857) from getlantern/ox/issue4100 -* Merge pull request [#848](https://github.com/getlantern/flashlight/issues/848) from getlantern/replica-testing - - - -## [6.0.5](https://github.com/getlantern/flashlight/compare/6.0.4...6.0.5) - -> 2020-08-21 - -### Pull Requests - -* Merge pull request [#852](https://github.com/getlantern/flashlight/issues/852) from getlantern/ox/mitm_chinese_browsers -* Merge pull request [#854](https://github.com/getlantern/flashlight/issues/854) from getlantern/genconfig-no-fatal - - - -## [6.0.4](https://github.com/getlantern/flashlight/compare/6.0.3...6.0.4) - -> 2020-08-13 - -### Pull Requests - -* Merge pull request [#851](https://github.com/getlantern/flashlight/issues/851) from getlantern/fixed-vertical-cn - - - -## [6.0.3](https://github.com/getlantern/flashlight/compare/6.0.2...6.0.3) - -> 2020-08-12 - -### Pull Requests - -* Merge pull request [#850](https://github.com/getlantern/flashlight/issues/850) from getlantern/ui-hotfix - - - -## [6.0.2](https://github.com/getlantern/flashlight/compare/6.0.1...6.0.2) - -> 2020-08-11 - -### Pull Requests - -* Merge pull request [#849](https://github.com/getlantern/flashlight/issues/849) from getlantern/ui-display-version - - - -## [6.0.1](https://github.com/getlantern/flashlight/compare/6.0.0...6.0.1) - -> 2020-08-08 - -### Pull Requests - -* Merge pull request [#846](https://github.com/getlantern/flashlight/issues/846) from getlantern/ui-features-survey -* Merge pull request [#844](https://github.com/getlantern/flashlight/issues/844) from getlantern/ox/issue4013 - - - -## [6.0.0](https://github.com/getlantern/flashlight/compare/5.10.0...6.0.0) - -> 2020-07-30 - -### Pull Requests - -* Merge pull request [#686](https://github.com/getlantern/flashlight/issues/686) from getlantern/replica -* Merge pull request [#838](https://github.com/getlantern/flashlight/issues/838) from getlantern/maxb/merge-devel -* Merge pull request [#836](https://github.com/getlantern/flashlight/issues/836) from getlantern/maxb/pull-prod-ui -* Merge pull request [#834](https://github.com/getlantern/flashlight/issues/834) from getlantern/replica-no-plaintext -* Merge pull request [#831](https://github.com/getlantern/flashlight/issues/831) from getlantern/bucket-config -* Merge pull request [#820](https://github.com/getlantern/flashlight/issues/820) from getlantern/configure-http-client -* Merge pull request [#819](https://github.com/getlantern/flashlight/issues/819) from getlantern/bcm/allow-options-take2 -* Merge pull request [#818](https://github.com/getlantern/flashlight/issues/818) from getlantern/bcm/allow-options -* Merge pull request [#814](https://github.com/getlantern/flashlight/issues/814) from getlantern/explicit-s3-torrenting -* Merge pull request [#812](https://github.com/getlantern/flashlight/issues/812) from getlantern/replica-merge-from-devel -* Merge pull request [#808](https://github.com/getlantern/flashlight/issues/808) from getlantern/maxb/merge-devel-replica -* Merge pull request [#800](https://github.com/getlantern/flashlight/issues/800) from getlantern/maxb/fix-replica-api-paths -* Merge pull request [#795](https://github.com/getlantern/flashlight/issues/795) from getlantern/features-enable-replica -* Merge pull request [#785](https://github.com/getlantern/flashlight/issues/785) from getlantern/3440-replica-as-feature -* Merge pull request [#787](https://github.com/getlantern/flashlight/issues/787) from getlantern/myles-replica-as-feature -* Merge pull request [#784](https://github.com/getlantern/flashlight/issues/784) from getlantern/fix-filenames -* Merge pull request [#786](https://github.com/getlantern/flashlight/issues/786) from getlantern/merge-master -* Merge pull request [#783](https://github.com/getlantern/flashlight/issues/783) from getlantern/maxb/replica-download-url-fix -* Merge pull request [#776](https://github.com/getlantern/flashlight/issues/776) from getlantern/maxb/replica-camelCase -* Merge pull request [#766](https://github.com/getlantern/flashlight/issues/766) from getlantern/replica-ui-refactor -* Merge pull request [#754](https://github.com/getlantern/flashlight/issues/754) from getlantern/replica-retry-bind - - - -## [5.10.0](https://github.com/getlantern/flashlight/compare/5.9.19...5.10.0) - -> 2020-07-20 - - - -## [5.9.19](https://github.com/getlantern/flashlight/compare/5.9.18...5.9.19) - -> 2020-07-14 - - - -## [5.9.18](https://github.com/getlantern/flashlight/compare/5.9.17...5.9.18) - -> 2020-07-09 - -### Pull Requests - -* Merge pull request [#840](https://github.com/getlantern/flashlight/issues/840) from getlantern/quic-hotfix - - - -## [5.9.17](https://github.com/getlantern/flashlight/compare/5.9.16...5.9.17) - -> 2020-07-08 - -### Pull Requests - -* Merge pull request [#839](https://github.com/getlantern/flashlight/issues/839) from getlantern/3906-include-utls-fix -* Merge pull request [#837](https://github.com/getlantern/flashlight/issues/837) from getlantern/maxb/issue-3907 -* Merge pull request [#835](https://github.com/getlantern/flashlight/issues/835) from getlantern/3894-ga-regularly - - - -## [5.9.16](https://github.com/getlantern/flashlight/compare/5.9.15...5.9.16) - -> 2020-07-02 - -### Pull Requests - -* Merge pull request [#833](https://github.com/getlantern/flashlight/issues/833) from getlantern/ox/proxybench-id3 - - - -## [5.9.15](https://github.com/getlantern/flashlight/compare/5.9.14...5.9.15) - -> 2020-06-23 - - - -## [5.9.14](https://github.com/getlantern/flashlight/compare/5.9.13...5.9.14) - -> 2020-06-15 - -### Pull Requests - -* Merge pull request [#830](https://github.com/getlantern/flashlight/issues/830) from getlantern/harry/tlsmasq-test-fix - - - -## [5.9.13](https://github.com/getlantern/flashlight/compare/5.9.12...5.9.13) - -> 2020-06-11 - -### Pull Requests - -* Merge pull request [#829](https://github.com/getlantern/flashlight/issues/829) from getlantern/systray-osx-crash - - - -## [5.9.12](https://github.com/getlantern/flashlight/compare/5.9.11...5.9.12) - -> 2020-06-09 - -### Pull Requests - -* Merge pull request [#827](https://github.com/getlantern/flashlight/issues/827) from getlantern/update-utls-chrome-auto -* Merge pull request [#828](https://github.com/getlantern/flashlight/issues/828) from getlantern/maxb/chromeextensiontest-fix - - - -## [5.9.11](https://github.com/getlantern/flashlight/compare/5.9.10...5.9.11) - -> 2020-06-05 - - - -## [5.9.10](https://github.com/getlantern/flashlight/compare/5.9.9...5.9.10) - -> 2020-06-02 - -### Pull Requests - -* Merge pull request [#825](https://github.com/getlantern/flashlight/issues/825) from getlantern/harry/3795 - - - -## [5.9.9](https://github.com/getlantern/flashlight/compare/5.9.8...5.9.9) - -> 2020-06-02 - -### Pull Requests - -* Merge pull request [#823](https://github.com/getlantern/flashlight/issues/823) from getlantern/update-utls -* Merge pull request [#822](https://github.com/getlantern/flashlight/issues/822) from getlantern/wss_ips -* Merge pull request [#821](https://github.com/getlantern/flashlight/issues/821) from getlantern/harry/3780 -* Merge pull request [#815](https://github.com/getlantern/flashlight/issues/815) from getlantern/3655-fix-timer -* Merge pull request [#817](https://github.com/getlantern/flashlight/issues/817) from getlantern/ox/borda-privacy -* Merge pull request [#816](https://github.com/getlantern/flashlight/issues/816) from getlantern/3679-systray -* Merge pull request [#810](https://github.com/getlantern/flashlight/issues/810) from getlantern/ox/issue3604 - - - -## [5.9.8](https://github.com/getlantern/flashlight/compare/5.9.7...5.9.8) - -> 2020-05-12 - -### Pull Requests - -* Merge pull request [#811](https://github.com/getlantern/flashlight/issues/811) from getlantern/ox/issue3702 -* Merge pull request [#809](https://github.com/getlantern/flashlight/issues/809) from getlantern/maxb/issue-3666 -* Merge pull request [#807](https://github.com/getlantern/flashlight/issues/807) from getlantern/3607-initialization-timeout - - - -## [5.9.7](https://github.com/getlantern/flashlight/compare/5.9.6...5.9.7) - -> 2020-04-29 - -### Pull Requests - -* Merge pull request [#806](https://github.com/getlantern/flashlight/issues/806) from getlantern/maxb/sentry-reporting-fix - - - -## [5.9.6](https://github.com/getlantern/flashlight/compare/5.9.5...5.9.6) - -> 2020-04-29 - -### Pull Requests - -* Merge pull request [#805](https://github.com/getlantern/flashlight/issues/805) from getlantern/3654-update-borda -* Merge pull request [#804](https://github.com/getlantern/flashlight/issues/804) from getlantern/ox/issue3638 -* Merge pull request [#801](https://github.com/getlantern/flashlight/issues/801) from getlantern/3579-iran-block - - - -## [5.9.5](https://github.com/getlantern/flashlight/compare/5.9.4...5.9.5) - -> 2020-04-24 - -### Pull Requests - -* Merge pull request [#803](https://github.com/getlantern/flashlight/issues/803) from getlantern/maxb/issue-3651 -* Merge pull request [#802](https://github.com/getlantern/flashlight/issues/802) from getlantern/uiserver-on-chan -* Merge pull request [#797](https://github.com/getlantern/flashlight/issues/797) from getlantern/ox/hardcodedproxies - - - -## [5.9.4](https://github.com/getlantern/flashlight/compare/5.9.3...5.9.4) - -> 2020-04-20 - -### Pull Requests - -* Merge pull request [#798](https://github.com/getlantern/flashlight/issues/798) from getlantern/systray-nil-pointer -* Merge pull request [#796](https://github.com/getlantern/flashlight/issues/796) from getlantern/3603-cmux - - - -## [5.9.3](https://github.com/getlantern/flashlight/compare/5.9.2...5.9.3) - -> 2020-04-16 - -### Pull Requests - -* Merge pull request [#788](https://github.com/getlantern/flashlight/issues/788) from getlantern/ox/issue3326 -* Merge pull request [#794](https://github.com/getlantern/flashlight/issues/794) from getlantern/ox/issue3582 - - - -## [5.9.2](https://github.com/getlantern/flashlight/compare/5.9.1...5.9.2) - -> 2020-04-15 - -### Reverts - -* Add duplicate and missing field checks to config checker - -### Pull Requests - -* Merge pull request [#793](https://github.com/getlantern/flashlight/issues/793) from getlantern/maxb/issue-3584 -* Merge pull request [#791](https://github.com/getlantern/flashlight/issues/791) from getlantern/ox/whitelistonly -* Merge pull request [#790](https://github.com/getlantern/flashlight/issues/790) from getlantern/harry/config-validator-update -* Merge pull request [#789](https://github.com/getlantern/flashlight/issues/789) from getlantern/ox/yamlvalidate - - - -## [5.9.1](https://github.com/getlantern/flashlight/compare/5.9.0...5.9.1) - -> 2020-04-07 - -### Pull Requests - -* Merge pull request [#782](https://github.com/getlantern/flashlight/issues/782) from getlantern/3551-active-probing - - - -## [5.9.0](https://github.com/getlantern/flashlight/compare/5.8.6...5.9.0) - -> 2020-04-03 - -### Pull Requests - -* Merge pull request [#777](https://github.com/getlantern/flashlight/issues/777) from getlantern/ox/precise_stealth -* Merge pull request [#779](https://github.com/getlantern/flashlight/issues/779) from getlantern/ox/issue3532 -* Merge pull request [#778](https://github.com/getlantern/flashlight/issues/778) from getlantern/chrome-extension-too-many-files -* Merge pull request [#775](https://github.com/getlantern/flashlight/issues/775) from getlantern/ox/ios-proxystats - - - -## [5.8.6](https://github.com/getlantern/flashlight/compare/5.8.5...5.8.6) - -> 2020-03-17 - -### Pull Requests - -* Merge pull request [#774](https://github.com/getlantern/flashlight/issues/774) from getlantern/harry/tlsmasq-1-3-ciphers - - - -## [5.8.5](https://github.com/getlantern/flashlight/compare/5.8.4...5.8.5) - -> 2020-03-16 - -### Pull Requests - -* Merge pull request [#773](https://github.com/getlantern/flashlight/issues/773) from getlantern/3455-check-nil-session-ticket -* Merge pull request [#772](https://github.com/getlantern/flashlight/issues/772) from getlantern/maxb/update-systray -* Merge pull request [#768](https://github.com/getlantern/flashlight/issues/768) from getlantern/3363-features -* Merge pull request [#769](https://github.com/getlantern/flashlight/issues/769) from getlantern/build-all-tests -* Merge pull request [#760](https://github.com/getlantern/flashlight/issues/760) from getlantern/harry/expiring-session-tickets -* Merge pull request [#770](https://github.com/getlantern/flashlight/issues/770) from getlantern/ox/expiring-session-tickets -* Merge pull request [#765](https://github.com/getlantern/flashlight/issues/765) from getlantern/ox/issue3410 - - - -## [5.8.4](https://github.com/getlantern/flashlight/compare/5.8.3...5.8.4) - -> 2020-03-06 - -### Pull Requests - -* Merge pull request [#767](https://github.com/getlantern/flashlight/issues/767) from getlantern/3396-disable-chrome-extension -* Merge pull request [#764](https://github.com/getlantern/flashlight/issues/764) from getlantern/maxb/sentry-report-osversion -* Merge pull request [#734](https://github.com/getlantern/flashlight/issues/734) from getlantern/harry/tlsmasq-integration -* Merge pull request [#758](https://github.com/getlantern/flashlight/issues/758) from getlantern/maxb/issue-3325 - - - -## [5.8.3](https://github.com/getlantern/flashlight/compare/5.8.2...5.8.3) - -> 2020-02-12 - -### Pull Requests - -* Merge pull request [#757](https://github.com/getlantern/flashlight/issues/757) from getlantern/concurrent-session-states -* Merge pull request [#756](https://github.com/getlantern/flashlight/issues/756) from getlantern/lock-session-states -* Merge pull request [#755](https://github.com/getlantern/flashlight/issues/755) from getlantern/exit-on-existing - - - -## [5.8.2](https://github.com/getlantern/flashlight/compare/5.8.1...5.8.2) - -> 2020-02-11 - -### Pull Requests - -* Merge pull request [#753](https://github.com/getlantern/flashlight/issues/753) from getlantern/ox/issue3329 -* Merge pull request [#752](https://github.com/getlantern/flashlight/issues/752) from getlantern/sentry-0.5.1 - - - -## [5.8.1](https://github.com/getlantern/flashlight/compare/5.8.0...5.8.1) - -> 2020-02-07 - -### Pull Requests - -* Merge pull request [#751](https://github.com/getlantern/flashlight/issues/751) from getlantern/disable-chrome-extension -* Merge pull request [#750](https://github.com/getlantern/flashlight/issues/750) from getlantern/1.13.7-mod-tidy - - - -## [5.8.0](https://github.com/getlantern/flashlight/compare/5.7.2...5.8.0) - -> 2020-02-07 - -### Pull Requests - -* Merge pull request [#749](https://github.com/getlantern/flashlight/issues/749) from getlantern/changelog-tag-excludes -* Merge pull request [#715](https://github.com/getlantern/flashlight/issues/715) from getlantern/wss_fake_sni -* Merge pull request [#748](https://github.com/getlantern/flashlight/issues/748) from getlantern/maxb/sentry-reporting-panic -* Merge pull request [#747](https://github.com/getlantern/flashlight/issues/747) from getlantern/ox/issue3304 -* Merge pull request [#746](https://github.com/getlantern/flashlight/issues/746) from getlantern/switch-back-to-upstream-smux -* Merge pull request [#744](https://github.com/getlantern/flashlight/issues/744) from getlantern/ox/ioscrashfix -* Merge pull request [#743](https://github.com/getlantern/flashlight/issues/743) from getlantern/ox/back_to_free -* Merge pull request [#729](https://github.com/getlantern/flashlight/issues/729) from getlantern/quic_wg24 -* Merge pull request [#742](https://github.com/getlantern/flashlight/issues/742) from getlantern/exit-cleanup -* Merge pull request [#741](https://github.com/getlantern/flashlight/issues/741) from getlantern/3247-update-cmux -* Merge pull request [#738](https://github.com/getlantern/flashlight/issues/738) from getlantern/3257-override-shortcut-resolver -* Merge pull request [#739](https://github.com/getlantern/flashlight/issues/739) from getlantern/gen-from-geolite2 -* Merge pull request [#737](https://github.com/getlantern/flashlight/issues/737) from getlantern/3247-smux-fix -* Merge pull request [#735](https://github.com/getlantern/flashlight/issues/735) from getlantern/ox/moreiospro -* Merge pull request [#730](https://github.com/getlantern/flashlight/issues/730) from getlantern/install-chrome-extension -* Merge pull request [#733](https://github.com/getlantern/flashlight/issues/733) from getlantern/ox/iosmemory -* Merge pull request [#732](https://github.com/getlantern/flashlight/issues/732) from getlantern/ox/utp_ios -* Merge pull request [#731](https://github.com/getlantern/flashlight/issues/731) from getlantern/ox/issue3202 -* Merge pull request [#727](https://github.com/getlantern/flashlight/issues/727) from getlantern/chrome-extension-settings -* Merge pull request [#726](https://github.com/getlantern/flashlight/issues/726) from getlantern/maxb/issue2111 -* Merge pull request [#725](https://github.com/getlantern/flashlight/issues/725) from getlantern/allow-ssh-port -* Merge pull request [#721](https://github.com/getlantern/flashlight/issues/721) from getlantern/3178-grayscale-release -* Merge pull request [#723](https://github.com/getlantern/flashlight/issues/723) from getlantern/3180-initialize-option -* Merge pull request [#724](https://github.com/getlantern/flashlight/issues/724) from getlantern/goprivate -* Merge pull request [#722](https://github.com/getlantern/flashlight/issues/722) from getlantern/ox/issue3201 -* Merge pull request [#719](https://github.com/getlantern/flashlight/issues/719) from getlantern/upgrade-go-ping -* Merge pull request [#720](https://github.com/getlantern/flashlight/issues/720) from getlantern/ox/update-dnsgrab -* Merge pull request [#718](https://github.com/getlantern/flashlight/issues/718) from getlantern/update-detour -* Merge pull request [#716](https://github.com/getlantern/flashlight/issues/716) from getlantern/ox/update-netstack -* Merge pull request [#717](https://github.com/getlantern/flashlight/issues/717) from getlantern/3181-systray-update -* Merge pull request [#714](https://github.com/getlantern/flashlight/issues/714) from getlantern/ox/issue3158 - - - -## [5.7.2](https://github.com/getlantern/flashlight/compare/5.7.1...5.7.2) - -> 2019-12-12 - - - -## [5.7.1](https://github.com/getlantern/flashlight/compare/5.7.0...5.7.1) - -> 2019-12-04 - - - -## [5.7.0](https://github.com/getlantern/flashlight/compare/5.6.4...5.7.0) - -> 2019-12-03 - -### Pull Requests - -* Merge pull request [#713](https://github.com/getlantern/flashlight/issues/713) from getlantern/disable-packet-capture -* Merge pull request [#712](https://github.com/getlantern/flashlight/issues/712) from getlantern/disable-packet-capture -* Merge pull request [#711](https://github.com/getlantern/flashlight/issues/711) from getlantern/ox/windows-gui-performance-tweak -* Merge pull request [#709](https://github.com/getlantern/flashlight/issues/709) from getlantern/ox/issue3108 -* Merge pull request [#708](https://github.com/getlantern/flashlight/issues/708) from getlantern/ox/force-config-country-mobile -* Merge pull request [#679](https://github.com/getlantern/flashlight/issues/679) from getlantern/ox/issue452 -* Merge pull request [#682](https://github.com/getlantern/flashlight/issues/682) from getlantern/harry/2485-capture-all-the-time -* Merge pull request [#707](https://github.com/getlantern/flashlight/issues/707) from getlantern/ox/issue3068 -* Merge pull request [#706](https://github.com/getlantern/flashlight/issues/706) from getlantern/close-hasSucceedingDialer - - - -## [5.6.4](https://github.com/getlantern/flashlight/compare/5.6.3...5.6.4) - -> 2019-10-29 - -### Pull Requests - -* Merge pull request [#705](https://github.com/getlantern/flashlight/issues/705) from getlantern/myleshorton-global-test -* Merge pull request [#704](https://github.com/getlantern/flashlight/issues/704) from getlantern/embedded-global-test -* Merge pull request [#702](https://github.com/getlantern/flashlight/issues/702) from getlantern/update-global-config -* Merge pull request [#703](https://github.com/getlantern/flashlight/issues/703) from getlantern/3083-config-test - - - -## [5.6.3](https://github.com/getlantern/flashlight/compare/5.6.2...5.6.3) - -> 2019-10-28 - -### Pull Requests - -* Merge pull request [#700](https://github.com/getlantern/flashlight/issues/700) from getlantern/proxy-connection-again -* Merge pull request [#701](https://github.com/getlantern/flashlight/issues/701) from getlantern/2986-more-ci-fixes -* Merge pull request [#699](https://github.com/getlantern/flashlight/issues/699) from getlantern/ci-fixes - - - -## [5.6.2](https://github.com/getlantern/flashlight/compare/5.6.1...5.6.2) - -> 2019-10-21 - -### Pull Requests - -* Merge pull request [#698](https://github.com/getlantern/flashlight/issues/698) from getlantern/fix-direct-headers - - - -## [5.6.1](https://github.com/getlantern/flashlight/compare/5.6.0...5.6.1) - -> 2019-10-18 - -### Reverts - -* Simpler fix for not sending version header to origin sites - -### Pull Requests - -* Merge pull request [#697](https://github.com/getlantern/flashlight/issues/697) from getlantern/ui-fixed-recovery -* Merge pull request [#696](https://github.com/getlantern/flashlight/issues/696) from getlantern/ox/more-version-header-fixes - - - -## [5.6.0](https://github.com/getlantern/flashlight/compare/5.5.8...5.6.0) - -> 2019-10-17 - -### Reverts - -* Merge pull request [#690](https://github.com/getlantern/flashlight/issues/690) from getlantern/1920-lantern-headers - -### Pull Requests - -* Merge pull request [#695](https://github.com/getlantern/flashlight/issues/695) from getlantern/modern-go-deps -* Merge pull request [#694](https://github.com/getlantern/flashlight/issues/694) from getlantern/server-sets-trusted -* Merge pull request [#693](https://github.com/getlantern/flashlight/issues/693) from getlantern/ox/issue1920 -* Merge pull request [#692](https://github.com/getlantern/flashlight/issues/692) from getlantern/ox/commonconfig -* Merge pull request [#691](https://github.com/getlantern/flashlight/issues/691) from getlantern/latest-proxy -* Merge pull request [#690](https://github.com/getlantern/flashlight/issues/690) from getlantern/1920-lantern-headers -* Merge pull request [#689](https://github.com/getlantern/flashlight/issues/689) from getlantern/ox/issue1558 -* Merge pull request [#687](https://github.com/getlantern/flashlight/issues/687) from getlantern/ox/issue3022 -* Merge pull request [#688](https://github.com/getlantern/flashlight/issues/688) from getlantern/ox/ping-on-autoreport -* Merge pull request [#684](https://github.com/getlantern/flashlight/issues/684) from getlantern/update-utls -* Merge pull request [#681](https://github.com/getlantern/flashlight/issues/681) from getlantern/hit-multiple-proxy -* Merge pull request [#680](https://github.com/getlantern/flashlight/issues/680) from getlantern/quic_fake_sni - - - -## [5.5.8](https://github.com/getlantern/flashlight/compare/5.5.7...5.5.8) - -> 2019-09-24 - -### Pull Requests - -* Merge pull request [#676](https://github.com/getlantern/flashlight/issues/676) from getlantern/no-embedded-proxies -* Merge pull request [#677](https://github.com/getlantern/flashlight/issues/677) from getlantern/goroutines-800 - - - -## [5.5.7](https://github.com/getlantern/flashlight/compare/5.5.6...5.5.7) - -> 2019-09-19 - -### Pull Requests - -* Merge pull request [#675](https://github.com/getlantern/flashlight/issues/675) from getlantern/ox/ping -* Merge pull request [#673](https://github.com/getlantern/flashlight/issues/673) from getlantern/ox/percentilefix -* Merge pull request [#650](https://github.com/getlantern/flashlight/issues/650) from getlantern/bcm/email-reportissue-screenshot -* Merge pull request [#674](https://github.com/getlantern/flashlight/issues/674) from getlantern/2986-check-ci-failure -* Merge pull request [#670](https://github.com/getlantern/flashlight/issues/670) from getlantern/go1.13-timestamps -* Merge pull request [#668](https://github.com/getlantern/flashlight/issues/668) from getlantern/bcm/update-apache-thrift -* Merge pull request [#666](https://github.com/getlantern/flashlight/issues/666) from getlantern/2554-write-log-in-parent -* Merge pull request [#667](https://github.com/getlantern/flashlight/issues/667) from getlantern/2554-restart-on-unresponsive -* Merge pull request [#663](https://github.com/getlantern/flashlight/issues/663) from getlantern/ox/nostagingconfig - - - -## [5.5.6](https://github.com/getlantern/flashlight/compare/5.5.5...5.5.6) - -> 2019-08-31 - - - -## [5.5.5](https://github.com/getlantern/flashlight/compare/5.5.4...5.5.5) - -> 2019-08-27 - - - -## [5.5.4](https://github.com/getlantern/flashlight/compare/5.5.3...5.5.4) - -> 2019-08-23 - -### Pull Requests - -* Merge pull request [#662](https://github.com/getlantern/flashlight/issues/662) from getlantern/2929-redial-session-in-quicwrapper -* Merge pull request [#661](https://github.com/getlantern/flashlight/issues/661) from getlantern/issue_2962 -* Merge pull request [#660](https://github.com/getlantern/flashlight/issues/660) from getlantern/wss_validate -* Merge pull request [#658](https://github.com/getlantern/flashlight/issues/658) from getlantern/log-session-keys -* Merge pull request [#651](https://github.com/getlantern/flashlight/issues/651) from getlantern/hit-proxy-direct - - - -## [5.5.3](https://github.com/getlantern/flashlight/compare/5.5.2...5.5.3) - -> 2019-08-21 - -### Pull Requests - -* Merge pull request [#659](https://github.com/getlantern/flashlight/issues/659) from getlantern/ui-update-5.5.3 -* Merge pull request [#653](https://github.com/getlantern/flashlight/issues/653) from getlantern/oquic - - - -## [5.5.2](https://github.com/getlantern/flashlight/compare/5.5.1...5.5.2) - -> 2019-08-21 - -### Pull Requests - -* Merge pull request [#657](https://github.com/getlantern/flashlight/issues/657) from getlantern/harry/expose-proxies -* Merge pull request [#655](https://github.com/getlantern/flashlight/issues/655) from getlantern/harry/add-diagnostics -* Merge pull request [#656](https://github.com/getlantern/flashlight/issues/656) from getlantern/tom/logProxies -* Merge pull request [#654](https://github.com/getlantern/flashlight/issues/654) from getlantern/ox/issue2282-configurable -* Merge pull request [#652](https://github.com/getlantern/flashlight/issues/652) from getlantern/2939-golog-use-prefixer -* Merge pull request [#649](https://github.com/getlantern/flashlight/issues/649) from getlantern/tom/logFix -* Merge pull request [#648](https://github.com/getlantern/flashlight/issues/648) from getlantern/run-as-cache - - - -## [5.5.1](https://github.com/getlantern/flashlight/compare/5.5.0...5.5.1) - -> 2019-07-30 - -### Pull Requests - -* Merge pull request [#646](https://github.com/getlantern/flashlight/issues/646) from getlantern/2926-ctx-fixes -* Merge pull request [#645](https://github.com/getlantern/flashlight/issues/645) from getlantern/ox/runasimprovements -* Merge pull request [#644](https://github.com/getlantern/flashlight/issues/644) from getlantern/2788-update-quicwrapper -* Merge pull request [#643](https://github.com/getlantern/flashlight/issues/643) from getlantern/ox/issue2914 -* Merge pull request [#642](https://github.com/getlantern/flashlight/issues/642) from getlantern/2913-run-on-behalf-of-user -* Merge pull request [#641](https://github.com/getlantern/flashlight/issues/641) from getlantern/smux-v1.3.4 -* Merge pull request [#640](https://github.com/getlantern/flashlight/issues/640) from getlantern/smux-mem-usage - - - -## [5.5.0](https://github.com/getlantern/flashlight/compare/5.4.7...5.5.0) - -> 2019-07-08 - -### Pull Requests - -* Merge pull request [#639](https://github.com/getlantern/flashlight/issues/639) from getlantern/fix-arista-sum -* Merge pull request [#637](https://github.com/getlantern/flashlight/issues/637) from getlantern/2866-update-tinywss-pull-12 -* Merge pull request [#563](https://github.com/getlantern/flashlight/issues/563) from getlantern/ox/gotun2socks -* Merge pull request [#635](https://github.com/getlantern/flashlight/issues/635) from getlantern/ox/issue2780 -* Merge pull request [#634](https://github.com/getlantern/flashlight/issues/634) from getlantern/ox/ios_report_issue_test -* Merge pull request [#633](https://github.com/getlantern/flashlight/issues/633) from getlantern/mod-fix -* Merge pull request [#617](https://github.com/getlantern/flashlight/issues/617) from getlantern/ox/gotun2socks-updates - - - -## [5.4.7](https://github.com/getlantern/flashlight/compare/5.4.6...5.4.7) - -> 2019-06-20 - -### Pull Requests - -* Merge pull request [#632](https://github.com/getlantern/flashlight/issues/632) from getlantern/ox/utpios -* Merge pull request [#619](https://github.com/getlantern/flashlight/issues/619) from getlantern/ox/iosdemofix - - - -## [5.4.6](https://github.com/getlantern/flashlight/compare/5.4.5...5.4.6) - -> 2019-06-12 - -### Pull Requests - -* Merge pull request [#631](https://github.com/getlantern/flashlight/issues/631) from getlantern/bcm/disable-utp-linux - - - -## [5.4.5](https://github.com/getlantern/flashlight/compare/5.4.4...5.4.5) - -> 2019-06-11 - -### Pull Requests - -* Merge pull request [#630](https://github.com/getlantern/flashlight/issues/630) from getlantern/2841-disable-utp-android - - - -## [5.4.4](https://github.com/getlantern/flashlight/compare/5.4.3...5.4.4) - -> 2019-06-10 - -### Pull Requests - -* Merge pull request [#624](https://github.com/getlantern/flashlight/issues/624) from getlantern/dynamic-config-fetch -* Merge pull request [#629](https://github.com/getlantern/flashlight/issues/629) from getlantern/fix_utls_branch - - - -## [5.4.3](https://github.com/getlantern/flashlight/compare/5.4.2...5.4.3) - -> 2019-06-07 - -### Pull Requests - -* Merge pull request [#628](https://github.com/getlantern/flashlight/issues/628) from getlantern/utp-windows-xp -* Merge pull request [#627](https://github.com/getlantern/flashlight/issues/627) from getlantern/wss_fronting -* Merge pull request [#616](https://github.com/getlantern/flashlight/issues/616) from getlantern/use-go-modules -* Merge pull request [#618](https://github.com/getlantern/flashlight/issues/618) from getlantern/harry/go-modules-1-11-support - - - -## [5.4.2](https://github.com/getlantern/flashlight/compare/5.4.1...5.4.2) - -> 2019-06-05 - -### Reverts - -* Disable cgocheck to improve utp cpu usage - -### Pull Requests - -* Merge pull request [#626](https://github.com/getlantern/flashlight/issues/626) from getlantern/removed-unused-proxied -* Merge pull request [#609](https://github.com/getlantern/flashlight/issues/609) from getlantern/ox/utplampshade - - - -## [5.4.1](https://github.com/getlantern/flashlight/compare/5.4.0...5.4.1) - -> 2019-06-02 - -### Pull Requests - -* Merge pull request [#625](https://github.com/getlantern/flashlight/issues/625) from getlantern/tinywss-panic -* Merge pull request [#623](https://github.com/getlantern/flashlight/issues/623) from getlantern/ox/fix_ios_test -* Merge pull request [#622](https://github.com/getlantern/flashlight/issues/622) from getlantern/ios-config-ci -* Merge pull request [#621](https://github.com/getlantern/flashlight/issues/621) from getlantern/cors-ci-fix -* Merge pull request [#620](https://github.com/getlantern/flashlight/issues/620) from getlantern/2733-borda-reporting -* Merge pull request [#588](https://github.com/getlantern/flashlight/issues/588) from getlantern/ox/issue2635 -* Merge pull request [#607](https://github.com/getlantern/flashlight/issues/607) from getlantern/platform-ios - - - -## [5.4.0](https://github.com/getlantern/flashlight/compare/5.3.8...5.4.0) - -> 2019-05-10 - -### Pull Requests - -* Merge pull request [#615](https://github.com/getlantern/flashlight/issues/615) from getlantern/ui-update-540 -* Merge pull request [#612](https://github.com/getlantern/flashlight/issues/612) from getlantern/wss -* Merge pull request [#614](https://github.com/getlantern/flashlight/issues/614) from getlantern/update-go-update-again -* Merge pull request [#613](https://github.com/getlantern/flashlight/issues/613) from getlantern/update-go-update -* Merge pull request [#610](https://github.com/getlantern/flashlight/issues/610) from getlantern/2720-add-comment -* Merge pull request [#611](https://github.com/getlantern/flashlight/issues/611) from getlantern/ox/issue2720 - - - -## [5.3.8](https://github.com/getlantern/flashlight/compare/5.3.7...5.3.8) - -> 2019-04-24 - -### Pull Requests - -* Merge pull request [#608](https://github.com/getlantern/flashlight/issues/608) from getlantern/2612 -* Merge pull request [#605](https://github.com/getlantern/flashlight/issues/605) from getlantern/ox/issue2737 -* Merge pull request [#598](https://github.com/getlantern/flashlight/issues/598) from getlantern/client-beam - - - -## [5.3.7](https://github.com/getlantern/flashlight/compare/5.3.6...5.3.7) - -> 2019-04-23 - - - -## [5.3.6](https://github.com/getlantern/flashlight/compare/5.3.5...5.3.6) - -> 2019-04-18 - -### Pull Requests - -* Merge pull request [#599](https://github.com/getlantern/flashlight/issues/599) from getlantern/uae-blacklist -* Merge pull request [#603](https://github.com/getlantern/flashlight/issues/603) from getlantern/2724-fix-panic - - - -## [5.3.5](https://github.com/getlantern/flashlight/compare/5.3.4...5.3.5) - -> 2019-04-12 - -### Pull Requests - -* Merge pull request [#606](https://github.com/getlantern/flashlight/issues/606) from getlantern/ui-5.3.5 -* Merge pull request [#604](https://github.com/getlantern/flashlight/issues/604) from getlantern/2734-ditch-easylist - - - -## [5.3.4](https://github.com/getlantern/flashlight/compare/5.3.3...5.3.4) - -> 2019-04-02 - -### Pull Requests - -* Merge pull request [#602](https://github.com/getlantern/flashlight/issues/602) from getlantern/flags-crash - - - -## [5.3.3](https://github.com/getlantern/flashlight/compare/5.3.2...5.3.3) - -> 2019-04-02 - -### Pull Requests - -* Merge pull request [#601](https://github.com/getlantern/flashlight/issues/601) from getlantern/fix-reset-timer -* Merge pull request [#600](https://github.com/getlantern/flashlight/issues/600) from getlantern/ignore-touchbar -* Merge pull request [#521](https://github.com/getlantern/flashlight/issues/521) from getlantern/ox/genglobalfromcloud -* Merge pull request [#597](https://github.com/getlantern/flashlight/issues/597) from getlantern/httpse-test-fix -* Merge pull request [#593](https://github.com/getlantern/flashlight/issues/593) from getlantern/datacap-logs -* Merge pull request [#596](https://github.com/getlantern/flashlight/issues/596) from getlantern/ox/ignore_rtt_deadline - - - -## [5.3.2](https://github.com/getlantern/flashlight/compare/5.3.1...5.3.2) - -> 2019-03-12 - -### Pull Requests - -* Merge pull request [#594](https://github.com/getlantern/flashlight/issues/594) from getlantern/2678-quic-panic -* Merge pull request [#595](https://github.com/getlantern/flashlight/issues/595) from getlantern/ox/borda_no_verbose -* Merge pull request [#592](https://github.com/getlantern/flashlight/issues/592) from getlantern/2663-shortcut-fixes -* Merge pull request [#591](https://github.com/getlantern/flashlight/issues/591) from getlantern/update-gopacket - - - -## [5.3.1](https://github.com/getlantern/flashlight/compare/5.3.0...5.3.1) - -> 2019-02-26 - -### Pull Requests - -* Merge pull request [#590](https://github.com/getlantern/flashlight/issues/590) from getlantern/2574-larger-idle-timeout -* Merge pull request [#517](https://github.com/getlantern/flashlight/issues/517) from getlantern/ox/server_connect_timeout -* Merge pull request [#586](https://github.com/getlantern/flashlight/issues/586) from getlantern/2628-reliable-connection-states -* Merge pull request [#589](https://github.com/getlantern/flashlight/issues/589) from getlantern/2565-avoid-borda-infinite-loop - - - -## [5.3.0](https://github.com/getlantern/flashlight/compare/5.2.8...5.3.0) - -> 2019-02-20 - -### Pull Requests - -* Merge pull request [#587](https://github.com/getlantern/flashlight/issues/587) from getlantern/lampshade-pr-34 -* Merge pull request [#585](https://github.com/getlantern/flashlight/issues/585) from getlantern/add-probe-test -* Merge pull request [#584](https://github.com/getlantern/flashlight/issues/584) from getlantern/2619-probing-accuracy -* Merge pull request [#583](https://github.com/getlantern/flashlight/issues/583) from getlantern/remove-misleading-log -* Merge pull request [#582](https://github.com/getlantern/flashlight/issues/582) from getlantern/fix_qtls_dep - - - -## [5.2.8](https://github.com/getlantern/flashlight/compare/5.2.7...5.2.8) - -> 2019-01-31 - -### Pull Requests - -* Merge pull request [#581](https://github.com/getlantern/flashlight/issues/581) from getlantern/ui-5.2.8 -* Merge pull request [#580](https://github.com/getlantern/flashlight/issues/580) from getlantern/ox/latest-quic -* Merge pull request [#564](https://github.com/getlantern/flashlight/issues/564) from getlantern/ox/balancer_dial_details -* Merge pull request [#577](https://github.com/getlantern/flashlight/issues/577) from getlantern/update_quic -* Merge pull request [#579](https://github.com/getlantern/flashlight/issues/579) from getlantern/update_quic_no_test -* Merge pull request [#576](https://github.com/getlantern/flashlight/issues/576) from getlantern/2575-no-direct-addrs -* Merge pull request [#572](https://github.com/getlantern/flashlight/issues/572) from getlantern/2534-new-lampshade -* Merge pull request [#575](https://github.com/getlantern/flashlight/issues/575) from getlantern/2564-latest-shortcut - - - -## [5.2.7](https://github.com/getlantern/flashlight/compare/5.2.6...5.2.7) - -> 2019-01-18 - -### Pull Requests - -* Merge pull request [#574](https://github.com/getlantern/flashlight/issues/574) from getlantern/context-digest - - - -## [5.2.6](https://github.com/getlantern/flashlight/compare/5.2.5...5.2.6) - -> 2019-01-17 - -### Pull Requests - -* Merge pull request [#573](https://github.com/getlantern/flashlight/issues/573) from getlantern/ui-5.2.6 -* Merge pull request [#490](https://github.com/getlantern/flashlight/issues/490) from getlantern/issue_1579 - - - -## [5.2.5](https://github.com/getlantern/flashlight/compare/5.2.4...5.2.5) - -> 2019-01-16 - -### Pull Requests - -* Merge pull request [#571](https://github.com/getlantern/flashlight/issues/571) from getlantern/dep-ensure-yaml -* Merge pull request [#570](https://github.com/getlantern/flashlight/issues/570) from getlantern/ui-5.2.5 -* Merge pull request [#569](https://github.com/getlantern/flashlight/issues/569) from getlantern/update-context - - - -## [5.2.4](https://github.com/getlantern/flashlight/compare/5.2.3...5.2.4) - -> 2019-01-08 - -### Pull Requests - -* Merge pull request [#568](https://github.com/getlantern/flashlight/issues/568) from getlantern/ox/issue2496 -* Merge pull request [#567](https://github.com/getlantern/flashlight/issues/567) from getlantern/2535-pipe-stdout-and-stderr - - - -## [5.2.3](https://github.com/getlantern/flashlight/compare/5.2.2...5.2.3) - -> 2019-01-04 - -### Pull Requests - -* Merge pull request [#565](https://github.com/getlantern/flashlight/issues/565) from getlantern/add-mail-ports -* Merge pull request [#566](https://github.com/getlantern/flashlight/issues/566) from getlantern/ui-5.2.3 -* Merge pull request [#562](https://github.com/getlantern/flashlight/issues/562) from getlantern/global_config_test -* Merge pull request [#536](https://github.com/getlantern/flashlight/issues/536) from getlantern/ox/memhelper - - - -## [5.2.2](https://github.com/getlantern/flashlight/compare/5.2.1...5.2.2) - -> 2018-12-13 - -### Pull Requests - -* Merge pull request [#561](https://github.com/getlantern/flashlight/issues/561) from getlantern/ui-5.2.2 -* Merge pull request [#560](https://github.com/getlantern/flashlight/issues/560) from getlantern/lampshade-upgrade -* Merge pull request [#559](https://github.com/getlantern/flashlight/issues/559) from getlantern/bcmertz/icons-dependency -* Merge pull request [#558](https://github.com/getlantern/flashlight/issues/558) from getlantern/hitproxy-wsl -* Merge pull request [#557](https://github.com/getlantern/flashlight/issues/557) from getlantern/systray-update -* Merge pull request [#556](https://github.com/getlantern/flashlight/issues/556) from getlantern/bcmertz/update-icons - - - -## [5.2.1](https://github.com/getlantern/flashlight/compare/5.2.0...5.2.1) - -> 2018-12-07 - -### Pull Requests - -* Merge pull request [#555](https://github.com/getlantern/flashlight/issues/555) from getlantern/ui-5.2.1 -* Merge pull request [#553](https://github.com/getlantern/flashlight/issues/553) from getlantern/correct-locale -* Merge pull request [#552](https://github.com/getlantern/flashlight/issues/552) from getlantern/ox/numproxies - - - -## [5.2.0](https://github.com/getlantern/flashlight/compare/5.1.0...5.2.0) - -> 2018-12-04 - -### Pull Requests - -* Merge pull request [#551](https://github.com/getlantern/flashlight/issues/551) from getlantern/afisk-issue-2471 - - - -## [5.1.0](https://github.com/getlantern/flashlight/compare/5.0.4...5.1.0) - -> 2018-12-03 - - - -## [5.0.4](https://github.com/getlantern/flashlight/compare/5.0.3...5.0.4) - -> 2018-12-03 - -### Pull Requests - -* Merge pull request [#548](https://github.com/getlantern/flashlight/issues/548) from getlantern/x-forwarded-for-pro-server - - - -## [5.0.3](https://github.com/getlantern/flashlight/compare/5.0.2...5.0.3) - -> 2018-12-03 - - - -## [5.0.2](https://github.com/getlantern/flashlight/compare/5.0.1...5.0.2) - -> 2018-12-03 - -### Pull Requests - -* Merge pull request [#547](https://github.com/getlantern/flashlight/issues/547) from getlantern/yinbi-ui-11 - - - -## [5.0.1](https://github.com/getlantern/flashlight/compare/5.0.0...5.0.1) - -> 2018-12-01 - -### Pull Requests - -* Merge pull request [#545](https://github.com/getlantern/flashlight/issues/545) from getlantern/ox/memlimit - - - -## [5.0.0](https://github.com/getlantern/flashlight/compare/4.9.1-yinbi...5.0.0) - -> 2018-11-30 - -### Pull Requests - -* Merge pull request [#544](https://github.com/getlantern/flashlight/issues/544) from getlantern/yinbi-ui-10 -* Merge pull request [#543](https://github.com/getlantern/flashlight/issues/543) from getlantern/ox/lampshadeidleinterval -* Merge pull request [#542](https://github.com/getlantern/flashlight/issues/542) from getlantern/ox/probe_eof -* Merge pull request [#541](https://github.com/getlantern/flashlight/issues/541) from getlantern/yinbi-ui-9 -* Merge pull request [#539](https://github.com/getlantern/flashlight/issues/539) from getlantern/1775-fetch-user-data-more-often -* Merge pull request [#540](https://github.com/getlantern/flashlight/issues/540) from getlantern/myles-yinbi-17 -* Merge pull request [#523](https://github.com/getlantern/flashlight/issues/523) from getlantern/2339-dev-not-hit-outdated-page -* Merge pull request [#538](https://github.com/getlantern/flashlight/issues/538) from getlantern/fix-ci -* Merge pull request [#533](https://github.com/getlantern/flashlight/issues/533) from getlantern/hh/yinbi-154 -* Merge pull request [#532](https://github.com/getlantern/flashlight/issues/532) from getlantern/ox/issue2415 -* Merge pull request [#531](https://github.com/getlantern/flashlight/issues/531) from getlantern/ox/issue2416 - diff --git a/chained/broflake_impl.go b/chained/broflake_impl.go index 031f4f18f..0f8edd8dd 100644 --- a/chained/broflake_impl.go +++ b/chained/broflake_impl.go @@ -19,11 +19,6 @@ func init() { broflake_common.SetDebugLogger(log.AsDebugLogger()) } -const ( - // only wait 10 seconds before failing over to the next masquerade since signaling with Freddie only has a 25 second timeout - masqueradeTimeout = 10 * time.Second -) - type broflakeImpl struct { reportDialCore reportDialCoreFn // TODO: I don't know what this is for yet QUICLayer *clientcore.QUICLayer @@ -144,7 +139,7 @@ func makeBroflakeOptions(pc *config.ProxyConfig) ( // Broflake's HTTP client isn't currently configurable via PluggableTransportSettings, and so // we just give it this domain fronted client in all cases wo.HttpClient = &http.Client{ - Transport: proxied.Fronted("broflake_fronted_roundtrip", masqueradeTimeout), + Transport: proxied.Fronted("broflake_fronted_roundtrip"), Timeout: 60 * time.Second, } diff --git a/chained/broflake_impl_test.go b/chained/broflake_impl_test.go index 0a11a4546..8ddf0ea6d 100644 --- a/chained/broflake_impl_test.go +++ b/chained/broflake_impl_test.go @@ -4,17 +4,29 @@ import ( "crypto/x509" "fmt" "math/rand" + "os" + "path/filepath" "strconv" "testing" "time" "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v2" "github.com/getlantern/broflake/clientcore" "github.com/getlantern/common/config" + "github.com/getlantern/fronted" + + flconfig "github.com/getlantern/flashlight/v7/config" + "github.com/getlantern/flashlight/v7/proxied" + + tls "github.com/refraction-networking/utls" ) +var fr = newFronted() + func TestMakeBroflakeOptions(t *testing.T) { + proxied.SetFronted(fr) pc := &config.ProxyConfig{ PluggableTransportSettings: map[string]string{ "broflake_ctablesize": "69", @@ -193,6 +205,7 @@ func TestMakeBroflakeOptions(t *testing.T) { } func TestGetRandomSubset(t *testing.T) { + proxied.SetFronted(fr) listSize := 100 uniqueStrings := make([]string, 0, listSize) for i := 0; i < listSize; i++ { @@ -221,3 +234,36 @@ func TestGetRandomSubset(t *testing.T) { subset = getRandomSubset(uint32(100), rng, nullSet) assert.Equal(t, len(subset), 0) } + +func newFronted() fronted.Fronted { + // Init domain-fronting + global, err := os.ReadFile("../embeddedconfig/global.yaml") + if err != nil { + log.Errorf("Unable to load embedded global config: %v", err) + os.Exit(1) + } + cfg := flconfig.NewGlobal() + err = yaml.Unmarshal(global, cfg) + if err != nil { + log.Errorf("Unable to unmarshal embedded global config: %v", err) + os.Exit(1) + } + + certs, err := cfg.TrustedCACerts() + if err != nil { + log.Errorf("Unable to read trusted certs: %v", err) + } + + tempConfigDir, err := os.MkdirTemp("", "issue_test") + if err != nil { + log.Errorf("Unable to create temp config dir: %v", err) + os.Exit(1) + } + defer os.RemoveAll(tempConfigDir) + fronted, err := fronted.NewFronted(filepath.Join(tempConfigDir, "masquerade_cache"), tls.HelloChrome_100, flconfig.DefaultFrontedProviderID) + if err != nil { + log.Errorf("Unable to configure fronted: %v", err) + } + fronted.UpdateConfig(certs, cfg.Client.FrontedProviders()) + return fronted +} diff --git a/chained/https_impl.go b/chained/https_impl.go index c3e4d306d..d786afc77 100644 --- a/chained/https_impl.go +++ b/chained/https_impl.go @@ -98,7 +98,7 @@ func (impl *httpsImpl) dialServer(op *ops.Op, ctx context.Context) (net.Conn, er result, err := d.DialForTimings("tcp", impl.addr) if err != nil { if isHelloErr(err) { - log.Debugf("got error likely related to bad hello; advancing roller: %v", err) + log.Debugf("https_impl got error likely related to bad hello; advancing roller: %v", err) r.advance() } return nil, err diff --git a/chained/proxy.go b/chained/proxy.go index 1699f48df..0086e4054 100644 --- a/chained/proxy.go +++ b/chained/proxy.go @@ -141,7 +141,6 @@ func CreateDialer(configDir, name string, s *config.ProxyConfig, uc common.UserC if err != nil { return nil, err } - log.Debugf("AuthToken: %s", p.authToken) p.impl, err = createImpl(configDir, name, addr, transport, s, uc, p.reportDialCore) if err != nil { log.Debugf("Unable to create proxy implementation for %v: %v", name, err) diff --git a/chained/tls_file_cache_test.go b/chained/tls_file_cache_test.go index e8ca31b97..42f8c67a3 100644 --- a/chained/tls_file_cache_test.go +++ b/chained/tls_file_cache_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/getlantern/tlsdialer/v3" + tlsdialer "github.com/getlantern/tlsdialer/v3" "github.com/getlantern/tlsresumption" tls "github.com/refraction-networking/utls" "github.com/stretchr/testify/assert" diff --git a/chained/tlsmasq_impl.go b/chained/tlsmasq_impl.go index f23b1c229..a5a83fd68 100644 --- a/chained/tlsmasq_impl.go +++ b/chained/tlsmasq_impl.go @@ -199,7 +199,7 @@ func (h *utlsHandshaker) Handshake(conn net.Conn) (*ptlshs.HandshakeResult, erro } if err = uconn.Handshake(); err != nil { if isHelloErr(err) { - log.Debugf("got error likely related to bad hello; advancing roller: %v", err) + log.Debugf("tlsmasq got error likely related to bad hello; advancing roller: %v", err) r.advance() } return nil, err diff --git a/client/handler.go b/client/handler.go index 1a24e0284..c62e8fac4 100644 --- a/client/handler.go +++ b/client/handler.go @@ -136,10 +136,11 @@ func (client *Client) isHTTPProxyPort(r *http.Request) bool { // requests (similar to desktop's APIHandler) func (client *Client) interceptProRequest(cs *filters.ConnectionState, r *http.Request) (*http.Response, *filters.ConnectionState, error) { log.Debugf("Intercepting request to pro server: %v", r.URL.Path) + // Strip /pro from path. r.URL.Path = r.URL.Path[4:] pro.PrepareProRequest(r, client.user) r.Header.Del("Origin") - resp, err := pro.GetHTTPClient().Do(r) + resp, err := pro.HTTPClient.Do(r) if err != nil { log.Errorf("Error intercepting request to pro server: %v", err) resp = &http.Response{ diff --git a/config/config.go b/config/config.go index f2f97e9ca..4c7cc22e0 100644 --- a/config/config.go +++ b/config/config.go @@ -11,13 +11,13 @@ import ( "sync" "time" - "github.com/getsentry/sentry-go" "gopkg.in/yaml.v3" "github.com/getlantern/golog" "github.com/getlantern/rot13" "github.com/getlantern/flashlight/v7/common" + "github.com/getlantern/flashlight/v7/embeddedconfig" "github.com/getlantern/flashlight/v7/ops" ) @@ -88,12 +88,6 @@ type options struct { // yaml configs. dispatch func(cfg interface{}, src Source) - // embeddedData is the data for embedded configs, using tarfs. - embeddedData []byte - - // whether or not embedded data is required. - embeddedRequired bool - // sleep the time to sleep between config fetches. sleep func() time.Duration @@ -108,6 +102,53 @@ type options struct { // opName is the operation name to use for ops.Begin when fetching configs. opName string + + // ignoreSaved specifies whether or not to ignore saved config and only use + // configs fetched from the network (possibly because we previously snagged + // the saved config, for example). + ignoreSaved bool +} + +// NewGlobalOnDisk creates a new global config that is saved on disk either via +// the embedded config or fetched from the network. +func NewGlobalOnDisk(configDir string, flags map[string]interface{}) (*Global, error) { + configPath := filepath.Join(configDir, "global.yaml") + embedded := NewGlobal() + if err := yaml.Unmarshal(embeddedconfig.Global, embedded); err != nil { + return nil, err + } + if err := embedded.validate(); err != nil { + return nil, err + } + + saved, err := savedGlobal(configPath, obfuscate(flags)) + if err != nil { + return embedded, nil + } + + // The embedded config can be newer, for example, if the user has installed a new version of the app. + if embeddedIsNewer(configPath) { + return embedded, nil + } else { + return saved, nil + } +} + +func savedGlobal(filePath string, obfuscate bool) (*Global, error) { + bytes, err := saved(filePath, obfuscate) + if err != nil { + return nil, err + } + + log.Debugf("Returning saved global config at %v", filePath) + saved := NewGlobal() + if err := yaml.Unmarshal(bytes, saved); err != nil { + return nil, err + } + if err := saved.validate(); err != nil { + return nil, err + } + return saved, nil } // pipeConfig creates a new config pipeline for reading a specified type of @@ -150,39 +191,16 @@ func pipeConfig(opts *options) (stop func()) { } configPath := filepath.Join(opts.saveDir, opts.name) - - log.Tracef("Obfuscating %v", opts.obfuscate) conf := newConfig(configPath, opts) - sendEmbedded := func() bool { - if embedded, err := conf.embedded(opts.embeddedData); err != nil { - log.Errorf("Could not load embedded config %v", err) - return false - } else { - log.Debugf("Sending embedded config for %v", opts.name) - dispatch(embedded, Embedded) - return true - } - } - - sendSaved := func() bool { - if saved, err := conf.saved(); err != nil { + // We ignore the saved global config here because we need it so early in the + // initialization sequence that we've already grabbed it at this point. + if !opts.ignoreSaved { + if saved, err := saved(configPath, conf.obfuscate); err != nil { log.Debugf("Could not load stored config %v", err) - return false } else { log.Debugf("Sending saved config for %v", opts.name) dispatch(saved, Saved) - return true - } - } - - if embeddedIsNewer(conf, opts) && !opts.sticky { - if !sendEmbedded() { - sendSaved() - } - } else { - if !sendSaved() { - sendEmbedded() } } @@ -206,17 +224,10 @@ func pipeConfig(opts *options) (stop func()) { // Checks to see if our embedded config is newer than our saved config. If it is, use that. This could happen, // for example, if the user has successfully auto-updated or installed a new version by any means, but // where there's some blocking event or bug preventing new configs from being fetched. -func embeddedIsNewer(conf *config, opts *options) bool { - if opts.embeddedData == nil { - if opts.embeddedRequired { - sentry.CaptureException(log.Errorf("no embedded config for %v", opts.name)) - } - - return false - } - - saved, err := os.Stat(conf.filePath) +func embeddedIsNewer(savedPath string) bool { + saved, err := os.Stat(savedPath) if os.IsNotExist(err) { + log.Debug("No saved config found -- using embedded") return true } @@ -232,6 +243,34 @@ func embeddedIsNewer(conf *config, opts *options) bool { } } +func saved(filePath string, obfuscate bool) ([]byte, error) { + infile, err := os.Open(filePath) + if err != nil { + err = fmt.Errorf("unable to open config file %v for reading: %w", filePath, err) + log.Error(err.Error()) + return nil, err + } + defer infile.Close() + + var in io.Reader = infile + if obfuscate { + in = rot13.NewReader(infile) + } + + bytes, err := io.ReadAll(in) + if err != nil { + err = fmt.Errorf("error reading config from %v: %w", filePath, err) + log.Error(err.Error()) + return nil, err + } + if len(bytes) == 0 { + return nil, fmt.Errorf("config exists but is empty at %v", filePath) + } + + log.Debugf("Returning saved config at %v", filePath) + return bytes, nil +} + func yamlRoundTrip(o interface{}) interface{} { if o == nil { return nil diff --git a/config/config_test.go b/config/config_test.go index 789c32042..6f9ca996e 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -36,18 +36,13 @@ func TestEmbeddedIsNewer(t *testing.T) { configPath := inTempDir(opts.name) conf := newConfig(configPath, opts) - // No embedded config. - assert.False(t, embeddedIsNewer(conf, opts)) - - opts.embeddedData = []byte("test") - // No proxies on disk. - assert.True(t, embeddedIsNewer(conf, opts)) + assert.True(t, embeddedIsNewer(conf.filePath)) - conf.doSaveOne(opts.embeddedData) + conf.doSaveOne([]byte("test")) // Saved new proxies file -- make sure we use that. - assert.False(t, embeddedIsNewer(conf, opts)) + assert.False(t, embeddedIsNewer(conf.filePath)) }) } diff --git a/config/initializer.go b/config/initializer.go index ee002d8aa..0db3c4c0f 100644 --- a/config/initializer.go +++ b/config/initializer.go @@ -9,7 +9,6 @@ import ( "github.com/getlantern/yaml" "github.com/getlantern/flashlight/v7/common" - "github.com/getlantern/flashlight/v7/embeddedconfig" ) const packageLogPrefix = "flashlight.config" @@ -80,24 +79,23 @@ func InitWithURLs( // These are the options for fetching the global config. globalOptions := &options{ - saveDir: configDir, - onSaveError: onGlobalSaveError, - obfuscate: obfuscate(flags), - name: "global.yaml", - originURL: globalURL, - userConfig: userConfig, - unmarshaler: newGlobalUnmarshaler(flags), - dispatch: globalDispatch, - embeddedData: embeddedconfig.Global, - embeddedRequired: true, + saveDir: configDir, + onSaveError: onGlobalSaveError, + obfuscate: obfuscate(flags), + name: "global.yaml", + originURL: globalURL, + userConfig: userConfig, + unmarshaler: newGlobalUnmarshaler(flags), + dispatch: globalDispatch, sleep: func() time.Duration { mx.RLock() defer mx.RUnlock() return globalConfigPollInterval }, - sticky: isSticky(flags), - rt: rt, - opName: "fetch_global", + sticky: isSticky(flags), + rt: rt, + opName: "fetch_global", + ignoreSaved: true, } stopGlobal := pipeConfig(globalOptions) diff --git a/dialer/fastconnect.go b/dialer/fastconnect.go index 1f473687f..0034e51eb 100644 --- a/dialer/fastconnect.go +++ b/dialer/fastconnect.go @@ -102,7 +102,6 @@ func (fcd *fastConnectDialer) onConnected(pd ProxyDialer, connectTime time.Durat fcd.topDialer.set(newTopDialer) } fcd.opts.OnSuccess(fcd.topDialer.get()) - log.Debug("Finished adding connected dialer") } // connectAll dials all the dialers in parallel to connect the user as quickly as diff --git a/email/email.go b/email/email.go index 6bcf56838..30129ce39 100644 --- a/email/email.go +++ b/email/email.go @@ -8,7 +8,6 @@ import ( "encoding/hex" "fmt" "math" - "net/http" "strconv" "strings" "sync" @@ -24,6 +23,7 @@ import ( "github.com/getlantern/flashlight/v7/geolookup" "github.com/getlantern/flashlight/v7/logging" "github.com/getlantern/flashlight/v7/ops" + "github.com/getlantern/flashlight/v7/proxied" "github.com/getlantern/flashlight/v7/util" ) @@ -37,7 +37,6 @@ var ( // Limit text logtail to 1MB maxLogTailSize = 1024768 defaultRecipient string - httpClient = &http.Client{} mu sync.RWMutex ) @@ -64,19 +63,6 @@ func getDefaultRecipient() string { return defaultRecipient } -// SetHTTPClient configures an alternate http.Client to use when sending emails -func SetHTTPClient(client *http.Client) { - mu.Lock() - defer mu.Unlock() - httpClient = client -} - -func getHTTPClient() *http.Client { - mu.RLock() - defer mu.RUnlock() - return httpClient -} - // Message is a templatized email message type Message struct { // The mandrill template slug @@ -141,7 +127,7 @@ func Send(ctx context.Context, msg *Message) error { func sendTemplate(ctx context.Context, msg *Message) error { client := mandrill.ClientWithKey(Key) - client.HTTPClient = getHTTPClient() + client.HTTPClient = proxied.DirectThenFrontedClient(1 * time.Minute) recipient := msg.To if recipient == "" { recipient = getDefaultRecipient() diff --git a/email/email_test.go b/email/email_test.go index 4d6069d25..934e0aeac 100644 --- a/email/email_test.go +++ b/email/email_test.go @@ -3,21 +3,18 @@ package email import ( "context" "io/ioutil" - "net/http" "os" "path/filepath" "testing" - "time" "github.com/keighl/mandrill" + tls "github.com/refraction-networking/utls" "github.com/stretchr/testify/assert" "github.com/getlantern/flashlight/v7/config" - "github.com/getlantern/flashlight/v7/embeddedconfig" "github.com/getlantern/flashlight/v7/proxied" "github.com/getlantern/fronted" "github.com/getlantern/golog" - "github.com/getlantern/keyman" "github.com/getlantern/yaml" ) @@ -62,24 +59,7 @@ func TestSubmitIssue(t *testing.T) { // test that domain-fronting is working, you can block mandrillapp.com, for // example by setting its address to 0.0.0.0 in /etc/hosts. if false { - cfg := &config.Global{} - err := yaml.Unmarshal(embeddedconfig.Global, cfg) - if !assert.NoError(t, err) { - return - } - - certs := make([]string, 0, len(cfg.TrustedCAs)) - for _, ca := range cfg.TrustedCAs { - certs = append(certs, ca.Cert) - } - pool, err := keyman.PoolContainingCerts(certs...) - if !assert.NoError(t, err) { - return - } - - fronted.Configure(pool, cfg.Client.FrontedProviders(), config.DefaultFrontedProviderID, filepath.Join(tempConfigDir, "masquerade_cache")) - SetHTTPClient(proxied.DirectThenFrontedClient(5 * time.Second)) - defer SetHTTPClient(&http.Client{}) + proxied.SetFronted(newFronted()) msg := &Message{ To: "ox+unittest@getlantern.org", @@ -89,3 +69,36 @@ func TestSubmitIssue(t *testing.T) { assert.NoError(t, sendTemplate(context.Background(), msg), "Should be able to send email") } } + +func newFronted() fronted.Fronted { + // Init domain-fronting + global, err := os.ReadFile("../embeddedconfig/global.yaml") + if err != nil { + log.Errorf("Unable to load embedded global config: %v", err) + os.Exit(1) + } + cfg := config.NewGlobal() + err = yaml.Unmarshal(global, cfg) + if err != nil { + log.Errorf("Unable to unmarshal embedded global config: %v", err) + os.Exit(1) + } + + certs, err := cfg.TrustedCACerts() + if err != nil { + log.Errorf("Unable to read trusted certs: %v", err) + } + + tempConfigDir, err := os.MkdirTemp("", "issue_test") + if err != nil { + log.Errorf("Unable to create temp config dir: %v", err) + os.Exit(1) + } + defer os.RemoveAll(tempConfigDir) + fronted, err := fronted.NewFronted(filepath.Join(tempConfigDir, "masquerade_cache"), tls.HelloChrome_100, config.DefaultFrontedProviderID) + if err != nil { + log.Errorf("Unable to configure fronted: %v", err) + } + fronted.UpdateConfig(certs, cfg.Client.FrontedProviders()) + return fronted +} diff --git a/flashlight.go b/flashlight.go index 6a179a655..b56ebcb88 100644 --- a/flashlight.go +++ b/flashlight.go @@ -15,6 +15,7 @@ import ( "github.com/getlantern/fronted" "github.com/getlantern/golog" "github.com/getlantern/netx" + tls "github.com/refraction-networking/utls" "google.golang.org/protobuf/proto" "github.com/getlantern/flashlight/v7/apipb" @@ -25,7 +26,6 @@ import ( userconfig "github.com/getlantern/flashlight/v7/config/user" "github.com/getlantern/flashlight/v7/dialer" "github.com/getlantern/flashlight/v7/domainrouting" - "github.com/getlantern/flashlight/v7/email" "github.com/getlantern/flashlight/v7/geolookup" "github.com/getlantern/flashlight/v7/goroutines" fops "github.com/getlantern/flashlight/v7/ops" @@ -96,6 +96,7 @@ type Flashlight struct { errorHandler func(HandledErrorType, error) mxProxyListeners sync.RWMutex proxyListeners []func(map[string]*commonconfig.ProxyConfig, config.Source) + fronted fronted.Fronted } // clientCallbacks are callbacks the client is configured with @@ -107,171 +108,6 @@ type clientCallbacks struct { onSucceedingProxy func() } -func (f *Flashlight) onGlobalConfig(cfg *config.Global, src config.Source) { - log.Debugf("Got global config from %v", src) - f.mxGlobal.Lock() - f.global = cfg - f.mxGlobal.Unlock() - domainrouting.Configure(cfg.DomainRoutingRules, cfg.ProxiedSites) - f.applyClientConfig(cfg) - f.applyOtel(cfg) - f.callbacks.onConfigUpdate(cfg, src) - f.callbacks.onInit() -} - -// EnabledFeatures gets all features enabled based on current conditions -func (f *Flashlight) EnabledFeatures() map[string]bool { - featuresEnabled := make(map[string]bool) - f.mxGlobal.RLock() - if f.global == nil { - f.mxGlobal.RUnlock() - return featuresEnabled - } - global := f.global - f.mxGlobal.RUnlock() - country := geolookup.GetCountry(0) - for feature := range global.FeaturesEnabled { - if f.calcFeature(global, country, "0.0.1", feature) { - featuresEnabled[feature] = true - } - } - return featuresEnabled -} - -// EnableNamedDomainRules adds named domain rules specified as arguments to the domainrouting rules table -func (f *Flashlight) EnableNamedDomainRules(names ...string) { - f.mxGlobal.RLock() - global := f.global - f.mxGlobal.RUnlock() - if global == nil { - return - } - for _, name := range names { - if v, ok := global.NamedDomainRoutingRules[name]; ok { - if err := domainrouting.AddRules(v); err != nil { - _ = log.Errorf("Unable to add named domain routing rules: %v", err) - } - } else { - log.Debugf("Named domain routing rule %s is not defined in global config", name) - } - } -} - -// DisableNamedDomainRules removes named domain rules specified as arguments from the domainrouting rules table -func (f *Flashlight) DisableNamedDomainRules(names ...string) { - f.mxGlobal.RLock() - global := f.global - f.mxGlobal.RUnlock() - if global == nil { - return - } - for _, name := range names { - if v, ok := global.NamedDomainRoutingRules[name]; !ok { - if err := domainrouting.RemoveRules(v); err != nil { - _ = log.Errorf("Unable to remove named domain routing rules: %v", err) - } - } else { - log.Debugf("Named domain routing rule %s is not defined in global config", name) - } - } -} - -// featureEnabled returns true if the input feature is enabled for this flashlight instance. Feature -// names are tracked in the config package. -func (f *Flashlight) featureEnabled(feature string) bool { - // features internal to flashlight are not controllable by application version, since flashlight doesn't know the version, so we use a very low version number just to make sure it parses - return f.FeatureEnabled(feature, "0.0.1") -} - -func (f *Flashlight) FeatureEnabled(feature, applicationVersion string) bool { - f.mxGlobal.RLock() - global := f.global - f.mxGlobal.RUnlock() - return f.calcFeature(global, geolookup.GetCountry(0), applicationVersion, feature) -} - -func (f *Flashlight) calcFeature(global *config.Global, country, applicationVersion, feature string) bool { - // Special case: Use defaults for blocking related features until geolookup is finished - // to avoid accidentally generating traffic that could trigger blocking. - enabled, blockingRelated := blockingRelevantFeatures[feature] - if country == "" && blockingRelated { - enabledText := "disabled" - if enabled { - enabledText = "enabled" - } - log.Debugf("Blocking related feature %v %v because geolookup has not yet finished", feature, enabledText) - return enabled - } - if global == nil { - log.Error("No global configuration!") - return enabled - } - if blockingRelated { - log.Debugf("Checking blocking related feature %v with country set to %v", feature, country) - } - return global.FeatureEnabled(feature, - common.Platform, - f.userConfig.GetAppName(), - applicationVersion, - f.userConfig.GetUserID(), - f.isPro(), - country) -} - -// FeatureOptions unmarshals options for the input feature. Feature names are tracked in the config -// package. -func (f *Flashlight) FeatureOptions(feature string, opts config.FeatureOptions) error { - f.mxGlobal.RLock() - global := f.global - f.mxGlobal.RUnlock() - if global == nil { - // just to be safe - return errors.New("No global configuration") - } - return global.UnmarshalFeatureOptions(feature, opts) -} - -func (f *Flashlight) addProxyListener(listener func(proxies map[string]*commonconfig.ProxyConfig, src config.Source)) { - f.mxProxyListeners.Lock() - defer f.mxProxyListeners.Unlock() - f.proxyListeners = append(f.proxyListeners, listener) -} - -func (f *Flashlight) notifyProxyListeners(proxies map[string]*commonconfig.ProxyConfig, src config.Source) { - f.mxProxyListeners.RLock() - defer f.mxProxyListeners.RUnlock() - for _, l := range f.proxyListeners { - // Make absolutely sure we don't hit data races with different go routines - // accessing shared data -- give each go routine it's own copy. - proxiesCopy := chained.CopyConfigs(proxies) - go l(proxiesCopy, src) - } -} - -func (f *Flashlight) startGlobalConfigFetch() func() { - globalDispatch := func(conf interface{}, src config.Source) { - cfg := conf.(*config.Global) - log.Debugf("Applying global config") - f.onGlobalConfig(cfg, src) - } - rt := proxied.ParallelPreferChained() - - onConfigSaveError := func(err error) { - f.errorHandler(ErrorTypeConfigSaveFailure, err) - } - - stopConfig := config.Init( - f.configDir, f.flagsAsMap, f.userConfig, - globalDispatch, onConfigSaveError, rt) - return stopConfig -} - -func (f *Flashlight) applyOtel(cfg *config.Global) { - if cfg.Otel != nil && f.featureEnabled(config.FeatureOtel) { - otel.Configure(cfg.Otel) - } -} - // New creates a client proxy. func New( appName string, @@ -302,7 +138,6 @@ func New( appName, appVersion, revisionDate, deviceID, isPro, func() string { return geolookup.GetCountry(0) }) - email.SetHTTPClient(proxied.DirectThenFrontedClient(1 * time.Minute)) f := &Flashlight{ callbacks: clientCallbacks{ @@ -342,6 +177,20 @@ func New( log.Errorf("user config: %v", err) } + globalConfig, err := config.NewGlobalOnDisk(f.configDir, f.flagsAsMap) + if err != nil { + fatalErr := fmt.Errorf("unable to initialize global config: %v", err) + f.op.FailIf(fatalErr) + f.op.End() + return nil, fatalErr + } + + f.fronted, err = fronted.NewFronted(filepath.Join(configDir, "masquerade_cache"), tls.HelloChrome_102, config.DefaultFrontedProviderID) + if err != nil { + log.Errorf("Unable to configure fronted: %v", err) + } + proxied.SetFronted(f.fronted) + var grabber dnsgrab.Server var grabberErr error if enableVPN { @@ -426,6 +275,7 @@ func New( } f.client = cl + f.onGlobalConfig(globalConfig, config.Embedded) f.addProxyListener(func(proxies map[string]*commonconfig.ProxyConfig, src config.Source) { log.Debug("Applying proxy config with proxies") @@ -553,6 +403,171 @@ func (f *Flashlight) startConfigService() (services.StopFn, error) { return services.StartConfigService(handler, configOpts) } +func (f *Flashlight) onGlobalConfig(cfg *config.Global, src config.Source) { + log.Debugf("Got global config from %v", src) + f.mxGlobal.Lock() + f.global = cfg + f.mxGlobal.Unlock() + domainrouting.Configure(cfg.DomainRoutingRules, cfg.ProxiedSites) + f.applyGlobalConfig(cfg) + f.applyOtel(cfg) + f.callbacks.onConfigUpdate(cfg, src) + f.callbacks.onInit() +} + +// EnabledFeatures gets all features enabled based on current conditions +func (f *Flashlight) EnabledFeatures() map[string]bool { + featuresEnabled := make(map[string]bool) + f.mxGlobal.RLock() + if f.global == nil { + f.mxGlobal.RUnlock() + return featuresEnabled + } + global := f.global + f.mxGlobal.RUnlock() + country := geolookup.GetCountry(0) + for feature := range global.FeaturesEnabled { + if f.calcFeature(global, country, "0.0.1", feature) { + featuresEnabled[feature] = true + } + } + return featuresEnabled +} + +// EnableNamedDomainRules adds named domain rules specified as arguments to the domainrouting rules table +func (f *Flashlight) EnableNamedDomainRules(names ...string) { + f.mxGlobal.RLock() + global := f.global + f.mxGlobal.RUnlock() + if global == nil { + return + } + for _, name := range names { + if v, ok := global.NamedDomainRoutingRules[name]; ok { + if err := domainrouting.AddRules(v); err != nil { + _ = log.Errorf("Unable to add named domain routing rules: %v", err) + } + } else { + log.Debugf("Named domain routing rule %s is not defined in global config", name) + } + } +} + +// DisableNamedDomainRules removes named domain rules specified as arguments from the domainrouting rules table +func (f *Flashlight) DisableNamedDomainRules(names ...string) { + f.mxGlobal.RLock() + global := f.global + f.mxGlobal.RUnlock() + if global == nil { + return + } + for _, name := range names { + if v, ok := global.NamedDomainRoutingRules[name]; !ok { + if err := domainrouting.RemoveRules(v); err != nil { + _ = log.Errorf("Unable to remove named domain routing rules: %v", err) + } + } else { + log.Debugf("Named domain routing rule %s is not defined in global config", name) + } + } +} + +// featureEnabled returns true if the input feature is enabled for this flashlight instance. Feature +// names are tracked in the config package. +func (f *Flashlight) featureEnabled(feature string) bool { + // features internal to flashlight are not controllable by application version, since flashlight doesn't know the version, so we use a very low version number just to make sure it parses + return f.FeatureEnabled(feature, "0.0.1") +} + +func (f *Flashlight) FeatureEnabled(feature, applicationVersion string) bool { + f.mxGlobal.RLock() + global := f.global + f.mxGlobal.RUnlock() + return f.calcFeature(global, geolookup.GetCountry(0), applicationVersion, feature) +} + +func (f *Flashlight) calcFeature(global *config.Global, country, applicationVersion, feature string) bool { + // Special case: Use defaults for blocking related features until geolookup is finished + // to avoid accidentally generating traffic that could trigger blocking. + enabled, blockingRelated := blockingRelevantFeatures[feature] + if country == "" && blockingRelated { + enabledText := "disabled" + if enabled { + enabledText = "enabled" + } + log.Debugf("Blocking related feature %v %v because geolookup has not yet finished", feature, enabledText) + return enabled + } + if global == nil { + log.Error("No global configuration!") + return enabled + } + if blockingRelated { + log.Debugf("Checking blocking related feature %v with country set to %v", feature, country) + } + return global.FeatureEnabled(feature, + common.Platform, + f.userConfig.GetAppName(), + applicationVersion, + f.userConfig.GetUserID(), + f.isPro(), + country) +} + +// FeatureOptions unmarshals options for the input feature. Feature names are tracked in the config +// package. +func (f *Flashlight) FeatureOptions(feature string, opts config.FeatureOptions) error { + f.mxGlobal.RLock() + global := f.global + f.mxGlobal.RUnlock() + if global == nil { + // just to be safe + return errors.New("No global configuration") + } + return global.UnmarshalFeatureOptions(feature, opts) +} + +func (f *Flashlight) addProxyListener(listener func(proxies map[string]*commonconfig.ProxyConfig, src config.Source)) { + f.mxProxyListeners.Lock() + defer f.mxProxyListeners.Unlock() + f.proxyListeners = append(f.proxyListeners, listener) +} + +func (f *Flashlight) notifyProxyListeners(proxies map[string]*commonconfig.ProxyConfig, src config.Source) { + f.mxProxyListeners.RLock() + defer f.mxProxyListeners.RUnlock() + for _, l := range f.proxyListeners { + // Make absolutely sure we don't hit data races with different go routines + // accessing shared data -- give each go routine it's own copy. + proxiesCopy := chained.CopyConfigs(proxies) + go l(proxiesCopy, src) + } +} + +func (f *Flashlight) startGlobalConfigFetch() func() { + globalDispatch := func(conf interface{}, src config.Source) { + cfg := conf.(*config.Global) + log.Debugf("Applying global config") + f.onGlobalConfig(cfg, src) + } + rt := proxied.ParallelPreferChained() + + onConfigSaveError := func(err error) { + f.errorHandler(ErrorTypeConfigSaveFailure, err) + } + + stopConfig := config.Init( + f.configDir, f.flagsAsMap, f.userConfig, + globalDispatch, onConfigSaveError, rt) + return stopConfig +} + +func (f *Flashlight) applyOtel(cfg *config.Global) { + if cfg.Otel != nil && f.featureEnabled(config.FeatureOtel) { + otel.Configure(cfg.Otel) + } +} + // convertNewProxyConfToOld converts the new ProxyConnectConfig format to the old ProxyConfig. This // is temporary until all code is updated to use the new config format. // @@ -605,7 +620,6 @@ func (f *Flashlight) RunClientListeners(httpProxyAddr, socksProxyAddr string, err := f.client.ListenAndServeHTTP(httpProxyAddr, func() { log.Debug("Started client HTTP proxy") proxied.SetProxyAddr(f.client.Addr) - email.SetHTTPClient(proxied.DirectThenFrontedClient(1 * time.Minute)) if afterStart != nil { afterStart(f.client) @@ -635,13 +649,13 @@ func (f *Flashlight) Stop() error { return f.client.Stop() } -func (f *Flashlight) applyClientConfig(cfg *config.Global) { +func (f *Flashlight) applyGlobalConfig(cfg *config.Global) { f.client.DNSResolutionMapForDirectDialsEventual.Set(cfg.Client.DNSResolutionMapForDirectDials) certs, err := cfg.TrustedCACerts() if err != nil { log.Errorf("Unable to get trusted ca certs, not configuring fronted: %s", err) } else if cfg.Client != nil && cfg.Client.Fronted != nil { - fronted.Configure(certs, cfg.Client.FrontedProviders(), config.DefaultFrontedProviderID, filepath.Join(f.configDir, "masquerade_cache")) + f.fronted.UpdateConfig(certs, cfg.Client.FrontedProviders()) } else { log.Errorf("Unable to configured fronted (no config)") } diff --git a/go.mod b/go.mod index 3b98942c9..a89a7820a 100644 --- a/go.mod +++ b/go.mod @@ -2,26 +2,12 @@ module github.com/getlantern/flashlight/v7 go 1.22.6 -toolchain go1.23.3 - -replace github.com/elazarl/goproxy => github.com/getlantern/goproxy v0.0.0-20220805074304-4a43a9ed4ec6 - replace github.com/keighl/mandrill => github.com/getlantern/mandrill v0.0.0-20221004112352-e7c04248adcb -//replace github.com/getlantern/yinbi-server => ../yinbi-server - -//replace github.com/getlantern/mandrill => /home/soltzen/dev/soltzen/mandrill - -//replace github.com/getlantern/proxy/v3 => ../proxy - -//replace github.com/getlantern/lantern-server => ../lantern-server +//replace github.com/getlantern/fronted => ../fronted replace github.com/eycorsican/go-tun2socks => github.com/getlantern/go-tun2socks v1.16.12-0.20201218023150-b68f09e5ae93 -// We use a fork of gomobile that allows reusing the cache directory for faster builds, based -// on this unmerged PR against gomobile - https://github.com/golang/mobile/pull/58. -replace golang.org/x/mobile => github.com/oxtoacart/mobile v0.0.0-20220116191336-0bdf708b6d0f - replace github.com/tetratelabs/wazero => github.com/refraction-networking/wazero v1.7.1-w require ( @@ -43,7 +29,7 @@ require ( github.com/getlantern/event v0.0.0-20210901195647-a7e3145142e6 github.com/getlantern/eventual v1.0.0 github.com/getlantern/eventual/v2 v2.0.2 - github.com/getlantern/fronted v0.0.0-20241203140224-a556be12abc5 + github.com/getlantern/fronted v0.0.0-20241206211020-da8e3e9f49fd github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65 github.com/getlantern/hellosplitter v0.1.1 @@ -79,7 +65,6 @@ require ( github.com/getlantern/uuid v1.2.0 github.com/getlantern/waitforserver v1.0.1 github.com/getlantern/yaml v0.0.0-20190801163808-0c9bb1ebf426 - github.com/getsentry/sentry-go v0.20.0 github.com/golang/protobuf v1.5.3 github.com/hashicorp/golang-lru v0.5.4 github.com/jaffee/commandeer v0.6.0 @@ -102,7 +87,7 @@ require ( go.opentelemetry.io/otel/trace v1.19.0 go.uber.org/atomic v1.10.0 golang.org/x/sys v0.26.0 - google.golang.org/protobuf v1.33.0 + google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 howett.net/plist v1.0.0 @@ -111,6 +96,7 @@ require ( require ( git.torproject.org/pluggable-transports/goptlib.git v1.2.0 // indirect github.com/Jigsaw-Code/outline-ss-server v1.5.0 // indirect + github.com/alitto/pond/v2 v2.1.5 // indirect github.com/anacrolix/dht/v2 v2.20.0 // indirect github.com/blang/vfs v1.0.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect @@ -120,6 +106,7 @@ require ( github.com/getlantern/algeneva v0.0.0-20240222191137-2b4e88234f59 // indirect github.com/getlantern/lampshade v0.0.0-20201109225444-b06082e15f3a // indirect github.com/getlantern/withtimeout v0.0.0-20160829163843-511f017cd913 // indirect + github.com/getsentry/sentry-go v0.20.0 // indirect github.com/go-llsqlite/crawshaw v0.5.1 // indirect github.com/tetratelabs/wazero v1.7.1 // indirect github.com/vishvananda/netns v0.0.1 // indirect diff --git a/go.sum b/go.sum index 4e4044d23..7f3bc41ff 100644 --- a/go.sum +++ b/go.sum @@ -49,6 +49,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alextanhongpin/go-bandit v0.0.0-20191125130111-30de60d69bae h1:ZrWHh+wXI877HHdIHLWCtQmL0u4CW6GPqTBOvYlO6Ts= github.com/alextanhongpin/go-bandit v0.0.0-20191125130111-30de60d69bae/go.mod h1:FaUXXpw8d7DBpg3M5wrQAj6RAGuVVoV35hvKKguVyNc= +github.com/alitto/pond/v2 v2.1.5 h1:2pp/KAPcb02NSpHsjjnxnrTDzogMLsq+vFf/L0DB84A= +github.com/alitto/pond/v2 v2.1.5/go.mod h1:xkjYEgQ05RSpWdfSd1nM3OVv7TBhLdy7rMp3+2Nq+yE= github.com/anacrolix/chansync v0.4.1-0.20240627045151-1aa1ac392fe8 h1:eyb0bBaQKMOh5Se/Qg54shijc8K4zpQiOjEhKFADkQM= github.com/anacrolix/chansync v0.4.1-0.20240627045151-1aa1ac392fe8/go.mod h1:DZsatdsdXxD0WiwcGl0nJVwyjCKMDv+knl1q2iBjA2k= github.com/anacrolix/confluence v1.15.0 h1:4BcfG2ZqLSSsShbDgwhC/ynW2ulkg0PebPuHe97Rqi4= @@ -265,8 +267,8 @@ github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c h1:mcz27xtA github.com/getlantern/filepersist v0.0.0-20210901195658-ed29a1cb0b7c/go.mod h1:8DGAx0LNUfXNnEH+fXI0s3OCBA/351kZCiz/8YSK3i8= github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede h1:yrU6Px3ZkvCsDLPryPGi6FN+2iqFPq+JeCb7EFoDBhw= github.com/getlantern/framed v0.0.0-20190601192238-ceb6431eeede/go.mod h1:nhnoiS6DE6zfe+BaCMU4YI01UpsuiXnDqM5S8jxHuuI= -github.com/getlantern/fronted v0.0.0-20241203140224-a556be12abc5 h1:MlTHPl2m/uP6NtEwdXaOAvjHgWwFYBdFDr9JxGrNKz0= -github.com/getlantern/fronted v0.0.0-20241203140224-a556be12abc5/go.mod h1:WagRGK4MYeETU3eSuI7JFj1EihkAhbxRxWYUoUGTM5c= +github.com/getlantern/fronted v0.0.0-20241206211020-da8e3e9f49fd h1:eChZridlH747nYchEMeSzhBEUt2YKa4QtRiVqkF+ro0= +github.com/getlantern/fronted v0.0.0-20241206211020-da8e3e9f49fd/go.mod h1:462pmX7a/aKl9RGC0dT8z/K19c7l1eWeAoOYEwUjg2s= github.com/getlantern/geo v0.0.0-20241129152027-2fc88c10f91e h1:vpikNz6IzvEoqVYmiK5Uq+lE4TCzvMDqbZdxFbtGK1g= github.com/getlantern/geo v0.0.0-20241129152027-2fc88c10f91e/go.mod h1:RjQ0krF8NTCc5xo2Q1995/vZBnYg33h8svn15do7dLg= github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 h1:RBKofGGMt2k6eGBwX8mky9qunjL+KnAp9JdzXjiRkRw= @@ -1101,8 +1103,8 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/issue/issue.go b/issue/issue.go index 3d737987f..591d5f5e0 100644 --- a/issue/issue.go +++ b/issue/issue.go @@ -7,23 +7,18 @@ import ( "strconv" "time" - proto "github.com/golang/protobuf/proto" - "github.com/getlantern/flashlight/v7/common" "github.com/getlantern/flashlight/v7/geolookup" "github.com/getlantern/flashlight/v7/logging" "github.com/getlantern/flashlight/v7/proxied" "github.com/getlantern/flashlight/v7/util" "github.com/getlantern/golog" + "google.golang.org/protobuf/proto" ) var ( log = golog.LoggerFor("flashlight.issue") maxLogSize = 10247680 - - client = &http.Client{ - Transport: proxied.Fronted("issue_fronted_roundtrip", 0), - } ) const ( @@ -78,7 +73,11 @@ func sendReport( device string, model string, osVersion string, - attachments []*Attachment) error { + attachments []*Attachment, +) error { + httpClient := &http.Client{ + Transport: proxied.Fronted("issue_fronted_roundtrip"), + } r := &Request{} r.Type = Request_ISSUE_TYPE(issueType) @@ -137,7 +136,7 @@ func sendReport( } req.Header.Set("content-type", "application/x-protobuf") - resp, err := client.Do(req) + resp, err := httpClient.Do(req) if err != nil { return log.Errorf("unable to send issue report: %v", err) } diff --git a/issue/issue_test.go b/issue/issue_test.go index fb5d7bbfd..bf09166c5 100644 --- a/issue/issue_test.go +++ b/issue/issue_test.go @@ -9,26 +9,32 @@ import ( "gopkg.in/yaml.v2" "github.com/getlantern/fronted" + tls "github.com/refraction-networking/utls" "github.com/getlantern/flashlight/v7/config" "github.com/getlantern/flashlight/v7/geolookup" + "github.com/getlantern/flashlight/v7/proxied" ) func TestMain(m *testing.M) { - tempConfigDir, err := os.MkdirTemp("", "issue_test") - if err != nil { - log.Errorf("Unable to create temp config dir: %v", err) - os.Exit(1) - } - defer os.RemoveAll(tempConfigDir) + fronted := newFronted() + proxied.SetFronted(fronted) + + //log.Debug(cfg.Client.FrontedProviders()) + //fronted.Configure(certs, cfg.Client.FrontedProviders(), config.DefaultFrontedProviderID, filepath.Join(tempConfigDir, "masquerade_cache")) + + geolookup.GetCountry(1 * time.Minute) + os.Exit(m.Run()) +} + +func newFronted() fronted.Fronted { // Init domain-fronting global, err := os.ReadFile("../embeddedconfig/global.yaml") if err != nil { log.Errorf("Unable to load embedded global config: %v", err) os.Exit(1) } - cfg := config.NewGlobal() err = yaml.Unmarshal(global, cfg) if err != nil { @@ -41,14 +47,23 @@ func TestMain(m *testing.M) { log.Errorf("Unable to read trusted certs: %v", err) } - log.Debug(cfg.Client.FrontedProviders()) - fronted.Configure(certs, cfg.Client.FrontedProviders(), config.DefaultFrontedProviderID, filepath.Join(tempConfigDir, "masquerade_cache")) - - geolookup.GetCountry(1 * time.Minute) - os.Exit(m.Run()) + tempConfigDir, err := os.MkdirTemp("", "issue_test") + if err != nil { + log.Errorf("Unable to create temp config dir: %v", err) + os.Exit(1) + } + defer os.RemoveAll(tempConfigDir) + fronted, err := fronted.NewFronted(filepath.Join(tempConfigDir, "masquerade_cache"), tls.HelloChrome_100, config.DefaultFrontedProviderID) + if err != nil { + log.Errorf("Unable to configure fronted: %v", err) + } + fronted.UpdateConfig(certs, cfg.Client.FrontedProviders()) + return fronted } func TestSendReport(t *testing.T) { + fronted := newFronted() + proxied.SetFronted(fronted) err := sendReport( "34qsdf-24qsadf-32542q", "1", @@ -67,7 +82,8 @@ func TestSendReport(t *testing.T) { Name: "Hello.txt", Data: []byte("Hello World"), }, - }) + }, + ) if err != nil { t.Errorf("SendReport() error = %v", err) } diff --git a/kcptun/proxies.yaml b/kcptun/proxies.yaml deleted file mode 100644 index f57e5f40a..000000000 --- a/kcptun/proxies.yaml +++ /dev/null @@ -1,56 +0,0 @@ -fp-sbtk1a-20171007-010-kcp: - addr: 47.74.17.196:443 - authtoken: WZPakrXQO1czszu2c5Ih5Nt1gN6u81bvHR71pKU7R0zx9C0uaVz18gjPJ5iLKTw2 - kcpsettings: - iat-mode: 0 - remoteaddr: 47.74.17.196:7123 - mode: fast2 - conn: 1 - keepalive: 10 - interval: 50 - parityshard: 3 - datashard: 10 - rcvwnd: 512 - sndwnd: 128 - mtu: 1350 - scavengettl: 600 - crypt: "salsa20" - key: "thisisreallyakey" - sockbuf: 4194304 - snmpperiod: 60 -fp-doams3-20170626-007: - addr: 188.166.32.81:6766 - cert: "-----BEGIN CERTIFICATE-----\nMIIDtDCCApygAwIBAgIEYAi66TANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEDAOBgNVBAcTB01vb3Jpc2gxHjAcBgNV\nBAoTFUdyYWRhdGlvbiBPdmVyc3RhdGluZzERMA8GA1UECxMIR2FyZGVuZXIxGDAW\nBgNVBAMTD0J1cm5vb3NlIEVmZm9ydDAeFw0xNzA0MTkxNjIxMTZaFw0xOTA0MTkx\nNjIxMTZaMIGBMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEQMA4G\nA1UEBxMHTW9vcmlzaDEeMBwGA1UEChMVR3JhZGF0aW9uIE92ZXJzdGF0aW5nMREw\nDwYDVQQLEwhHYXJkZW5lcjEYMBYGA1UEAxMPQnVybm9vc2UgRWZmb3J0MIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiXRSMM6f8UfkU7PO0007qlAl+L18\neuaJ3f4owLQ0LgvVavmq/rdsWgngmF2+wxe9mEFXVwoNqOgTxwkcV0YRR0VxG4tT\n0Q8vc9Q7oINalF2c0Rtc2PkjIGtdkq6WlQ+C9ThdH6ALF2LpMwr6GT9QESLskFbb\n5GcqlxotrM5NQstxdH0u3ryPwo9fOCfA3v4AlamHRPLh104jyDwSsU/rzfSv3UYC\n0Ctm59H1kEtLZNSZQmj3BWR08+Yd3JFqfAOj5rWdhJPmaya7Sjn2MBEMiRY1vhOR\n2fHqHPBvva6+GGKai4HBhZaS8zAVIf0WUqMoniVBzr+G+T8nVVVBTbDLyQIDAQAB\nozIwMDAPBgNVHREECDAGhwS8piBRMB0GA1UdDgQWBBStdTSPwQEdI4ituR9+KF53\n2wbTUDANBgkqhkiG9w0BAQsFAAOCAQEAgRC2DRrtAbUz1rHoScBUnIKQzuWvnRvz\niEOkZHmNrT588TFCc+90FCOjo+yTvsOnW2SU6bPMgpUMNELcqSBCqXb1k/mKTN88\nias1VeYK8WM80D7MA2GB1+oyf0evJuw4/b3o5XkiZkep6qhrN2cqOXPpNti4Tnug\nsXX1nZLx0qQdgDCpQQT8NGTMRswID8qgL9R9r7ixi9UqplY86fxzc8KUkLP6bOhB\nXrOn2sLx7fkQ0drZpdHvUrnXL7sads3NuWwIInyizUkVPRLkKf+p47XDxPMSl2Td\nKQKA0nBcOgUyoBnQocXH7auYjvzxquHvJ+MW2bMoa7meufxG22yQ6Q==\n-----END - CERTIFICATE-----" - authtoken: QTB6IsoF4uOTZSHynpzL618caUSFFL1diKV9k5Fa4VQful2ZMNwYe45JoZJrUBeH - trusted: true - pluggabletransport: "" - pluggabletransportsettings: {} - kcpsettings: {} -fp-doblr1-20170624-010: - addr: 139.59.41.243:443 - cert: "-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIEVSJ9wDANBgkqhkiG9w0BAQsFADBVMQswCQYDVQQGEwJV\nUzETMBEGA1UECBMKV2FzaGluZ3RvbjEYMBYGA1UEBxMPQnVudCBSaGFwc29kaXpl\nMRcwFQYDVQQDEw5Ub2lsaW5nIFdhcm1lcjAeFw0xNzA0MjQxNzM5MzlaFw0xODA0\nMjQxNzM5MzlaMFUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRgw\nFgYDVQQHEw9CdW50IFJoYXBzb2RpemUxFzAVBgNVBAMTDlRvaWxpbmcgV2FybWVy\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0uWBvQ0dH2DbPrRHXheH\nQ+j5Gjlj0dRtJLE2B5wRcbbgq4iwHZccjEgvIA+N47Y4F0c/TNgDO5RY2T5RqKU7\np2HpuNyXUVZTpoIPw1haeIFd8rvUtjo6CXGNbW3ZWnvTw7sRZRsyt10ZD8dVDk6i\nQN+KGvrqwltbkKwlnJdDBJ0dR3ToQLYvEts/DiGKgtX9kLG1w3lS2QAh+9G6gDeQ\njhK//D7Quioiv4tJ9RUuvhf8WO2Sth6b8zXy5u0NrWvrbZSyf/Z/ozSLufk7TkOt\nttlottLBXAp1mOP2+3qAZnNCSW/kYKyG3kw4FeNw0i8vhvRDsuC2aXAFF+FmKKvs\nQQIDAQABozIwMDAPBgNVHREECDAGhwSLOynzMB0GA1UdDgQWBBT3DIPZDhIEcjOK\nv6ZjWJ/k4HYRiDANBgkqhkiG9w0BAQsFAAOCAQEAX1QJ7FpOdGyssEZVTYVNUNK2\necIoXN4Kehrs3lE0+5I2Mf/pDMsMuFLbQK8qa12jkzZnciWghlUb/r2LMMwgGV9o\nCDULlFEtwGAeUnKgzYvwbV4abvnb1Svots//jmGShFDPnM2g7hWPt82UuENuPk1a\nYf+LdJHLijTg1UHQ6SeM3WV1hkzbFOG/lbobm/aaqxURmiM01QtuGBx4LfIi6QcZ\n6MCCxpfaozSTH4787tsqjcdA2aioymG0xM6MAaaO/xgm8CHpATUtYPnRwfZTTvTc\nc3Ew+sUf5J3BExplcvIJZrFD5+atooh92OYuyor8MHiLc6fHBtDXAprZRkuR/w==\n-----END - CERTIFICATE-----" - authtoken: wTWfRZdBZjnD006hgj2s6ipClB8SssV41GHU0vXDpdiPhLZ1SaUV4gx75amLmppX - trusted: true - pluggabletransport: "" - pluggabletransportsettings: {} - kcpsettings: {} -fp-donyc3-20170621-001-lampshade: - addr: 104.131.186.35:443 - cert: "-----BEGIN CERTIFICATE-----\nMIIDZDCCAkygAwIBAgIED3KvKzANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJV\nUzERMA8GA1UECBMITmV3IFlvcmsxEzARBgNVBAcTClByaXZhdGl6ZXMxIzAhBgNV\nBAMTGkVwc29uIERpc2luaGVyaXRpbmcgQmV0b29rMB4XDTE3MDcwNzA3NDIzMloX\nDTE5MDcwNzA3NDIzMlowWjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3Jr\nMRMwEQYDVQQHEwpQcml2YXRpemVzMSMwIQYDVQQDExpFcHNvbiBEaXNpbmhlcml0\naW5nIEJldG9vazCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK7ffJwO\nnMYM3MmvGQZj5/bKG6S0MUr56dzz/I+Yt8WMhxa8dYKYr2jIhlE9knpySOB9Vm67\naKtLwbovDsYkCLCDcURFL7XOmlbzao7HKy8ynAoXHHBTwFWhr2oGfoZBR3wi0eS6\nr8KyAbtvrEr4tG6ADpDr6X9eZjSPZSoQWPoagZExoFoS9RzvddyEy+713inICPxS\nuqdi3Q8npqRnFFjSyMsKQxJxu6/AxCE4lsAeNfrHQmWQOlVZriai2020VxSjeSZ3\naOYOmxcItz891s2MtTE6D41s0UMOiOfn9WhnVWH/RI1pazt1h7QgHJesDne3uaXV\ntmnniS6WgBh702cCAwEAAaMyMDAwDwYDVR0RBAgwBocEaIO6IzAdBgNVHQ4EFgQU\nwxhTGip6QANZzTMz28M6RM5hvlswDQYJKoZIhvcNAQELBQADggEBADGvbdXFjbM2\nmwXF4ggsu1IxOzl10n960vaSjFtAERYwdRphHXfNay71LR2hVFTMzEVt1YyVvZfW\nV+WgZuDLKMDQGNcwsFUriWLG9wtylSqmrVXISKaJloDTP/pS4PR8klE7QZWl7e2u\nC1aWgIdsPFfRab/HEECxKRTtcTOArE500LN6QXdP0EHJQdRbNEFRvM+IuWYC9tuP\nuHvd+N8hLwztYgCZV13DIUVN2iIM9z32Ud9YAUfvtNjznECDGIu2hAcWe+AJbC07\nbrmbD+cJf+0WGUOIdc+c1I96z7Rw1gZpUSauYlXNXje+FIcB2J6a6rwMUXBmV9s9\nxNCEZ2OXLgo=\n-----END - CERTIFICATE-----" - authtoken: ZB3jmoObz1QKoaHnMoHMVzYB42lqNnKoY12u90JeCU957xY0VZA83Q7AZEwIC9mP - trusted: true - pluggabletransport: lampshade - pluggabletransportsettings: {} - kcpsettings: {} -fp-sbtk1a-20171005-101-lampshade: - addr: 47.74.2.134:23415 - cert: "-----BEGIN CERTIFICATE-----\nMIIDbDCCAlSgAwIBAgIEFVAB5TANBgkqhkiG9w0BAQsFADBeMQswCQYDVQQGEwJV\nUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNVXBwZXJjbGFzc21hbjEi\nMCAGA1UEAxMZRHJhZ29ucyBNdXNlIEx5ZSBTeW1wb3NpYTAeFw0xNzA5MDEwNDUx\nMzdaFw0xODA5MDEwNDUxMzdaMF4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp\nZm9ybmlhMRYwFAYDVQQHEw1VcHBlcmNsYXNzbWFuMSIwIAYDVQQDExlEcmFnb25z\nIE11c2UgTHllIFN5bXBvc2lhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAtblTrqgWOptfJcA0Y1r0O6FAb29AvZLy4xCOM+LRF+1/l9+xD0kWlUlbZpTV\nBJ/uIYqb2iFlHsMydO9zgsajK1zes6T3BhZS0eBtWdrne2p10U0dDyWmXuM6+Vmd\nfym5iVpBXj4gOICPmY59+6lXGWKxzp/29EIscAv350l1Ehmh84XYo97cZq5AoiER\nWRW7T61R9a2BSUIsmNoJ6nL8qPNYpj/4Pg537v0dZ3ZpDZu6/nSyzjgWu6w7kdwh\no1ctBz9kJ758RXHLv8SmyuYloGz1IJh53ZQlo97CzMjvHaM5/qFggHhEuXeZ+8ew\n935qy6uBMPotOmz7S9rvG5d/CQIDAQABozIwMDAPBgNVHREECDAGhwQvSgKGMB0G\nA1UdDgQWBBShrT0x8bKdCoeC7wY/j47mEMoh4jANBgkqhkiG9w0BAQsFAAOCAQEA\nXODtV28oChatsQYwRqyaBtmzhYK8jf++wDA1lyOQobVPLYG3cRfd1Bmyb+qAXfvS\nXZdiJWkrfGUdS2NRZlqfg/HMMd288o9BFJlcqXDf4I1On3YhdE9Kauzj2bEhRN5W\nxh1FiUtI3+ocQ8+L2LwtjONi+nWug9G5BJ6gh9md6PogyIeMee+FanK9SSZPMbEP\nRSK2deG+kbG3/b2FvkLQ51nU/qgN9uX4JcyJ/MtmGqBcczTlpVxpV4IDhZgittQJ\n0yiaoG0xyeXwcpK9rNZ2cQWiL9H2+8tAxvGBs9iKTyYnU2T6jlSbszSVFeXaAMy+\noFDGQMArFR18vQhQb2bjAQ==\n-----END - CERTIFICATE-----" - authtoken: Mbm7B7kXz9ZH7WzmMMDA90bAGHhV8VjT86iIXBy0iizT04W7HwNagLyptNFRiMIq - trusted: true - pluggabletransport: lampshade - pluggabletransportsettings: {} - kcpsettings: {} diff --git a/pro/http.go b/pro/http.go deleted file mode 100644 index ce765cd5b..000000000 --- a/pro/http.go +++ /dev/null @@ -1,29 +0,0 @@ -package pro - -import ( - "net/http" - "time" - - "github.com/getlantern/flashlight/v7/proxied" -) - -var ( - httpClient = getHTTPClient(proxied.ParallelForIdempotent()) -) - -// GetHTTPClient creates a new http.Client that uses domain fronting and direct -// proxies. -func GetHTTPClient() *http.Client { - return httpClient -} - -func getHTTPClient(rt http.RoundTripper) *http.Client { - return &http.Client{ - Transport: rt, - // Don't follow redirects - CheckRedirect: func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse - }, - Timeout: 30 * time.Second, - } -} diff --git a/pro/migrate.go b/pro/migrate.go deleted file mode 100644 index 2777ffca0..000000000 --- a/pro/migrate.go +++ /dev/null @@ -1,18 +0,0 @@ -package pro - -import ( - "net/http" - - "github.com/getlantern/flashlight/v7/common" - "github.com/getlantern/flashlight/v7/pro/client" -) - -// MigrateDeviceID migrates the user's device ID from the old to the new scheme (only relevant to desktop builds) -func MigrateDeviceID(uc common.UserConfig, oldDeviceID string) error { - return migrateDeviceIDWithClient(uc, oldDeviceID, httpClient) -} - -func migrateDeviceIDWithClient(uc common.UserConfig, oldDeviceID string, hc *http.Client) error { - logger.Debugf("Migrating deviceID from %v to %v", oldDeviceID, uc.GetDeviceID()) - return client.NewClient(hc, PrepareProRequestWithOptions).MigrateDeviceID(uc, oldDeviceID) -} diff --git a/pro/proxy.go b/pro/proxy.go index 17f337696..76196a15a 100644 --- a/pro/proxy.go +++ b/pro/proxy.go @@ -5,14 +5,15 @@ import ( "compress/gzip" "encoding/json" "io" - "io/ioutil" "net/http" "net/http/httputil" "strconv" "strings" + "time" "github.com/getlantern/flashlight/v7/common" "github.com/getlantern/flashlight/v7/pro/client" + "github.com/getlantern/flashlight/v7/proxied" "github.com/getlantern/golog" ) @@ -20,10 +21,17 @@ var ( log = golog.LoggerFor("flashlight.pro") ) -type proxyTransport struct { - // Satisfies http.RoundTripper +var HTTPClient = &http.Client{ + Transport: proxied.ParallelForIdempotent(), + // Don't follow redirects + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + Timeout: 30 * time.Second, } +type proxyTransport struct{} + func (pt *proxyTransport) processOptions(req *http.Request) *http.Response { resp := &http.Response{ StatusCode: http.StatusOK, @@ -31,7 +39,7 @@ func (pt *proxyTransport) processOptions(req *http.Request) *http.Response { "Connection": {"keep-alive"}, "Via": {"Lantern Client"}, }, - Body: ioutil.NopCloser(strings.NewReader("preflight complete")), + Body: io.NopCloser(strings.NewReader("preflight complete")), } if !common.ProcessCORS(resp.Header, req) { return &http.Response{ @@ -49,7 +57,7 @@ func (pt *proxyTransport) RoundTrip(req *http.Request) (resp *http.Response, err origin := req.Header.Get("Origin") // Workaround for https://github.com/getlantern/pro-server/issues/192 req.Header.Del("Origin") - resp, err = GetHTTPClient().Do(req) + resp, err = HTTPClient.Do(req) if err != nil { log.Errorf("Could not issue HTTP request? %v", err) return @@ -72,12 +80,12 @@ func (pt *proxyTransport) RoundTrip(req *http.Request) (resp *http.Response, err log.Errorf("User ID %s is invalid", _userID) return } - body, readErr := ioutil.ReadAll(resp.Body) + body, readErr := io.ReadAll(resp.Body) if readErr != nil { log.Errorf("Error read response body: %v", readErr) return } - resp.Body = ioutil.NopCloser(bytes.NewReader(body)) + resp.Body = io.NopCloser(bytes.NewReader(body)) encoding := resp.Header.Get("Content-Encoding") var br io.Reader = bytes.NewReader(body) switch encoding { diff --git a/pro/proxy_test.go b/pro/proxy_test.go index 0b628624d..a592c7613 100644 --- a/pro/proxy_test.go +++ b/pro/proxy_test.go @@ -22,7 +22,7 @@ import ( func TestProxy(t *testing.T) { uc := common.NewUserConfigData(common.DefaultAppName, "device", 0, "token", nil, "en-US") m := &testutils.MockRoundTripper{Header: http.Header{}, Body: strings.NewReader("GOOD")} - httpClient = &http.Client{Transport: m} + HTTPClient = &http.Client{Transport: m} l, err := net.Listen("tcp", "localhost:0") if !assert.NoError(t, err) { return diff --git a/pro/user_data.go b/pro/user_data.go index 3d907f4e0..5065102e1 100644 --- a/pro/user_data.go +++ b/pro/user_data.go @@ -82,7 +82,7 @@ func IsProUser(uc common.UserConfig) (isPro bool, statusKnown bool) { user, found := GetUserDataFast(uc.GetUserID()) if !found { var err error - user, err = fetchUserDataWithClient(uc, httpClient) + user, err = fetchUserDataWithClient(uc, HTTPClient) if err != nil { logger.Debugf("Got error fetching pro user: %v", err) return false, false @@ -113,12 +113,12 @@ func GetUserDataFast(userID int64) (*client.User, bool) { // NewUser creates a new user via Pro API, and updates local cache. func NewUser(uc common.UserConfig) (*client.User, error) { - return newUserWithClient(uc, httpClient) + return newUserWithClient(uc, HTTPClient) } // NewClient creates a new pro Client func NewClient() *client.Client { - return client.NewClient(httpClient, PrepareProRequestWithOptions) + return client.NewClient(HTTPClient, PrepareProRequestWithOptions) } // newUserWithClient creates a new user via Pro API, and updates local cache @@ -140,7 +140,7 @@ func newUserWithClient(uc common.UserConfig, hc *http.Client) (*client.User, err // FetchUserData fetches user data from Pro API, and updates local cache. func FetchUserData(uc common.UserConfig) (*client.User, error) { - return fetchUserDataWithClient(uc, httpClient) + return fetchUserDataWithClient(uc, HTTPClient) } func fetchUserDataWithClient(uc common.UserConfig, hc *http.Client) (*client.User, error) { diff --git a/proxied/fronted.go b/proxied/fronted.go index f1770d4d5..9ae2fa99f 100644 --- a/proxied/fronted.go +++ b/proxied/fronted.go @@ -2,29 +2,20 @@ package proxied import ( "net/http" - "time" - "github.com/getlantern/errors" "github.com/getlantern/flashlight/v7/ops" - "github.com/getlantern/fronted" ) -const DefaultMasqueradeTimeout = 5 * time.Minute - // Fronted creates an http.RoundTripper that proxies request using domain // fronting. -// -// Leave masqueradeTimeout as 0 to use a default value. -func Fronted(opName string, masqueradeTimeout time.Duration) http.RoundTripper { - if masqueradeTimeout == 0 { - masqueradeTimeout = DefaultMasqueradeTimeout +func Fronted(opName string) http.RoundTripper { + return frontedRoundTripper{ + opName: opName, } - return frontedRoundTripper{masqueradeTimeout: masqueradeTimeout, opName: opName} } type frontedRoundTripper struct { - masqueradeTimeout time.Duration - opName string + opName string } // Use a wrapper for fronted.NewDirect to avoid blocking @@ -35,10 +26,5 @@ func (f frontedRoundTripper) RoundTrip(req *http.Request) (*http.Response, error op := ops.Begin(f.opName) defer op.End() } - rt, ok := fronted.NewFronted(f.masqueradeTimeout) - if !ok { - return nil, errors.New("Unable to obtain direct fronter") - } - changeUserAgent(req) - return rt.RoundTrip(req) + return fronter.RoundTrip(req) } diff --git a/proxied/proxied.go b/proxied/proxied.go index dc247e613..51e3c200a 100644 --- a/proxied/proxied.go +++ b/proxied/proxied.go @@ -6,10 +6,9 @@ package proxied import ( "bytes" - "context" "crypto/tls" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httputil" "net/url" @@ -23,6 +22,7 @@ import ( "github.com/getlantern/errors" "github.com/getlantern/eventual" + "github.com/getlantern/fronted" "github.com/getlantern/golog" "github.com/getlantern/keyman" "github.com/getlantern/netx" @@ -47,8 +47,19 @@ var ( // Shared client session cache for all connections clientSessionCache = tls.NewLRUClientSessionCache(1000) + + fronter fronted.Fronted + fronterMu sync.RWMutex ) +// SetFronted sets the fronted.Fronted to use for domain fronting. This is a bit hacky but otherwise would +// require a significant refactor of the proxied package. +func SetFronted(f fronted.Fronted) { + fronterMu.Lock() + fronter = f + fronterMu.Unlock() +} + func success(resp *http.Response) bool { return (resp.StatusCode > 199 && resp.StatusCode < 400) || resp.StatusCode == http.StatusUpgradeRequired } @@ -81,29 +92,19 @@ func getProxyAddr() (string, bool) { return addr.(string), true } -// RoundTripper implements http.RoundTripper and allows configuration of the -// masquerade timeout. -type RoundTripper interface { - http.RoundTripper - - // SetMasqueradeTimeout specifies how long we're willing to wait for a valid - // fronting masquerade before failing. - SetMasqueradeTimeout(time.Duration) -} - // ParallelPreferChained creates a new http.RoundTripper that attempts to send // requests through both chained and direct fronted routes in parallel. Once a // chained request succeeds, subsequent requests will only go through Chained // servers unless and until a request fails, in which case we'll start trying // fronted requests again. -func ParallelPreferChained() RoundTripper { +func ParallelPreferChained() http.RoundTripper { return dual(true, "") } // ChainedThenFronted creates a new http.RoundTripper that attempts to send // requests first through a chained server and then falls back to using a // direct fronted server if the chained route didn't work. -func ChainedThenFronted() RoundTripper { +func ChainedThenFronted() http.RoundTripper { return dual(false, "") } @@ -112,14 +113,14 @@ func ChainedThenFronted() RoundTripper { // Once a chained request succeeds, subsequent requests will only go through // Chained servers unless and until a request fails, in which case we'll start // trying fronted requests again. -func ParallelPreferChainedWith(rootCA string) RoundTripper { +func ParallelPreferChainedWith(rootCA string) http.RoundTripper { return dual(true, rootCA) } // ChainedThenFrontedWith creates a new http.RoundTripper that attempts to send // requests first through a chained server and then falls back to using a // direct fronted server if the chained route didn't work. -func ChainedThenFrontedWith(rootCA string) RoundTripper { +func ChainedThenFrontedWith(rootCA string) http.RoundTripper { return dual(false, rootCA) } @@ -139,32 +140,29 @@ func ParallelForIdempotent() http.RoundTripper { // dual creates a new http.RoundTripper that attempts to send // requests to both chained and fronted servers either in parallel or not. -func dual(parallel bool, rootCA string) RoundTripper { +func dual(parallel bool, rootCA string) http.RoundTripper { cf := &chainedAndFronted{ - parallel: parallel, - masqueradeTimeout: DefaultMasqueradeTimeout, - rootCA: rootCA, + parallel: parallel, + rootCA: rootCA, } cf.setFetcher(newDualFetcher(cf)) return cf } func newDualFetcher(cf *chainedAndFronted) http.RoundTripper { - return newDualFetcherWithTimeout(cf, cf.getMasqueradeTimeout()) -} - -func newDualFetcherWithTimeout(cf *chainedAndFronted, masqueradeTimeout time.Duration) http.RoundTripper { - return &dualFetcher{cf: cf, rootCA: cf.rootCA, masqueradeTimeout: masqueradeTimeout} + return &dualFetcher{ + cf: cf, + rootCA: cf.rootCA, + } } // chainedAndFronted fetches HTTP data in parallel using both chained and fronted // servers. type chainedAndFronted struct { - parallel bool - _fetcher http.RoundTripper - mu sync.RWMutex - rootCA string - masqueradeTimeout time.Duration + parallel bool + _fetcher http.RoundTripper + mu sync.RWMutex + rootCA string } func (cf *chainedAndFronted) getFetcher() http.RoundTripper { @@ -213,29 +211,13 @@ func (cf *chainedAndFronted) RoundTrip(req *http.Request) (*http.Response, error return resp, err } -func (cf *chainedAndFronted) SetMasqueradeTimeout(masqueradeTimeout time.Duration) { - cf.mu.Lock() - cf.masqueradeTimeout = masqueradeTimeout - _, isDual := cf._fetcher.(*dualFetcher) - if isDual { - cf._fetcher = newDualFetcherWithTimeout(cf, masqueradeTimeout) - } - cf.mu.Unlock() -} - -func (cf *chainedAndFronted) getMasqueradeTimeout() time.Duration { - cf.mu.RLock() - defer cf.mu.RUnlock() - return cf.masqueradeTimeout -} - type chainedRoundTripper struct { rootCA string } // RoundTrip will attempt to execute the specified HTTP request using only a chained fetcher func (cf *chainedRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - log.Debugf("Using chained fronter for request to: %#v", req.URL) + log.Debugf("Using chained fetcher") rt, err := ChainedNonPersistent(cf.rootCA) if err != nil { return nil, err @@ -244,9 +226,8 @@ func (cf *chainedRoundTripper) RoundTrip(req *http.Request) (*http.Response, err } type dualFetcher struct { - cf *chainedAndFronted - rootCA string - masqueradeTimeout time.Duration + cf *chainedAndFronted + rootCA string } // RoundTrip will attempt to execute the specified HTTP request using both @@ -264,7 +245,8 @@ func (df *dualFetcher) RoundTrip(req *http.Request) (*http.Response, error) { if err != nil { return nil, errors.Wrap(err).Op("DFCreateChainedClient") } - return df.do(req, directRT, frontedRoundTripper{masqueradeTimeout: df.masqueradeTimeout}) + frontedRT := Fronted("dual_fetcher_round_trip") + return df.do(req, directRT, frontedRT) } // do will attempt to execute the specified HTTP request using both @@ -328,7 +310,7 @@ func (df *dualFetcher) do(req *http.Request, chainedRT http.RoundTripper, ddfRT } doFronted := func() { op.ProxyType(ops.ProxyFronted) - log.Debugf("dualfetcher sending DDF request to %v. With body? %v", frontedReq.URL.String(), frontedReq.Body != nil) + log.Debugf("Sending DDF request. With body? %v", frontedReq.Body != nil) start := time.Now() if resp, err := request(!df.cf.parallel, ddfRT, frontedReq); err == nil { elapsed := time.Since(start) @@ -344,7 +326,7 @@ func (df *dualFetcher) do(req *http.Request, chainedRT http.RoundTripper, ddfRT doChained := func() { op.ProxyType(ops.ProxyChained) - log.Debugf("dualfetcher sending chained request to %v. With body? %v", req.URL.String(), req.Body != nil) + log.Debugf("Sending chained request. With body? %v", req.Body != nil) start := time.Now() if res, err := request(false, chainedRT, req); err == nil { elapsed := time.Since(start) @@ -441,10 +423,10 @@ func (cf *chainedAndFronted) cloneRequestForFronted(req *http.Request) (*http.Re if req.Body != nil { //Replicate the body. Attach a new copy to original request as body can //only be read once - buf, _ := ioutil.ReadAll(req.Body) + buf, _ := io.ReadAll(req.Body) _ = req.Body.Close() - req.Body = ioutil.NopCloser(bytes.NewReader(buf)) - frontedReq.Body = ioutil.NopCloser(bytes.NewReader(buf)) + req.Body = io.NopCloser(bytes.NewReader(buf)) + frontedReq.Body = io.NopCloser(bytes.NewReader(buf)) frontedReq.ContentLength = req.ContentLength } @@ -526,9 +508,7 @@ func chained(rootCA string, persistent bool) (http.RoundTripper, error) { // Cache TLS sessions for faster connection ClientSessionCache: clientSessionCache, }, - } - if persistent { - tr.IdleConnTimeout = 30 * time.Second + IdleConnTimeout: 30 * time.Second, } if rootCA != "" { @@ -540,21 +520,13 @@ func chained(rootCA string, persistent bool) (http.RoundTripper, error) { } tr.Proxy = func(req *http.Request) (*url.URL, error) { - log.Tracef("Using chained proxy for: %+v", req.URL) proxyAddr, ok := getProxyAddr() if !ok { - log.Errorf("Chained proxy unavailable") return nil, errors.New(ErrChainedProxyUnavailable) } return url.Parse("http://" + proxyAddr) } - tr.OnProxyConnectResponse = func(ctx context.Context, proxyURL *url.URL, connectReq *http.Request, connectRes *http.Response) error { - log.Tracef("Proxy connect request: %+v", connectReq) - log.Tracef("Proxy connect response: %+v", connectRes) - return nil - } - return AsRoundTripper(func(req *http.Request) (*http.Response, error) { changeUserAgent(req) op := ops.Begin("chained").ProxyType(ops.ProxyChained).Request(req) @@ -602,7 +574,7 @@ func DirectThenFrontedClient(timeout time.Duration) *http.Client { TLSHandshakeTimeout: timeout, ResponseHeaderTimeout: timeout, } - frt := &frontedRoundTripper{masqueradeTimeout: timeout} + frt := Fronted("direct_then_fronted") return &http.Client{ Timeout: timeout * 2, Transport: serialTransport{drt, frt}, @@ -618,7 +590,7 @@ func ChainedThenDirectThenFrontedClient(timeout time.Duration, rootCA string) *h TLSHandshakeTimeout: 10 * time.Second, ResponseHeaderTimeout: 30 * time.Second, } - frt := Fronted("", 10*time.Second) + frt := Fronted("chained_then_direct_then_fronted") return &http.Client{ Timeout: timeout * 2, Transport: serialTransport{chained, drt, frt}, diff --git a/proxied/proxied_test.go b/proxied/proxied_test.go index be77398b4..7c03e1794 100644 --- a/proxied/proxied_test.go +++ b/proxied/proxied_test.go @@ -3,23 +3,32 @@ package proxied import ( "bytes" "fmt" + "io" "io/ioutil" "net" "net/http" "net/http/httputil" + "os" + "path/filepath" "strings" "sync/atomic" "testing" "time" + tls "github.com/refraction-networking/utls" "github.com/vulcand/oxy/forward" + "gopkg.in/yaml.v2" "github.com/getlantern/eventual" "github.com/getlantern/fronted" "github.com/stretchr/testify/assert" + + flconfig "github.com/getlantern/flashlight/v7/config" ) +var fr = newFronted() + type mockChainedRT struct { req eventual.Value sc uint32 @@ -38,7 +47,7 @@ func (rt *mockChainedRT) RoundTrip(req *http.Request) (*http.Response, error) { return &http.Response{ Status: fmt.Sprintf("%d OK", rt.statusCode()), StatusCode: rt.statusCode(), - Body: ioutil.NopCloser(bytes.NewBufferString("Chained")), + Body: io.NopCloser(bytes.NewBufferString("Chained")), }, nil } @@ -51,7 +60,7 @@ func (rt *mockFrontedRT) RoundTrip(req *http.Request) (*http.Response, error) { return &http.Response{ Status: "200 OK", StatusCode: 200, - Body: ioutil.NopCloser(bytes.NewBufferString("Fronted")), + Body: io.NopCloser(bytes.NewBufferString("Fronted")), }, nil } @@ -68,6 +77,7 @@ func (rt *delayedRT) RoundTrip(req *http.Request) (*http.Response, error) { // TestChainedAndFrontedHeaders tests to make sure headers are correctly // copied to the fronted request from the original chained request. func TestChainedAndFrontedHeaders(t *testing.T) { + SetFronted(fr) directURL := "http://direct" req, err := http.NewRequest("GET", directURL, nil) if !assert.NoError(t, err) { @@ -78,9 +88,9 @@ func TestChainedAndFrontedHeaders(t *testing.T) { req.Header.Set("Cache-Control", "no-cache") etag := "473892jdfda" req.Header.Set("X-Lantern-If-None-Match", etag) - req.Body = ioutil.NopCloser(bytes.NewBufferString("Hello")) + req.Body = io.NopCloser(bytes.NewBufferString("Hello")) - df := &dualFetcher{&chainedAndFronted{parallel: true}, "", 5 * time.Minute} + df := &dualFetcher{&chainedAndFronted{parallel: true}, ""} crt := &mockChainedRT{req: eventual.NewValue(), sc: 503} frt := &mockFrontedRT{req: eventual.NewValue()} df.do(req, crt, frt) @@ -110,6 +120,7 @@ func checkRequest(t *testing.T, v eventual.Value, etag string, url string) { // TestNonIdempotentRequest tests to make sure ParallelPreferChained reject // non-idempotent requests. func TestNonIdempotentRequest(t *testing.T) { + SetFronted(fr) directURL := "http://direct" req, err := http.NewRequest("POST", directURL, nil) if !assert.NoError(t, err) { @@ -133,6 +144,7 @@ func TestChainedThenFronted(t *testing.T) { } func TestSwitchingToChained(t *testing.T) { + SetFronted(fr) chained := &mockChainedRT{req: eventual.NewValue(), sc: 503} fronted := &mockFrontedRT{req: eventual.NewValue()} req, _ := http.NewRequest("GET", "http://chained", nil) @@ -155,7 +167,8 @@ func TestSwitchingToChained(t *testing.T) { assert.True(t, valid, "should switch to chained fetcher") } -func doTestChainedAndFronted(t *testing.T, build func() RoundTripper) { +func doTestChainedAndFronted(t *testing.T, build func() http.RoundTripper) { + SetFronted(fr) fwd, _ := forward.New() sleep := 0 * time.Second @@ -179,7 +192,7 @@ func doTestChainedAndFronted(t *testing.T, build func() RoundTripper) { SetProxyAddr(eventual.DefaultGetter(l.Addr().String())) - fronted.ConfigureForTest(t) + SetFronted(fronted.ConfigureForTest(t)) geo := "http://d3u5fqukq7qrhd.cloudfront.net/lookup/198.199.72.101" req, err := http.NewRequest("GET", geo, nil) @@ -188,7 +201,7 @@ func doTestChainedAndFronted(t *testing.T, build func() RoundTripper) { cf := build() resp, err := cf.RoundTrip(req) assert.NoError(t, err) - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) assert.NoError(t, err) //log.Debugf("Got body: %v", string(body)) assert.True(t, strings.Contains(string(body), "United States"), "Unexpected response ") @@ -200,7 +213,7 @@ func doTestChainedAndFronted(t *testing.T, build func() RoundTripper) { // resolve and make sure even the delayed req server still gives us the result goodhost := "d3u5fqukq7qrhd.cloudfront.net" badhost := "48290.cloudfront.net" - fronted.ConfigureHostAlaisesForTest(t, map[string]string{goodhost: badhost}) + SetFronted(fronted.ConfigureHostAlaisesForTest(t, map[string]string{goodhost: badhost})) req, err = http.NewRequest("GET", geo, nil) @@ -208,25 +221,25 @@ func doTestChainedAndFronted(t *testing.T, build func() RoundTripper) { cf = build() resp, err = cf.RoundTrip(req) assert.NoError(t, err) - //log.Debugf("Got response in test") - body, err = ioutil.ReadAll(resp.Body) + log.Debugf("Got response in test") + body, err = io.ReadAll(resp.Body) assert.NoError(t, err) assert.True(t, strings.Contains(string(body), "United States"), "Unexpected response ") _ = resp.Body.Close() // Now give the bad url to the req server and make sure we still get the corret // result from the fronted server. - //log.Debugf("Running test with bad URL in the req server") + log.Debugf("Running test with bad URL in the req server") bad := "http://48290.cloudfront.net/lookup/198.199.72.101" req, err = http.NewRequest("GET", bad, nil) - fronted.ConfigureHostAlaisesForTest(t, map[string]string{badhost: goodhost}) + SetFronted(fronted.ConfigureHostAlaisesForTest(t, map[string]string{badhost: goodhost})) assert.NoError(t, err) cf = build() resp, err = cf.RoundTrip(req) if assert.NoError(t, err) { if assert.Equal(t, 200, resp.StatusCode) { - body, err = ioutil.ReadAll(resp.Body) + body, err = io.ReadAll(resp.Body) if assert.NoError(t, err) { assert.True(t, strings.Contains(string(body), "United States"), "Unexpected response "+string(body)) } @@ -270,6 +283,39 @@ func TestCloneRequestForFronted(t *testing.T) { assert.Equal(t, "chained.com", r.URL.Host) assert.Equal(t, "/path1", r.URL.Path) assert.Equal(t, req.ContentLength, r.ContentLength) - b, _ := ioutil.ReadAll(r.Body) + b, _ := io.ReadAll(r.Body) assert.Equal(t, "abc", string(b), "should have body") } + +func newFronted() fronted.Fronted { + // Init domain-fronting + global, err := os.ReadFile("../embeddedconfig/global.yaml") + if err != nil { + log.Errorf("Unable to load embedded global config: %v", err) + os.Exit(1) + } + cfg := flconfig.NewGlobal() + err = yaml.Unmarshal(global, cfg) + if err != nil { + log.Errorf("Unable to unmarshal embedded global config: %v", err) + os.Exit(1) + } + + certs, err := cfg.TrustedCACerts() + if err != nil { + log.Errorf("Unable to read trusted certs: %v", err) + } + + tempConfigDir, err := os.MkdirTemp("", "proxied_test") + if err != nil { + log.Errorf("Unable to create temp config dir: %v", err) + os.Exit(1) + } + defer os.RemoveAll(tempConfigDir) + fronted, err := fronted.NewFronted(filepath.Join(tempConfigDir, "masquerade_cache"), tls.HelloChrome_100, flconfig.DefaultFrontedProviderID) + if err != nil { + log.Errorf("Unable to configure fronted: %v", err) + } + fronted.UpdateConfig(certs, cfg.Client.FrontedProviders()) + return fronted +} diff --git a/services/bypass.go b/services/bypass.go index 5165ea847..129d845a0 100644 --- a/services/bypass.go +++ b/services/bypass.go @@ -170,7 +170,7 @@ func (b *bypassService) newProxy(name string, pc *commonconfig.ProxyConfig, conf ProxyConfig: pc, name: name, proxyRoundTripper: newProxyRoundTripper(name, pc, userConfig, dialer), - dfRoundTripper: proxied.Fronted("bypass_fronted_roundtrip", 0), + dfRoundTripper: proxied.Fronted("bypass_fronted_roundtrip"), sender: &sender{}, toggle: atomic.NewBool(mrand.Float32() < 0.5), userConfig: userConfig, @@ -221,7 +221,7 @@ func newProxy( ProxyConfig: pc, name: name, proxyRoundTripper: newProxyRoundTripper(name, pc, userConfig, dialer), - dfRoundTripper: proxied.Fronted("bypass_fronted_roundtrip", 0), + dfRoundTripper: proxied.Fronted("bypass_fronted_roundtrip"), sender: &sender{}, toggle: atomic.NewBool(mrand.Float32() < 0.5), userConfig: userConfig, diff --git a/services/config.go b/services/config.go index 0dae9bc93..be47b2fee 100644 --- a/services/config.go +++ b/services/config.go @@ -2,6 +2,7 @@ package services import ( "bytes" + "context" "errors" "fmt" "io" @@ -176,8 +177,10 @@ func (cs *configService) fetch() (*apipb.ConfigResponse, int64, error) { resp *http.Response sleep int64 ) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel() for { - req, err := cs.newRequest() + req, err := cs.newRequest(ctx) if err != nil { return nil, 0, err } @@ -225,7 +228,7 @@ func (cs *configService) fetch() (*apipb.ConfigResponse, int64, error) { // newRequest returns a new ConfigRequest with the current client info, proxy ids, and the last // time the config was fetched. -func (cs *configService) newRequest() (*http.Request, error) { +func (cs *configService) newRequest(ctx context.Context) (*http.Request, error) { conf := cs.configHandler.GetConfig() proxies := []*apipb.ProxyConnectConfig{} if conf != nil { // not the first request @@ -233,8 +236,8 @@ func (cs *configService) newRequest() (*http.Request, error) { } names := make([]string, len(proxies)) - for _, proxy := range proxies { - names = append(names, proxy.Name) + for i, proxy := range proxies { + names[i] = proxy.Name } confReq := &apipb.ConfigRequest{ @@ -250,7 +253,7 @@ func (cs *configService) newRequest() (*http.Request, error) { return nil, fmt.Errorf("unable to marshal config request: %w", err) } - req, err := http.NewRequest(http.MethodPost, cs.opts.OriginURL, bytes.NewReader(buf)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, cs.opts.OriginURL, bytes.NewReader(buf)) if err != nil { return nil, fmt.Errorf("unable to create request") }