diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000..60880795 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,538 @@ +{ + "projectName": "flutter_inappwebview", + "projectOwner": "pichillilorenzo", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": true, + "commitConvention": "none", + "contributors": [ + { + "login": "AlexV525", + "name": "Alex Li", + "avatar_url": "https://avatars.githubusercontent.com/u/15884415?v=4", + "profile": "https://blog.alexv525.com/", + "contributions": [ + "code" + ] + }, + { + "login": "crazecoder", + "name": "1/2", + "avatar_url": "https://avatars.githubusercontent.com/u/18387906?v=4", + "profile": "https://github.com/crazecoder", + "contributions": [ + "code" + ] + }, + { + "login": "cbodin", + "name": "Christofer Bodin", + "avatar_url": "https://avatars.githubusercontent.com/u/220255?v=4", + "profile": "https://github.com/cbodin", + "contributions": [ + "code" + ] + }, + { + "login": "matthewlloyd", + "name": "Matthew Lloyd", + "avatar_url": "https://avatars.githubusercontent.com/u/2041996?v=4", + "profile": "https://github.com/matthewlloyd", + "contributions": [ + "code" + ] + }, + { + "login": "carloserazo47", + "name": "C E", + "avatar_url": "https://avatars.githubusercontent.com/u/83635384?v=4", + "profile": "https://github.com/carloserazo47", + "contributions": [ + "code" + ] + }, + { + "login": "robsonmeemo", + "name": "Robson Araujo", + "avatar_url": "https://avatars.githubusercontent.com/u/47990393?v=4", + "profile": "https://github.com/robsonmeemo", + "contributions": [ + "code" + ] + }, + { + "login": "ryanhz", + "name": "Ryan", + "avatar_url": "https://avatars.githubusercontent.com/u/1142612?v=4", + "profile": "https://github.com/ryanhz", + "contributions": [ + "code" + ] + }, + { + "login": "CodeEagle", + "name": "CodeEagle", + "avatar_url": "https://avatars.githubusercontent.com/u/2311352?v=4", + "profile": "https://codeeagle.github.io/", + "contributions": [ + "code" + ] + }, + { + "login": "tneotia", + "name": "Tanay Neotia", + "avatar_url": "https://avatars.githubusercontent.com/u/50850142?v=4", + "profile": "https://github.com/tneotia", + "contributions": [ + "code" + ] + }, + { + "login": "panndoraBoo", + "name": "Jamie Joost", + "avatar_url": "https://avatars.githubusercontent.com/u/8928207?v=4", + "profile": "https://github.com/panndoraBoo", + "contributions": [ + "code" + ] + }, + { + "login": "deandreamatias", + "name": "Matias de Andrea", + "avatar_url": "https://avatars.githubusercontent.com/u/21011641?v=4", + "profile": "https://deandreamatias.com/", + "contributions": [ + "code" + ] + }, + { + "login": "YouCii", + "name": "YouCii", + "avatar_url": "https://avatars.githubusercontent.com/u/17899073?v=4", + "profile": "https://blog.csdn.net/j550341130", + "contributions": [ + "code" + ] + }, + { + "login": "cutzmf", + "name": "Salnikov Sergey", + "avatar_url": "https://avatars.githubusercontent.com/u/1662033?v=4", + "profile": "https://github.com/cutzmf", + "contributions": [ + "code" + ] + }, + { + "login": "a00012025", + "name": "Po-Jui Chen", + "avatar_url": "https://avatars.githubusercontent.com/u/12824216?v=4", + "profile": "https://github.com/a00012025", + "contributions": [ + "code" + ] + }, + { + "login": "Manuito83", + "name": "Manuito", + "avatar_url": "https://avatars.githubusercontent.com/u/4816367?v=4", + "profile": "https://github.com/Manuito83", + "contributions": [ + "code" + ] + }, + { + "login": "setcy", + "name": "setcy", + "avatar_url": "https://avatars.githubusercontent.com/u/86180691?v=4", + "profile": "https://github.com/setcy", + "contributions": [ + "code" + ] + }, + { + "login": "EArminjon2", + "name": "EArminjon", + "avatar_url": "https://avatars.githubusercontent.com/u/92172436?v=4", + "profile": "https://github.com/EArminjon2", + "contributions": [ + "code" + ] + }, + { + "login": "ashank96", + "name": "Ashank Bharati", + "avatar_url": "https://avatars.githubusercontent.com/u/22197948?v=4", + "profile": "https://www.linkedin.com/in/ashank-bharati-497989127/", + "contributions": [ + "code" + ] + }, + { + "login": "chownation", + "name": "Michael Chow", + "avatar_url": "https://avatars.githubusercontent.com/u/1755207?v=4", + "profile": "https://dart.art/", + "contributions": [ + "code" + ] + }, + { + "login": "RodXander", + "name": "Osvaldo Saez", + "avatar_url": "https://avatars.githubusercontent.com/u/23609784?v=4", + "profile": "https://github.com/RodXander", + "contributions": [ + "code" + ] + }, + { + "login": "rsydor", + "name": "rsydor", + "avatar_url": "https://avatars.githubusercontent.com/u/79581663?v=4", + "profile": "https://github.com/rsydor", + "contributions": [ + "code" + ] + }, + { + "login": "hoanglm4", + "name": "Le Minh Hoang", + "avatar_url": "https://avatars.githubusercontent.com/u/7067757?v=4", + "profile": "https://github.com/hoanglm4", + "contributions": [ + "code" + ] + }, + { + "login": "Miiha", + "name": "Michael Kao", + "avatar_url": "https://avatars.githubusercontent.com/u/3897167?v=4", + "profile": "https://github.com/Miiha", + "contributions": [ + "code" + ] + }, + { + "login": "cloudygeek", + "name": "cloudygeek", + "avatar_url": "https://avatars.githubusercontent.com/u/6059542?v=4", + "profile": "https://github.com/cloudygeek", + "contributions": [ + "code" + ] + }, + { + "login": "chreck", + "name": "Christoph Eck", + "avatar_url": "https://avatars.githubusercontent.com/u/8030398?v=4", + "profile": "https://github.com/chreck", + "contributions": [ + "code" + ] + }, + { + "login": "Ser1ous", + "name": "Ser1ous", + "avatar_url": "https://avatars.githubusercontent.com/u/4497968?v=4", + "profile": "https://github.com/Ser1ous", + "contributions": [ + "code" + ] + }, + { + "login": "ItsCalebJones", + "name": "Caleb Jones", + "avatar_url": "https://avatars.githubusercontent.com/u/4519230?v=4", + "profile": "https://spacelaunchnow.me/", + "contributions": [ + "code" + ] + }, + { + "login": "savy-91", + "name": "Saverio Murgia", + "avatar_url": "https://avatars.githubusercontent.com/u/6215122?v=4", + "profile": "https://sungazer.io/", + "contributions": [ + "code" + ] + }, + { + "login": "tranductam2802", + "name": "Trần Đức Tâm", + "avatar_url": "https://avatars.githubusercontent.com/u/4957579?v=4", + "profile": "https://github.com/tranductam2802", + "contributions": [ + "code" + ] + }, + { + "login": "pcqpcq", + "name": "Joker", + "avatar_url": "https://avatars.githubusercontent.com/u/1411571?v=4", + "profile": "https://pcqpcq.me/", + "contributions": [ + "code" + ] + }, + { + "login": "ycv005", + "name": "Yash Chandra Verma", + "avatar_url": "https://avatars.githubusercontent.com/u/26734819?v=4", + "profile": "https://www.linkedin.com/in/ycv005/", + "contributions": [ + "code" + ] + }, + { + "login": "arneke", + "name": "Arne Kepp", + "avatar_url": "https://avatars.githubusercontent.com/u/425235?v=4", + "profile": "https://github.com/arneke", + "contributions": [ + "code" + ] + }, + { + "login": "omralcrt", + "name": "Ömral Cörüt", + "avatar_url": "https://avatars.githubusercontent.com/u/12418327?v=4", + "profile": "https://omralcrt.github.io/", + "contributions": [ + "code" + ] + }, + { + "login": "albatrosify", + "name": "LrdHelmchen", + "avatar_url": "https://avatars.githubusercontent.com/u/64252708?v=4", + "profile": "https://github.com/albatrosify", + "contributions": [ + "code" + ] + }, + { + "login": "gunantosteven", + "name": "Steven Gunanto", + "avatar_url": "https://avatars.githubusercontent.com/u/8141036?v=4", + "profile": "https://ungapps.com/", + "contributions": [ + "code" + ] + }, + { + "login": "DRSchlaubi", + "name": "Michael Rittmeister", + "avatar_url": "https://avatars.githubusercontent.com/u/16060205?v=4", + "profile": "https://schlau.bi/", + "contributions": [ + "code" + ] + }, + { + "login": "AAkira", + "name": "Akira Aratani", + "avatar_url": "https://avatars.githubusercontent.com/u/3386962?v=4", + "profile": "https://aakira.app/", + "contributions": [ + "code" + ] + }, + { + "login": "Doflatango", + "name": "Doflatango", + "avatar_url": "https://avatars.githubusercontent.com/u/3091033?v=4", + "profile": "https://github.com/Doflatango", + "contributions": [ + "code" + ] + }, + { + "login": "Eddayy", + "name": "Edmund Tay", + "avatar_url": "https://avatars.githubusercontent.com/u/17043852?v=4", + "profile": "https://github.com/Eddayy", + "contributions": [ + "code" + ] + }, + { + "login": "andreidiaconu", + "name": "Andrei Diaconu", + "avatar_url": "https://avatars.githubusercontent.com/u/1402046?v=4", + "profile": "https://andreidiaconu.com/", + "contributions": [ + "code" + ] + }, + { + "login": "plateaukao", + "name": "Daniel Kao", + "avatar_url": "https://avatars.githubusercontent.com/u/4084738?v=4", + "profile": "https://github.com/plateaukao", + "contributions": [ + "code" + ] + }, + { + "login": "xtyxtyx", + "name": "xuty", + "avatar_url": "https://avatars.githubusercontent.com/u/15033141?v=4", + "profile": "https://github.com/xtyxtyx", + "contributions": [ + "code" + ] + }, + { + "login": "wwwdata", + "name": "Ben Bieker", + "avatar_url": "https://avatars.githubusercontent.com/u/818880?v=4", + "profile": "https://bieker.ninja/", + "contributions": [ + "code" + ] + }, + { + "login": "phamnhuvu-dev", + "name": "Phạm Như Vũ", + "avatar_url": "https://avatars.githubusercontent.com/u/22906656?v=4", + "profile": "https://github.com/phamnhuvu-dev", + "contributions": [ + "code" + ] + }, + { + "login": "SebastienBtr", + "name": "SebastienBtr", + "avatar_url": "https://avatars.githubusercontent.com/u/18089010?v=4", + "profile": "https://github.com/SebastienBtr", + "contributions": [ + "code" + ] + }, + { + "login": "fattiger00", + "name": "NeZha", + "avatar_url": "https://avatars.githubusercontent.com/u/38494401?v=4", + "profile": "https://github.com/fattiger00", + "contributions": [ + "code" + ] + }, + { + "login": "klydra", + "name": "Jan Klinge", + "avatar_url": "https://avatars.githubusercontent.com/u/40038209?v=4", + "profile": "https://github.com/klydra", + "contributions": [ + "code" + ] + }, + { + "login": "PauloDurrerMelo", + "name": "PauloDurrerMelo", + "avatar_url": "https://avatars.githubusercontent.com/u/29310557?v=4", + "profile": "https://github.com/PauloDurrerMelo", + "contributions": [ + "code" + ] + }, + { + "login": "benmeemo", + "name": "benmeemo", + "avatar_url": "https://avatars.githubusercontent.com/u/47991706?v=4", + "profile": "https://github.com/benmeemo", + "contributions": [ + "code" + ] + }, + { + "login": "cinos1", + "name": "cinos", + "avatar_url": "https://avatars.githubusercontent.com/u/19343437?v=4", + "profile": "https://github.com/cinos1", + "contributions": [ + "code" + ] + }, + { + "login": "juicycleff", + "name": "Rex Raphael", + "avatar_url": "https://avatars.githubusercontent.com/u/11243590?v=4", + "profile": "https://xraph.com/", + "contributions": [ + "code" + ] + }, + { + "login": "Sense545", + "name": "Jan Henrik Høiland", + "avatar_url": "https://avatars.githubusercontent.com/u/769406?v=4", + "profile": "https://github.com/Sense545", + "contributions": [ + "code" + ] + }, + { + "login": "igtm", + "name": "Iguchi Tomokatsu", + "avatar_url": "https://avatars.githubusercontent.com/u/6331737?v=4", + "profile": "https://github.com/igtm", + "contributions": [ + "code" + ] + }, + { + "login": "ueman", + "name": "Jonas Uekötter", + "avatar_url": "https://avatars.githubusercontent.com/u/1270149?v=4", + "profile": "https://uekoetter.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "emakar", + "name": "emakar", + "avatar_url": "https://avatars.githubusercontent.com/u/7767193?v=4", + "profile": "https://github.com/emakar", + "contributions": [ + "code" + ] + }, + { + "login": "liasica", + "name": "liasica", + "avatar_url": "https://avatars.githubusercontent.com/u/671431?v=4", + "profile": "https://weibo.com/magicrolan", + "contributions": [ + "code" + ] + }, + { + "login": "addie9000", + "name": "Eiichiro Adachi", + "avatar_url": "https://avatars.githubusercontent.com/u/2036910?v=4", + "profile": "https://github.com/addie9000", + "contributions": [ + "code" + ] + }, + { + "login": "kamilpowalowski", + "name": "Kamil Powałowski", + "avatar_url": "https://avatars.githubusercontent.com/u/83073?v=4", + "profile": "https://github.com/kamilpowalowski", + "contributions": [ + "code" + ] + } + ], + "contributorsPerLine": 7, + "linkToUsage": false +} diff --git a/CHANGELOG.md b/CHANGELOG.md index b53591d1..45d36035 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +## 5.4.5 + +- Added Android direct camera capture feature +- Fixed missing `PullToRefreshController.isRefreshing` iOS implementation +- Fixed Android `PullToRefreshController.setEnabled` at runtime +- Fixed iOS `findNext` +- Fixed Android `RendererPriorityPolicy.waivedWhenNotVisible` type 'Null' is not a subtype of type 'bool' +- Fixed iOS 14.0 crash when calling `callAsyncJavaScript` method +- Merged "Android fix leaking MethodChannel through anonymous class" [#1201](https://github.com/pichillilorenzo/flutter_inappwebview/pull/1201) (thanks to [emakar](https://github.com/emakar)) +- Merged "Fix RangeError: Maximum call stack size exceeded" [#1208](https://github.com/pichillilorenzo/flutter_inappwebview/pull/1208) (thanks to [liasica](https://github.com/liasica)) + +## 5.4.4+3 + +- Removed Android unsafe trust manager + +## 5.4.4+2 + +- Fixed LICENSE + +## 5.4.4+1 + +- Fixed README + +## 5.4.4 + +- Added support for Android 33 +- Fixed possible null pointer exception in Android `ChromeCustomTabsActivity.java` + +## 5.4.3+8 + +- Merged "Xcode 14 build error: Stored properties cannot be marked potentially unavailable with '@available'" [#1238](https://github.com/pichillilorenzo/flutter_inappwebview/pull/1238) (thanks to [CodeEagle](https://github.com/CodeEagle)) +- Fixed example for iOS + ## 5.4.3+7 - Fixed possible Android java.lang.NullPointerException in "InAppBrowserActivity.onCreateOptionsMenu" about "webView.getTitle()" diff --git a/LICENSE b/LICENSE index d6493fe1..4dada16d 100755 --- a/LICENSE +++ b/LICENSE @@ -175,7 +175,18 @@ END OF TERMS AND CONDITIONS - Copyright 2018-2020 Lorenzo Pichilli + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Lorenzo Pichilli Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 3b0f4b04..d8d33849 100755 --- a/README.md +++ b/README.md @@ -1,22 +1,28 @@ +
+ # Flutter InAppWebView Plugin [![Share on Twitter](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Flutter%20InAppBrowser%20plugin!&url=https://github.com/pichillilorenzo/flutter_inappwebview&hashtags=flutter,flutterio,dart,dartlang,webview) [![Share on Facebook](https://img.shields.io/badge/share-facebook-blue.svg?longCache=true&style=flat&colorB=%234267b2)](https://www.facebook.com/sharer/sharer.php?u=https%3A//github.com/pichillilorenzo/flutter_inappwebview) -[![Pub](https://img.shields.io/pub/v/flutter_inappwebview.svg)](https://pub.dartlang.org/packages/flutter_inappwebview) -[![pub points](https://badges.bar/flutter_inappwebview/pub%20points)](https://pub.dev/packages/flutter_inappwebview/score) -[![popularity](https://badges.bar/flutter_inappwebview/popularity)](https://pub.dev/packages/flutter_inappwebview/score) -[![likes](https://badges.bar/flutter_inappwebview/likes)](https://pub.dev/packages/flutter_inappwebview/score) +![InAppWebView-logo](https://user-images.githubusercontent.com/5956938/195422744-bdcfed16-73f0-4bc9-94ab-ecf10771a1c4.png) + + +[![All Contributors](https://img.shields.io/badge/all_contributors-58-orange.svg?style=flat-square)](#contributors-) + + +[![Pub](https://img.shields.io/pub/v/flutter_inappwebview?include_prereleases)](https://pub.dartlang.org/packages/flutter_inappwebview) +[![Pub Points](https://img.shields.io/pub/points/flutter_inappwebview)](https://pub.dev/packages/flutter_inappwebview/score) +[![Pub Popularity](https://img.shields.io/pub/popularity/flutter_inappwebview)](https://pub.dev/packages/flutter_inappwebview/score) +[![Pub Likes](https://img.shields.io/pub/likes/flutter_inappwebview)](https://pub.dev/packages/flutter_inappwebview/score) [![Awesome Flutter](https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square)](https://stackoverflow.com/questions/tagged/flutter-inappwebview) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](/LICENSE) [![Donate to this project](https://img.shields.io/badge/support-donate-yellow.svg)](https://inappwebview.dev/donate/) -[![GitHub contributors](https://img.shields.io/github/contributors/pichillilorenzo/flutter_inappwebview)](https://github.com/pichillilorenzo/flutter_inappwebview/graphs/contributors) [![GitHub forks](https://img.shields.io/github/forks/pichillilorenzo/flutter_inappwebview?style=social)](https://github.com/pichillilorenzo/flutter_inappwebview) [![GitHub stars](https://img.shields.io/github/stars/pichillilorenzo/flutter_inappwebview?style=social)](https://github.com/pichillilorenzo/flutter_inappwebview) - -![InAppWebView-logo](https://user-images.githubusercontent.com/5956938/110180687-8751f480-7e0a-11eb-89cc-d62f85c148cb.png) - A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window. +
+ ## Articles/Resources - [Official documentation: inappwebview.dev/docs](https://inappwebview.dev/docs/) @@ -59,4 +65,99 @@ Add `flutter_inappwebview` as a [dependency in your pubspec.yaml file](https://f ## Support -Did you find this plugin useful? Please consider to [make a donation](https://inappwebview.dev/donate/) to help improve it! \ No newline at end of file +Did you find this plugin useful? Please consider to [make a donation](https://inappwebview.dev/donate/) to help improve it! + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Alex Li
Alex Li

💻
1/2
1/2

💻
Christofer Bodin
Christofer Bodin

💻
Matthew Lloyd
Matthew Lloyd

💻
C E
C E

💻
Robson Araujo
Robson Araujo

💻
Ryan
Ryan

💻
CodeEagle
CodeEagle

💻
Tanay Neotia
Tanay Neotia

💻
Jamie Joost
Jamie Joost

💻
Matias de Andrea
Matias de Andrea

💻
YouCii
YouCii

💻
Salnikov Sergey
Salnikov Sergey

💻
Po-Jui Chen
Po-Jui Chen

💻
Manuito
Manuito

💻
setcy
setcy

💻
EArminjon
EArminjon

💻
Ashank Bharati
Ashank Bharati

💻
Michael Chow
Michael Chow

💻
Osvaldo Saez
Osvaldo Saez

💻
rsydor
rsydor

💻
Le Minh Hoang
Le Minh Hoang

💻
Michael Kao
Michael Kao

💻
cloudygeek
cloudygeek

💻
Christoph Eck
Christoph Eck

💻
Ser1ous
Ser1ous

💻
Caleb Jones
Caleb Jones

💻
Saverio Murgia
Saverio Murgia

💻
Trần Đức Tâm
Trần Đức Tâm

💻
Joker
Joker

💻
Yash Chandra Verma
Yash Chandra Verma

💻
Arne Kepp
Arne Kepp

💻
Ömral Cörüt
Ömral Cörüt

💻
LrdHelmchen
LrdHelmchen

💻
Steven Gunanto
Steven Gunanto

💻
Michael Rittmeister
Michael Rittmeister

💻
Akira Aratani
Akira Aratani

💻
Doflatango
Doflatango

💻
Edmund Tay
Edmund Tay

💻
Andrei Diaconu
Andrei Diaconu

💻
Daniel Kao
Daniel Kao

💻
xuty
xuty

💻
Ben Bieker
Ben Bieker

💻
Phạm Như Vũ
Phạm Như Vũ

💻
SebastienBtr
SebastienBtr

💻
NeZha
NeZha

💻
Jan Klinge
Jan Klinge

💻
PauloDurrerMelo
PauloDurrerMelo

💻
benmeemo
benmeemo

💻
cinos
cinos

💻
Rex Raphael
Rex Raphael

💻
Jan Henrik Høiland
Jan Henrik Høiland

💻
Iguchi Tomokatsu
Iguchi Tomokatsu

💻
Jonas Uekötter
Jonas Uekötter

📖
emakar
emakar

💻
liasica
liasica

💻
Eiichiro Adachi
Eiichiro Adachi

💻
Kamil Powałowski
Kamil Powałowski

💻
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/android/build.gradle b/android/build.gradle index a6642d58..f6bfa929 100755 --- a/android/build.gradle +++ b/android/build.gradle @@ -22,7 +22,7 @@ rootProject.allprojects { apply plugin: 'com.android.library' android { - compileSdkVersion 31 + compileSdkVersion 33 defaultConfig { minSdkVersion 17 @@ -45,9 +45,9 @@ android { } } dependencies { - implementation 'androidx.webkit:webkit:1.4.0' + implementation 'androidx.webkit:webkit:1.5.0' implementation 'androidx.browser:browser:1.4.0' - implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.squareup.okhttp3:okhttp:3.14.9' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' } diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ServiceWorkerManager.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ServiceWorkerManager.java index ac2a654f..b9ff2958 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ServiceWorkerManager.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ServiceWorkerManager.java @@ -168,13 +168,7 @@ public class ServiceWorkerManager implements MethodChannel.MethodCallHandler { } private ServiceWorkerClientCompat dummyServiceWorkerClientCompat() { - return new ServiceWorkerClientCompat() { - @Nullable - @Override - public WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request) { - return null; - } - }; + return DummyServiceWorkerClientCompat.INSTANCE; } public void dispose() { @@ -185,4 +179,14 @@ public class ServiceWorkerManager implements MethodChannel.MethodCallHandler { } plugin = null; } + + private static final class DummyServiceWorkerClientCompat extends ServiceWorkerClientCompat { + static final ServiceWorkerClientCompat INSTANCE = new DummyServiceWorkerClientCompat(); + + @Nullable + @Override + public WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request) { + return null; + } + } } diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/Util.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/Util.java old mode 100755 new mode 100644 index 485297a1..d0618c05 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/Util.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/Util.java @@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.FileInputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; @@ -30,7 +32,6 @@ import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; @@ -38,7 +39,6 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.net.ssl.HostnameVerifier; @@ -184,50 +184,12 @@ public class Util { } } - public static OkHttpClient getUnsafeOkHttpClient() { - try { - // Create a trust manager that does not validate certificate chains - final TrustManager[] trustAllCerts = new TrustManager[] { - new X509TrustManager() { - @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; - } - } - }; - - // Install the all-trusting trust manager - final SSLContext sslContext = SSLContext.getInstance("SSL"); - sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); - // Create an ssl socket factory with our all-trusting manager - final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); - - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]); - builder.hostnameVerifier(new HostnameVerifier() { - @Override - public boolean verify(String hostname, SSLSession session) { - return true; - } - }); - - OkHttpClient okHttpClient = builder - .connectTimeout(15, TimeUnit.SECONDS) - .writeTimeout(15, TimeUnit.SECONDS) - .readTimeout(15, TimeUnit.SECONDS) - .build(); - return okHttpClient; - } catch (Exception e) { - throw new RuntimeException(e); - } + public static OkHttpClient getBasicOkHttpClient() { + return new OkHttpClient.Builder() + .connectTimeout(15, TimeUnit.SECONDS) + .writeTimeout(15, TimeUnit.SECONDS) + .readTimeout(15, TimeUnit.SECONDS) + .build(); } /** @@ -328,4 +290,21 @@ public class Util { public static Object getOrDefault(Map map, String key, Object defaultValue) { return map.containsKey(key) ? map.get(key) : defaultValue; } + + @Nullable + public static Object invokeMethodIfExists(final O o, final String methodName, Object... args) { + Method[] methods = o.getClass().getMethods(); + for (Method method : methods) { + if (method.getName().equals(methodName)) { + try { + return method.invoke(o, args); + } catch (IllegalAccessException e) { + return null; + } catch (InvocationTargetException e) { + return null; + } + } + } + return null; + } } diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ActionBroadcastReceiver.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ActionBroadcastReceiver.java index 1d3bb700..4e215e83 100644 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ActionBroadcastReceiver.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ActionBroadcastReceiver.java @@ -27,14 +27,16 @@ public class ActionBroadcastReceiver extends BroadcastReceiver { String title = b.getString(KEY_URL_TITLE); String managerId = b.getString(CHROME_MANAGER_ID); - ChromeSafariBrowserManager manager = (ChromeSafariBrowserManager) ChromeSafariBrowserManager.shared.get(managerId); - - MethodChannel channel = new MethodChannel(manager.plugin.messenger, "com.pichillilorenzo/flutter_chromesafaribrowser_" + viewId); - Map obj = new HashMap<>(); - obj.put("url", url); - obj.put("title", title); - obj.put("id", id); - channel.invokeMethod("onChromeSafariBrowserItemActionPerform", obj); + if (managerId != null) { + ChromeSafariBrowserManager manager = (ChromeSafariBrowserManager) ChromeSafariBrowserManager.shared.get(managerId); + if (manager == null || manager.plugin == null|| manager.plugin.messenger == null) return; + MethodChannel channel = new MethodChannel(manager.plugin.messenger, "com.pichillilorenzo/flutter_chromesafaribrowser_" + viewId); + Map obj = new HashMap<>(); + obj.put("url", url); + obj.put("title", title); + obj.put("id", id); + channel.invokeMethod("onChromeSafariBrowserItemActionPerform", obj); + } } } } diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java index 5533ddc9..7be959bf 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java @@ -190,8 +190,10 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. builder.setInstantAppsEnabled(options.instantAppsEnabled); for (CustomTabsMenuItem menuItem : menuItems) { - builder.addMenuItem(menuItem.getLabel(), - createPendingIntent(menuItem.getId())); + PendingIntent pendingIntent = createPendingIntent(menuItem.getId()); + if (pendingIntent != null) { + builder.addMenuItem(menuItem.getLabel(), pendingIntent); + } } if (actionButton != null) { @@ -201,9 +203,12 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. Bitmap bmp = BitmapFactory.decodeByteArray( data, 0, data.length, bitmapOptions ); - builder.setActionButton(bmp, actionButton.getDescription(), - createPendingIntent(actionButton.getId()), - actionButton.isShouldTint()); + PendingIntent pendingIntent = createPendingIntent(actionButton.getId()); + if (pendingIntent != null) { + builder.setActionButton(bmp, actionButton.getDescription(), + pendingIntent, + actionButton.isShouldTint()); + } } } @@ -237,7 +242,9 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. } } + @Nullable private PendingIntent createPendingIntent(int actionSourceId) { + if (manager == null) return null; Intent actionIntent = new Intent(this, ActionBroadcastReceiver.class); Bundle extras = new Bundle(); @@ -256,11 +263,15 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. } public void dispose() { + onStop(); + onDestroy(); channel.setMethodCallHandler(null); manager = null; } public void close() { + onStop(); + onDestroy(); customTabsSession = null; finish(); Map obj = new HashMap<>(); diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/CustomTabsHelper.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/CustomTabsHelper.java index c3f0198d..f49e3470 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/CustomTabsHelper.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/CustomTabsHelper.java @@ -6,6 +6,7 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.Build; import android.text.TextUtils; import android.util.Log; @@ -52,6 +53,7 @@ public class CustomTabsHelper { PackageManager pm = context.getPackageManager(); // Get default VIEW intent handler. Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com")); + activityIntent.addCategory(Intent.CATEGORY_BROWSABLE); ResolveInfo defaultViewHandlerInfo = pm.resolveActivity(activityIntent, 0); String defaultViewHandlerPackageName = null; if (defaultViewHandlerInfo != null) { @@ -59,7 +61,11 @@ public class CustomTabsHelper { } // Get all apps that can handle VIEW intents. - List resolvedActivityList = pm.queryIntentActivities(activityIntent, 0); + int flags = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + flags |= PackageManager.MATCH_ALL; + } + List resolvedActivityList = pm.queryIntentActivities(activityIntent, flags); List packagesSupportingCustomTabs = new ArrayList<>(); for (ResolveInfo info : resolvedActivityList) { Intent serviceIntent = new Intent(); diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/content_blocker/ContentBlockerHandler.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/content_blocker/ContentBlockerHandler.java index 3b9e279b..78cdfcbb 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/content_blocker/ContentBlockerHandler.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/content_blocker/ContentBlockerHandler.java @@ -2,7 +2,6 @@ package com.pichillilorenzo.flutter_inappwebview.content_blocker; import android.os.Build; import android.os.Handler; -import android.os.Looper; import android.util.Log; import android.webkit.WebResourceResponse; @@ -21,6 +20,8 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.regex.Matcher; +import javax.net.ssl.SSLHandshakeException; + import okhttp3.Request; import okhttp3.Response; @@ -181,7 +182,7 @@ public class ContentBlockerHandler { Response response = null; try { - response = Util.getUnsafeOkHttpClient().newCall(mRequest).execute(); + response = Util.getBasicOkHttpClient().newCall(mRequest).execute(); byte[] dataBytes = response.body().bytes(); InputStream dataStream = new ByteArrayInputStream(dataBytes); @@ -198,12 +199,14 @@ public class ContentBlockerHandler { return new WebResourceResponse(contentType, encoding, dataStream); } catch (Exception e) { - e.printStackTrace(); if (response != null) { response.body().close(); response.close(); } - Log.e(LOG_TAG, e.getMessage()); + if (!(e instanceof SSLHandshakeException)) { + e.printStackTrace(); + Log.e(LOG_TAG, e.getMessage()); + } } } break; @@ -231,7 +234,7 @@ public class ContentBlockerHandler { Request mRequest = new Request.Builder().url(url).head().build(); Response response = null; try { - response = Util.getUnsafeOkHttpClient().newCall(mRequest).execute(); + response = Util.getBasicOkHttpClient().newCall(mRequest).execute(); if (response.header("content-type") != null) { String[] contentTypeSplitted = response.header("content-type").split(";"); @@ -251,8 +254,10 @@ public class ContentBlockerHandler { response.body().close(); response.close(); } - e.printStackTrace(); - Log.e(LOG_TAG, e.getMessage()); + if (!(e instanceof SSLHandshakeException)) { + e.printStackTrace(); + Log.e(LOG_TAG, e.getMessage()); + } } } return responseResourceType; diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java index a1951e6b..f061381c 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java @@ -276,8 +276,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie settings.setAllowFileAccessFromFileURLs(options.allowFileAccessFromFileURLs); settings.setAllowUniversalAccessFromFileURLs(options.allowUniversalAccessFromFileURLs); setCacheEnabled(options.cacheEnabled); - if (options.appCachePath != null && !options.appCachePath.isEmpty() && options.cacheEnabled) - settings.setAppCachePath(options.appCachePath); + if (options.appCachePath != null && !options.appCachePath.isEmpty() && options.cacheEnabled) { + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCachePath(options.appCachePath); + Util.invokeMethodIfExists(settings, "setAppCachePath", options.appCachePath); + } settings.setBlockNetworkImage(options.blockNetworkImage); settings.setBlockNetworkLoads(options.blockNetworkLoads); if (options.cacheMode != null) @@ -357,10 +360,6 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie setRendererPriorityPolicy( (int) options.rendererPriorityPolicy.get("rendererRequestedPriority"), (boolean) options.rendererPriorityPolicy.get("waivedWhenNotVisible")); - } else if ((options.rendererPriorityPolicy == null || (options.rendererPriorityPolicy != null && options.rendererPriorityPolicy.isEmpty())) && - Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - options.rendererPriorityPolicy.put("rendererRequestedPriority", getRendererRequestedPriority()); - options.rendererPriorityPolicy.put("waivedWhenNotVisible", getRendererPriorityWaivedWhenNotVisible()); } contentBlockerHandler.getRuleList().clear(); @@ -491,7 +490,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie // Disable caching settings.setCacheMode(WebSettings.LOAD_NO_CACHE); - settings.setAppCacheEnabled(false); + + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCacheEnabled(false); + Util.invokeMethodIfExists(settings, "setAppCacheEnabled", false); + clearHistory(); clearCache(true); @@ -501,7 +504,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie settings.setSaveFormData(false); } else { settings.setCacheMode(WebSettings.LOAD_DEFAULT); - settings.setAppCacheEnabled(true); + + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCacheEnabled(true); + Util.invokeMethodIfExists(settings, "setAppCacheEnabled", true); + settings.setSavePassword(true); settings.setSaveFormData(true); } @@ -512,13 +519,22 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie if (enabled) { Context ctx = getContext(); if (ctx != null) { - settings.setAppCachePath(ctx.getCacheDir().getAbsolutePath()); + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCachePath(ctx.getCacheDir().getAbsolutePath()); + Util.invokeMethodIfExists(settings, "setAppCachePath", ctx.getCacheDir().getAbsolutePath()); + settings.setCacheMode(WebSettings.LOAD_DEFAULT); - settings.setAppCacheEnabled(true); + + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCacheEnabled(true); + Util.invokeMethodIfExists(settings, "setAppCacheEnabled", true); } } else { settings.setCacheMode(WebSettings.LOAD_NO_CACHE); - settings.setAppCacheEnabled(false); + + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCacheEnabled(false); + Util.invokeMethodIfExists(settings, "setAppCacheEnabled", false); } } @@ -763,8 +779,11 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie if (newOptionsMap.get("cacheEnabled") != null && options.cacheEnabled != newOptions.cacheEnabled) setCacheEnabled(newOptions.cacheEnabled); - if (newOptionsMap.get("appCachePath") != null && (options.appCachePath == null || !options.appCachePath.equals(newOptions.appCachePath))) - settings.setAppCachePath(newOptions.appCachePath); + if (newOptionsMap.get("appCachePath") != null && (options.appCachePath == null || !options.appCachePath.equals(newOptions.appCachePath))) { + // removed from Android API 33+ (https://developer.android.com/sdk/api_diff/33/changes) + // settings.setAppCachePath(newOptions.appCachePath); + Util.invokeMethodIfExists(settings, "setAppCachePath", newOptions.appCachePath); + } if (newOptionsMap.get("blockNetworkImage") != null && options.blockNetworkImage != newOptions.blockNetworkImage) settings.setBlockNetworkImage(newOptions.blockNetworkImage); @@ -916,9 +935,9 @@ final public class InAppWebView extends InputAwareWebView implements InAppWebVie if (newOptionsMap.get("networkAvailable") != null && options.networkAvailable != newOptions.networkAvailable) setNetworkAvailable(newOptions.networkAvailable); - if (newOptionsMap.get("rendererPriorityPolicy") != null && + if (newOptionsMap.get("rendererPriorityPolicy") != null && (options.rendererPriorityPolicy == null || (options.rendererPriorityPolicy.get("rendererRequestedPriority") != newOptions.rendererPriorityPolicy.get("rendererRequestedPriority") || - options.rendererPriorityPolicy.get("waivedWhenNotVisible") != newOptions.rendererPriorityPolicy.get("waivedWhenNotVisible")) && + options.rendererPriorityPolicy.get("waivedWhenNotVisible") != newOptions.rendererPriorityPolicy.get("waivedWhenNotVisible"))) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { setRendererPriorityPolicy( (int) newOptions.rendererPriorityPolicy.get("rendererRequestedPriority"), diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewChromeClient.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewChromeClient.java index 0cb92643..67f3eef9 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewChromeClient.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewChromeClient.java @@ -780,15 +780,15 @@ public class InAppWebViewChromeClient extends WebChromeClient implements PluginR } protected void openFileChooser(ValueCallback filePathCallback, String acceptType) { - startPhotoPickerIntent(filePathCallback, acceptType); + startPickerIntent(filePathCallback, acceptType, null); } protected void openFileChooser(ValueCallback filePathCallback) { - startPhotoPickerIntent(filePathCallback, ""); + startPickerIntent(filePathCallback, "", null); } protected void openFileChooser(ValueCallback filePathCallback, String acceptType, String capture) { - startPhotoPickerIntent(filePathCallback, acceptType); + startPickerIntent(filePathCallback, acceptType, capture); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @@ -796,8 +796,8 @@ public class InAppWebViewChromeClient extends WebChromeClient implements PluginR public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) { String[] acceptTypes = fileChooserParams.getAcceptTypes(); boolean allowMultiple = fileChooserParams.getMode() == WebChromeClient.FileChooserParams.MODE_OPEN_MULTIPLE; - Intent intent = fileChooserParams.createIntent(); - return startPhotoPickerIntent(filePathCallback, intent, acceptTypes, allowMultiple); + boolean captureEnabled = fileChooserParams.isCaptureEnabled(); + return startPickerIntent(filePathCallback, acceptTypes, allowMultiple, captureEnabled); } @Override @@ -898,58 +898,89 @@ public class InAppWebViewChromeClient extends WebChromeClient implements PluginR return null; } - public void startPhotoPickerIntent(ValueCallback filePathCallback, String acceptType) { + public void startPickerIntent(ValueCallback filePathCallback, String acceptType, @Nullable String capture) { InAppWebViewFlutterPlugin.filePathCallbackLegacy = filePathCallback; - Intent fileChooserIntent = getFileChooserIntent(acceptType); - Intent chooserIntent = Intent.createChooser(fileChooserIntent, ""); + boolean images = acceptsImages(acceptType); + boolean video = acceptsVideo(acceptType); - ArrayList extraIntents = new ArrayList<>(); - if (acceptsImages(acceptType)) { - extraIntents.add(getPhotoIntent()); + Intent pickerIntent = null; + + if (capture != null) { + if (!needsCameraPermission()) { + if (images) { + pickerIntent = getPhotoIntent(); + } + else if (video) { + pickerIntent = getVideoIntent(); + } + } } - if (acceptsVideo(acceptType)) { - extraIntents.add(getVideoIntent()); + if (pickerIntent == null) { + Intent fileChooserIntent = getFileChooserIntent(acceptType); + pickerIntent = Intent.createChooser(fileChooserIntent, ""); + + ArrayList extraIntents = new ArrayList<>(); + if (!needsCameraPermission()) { + if (images) { + extraIntents.add(getPhotoIntent()); + } + if (video) { + extraIntents.add(getVideoIntent()); + } + } + pickerIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{})); } - chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{})); Activity activity = getActivity(); - if (activity == null) { - return; - } - if (chooserIntent.resolveActivity(activity.getPackageManager()) != null) { - activity.startActivityForResult(chooserIntent, PICKER_LEGACY); + if (activity != null && pickerIntent.resolveActivity(activity.getPackageManager()) != null) { + activity.startActivityForResult(pickerIntent, PICKER_LEGACY); } else { Log.d(LOG_TAG, "there is no Activity to handle this Intent"); } } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - public boolean startPhotoPickerIntent(final ValueCallback callback, final Intent intent, final String[] acceptTypes, final boolean allowMultiple) { + public boolean startPickerIntent(final ValueCallback callback, final String[] acceptTypes, + final boolean allowMultiple, final boolean captureEnabled) { InAppWebViewFlutterPlugin.filePathCallback = callback; - ArrayList extraIntents = new ArrayList<>(); - if (!needsCameraPermission()) { - if (acceptsImages(acceptTypes)) { - extraIntents.add(getPhotoIntent()); - } - if (acceptsVideo(acceptTypes)) { - extraIntents.add(getVideoIntent()); + boolean images = acceptsImages(acceptTypes); + boolean video = acceptsVideo(acceptTypes); + + Intent pickerIntent = null; + + if (captureEnabled) { + if (!needsCameraPermission()) { + if (images) { + pickerIntent = getPhotoIntent(); + } + else if (video) { + pickerIntent = getVideoIntent(); + } } } + if (pickerIntent == null) { + ArrayList extraIntents = new ArrayList<>(); + if (!needsCameraPermission()) { + if (images) { + extraIntents.add(getPhotoIntent()); + } + if (video) { + extraIntents.add(getVideoIntent()); + } + } - Intent fileSelectionIntent = getFileChooserIntent(acceptTypes, allowMultiple); + Intent fileSelectionIntent = getFileChooserIntent(acceptTypes, allowMultiple); - Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); - chooserIntent.putExtra(Intent.EXTRA_INTENT, fileSelectionIntent); - chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{})); + pickerIntent = new Intent(Intent.ACTION_CHOOSER); + pickerIntent.putExtra(Intent.EXTRA_INTENT, fileSelectionIntent); + pickerIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents.toArray(new Parcelable[]{})); + } Activity activity = getActivity(); - if (activity == null) { - return true; - } - if (chooserIntent.resolveActivity(activity.getPackageManager()) != null) { - activity.startActivityForResult(chooserIntent, PICKER); + if (activity != null && pickerIntent.resolveActivity(activity.getPackageManager()) != null) { + activity.startActivityForResult(pickerIntent, PICKER); } else { Log.d(LOG_TAG, "there is no Activity to handle this Intent"); } diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewClient.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewClient.java index 68d0e0b0..59aadaac 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewClient.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewClient.java @@ -328,32 +328,22 @@ public class InAppWebViewClient extends WebViewClient { @Override public void onReceivedHttpAuthRequest(final WebView view, final HttpAuthHandler handler, final String host, final String realm) { - - URI uri; - try { - uri = new URI(view.getUrl()); - } catch (URISyntaxException e) { - e.printStackTrace(); - - credentialsProposed = null; - previousAuthRequestFailureCount = 0; - - handler.cancel(); - return; + final String url = view.getUrl(); + String protocol = "https"; + int port = 0; + + if (url != null) { + try { + URI uri = new URI(url); + protocol = uri.getScheme(); + port = uri.getPort(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } } - final String protocol = uri.getScheme(); - final int port = uri.getPort(); - previousAuthRequestFailureCount++; - Map obj = new HashMap<>(); - obj.put("host", host); - obj.put("protocol", protocol); - obj.put("realm", realm); - obj.put("port", port); - obj.put("previousFailureCount", previousAuthRequestFailureCount); - if (credentialsProposed == null) credentialsProposed = CredentialDatabase.getInstance(view.getContext()).getHttpAuthCredentials(host, protocol, realm, port); @@ -365,6 +355,8 @@ public class InAppWebViewClient extends WebViewClient { URLProtectionSpace protectionSpace = new URLProtectionSpace(host, protocol, realm, port, view.getCertificate(), null); HttpAuthenticationChallenge challenge = new HttpAuthenticationChallenge(protectionSpace, previousAuthRequestFailureCount, credentialProposed); + final String finalProtocol = protocol; + final int finalPort = port; channel.invokeMethod("onReceivedHttpAuthRequest", challenge.toMap(), new MethodChannel.Result() { @Override public void success(Object response) { @@ -378,7 +370,7 @@ public class InAppWebViewClient extends WebViewClient { String password = (String) responseMap.get("password"); Boolean permanentPersistence = (Boolean) responseMap.get("permanentPersistence"); if (permanentPersistence != null && permanentPersistence) { - CredentialDatabase.getInstance(view.getContext()).setHttpAuthCredential(host, protocol, realm, port, username, password); + CredentialDatabase.getInstance(view.getContext()).setHttpAuthCredential(host, finalProtocol, realm, finalPort, username, password); } handler.proceed(username, password); return; @@ -419,20 +411,21 @@ public class InAppWebViewClient extends WebViewClient { @Override public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError sslError) { - URI uri; + final String url = sslError.getUrl(); + String host = ""; + String protocol = "https"; + final String realm = null; + int port = 0; + try { - uri = new URI(sslError.getUrl()); + URI uri = new URI(url); + host = uri.getHost(); + protocol = uri.getScheme(); + port = uri.getPort(); } catch (URISyntaxException e) { e.printStackTrace(); - handler.cancel(); - return; } - final String host = uri.getHost(); - final String protocol = uri.getScheme(); - final String realm = null; - final int port = uri.getPort(); - URLProtectionSpace protectionSpace = new URLProtectionSpace(host, protocol, realm, port, sslError.getCertificate(), sslError); ServerTrustChallenge challenge = new ServerTrustChallenge(protectionSpace); @@ -473,23 +466,21 @@ public class InAppWebViewClient extends WebViewClient { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedClientCertRequest(final WebView view, final ClientCertRequest request) { - - InAppWebView webView = (InAppWebView) view; - - URI uri; - try { - uri = new URI(view.getUrl()); - } catch (URISyntaxException e) { - e.printStackTrace(); - request.cancel(); - return; - } - + final String url = view.getUrl(); final String host = request.getHost(); - final String protocol = uri.getScheme(); + String protocol = "https"; final String realm = null; final int port = request.getPort(); + if (url != null) { + try { + URI uri = new URI(url); + protocol = uri.getScheme(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + URLProtectionSpace protectionSpace = new URLProtectionSpace(host, protocol, realm, port, view.getCertificate(), null); ClientCertChallenge challenge = new ClientCertChallenge(protectionSpace, request.getPrincipals(), request.getKeyTypes()); diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewOptions.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewOptions.java index 21917383..1418af9b 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewOptions.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebViewOptions.java @@ -95,7 +95,8 @@ public class InAppWebViewOptions implements Options { public Integer scrollBarDefaultDelayBeforeFade = null; public Boolean scrollbarFadingEnabled = true; public Integer scrollBarFadeDuration = null; - public Map rendererPriorityPolicy = new HashMap<>(); + @Nullable + public Map rendererPriorityPolicy = null; public Boolean useShouldInterceptRequest = false; public Boolean useOnRenderProcessGone = false; public Boolean disableDefaultErrorPage = false; diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/plugin_scripts_js/JavaScriptBridgeJS.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/plugin_scripts_js/JavaScriptBridgeJS.java index 565a6120..8187edc1 100644 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/plugin_scripts_js/JavaScriptBridgeJS.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/plugin_scripts_js/JavaScriptBridgeJS.java @@ -147,7 +147,8 @@ public class JavaScriptBridgeJS { " });" + " }," + " arrayBufferToString: function(arrayBuffer) {" + - " return String.fromCharCode.apply(String, arrayBuffer);" + + " var uint8Array = new Uint8Array(arrayBuffer);" + + " return uint8Array.reduce(function(acc, i) { return acc += String.fromCharCode.apply(null, [i]); }, '');" + " }," + " isBodyFormData: function(bodyString) {" + " return bodyString.indexOf('------WebKitFormBoundary') >= 0;" + diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/pull_to_refresh/PullToRefreshLayout.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/pull_to_refresh/PullToRefreshLayout.java index 0d009a4d..5db895b6 100644 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/pull_to_refresh/PullToRefreshLayout.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/pull_to_refresh/PullToRefreshLayout.java @@ -94,6 +94,7 @@ public class PullToRefreshLayout extends SwipeRefreshLayout implements MethodCha case "setEnabled": { Boolean enabled = (Boolean) call.argument("enabled"); + options.enabled = enabled; // used by InAppWebView.onOverScrolled setEnabled(enabled); } result.success(true); diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index de44914a..4b28f2e2 100755 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -30,7 +30,7 @@ android { targetCompatibility 1.8 } - compileSdkVersion 31 + compileSdkVersion 33 lintOptions { disable 'InvalidPackage' @@ -40,7 +40,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.pichillilorenzo.flutter_inappwebviewexample" minSdkVersion 17 - targetSdkVersion 31 + targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -64,6 +64,6 @@ dependencies { testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - implementation 'com.google.android.material:material:1.3.0' + implementation 'com.google.android.material:material:1.6.1' implementation 'com.android.support:multidex:1.0.3' } diff --git a/example/integration_test/webview_flutter_test.dart b/example/integration_test/webview_flutter_test.dart index 9b62063f..e73e1397 100644 --- a/example/integration_test/webview_flutter_test.dart +++ b/example/integration_test/webview_flutter_test.dart @@ -5495,7 +5495,7 @@ setTimeout(function() { child: InAppWebView( key: GlobalKey(), initialUrlRequest: - URLRequest(url: Uri.parse('https://mdn.github.io/sw-test/')), + URLRequest(url: Uri.parse('https://mdn.github.io/dom-examples/service-worker/simple-service-worker/')), ), ), ); @@ -5524,7 +5524,7 @@ setTimeout(function() { child: InAppWebView( key: GlobalKey(), initialUrlRequest: - URLRequest(url: Uri.parse('https://mdn.github.io/sw-test/')), + URLRequest(url: Uri.parse('https://mdn.github.io/dom-examples/service-worker/simple-service-worker/')), onLoadStop: (controller, url) { pageLoaded.complete(url!.toString()); }, @@ -5533,7 +5533,7 @@ setTimeout(function() { ); final String url = await pageLoaded.future; - expect(url, "https://mdn.github.io/sw-test/"); + expect(url, "https://mdn.github.io/dom-examples/service-worker/simple-service-worker/"); }, skip: !Platform.isAndroid); }); diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100755 --- a/example/ios/Flutter/AppFrameworkInfo.plist +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec index 663d5b29..8ce43943 100644 --- a/example/ios/Flutter/Flutter.podspec +++ b/example/ios/Flutter/Flutter.podspec @@ -6,12 +6,12 @@ Pod::Spec.new do |s| s.name = 'Flutter' s.version = '1.0.0' - s.summary = 'High-performance, high-fidelity mobile apps.' - s.homepage = 'https://flutter.io' - s.license = { :type => 'MIT' } + s.summary = 'A UI toolkit for beautiful and fast apps.' + s.homepage = 'https://flutter.dev' + s.license = { :type => 'BSD' } s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } - s.ios.deployment_target = '9.0' + s.ios.deployment_target = '11.0' # Framework linking is handled by Flutter tooling, not CocoaPods. # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. s.vendored_frameworks = 'path/to/nothing' diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh index de544d92..fdf299a5 100755 --- a/example/ios/Flutter/flutter_export_environment.sh +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -3,11 +3,11 @@ export "FLUTTER_ROOT=/Users/lorenzopichilli/fvm/versions/2.10.4" export "FLUTTER_APPLICATION_PATH=/Users/lorenzopichilli/flutter_inappwebview_v5/example" export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_TARGET=integration_test/webview_flutter_test.dart" +export "FLUTTER_TARGET=/Users/lorenzopichilli/flutter_inappwebview_v5/example/lib/main.dart" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=1.0.0" export "FLUTTER_BUILD_NUMBER=1" -export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==" +export "DART_DEFINES=Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" diff --git a/example/ios/Podfile b/example/ios/Podfile index 1e8c3c90..88359b22 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index da4b6637..95663621 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -375,7 +375,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -427,7 +427,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index d78c9615..d13650c0 100755 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/example/lib/in_app_webiew_example.screen.dart b/example/lib/in_app_webiew_example.screen.dart index b656d6fe..a42b9b45 100755 --- a/example/lib/in_app_webiew_example.screen.dart +++ b/example/lib/in_app_webiew_example.screen.dart @@ -151,10 +151,10 @@ class _InAppWebViewExampleScreenState extends State { "javascript", "about" ].contains(uri.scheme)) { - if (await canLaunch(url)) { + if (await canLaunchUrl(uri)) { // Launch the App - await launch( - url, + await launchUrl( + uri, ); // and cancel the request return NavigationActionPolicy.CANCEL; diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 7789db22..9ddc5ce6 100755 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: cupertino_icons: ^1.0.4 flutter_downloader: ^1.7.3 path_provider: ^2.0.9 - permission_handler: ^9.2.0 + permission_handler: ^10.0.2 url_launcher: ^6.0.20 # connectivity: ^0.4.5+6 flutter_inappwebview: diff --git a/example/test_assets/certificate.pfx b/example/test_assets/certificate.pfx index 3225678f..6e362107 100755 Binary files a/example/test_assets/certificate.pfx and b/example/test_assets/certificate.pfx differ diff --git a/ios/Classes/InAppWebViewMethodHandler.swift b/ios/Classes/InAppWebViewMethodHandler.swift index fe45528d..a908a9a0 100644 --- a/ios/Classes/InAppWebViewMethodHandler.swift +++ b/ios/Classes/InAppWebViewMethodHandler.swift @@ -417,7 +417,7 @@ public class InAppWebViewMethodHandler: FlutterMethodCallDelegate { break case "callAsyncJavaScript": if let webView = webView, #available(iOS 10.3, *) { - if #available(iOS 14.0, *) { + if #available(iOS 14.3, *) { // on iOS 14.0, for some reason, it crashes let functionBody = arguments!["functionBody"] as! String let functionArguments = arguments!["arguments"] as! [String:Any] var contentWorld = WKContentWorld.page diff --git a/ios/Classes/PluginScriptsJS/FindTextHighlightJS.swift b/ios/Classes/PluginScriptsJS/FindTextHighlightJS.swift index ac93adf0..a61a05b7 100644 --- a/ios/Classes/PluginScriptsJS/FindTextHighlightJS.swift +++ b/ios/Classes/PluginScriptsJS/FindTextHighlightJS.swift @@ -42,7 +42,7 @@ window.\(JAVASCRIPT_BRIDGE_NAME)._findAllAsyncForElement = function(element, key span.setAttribute( "id", - "WKWEBVIEW_SEARCH_WORD_" + \(FIND_TEXT_HIGHLIGHT_SEARCH_RESULT_COUNT_JS_SOURCE) + "\(JAVASCRIPT_BRIDGE_NAME)_SEARCH_WORD_" + \(FIND_TEXT_HIGHLIGHT_SEARCH_RESULT_COUNT_JS_SOURCE) ); span.setAttribute("class", "\(JAVASCRIPT_BRIDGE_NAME)_Highlight"); var backgroundColor = \(FIND_TEXT_HIGHLIGHT_SEARCH_RESULT_COUNT_JS_SOURCE) == 0 ? "#FF9732" : "#FFFF00"; diff --git a/ios/Classes/PluginScriptsJS/JavaScriptBridgeJS.swift b/ios/Classes/PluginScriptsJS/JavaScriptBridgeJS.swift index 9aa6334d..cddca764 100644 --- a/ios/Classes/PluginScriptsJS/JavaScriptBridgeJS.swift +++ b/ios/Classes/PluginScriptsJS/JavaScriptBridgeJS.swift @@ -175,7 +175,8 @@ let UTIL_JS_SOURCE = """ }); }, arrayBufferToString: function(arrayBuffer) { - return String.fromCharCode.apply(String, arrayBuffer); + var uint8Array = new Uint8Array(arrayBuffer); + return uint8Array.reduce(function(acc, i) { return acc += String.fromCharCode.apply(null, [i]); }, ''); }, isBodyFormData: function(bodyString) { return bodyString.indexOf('------WebKitFormBoundary') >= 0; diff --git a/ios/Classes/PullToRefresh/PullToRefreshControl.swift b/ios/Classes/PullToRefresh/PullToRefreshControl.swift index 481bf8d9..2d55d3ea 100644 --- a/ios/Classes/PullToRefresh/PullToRefreshControl.swift +++ b/ios/Classes/PullToRefresh/PullToRefreshControl.swift @@ -70,6 +70,9 @@ public class PullToRefreshControl : UIRefreshControl, FlutterPlugin { } result(true) break + case "isRefreshing": + result(isRefreshing) + break case "setColor": let color = arguments!["color"] as! String tintColor = UIColor(hexString: color) diff --git a/ios/Classes/Types/UserScript.swift b/ios/Classes/Types/UserScript.swift index c843e2b8..e03b6de2 100644 --- a/ios/Classes/Types/UserScript.swift +++ b/ios/Classes/Types/UserScript.swift @@ -10,8 +10,19 @@ import WebKit public class UserScript : WKUserScript { var groupName: String? + + private var contentWorldWrapper: Any? @available(iOS 14.0, *) - lazy var contentWorld: WKContentWorld = WKContentWorld.page + var contentWorld: WKContentWorld { + get { + if let value = contentWorldWrapper as? WKContentWorld { + return value + } + return .page + } + set { contentWorldWrapper = newValue } + } + public override init(source: String, injectionTime: WKUserScriptInjectionTime, forMainFrameOnly: Bool) { super.init(source: source, injectionTime: injectionTime, forMainFrameOnly: forMainFrameOnly) diff --git a/lib/src/in_app_webview/in_app_webview_controller.dart b/lib/src/in_app_webview/in_app_webview_controller.dart index b2be39c4..ece08df9 100644 --- a/lib/src/in_app_webview/in_app_webview_controller.dart +++ b/lib/src/in_app_webview/in_app_webview_controller.dart @@ -2218,7 +2218,7 @@ class InAppWebViewController { ///This parameter doesn’t apply to changes you make to the underlying web content, such as the document’s DOM structure. ///Those changes remain visible to all scripts, regardless of which content world you specify. ///For more information about content worlds, see [ContentWorld]. - ///Available on iOS 14.0+. + ///Available on iOS 14.3+. /// ///**NOTE**: This method shouldn't be called in the [WebView.onWebViewCreated] or [WebView.onLoadStart] events, ///because, in these events, the [WebView] is not ready to handle it yet. diff --git a/nodejs_server_test_auth_basic_and_ssl/ca-crt.srl b/nodejs_server_test_auth_basic_and_ssl/ca-crt.srl index 06b1afb8..24cec440 100755 --- a/nodejs_server_test_auth_basic_and_ssl/ca-crt.srl +++ b/nodejs_server_test_auth_basic_and_ssl/ca-crt.srl @@ -1 +1 @@ -B83E5BFA72399E6B +B83E5BFA72399E73 diff --git a/nodejs_server_test_auth_basic_and_ssl/certificate.pfx b/nodejs_server_test_auth_basic_and_ssl/certificate.pfx index 3225678f..6e362107 100755 Binary files a/nodejs_server_test_auth_basic_and_ssl/certificate.pfx and b/nodejs_server_test_auth_basic_and_ssl/certificate.pfx differ diff --git a/nodejs_server_test_auth_basic_and_ssl/client.js b/nodejs_server_test_auth_basic_and_ssl/client.js new file mode 100644 index 00000000..2ac4d2fe --- /dev/null +++ b/nodejs_server_test_auth_basic_and_ssl/client.js @@ -0,0 +1,20 @@ +var fs = require('fs'); +var https = require('https'); +var options = { + hostname: 'localhost', + port: 4433, + path: '/', + method: 'GET', + key: fs.readFileSync('client1-key.pem'), + cert: fs.readFileSync('client1-crt.pem'), + // pfx: fs.readFileSync('certificate.pfx'), + ca: fs.readFileSync('ca-crt.pem') }; +var req = https.request(options, function(res) { + res.on('data', function(data) { + process.stdout.write(data); + }); +}); +req.end(); +req.on('error', function(e) { + console.error(e); +}); \ No newline at end of file diff --git a/nodejs_server_test_auth_basic_and_ssl/client1-crt.pem b/nodejs_server_test_auth_basic_and_ssl/client1-crt.pem old mode 100755 new mode 100644 index 3f32b538..6df405aa --- a/nodejs_server_test_auth_basic_and_ssl/client1-crt.pem +++ b/nodejs_server_test_auth_basic_and_ssl/client1-crt.pem @@ -1,32 +1,32 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/nodejs_server_test_auth_basic_and_ssl/client2-crt.pem b/nodejs_server_test_auth_basic_and_ssl/client2-crt.pem old mode 100755 new mode 100644 index 2eceb939..a97991f5 --- a/nodejs_server_test_auth_basic_and_ssl/client2-crt.pem +++ b/nodejs_server_test_auth_basic_and_ssl/client2-crt.pem @@ -1,32 +1,32 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/nodejs_server_test_auth_basic_and_ssl/index.js b/nodejs_server_test_auth_basic_and_ssl/index.js index f6bcdb16..602c7244 100755 --- a/nodejs_server_test_auth_basic_and_ssl/index.js +++ b/nodejs_server_test_auth_basic_and_ssl/index.js @@ -1,5 +1,15 @@ // Example of the server https is taken from here: https://engineering.circle.com/https-authorized-certs-with-node-js-315e548354a2 +// Renew certificates: +// - openssl x509 -req -extfile server.cnf -days 9999 -passin "pass:password" -in server-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out server-crt.pem +// - openssl x509 -req -extfile client1.cnf -days 9999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client1-crt.pem +// - openssl x509 -req -extfile client2.cnf -days 9999 -passin "pass:password" -in client2-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client2-crt.pem +// Verify certificates: +// - openssl verify -CAfile ca-crt.pem server-crt.pem +// - openssl verify -CAfile ca-crt.pem client1-crt.pem +// - openssl verify -CAfile ca-crt.pem client2-crt.pem // Conversion of client1-crt.pem to certificate.pfx: https://stackoverflow.com/a/38408666/4637638 +// - openssl pkcs12 -export -out certificate.pfx -inkey client1-key.pem -in client1-crt.pem -certfile ca-crt.pem +// - Overwrite certificate.pfx to example/test_assets/certificate.pfx const express = require('express') const https = require('https') const cors = require('cors') diff --git a/nodejs_server_test_auth_basic_and_ssl/package-lock.json b/nodejs_server_test_auth_basic_and_ssl/package-lock.json index d914c657..295ca7b9 100755 --- a/nodejs_server_test_auth_basic_and_ssl/package-lock.json +++ b/nodejs_server_test_auth_basic_and_ssl/package-lock.json @@ -42,26 +42,28 @@ } }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "call-bind": { "version": "1.0.2", @@ -120,9 +122,9 @@ } }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { "version": "1.2.0", @@ -350,15 +352,15 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "https": { @@ -375,9 +377,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ipaddr.js": { "version": "1.9.1", @@ -423,41 +425,41 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multiparty": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.2.tgz", - "integrity": "sha512-NtZLjlvsjcoGrzojtwQwn/Tm90aWJ6XXtPppYF4WmOk/6ncdwMMKggFY2NlRRN9yiCEIVxpOfPWahVEG2HAG8Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz", + "integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==", "requires": { - "http-errors": "~1.8.0", + "http-errors": "~1.8.1", "safe-buffer": "5.2.1", "uid-safe": "2.1.5" }, "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" } } }, @@ -477,9 +479,9 @@ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -504,14 +506,17 @@ } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" }, "range-parser": { "version": "1.2.1", @@ -519,12 +524,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -623,9 +628,9 @@ } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "side-channel": { "version": "1.0.4", @@ -638,14 +643,14 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "type-is": { "version": "1.6.18", diff --git a/nodejs_server_test_auth_basic_and_ssl/package.json b/nodejs_server_test_auth_basic_and_ssl/package.json index 6feac6cc..ef405936 100755 --- a/nodejs_server_test_auth_basic_and_ssl/package.json +++ b/nodejs_server_test_auth_basic_and_ssl/package.json @@ -10,10 +10,10 @@ "license": "ISC", "dependencies": { "basic-auth": "latest", - "body-parser": "^1.19.0", + "body-parser": "^1.20.0", "cors": "^2.8.5", "express": "latest", "https": "latest", - "multiparty": "^4.2.2" + "multiparty": "^4.2.3" } } diff --git a/nodejs_server_test_auth_basic_and_ssl/server-crt.pem b/nodejs_server_test_auth_basic_and_ssl/server-crt.pem index b1f82664..4878b880 100755 --- a/nodejs_server_test_auth_basic_and_ssl/server-crt.pem +++ b/nodejs_server_test_auth_basic_and_ssl/server-crt.pem @@ -1,32 +1,32 @@ -----BEGIN CERTIFICATE----- -MIIFjDCCA3SgAwIBAgIJALg+W/pyOZ5pMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYD +MIIFjjCCA3agAwIBAgIJALg+W/pyOZ5xMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYD VQQGEwJVUzELMAkGA1UECAwCTUExDzANBgNVBAcMBkJvc3RvbjETMBEGA1UECgwK RXhhbXBsZSBDbzEQMA4GA1UECwwHdGVjaG9wczELMAkGA1UEAwwCY2ExIDAeBgkq -hkiG9w0BCQEWEWNlcnRzQGV4YW1wbGUuY29tMB4XDTE5MTAzMDIzMzQxOVoXDTIy -MDcyNTIzMzQxOVowgYgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJNQTEPMA0GA1UE -BwwGQm9zdG9uMRMwEQYDVQQKDApFeGFtcGxlIENvMRAwDgYDVQQLDAd0ZWNob3Bz -MRIwEAYDVQQDDAlsb2NhbGhvc3QxIDAeBgkqhkiG9w0BCQEWEWNlcnRzQGV4YW1w -bGUuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6+4m+blS6NcS -ZcftDArQhd7ekeeZzfiedonAXybjJ+GkqtigKW2hUtHldWRswx56braUAJYUsj2I -Xh9y9/vWCGUGF9ZsiPTI28bZgbfwvyGaO0K4mLPGdvOvtXgbbw3uC6hU+sbiFF88 -BgZdwnsjoP7wPHqyzJ8PQ7BM7jdflLFn1uULS+9fe/7gPRSXxvS26WC1IYK8gVqQ -JBXH2tO3ZSh8LygePjKUWQF4xsN8mttRYlahdhNIMb1ZgBnG4rFq8JOc5fUbrYIz -s+LLMRm8zn3GIZgp4BiK900RJGxDXtVnx6ce4fdj+4OsL8NW3JzBNB66unsQ1gkz -WZbAbaXN7HeUpnktuGfA+TdWrzMd8XXaMDHXj9Uh8NtjToBJ5hHkStSkHRxBnlyo -MvWXGubn+EfUC5nVBGnG/Yfb9caKlpgIHh164ScGKlFlV4W8VpoA1W0BwE/R/E/I -lo5wiX5DP2uxh8bC7J1UK7guDnGDZASWsqNxtCBuCmEx9L6ePlnQbuc/AA+QLdyS -z4wb0IGefS+et0BOJFj2/u28/A5N21swarTCxPm0rczXZfRhooM8/X6Z3Pw6E5ze -D1S/49V8qLwqwcwkJhnIJoqSj/cWNGVXRY2Tqu5536NvK3e5BvOPeULf0IKYDhUs -LxwgpQ07gntS7UHBSejmmmjs92IiQiECAwEAATANBgkqhkiG9w0BAQUFAAOCAgEA -JxbqWQynzigBoaR7DP6AtXzYC2RcVBQuwyBSy348ruiIeQy3Niwt5cuhFA/LVyZP -QI6KQTj2Qd0elAkeSp55nG/ZWmcszAF8aWrFRNUc0U85eUcZSyKP1eRblFgf2sMg -HrJY0w0Ust43jk+tWNCftSHL6+uxaKc0z18vFmpHIBtpecCHYaA2mEUTTS19mzSu -K816jEqDvwxUWRbC8aTLOKDS3w1OLBtwVQ8bBvKCbJv7I3AmWtGkmDdetBwEe9u4 -lpC/7Rmm57/UG5P8Vy7lVGyOnxQaTE1FxxNWwq02Iy4gc1UAovYYBtgsg+XfnpL6 -TUo/9gtjl5K6OMxS/8JJjCi7U8RqiZICGTvjUvl0ahUtjs9CHtruWPbQ7tpA+IWQ -k9U708R3TAILHtq1Po1cWTtezYqUokLVwQlvwWJOezuPWnz0v5VKuLX64Ot0HAjI -rB/VggCRRFbxseM22q3xYKGpERhvAnSjD6bAYP11MlCj/4FBflHDWgDjTvmwRW05 -GW7rsTT+4omu/yQGRXSqFpaD1pYuoi1j0Lhtk/LCwQLE9bxPBUf0t8Ut+q5s0s0X -yXB1git1Aq09HZ1yJRfL//g/PWOu5lFhc8Xe4grrB3peRl2yHNiBNXQ1m1DmxCpL -oeM+rfdX4oDVWH5oFmyFGAUOdsZ1JgvaasFq2JRKryA= +hkiG9w0BCQEWEWNlcnRzQGV4YW1wbGUuY29tMCAXDTIyMTAwMzExNDk1OVoYDzIw +NTAwMjE3MTE0OTU5WjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYD +VQQHDAZCb3N0b24xEzARBgNVBAoMCkV4YW1wbGUgQ28xEDAOBgNVBAsMB3RlY2hv +cHMxEjAQBgNVBAMMCWxvY2FsaG9zdDEgMB4GCSqGSIb3DQEJARYRY2VydHNAZXhh +bXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDr7ib5uVLo +1xJlx+0MCtCF3t6R55nN+J52icBfJuMn4aSq2KApbaFS0eV1ZGzDHnputpQAlhSy +PYheH3L3+9YIZQYX1myI9MjbxtmBt/C/IZo7QriYs8Z286+1eBtvDe4LqFT6xuIU +XzwGBl3CeyOg/vA8erLMnw9DsEzuN1+UsWfW5QtL7197/uA9FJfG9LbpYLUhgryB +WpAkFcfa07dlKHwvKB4+MpRZAXjGw3ya21FiVqF2E0gxvVmAGcbisWrwk5zl9Rut +gjOz4ssxGbzOfcYhmCngGIr3TREkbENe1WfHpx7h92P7g6wvw1bcnME0Hrq6exDW +CTNZlsBtpc3sd5SmeS24Z8D5N1avMx3xddowMdeP1SHw22NOgEnmEeRK1KQdHEGe +XKgy9Zca5uf4R9QLmdUEacb9h9v1xoqWmAgeHXrhJwYqUWVXhbxWmgDVbQHAT9H8 +T8iWjnCJfkM/a7GHxsLsnVQruC4OcYNkBJayo3G0IG4KYTH0vp4+WdBu5z8AD5At +3JLPjBvQgZ59L563QE4kWPb+7bz8Dk3bWzBqtMLE+bStzNdl9GGigzz9fpnc/DoT +nN4PVL/j1XyovCrBzCQmGcgmipKP9xY0ZVdFjZOq7nnfo28rd7kG8495Qt/QgpgO +FSwvHCClDTuCe1LtQcFJ6OaaaOz3YiJCIQIDAQABMA0GCSqGSIb3DQEBBQUAA4IC +AQCGAFB075uCWhHnE8h7JF/fu9siRwpuUmLCDkIT5U8ToRwRAv+uqMhosCbaScKk ++Xq+1VhdLbt7b5NuEmlwOHv4GA7ru2pwJylLoxnmWh7i/DbTERIF8dal+TYV+VPD +3+M0KEQAlUIrza2u4iX7vZxkuHgN4/cCESFolsY6YYAhHZ2cR5Xeso/AKo1mVlvk +1agUMvdRCoqvF+IRN/mvCILyE8Pueq41YN3gPC6qFLh2Mnjs6vhx03Fb4CRYWqIM +/jRRRDMMb48j5t8EwCmu3j8tiCrfEC1XcaP8o720r7CJ5nw/O8lsQEfRDtcebSuq ++iHko9NTIztRW2U2EqDYKyxr+cojAD2xhVwQDpnXPzj1XGfKx4AoE/69tDFLng8i +PUWxo8Aa1TtZtcEmBzv2BCFBuqVkBPE/ZayeL5teDvyjUXVokNI3rXYeYLYqPly0 +Qamm/fqnsd//tRgikeI+vHEUtcTCOqxmj3ELEf5PuITmtXGMUfAZZKAFU04h1Oxz +GQzOAuz+hnXA5RzlZA6y+r9HaL9bfu3CO59ITbZ/NVOW0toYCmuXR7oHLrF42JlH +MxdIatr942w/9yiJKCSZFnujwrerwOFn+7Utei/XASNXjUNc2HuMd+TfPSiM/YmM +pqiXXAYVskPHK9xG6w+YFhiLQ9KLOLSe7UXQZbs/NAxjXQ== -----END CERTIFICATE----- diff --git a/pubspec.yaml b/pubspec.yaml old mode 100755 new mode 100644 index 32ce620c..22e7066d --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,9 @@ name: flutter_inappwebview description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window. -version: 5.4.3+7 -homepage: https://github.com/pichillilorenzo/flutter_inappwebview +version: 5.4.5 +homepage: https://inappwebview.dev/ +repository: https://github.com/pichillilorenzo/flutter_inappwebview +issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues environment: sdk: ">=2.14.0 <3.0.0" @@ -65,4 +67,4 @@ flutter: false_secrets: - /nodejs_server_test_auth_basic_and_ssl/*.pem - - /nodejs_server_test_auth_basic_and_ssl/*.pfx \ No newline at end of file + - /nodejs_server_test_auth_basic_and_ssl/*.pfx