evoweb / recaptcha Goto Github PK
View Code? Open in Web Editor NEWTYPO3 Extension to make use of googles nocaptcha
License: GNU General Public License v2.0
TYPO3 Extension to make use of googles nocaptcha
License: GNU General Public License v2.0
Hey, thanks for publishing docs at docs.typo3.org.
We've noticed the following issues which you might want to solve:
We've moved the rendering from Bamboo to GitHub Actions. That's the reason I can't provide the logs of failed rendering. You might want to try out the local rendering via Docker to find related issues. You could also use documentation-draft
branch, as documented: https://docs.typo3.org/m/typo3/docs-how-to-document/master/en-us/WritingDocForExtension/Webhook.html#how-webhooks-work
You can comment on that issue to get further info or notify myself if everything is working.
We will set up corresponding redirects once everything is working.
Hey i am having multiple forms on a single page and when i try to send one to see if the validation goes through, it does not show the missing fields on the right form. Something i need to keep in mind for multiple forms on one page?
Hello
In CaptchaService, the configuration is first loaded from ext_conf_template.txt, and the overriden with typoscript setup.
If an integrator (like me) tried to redefine something in the extension configuration, it will be always overriden with typoscript setup.
Maybe we should have only one way to setup the extension: TS or ext_conf_template.txt.
What do you think?
Cheers
Hi!
we study https://developers.google.com/recaptcha/docs/display and see there is a doc for the language codes which will be add as parameter to the the url. E.g. https://www.google.com/recaptcha/api.js?hl?fr
It seems like the constant "lang" would not be used. We override the constant "api_server" and all is fine. Is this the right way?
Option A (easy): Remove "lang" constant and documentate the url behavior
Option B: (medium): Combine "api_server" and "lang" if "lang" is given.
Thanks for your feedback!
Using ext:form
on TYPO3 8.7.22 with recaptcha version 8.3.0 changing to invisible mode breaks form submission.
I've using for development google provided test keys, so reCaptcha always validates. Submitting a simple test form with reCaptcha set to invisible results in no submission of the form. The onRecaptchaSubmit
is invoked, seems like validation of the form takes place and then you are redirected back to the form without any errors or something. Seems like that finishers are not processed at all.
Switching back to "normal" mode everything works fine.
TypoScript Constants
plugin.tx_recaptcha {
include_invisible_recaptcha_callback = 1
invisible_recaptcha_formname = recaptchatest
enforceCaptcha = 1
public_key = 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
private_key = 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
}
Simple Test Form
renderingOptions:
submitButtonLabel: Submit
useInvisibleRecaptcha: true
identifier: recaptchatest
label: 'recaptcha test'
type: Form
prototypeName: standard
finishers:
-
options:
pageUid: '1'
additionalParameters: ''
identifier: Redirect
renderables:
-
renderingOptions:
previousButtonLabel: 'Previous step'
nextButtonLabel: 'Next step'
identifier: page-1
label: 'Contact Form'
type: Page
renderables:
-
defaultValue: ''
identifier: name
label: Name
type: Text
properties:
fluidAdditionalAttributes:
placeholder: Name
validators:
-
identifier: NotEmpty
-
defaultValue: ''
identifier: subject
label: Subject
type: Text
properties:
fluidAdditionalAttributes:
placeholder: Subject
validators:
-
identifier: NotEmpty
-
defaultValue: ''
identifier: email
label: Email
type: Text
properties:
fluidAdditionalAttributes:
placeholder: 'Email address'
validators:
-
identifier: NotEmpty
-
identifier: EmailAddress
-
defaultValue: ''
identifier: message
label: Message
type: Textarea
properties:
fluidAdditionalAttributes:
placeholder: ''
validators:
-
identifier: NotEmpty
-
renderingOptions:
submitButtonLabel: true
type: Recaptcha
identifier: recaptcha-1
label: reCAPTCHA
validators:
-
identifier: Recaptcha
When I change the value of plugin.recaptcha.lang to 'de' in the Extension Configuration it doesn't has an effect to the frontend. It always shows english labels. I cleared all the caches. This is my implementation in forms:
validators:
-
identifier: Recaptcha
renderingOptions:
submitButtonLabel: false
type: Recaptcha
identifier: recaptcha-1
label: ''
`
I'm using TYPO3 9.5.20 and recaptcha 9.1.3
Hi - I have a quick question.
I have implemented your t3 extension successfully on my contact form. ReCaptcha works as expected. However, I see the according JS now loaded on all my pages, not just the contact form. Is that to be expected?
Typo3 9.5.14, ReCaptcha Extension 9.1.3
Thanks
Hallo! Habe heute mal das Plugin installiert sowie konfiguriert - hat auch alles super geklappt. Das einzige Problem was ich habe ist, wenn ich mich abmelde / bzw der Endnutzer besucht die Seite, dann bekomme ich eine file_get_contents Fehlermeldung
TYPO3-Version 8.7.30
PHP-Version 7.1.33
Wenn ich eingeloggt bin funktioniert die Seite einwandfrei.
#1476107295: PHP Warning: file_get_contents(/***/htdocs/relaunch/webroot/https://www.google.com/recaptcha/api.js): failed to open stream: No such file or directory in ***/htdocs/relaunch/webroot/typo3_src/typo3_src-8.7.30/typo3/sysext/core/Classes/Resource/ResourceCompressor.php line 411 (More information)
Hello,
I'm using sf_register 9.4.1 with recaptcha 9.1.3 on TYPO3 9.5.23.
Clicking on the captcha works but when I click create button this exception is thrown:
Uncaught TYPO3 Exception: Argument 1 passed to Evoweb\SfRegister\Services\Captcha\AbstractAdapter::addError() must be of the type string, null given, called in typo3conf/ext/recaptcha/Classes/Adapter/SfRegisterAdapter.php on line 81 | TypeError thrown in file typo3conf/ext/sf_register/Classes/Services/Captcha/AbstractAdapter.php in line 65.
Within the isValid function it should be:
if ($status == false || $status['error'] !== NULL)
instead of:
if ($status == false || $status['error'] !== '') {
since $status['error'] is NULL when the captcha was solved correctly.
Cheers, Tobias
Hello,
Using the reCAPTCHA extension in EXT:form-Forms gives an error on sending the form.
Line 215 in Classes/Service/CaptchaService.php:
got changed for V12 to the following:
$response = $this->requestFactory->createRequest($this->configuration['verify_server'] . '?' . $params, 'POST');
But this doesn't work. First of all, the method takes the method as first parameter and the URI as the second, and doesn't return a response Object.
Changing it back to:
$response = $this->requestFactory->request($this->configuration['verify_server'] . '?' . $params, 'POST');
Fixes the issue.
First of all, thanks for your great work building this extension!
I have a simple contact form with multiple finishers defined, but even if I use just one it is not executed if I enable invisible recaptcha.
finishers:
-
options:
pageUid: '16'
additionalParameters: ''
identifier: Redirect
If I use the standard visible reCAPTCHA everything is working fine and my finishers are executed (except the already mentioned bug in #6)
Did anybody else noticed this behavior? I'm thankful for any help.
Recaptcha extension is not working, if you add/active it after spammer has already spamed form. There is a "required" per default missing if adding recaptcha field.
so spammer can still use old post parameters and emails are sent because there is no required validation
Hi, can I use v3 reCaptcha for ext:form ?
Same problem as mentioned in #7 but in different versions.
TYPO3 9.5.14 EXT: form 9.5.14 EXT: recaptcha 9.1.3
My setup / configuration seems to be correct since everything works as expected if a visible captcha is used.
I would appreciate your feedback.
Thanks in advance.
This line: use TYPO3\CMS\Core\TypoScript\TypoScriptService; in the Service breaks in Typo3 7.
The class in Typo3 7 is located here:
TYPO3\CMS\Extbase\Service\TypoScriptService.
Its possible to just remove the captcha input field "name-recaptcha-id" (e.g. kontakt-recaptcha-1) via inspector or something to bypass recaptcha check. With this missing input field, the "recaptcha-token" is not processed. (Which can be removed by user, too!)
So an attacker could easily spam the form again.
When checking if we have to process recaptcha-token, you should not believe the "name-recaptcha-id" field, instead there has to be something server-side which knows whether there was a captcha displayed or not.
Typo3 11.5.8
reCaptcha 11.0.2
Edit: i tried your latest developer build because i couldn't set the robotMode Parameter in the latest stable typo3 captcha extension
Captcha Extension dose not work.
I use the typo3 form extension and placing the captcha there.
Captcha is displayed in the frontend and can be clicked (im not a robot captcha v2) but after submit i get following error
after checking the captcha and submit form, formdata gets submitted & no error is displayed
(1/1) TypeError
Evoweb\Recaptcha\Services\CaptchaService::queryVerificationServer(): Return value must be of type array, null returned
The extensions reCAPTCHA integration is currently incompatible with trusted types. Adding a CSP header Content-Security-Policy: require-trusted-types-for 'script';
to the http response currently breaks the reCAPTCHA integration.
Google itself allows for trusted types:
https://developers.google.com/recaptcha/docs/v3#tips (3)
To activate them, the API URL needs to be changed to https://www.google.com/recaptcha/api.js?trustedtypes=true .
Right now it is possible to do so by modifying the TypoScript setup
# Include recaptcha with trusted types for CSP compatibility
page.includeJSFooterlibs.recaptcha = {$plugin.tx_recaptcha.api_server}{$plugin.tx_recaptcha.lang}&trustedtypes=true
I suggest to provide a TypoScript constant to activate trusted types and to activate it by default.
Are there any plans to get the plugin working unser Typo3 V12?
Hello
I am not able to get include_invisible_recaptcha_callback working. The inlineJs is not inserted on the page.
According to the TYPO3 CMS source code (\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::cObjGet
), page.jsInline should be a numerical array. Any non-numerical key are stripped away.
Cheers
TYPO3 8.7
Hello,
the keys given by reCAPTCHA Enterprise are not working for the extension.
The key type seams to be wrong, but in the Google Backend I choose website.
How can I setup this extention with reCAPTCHA Enterprise?
Got this error:
Core: Exception handler (WEB): Uncaught TYPO3 Exception: Argument 2 passed to TYPO3\CMS\Form\Service\TranslationService::translateFormElementError() must be of the type integer, float given, called in /html/typo3/typo3_src-8.7.8/typo3/sysext/form/Classes/ViewHelpers/TranslateElementErrorViewHelper.php on line 72 | TypeError thrown in file /html/typo3/typo3_src-8.7.8/typo3/sysext/form/Classes/Service/TranslationService.php in line 389. Requested URL: http://www.panther-packaging.de.tgm-server.de/kontakt/kontaktformular.html?tx_form_formframework%5Baction%5D=perform&tx_form_formframework%5Bcontroller%5D=FormFrontend&cHash=b6566333e11f2f256eeed9905fc9aeda
System:
TYPO3 8.7.8
PHP 7.1.9
Hello,
This line cause problem with 8.1:
PHP Warning: Undefined array key "robotMode"
I had to make it return (bool)($this->configuration['robotMode'] ?? false);
Thank you for the development and maintenance of this extension.
Since robotMode is not set in ext_conf_template.txt and if it is set to 0 in Typoscript setup the call to ArrayUtility::mergeRecursiveWithOverrule in CaptchaService.php with includeEmptyValue set to false results in a configuration where robotMode is not defined.
Depending on the setup this may lead to unnecessary PHP warnings "Undefined array key".
Adding robotMode = 0 to ext_conf_template.txt would fix it.
Hello,
I've recently installed sf_register on one of my sites and during configuration I noticed that this recaptcha extension overrides some of the typoscript configuration of sf_register, when implemented after sf_register.
I think you should mention this somewhere in the docs of this extension, since it could cause unexpected behaviour.
Since the Javascript for Recaptcha is integrated from an external source (Google Server), the corresponding property should also be set so that the compression of JS files can be activated globally on the page.
The corresponding line should therefore be added to "setup.typoscript":
page.includeJSFooterlibs.recaptcha.external = 1
Hello, thanks very much for this extension. We've been using it on a 9.5LTS version that I recently upgraded to 11LTS as I saw this was compatible. We're getting an exception now when loading the main form backend module or forms on the frontend:
(1/1) #1489260796 TYPO3\CMS\Form\Mvc\Configuration\Exception\CycleInheritancesException
TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin does not exist within the configuration
in /home/<--snipped username-->/public_html/typo3/sysext/form/Classes/Mvc/Configuration/InheritancesResolverService.php line 258
$inheritedConfiguration = $inheritedConfiguration[$key];
}
if ($inheritedConfiguration === null) {
throw new CycleInheritancesException(
$inheritancePath . ' does not exist within the configuration',
1489260796
);
}
at TYPO3\CMS\Form\Mvc\Configuration\InheritancesResolverService->resolveInheritancesRecursive(array('TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'))
in /home/<--snipped username-->/public_html/typo3/sysext/form/Classes/Mvc/Configuration/InheritancesResolverService.php line 193
$inheritances = $this->getValueByPath($this->referenceConfiguration, $path . '.' . self::INHERITANCE_OPERATOR);
//and replace the __inheritance operator by the respective partial
if (is_array($inheritances)) {
$inheritedConfigurations = $this->resolveInheritancesRecursive($inheritances);
$configuration[$key] = array_replace_recursive($inheritedConfigurations, $configuration[$key]);
}
//remove the inheritance operator from configuration
at TYPO3\CMS\Form\Mvc\Configuration\InheritancesResolverService->resolve(array('RecaptchaMixin' => array('__inheritances' => array('TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'), 'formEditor' => array('editors' => array(array('identifier' => 'validators', 'templateName' => 'Inspector-ValidatorsEditor', 'label' => 'formEditor.elements.FormElement.editor.recaptchaValidator.label', 'selectOptions' => array(array('value' => 'Recaptcha', 'label' => 'formEditor.elements.TextMixin.validators.Recaptcha.editor.header.label'))))))), array('TYPO3', 'CMS', 'Form', 'mixins', 'formElementMixins', 'RecaptchaMixin'), false)
Not a programmer (more of an integrator) but did some digging. Looks like its related to this deprecation: Deprecation: #89742 - Form mixins
Description
All mixins in the “form” extension have been deprecated and should not be used anymore. This affects all inheritances from TYPO3.CMS.Form.mixins.
The mixins have been deprecated with TYPO3v10 and will be removed with TYPO3v11.
Impact
Form setup inheriting mixins from TYPO3.CMS.Form.mixins. will trigger a deprecation warning in TYPO3v10.
With TYPO3v11 these mixins will be removed which will lead to an error.
Affected Installations
Instances using the “form” extension and inheriting from TYPO3.CMS.Form.mixins.* in their form setup.
Migration
Embed the essential parts from TYPO3.CMS.Form.mixins.* or migrate them to custom mixins.
and this section of the Recaptcha.yaml. Sorry I don't know how to fix it, but I'm trying to read up on what mixins are in relation to the form framework. Hope its an easy fix.
Again thanks for the great extension, hope this is enough info.
Context: c46c368
Hi!
I see that you add the hl param to the data-sitekey attribute. Is this documented? If we use 8.3 we got "invalid key" messages. If we use the old way (8.2.8) we have no problems. Maybe you can explain the commit?
Thanks :-)
I'm not sure if I'm missing something but the reCaptcha is always displayed in english no matter what value I set for lang
constant.
It also fails to auto-detect language if I leave lang
constant empty.
TYPO3 8.7
reCAPTCHA 8.2.0
jsInline
requires the array key to be numeric. In typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
cObjGet()
filters and sorts the array keys with filterAndSortByNumericKeys()
and the help of MathUtility::canBeInterpretedAsInteger()
.
This is done by a type cast to int
and a comparison with the original key. This type cast fails with numbers greater than 2147483647
on 32bit operation systems. Yes, there are still web hosting companies out there with 32bit operation systems!
This one was hard to tackle down because there is no error message. It just doesn't get rendered in the frontend although in the TypoScript Object Browser everything looks fine.
This workaround fixed the problem for me:
page.jsInline.1508480348393 >
page.jsInline.1508480348 = TEXT
page.jsInline.1508480348 {
value = function onRecaptchaSubmit() { document.getElementById('{$plugin.tx_recaptcha.invisible_recaptcha_formname}').submit(); return false; }
if.isTrue = {$plugin.tx_recaptcha.include_invisible_recaptcha_callback}
}
Hi, small question have you already a solution to integrate the recaptcha on powermail? Cheers Chris
See Pull request: https://github.com/evoWeb/recaptcha/pulls
I have an issue with the settings of the "public_key" and "private_key".
I use envvars in a Docker Container which again get set to the EXT config settings in the "LocalConfiguration.php". This works fine. I read in the documentation, that the EXT config gets overwritten with the TS template settings.
The TS template has default settings, which then overwrite my EXT config settings.
In order for me to work, I had to set the "public_key" and "private_key" in the TS constants to "" (empty) in order not to overwrite my EXT conf settings.
I did not expect that the "default" values overwrite my EXT config settings, which in my believe should be of higher priority.
Hi,
very much like your extension.
in our setup we need to distinguish different language locales (e.g. germany, switzerland, austria) but setting the plugin setting
plugin.tx_recaptcha.lang = de
depending on the current selected language does not seem to change the resulting recaptch code. Maybe I'm just missing something but I didn't found the right entry point in the extension, otherwise this may be a pull request. :)
Looking forward to any feedback.
kind regards
jonathan
When trying to add the reCaptcha element to a form in TYPO3 8.7.1
7
(and probably also newer versions), the editor crashes and throws an exception, whereas in TYPO3 8.7.1
6
everythig works as intended.
(Adding the element in 8.7.1
6
and then upgrading to 8.7.1
7
and touching the form works, by the way.)
This change in TYPO3 may possibly be responsible for causing this issue.
Exception details:
Exception while property mapping at property path "": No hmac found for property "identifier" (form element "recaptcha-1" / "validators.Recaptcha") #1528591585
TYPO3\CMS\Extbase\Property\Exception thrown in file
/html/typo3/typo3_src-8.7.17/typo3/sysext/extbase/Classes/Property/PropertyMapper.php in line 127
The CaptchaService->queryVerificationServer method:
https://github.com/evoWeb/recaptcha/blob/develop/Classes/Services/CaptchaService.php#L214
Will fail with a fatal PHP error getUrl fails because then it won't return an array but the return type is set to force an array.
So there needs to be a check and if it isn't an array assume false verification.
The View Model isn't loaded with other form element extensions
The ViewModel is always loaded
Install another extension with a custom form element that loads its ViewModel without index, e.g., https://extensions.typo3.org/extension/form_country_select or https://extensions.typo3.org/extension/form_element_linked_checkbox
Change
additionalViewModelModules:
- 'TYPO3/CMS/Recaptcha/Backend/FormEditor/RecaptchaViewModel'
to
additionalViewModelModules:
1647849522: 'TYPO3/CMS/Recaptcha/Backend/FormEditor/RecaptchaViewModel'
Important: Use a unique timestamp to prevent conflicts with other extensions.
Also don't do this inside a Yaml file that is imported by imports
. It seems Symfony has a Bug because the Indexes get removed again. It has to be done in the main Yaml file imported by TypoScript.
By adding the ViewModel without an index it gets added at index 0. Problem is, this is true for every other extension that adds ViewModels like this. This results in only a single ViewModel to be loaded, either the first or last extension (this I didn't check).
Hi,
when can we expect Release 12 to be in TER?
Thanks for your efforts.
Hey there, we have found out, that on our shared hosting there is a problem with the file_get_contents call.
Since it doesn't resolve via the Proxy we end up getting a timed out message from the google api.
We tested to call the api with the TYPO3 RequestFactory and it resolved the Proxy correctly.
Since we are using this extension we would be happy if we can find a solution for this behaviour.
Best Regards
Yannis Viol
Invisible reCaptcha not working on TYPO3 9.5
The reason is that in v12 they changed the templateName to 'Default' instead of 'Html'.
To keep compatibility with v11, I think you should just include Default.html and Default.txt templates.
TYPO3: 10.4.6
Recaptcha: 10.0.2
PHP: 7.3
I think I found a bug.
Creating a new form with a recaptcha creates the following error:
#1297759968 TYPO3\CMS\Extbase\Property\Exception
Exception while property mapping at property path "": No hmac found for property "identifier" (form element "recaptcha-1" / "validators.NotEmpty") #1528591585
After saving, the form is created but without the recaptcha.
But: It still works to edit forms that already exist (with recaptcha). So its just with new forms.
I added the reCaptcha.Extension to Typo3 11.5.13 and generated public and secret key with Google.
I added them in the extension configuration, flushed all caches, added the captcha to my form and still get this error message.
Any ideas on how to avoid it and get the captcha going?
It seems impossible to use the recaptcha with multiple forms on same site?
Hey,
I tried to use your recaptcha plugin in a Typo3 form.
When opening the page with the form i get the following error:
"The validator preset identified by "Recaptcha" could not be found, or the implementationClassName was not specified."
Full stack trace is attached as a PDF.
TYPO3 Exception.pdf
If you need more information please ask.
//EDIT: Using Typo3 8.7.11
Thank you,
Lucas
In the validator, the error
response parameter is used for formatting the error message:
But for errors from the server, error
is an array and not a string:
recaptcha/Classes/Services/CaptchaService.php
Line 207 in a101b74
So the error message will not be found and TYPO3 (8.7) even throws an exception when displaying the form.
Hey, thanks for such a helpful extension 👍
I recently came across an issue where compressed
JS assets are being created on every page request (which can quickly fill a server up).
With thanks to Lukas (on the TYPO3 Slack) it was identified as the Google JS included with this extension being the issue - it seems to request the JS each page load.
Is is possible to include excludeFromConcatenation
as a default? If you're happy for it to be added it I can make a merge request
page.includeJSFooterlibs.recaptcha.excludeFromConcatenation = 1
Thanks again
IHMO the RecaptchaValidator should have $acceptsEmptyValues = false
Without it, a form is valid even if no captcha challenge is posted.
Using the Captcha with the TYPO3 Form editor shows in frontend always the message "reCAPTCHA
Development mode active. Do not expect the captcha to appear ".
Application Context is "Production". Keys are set in extension Settings. I also tried as a quick fix to check the option "plugin.recaptcha.enforceCaptcha". But no luck.
TYPO3 11.5.30
evoweb/recaptcha 11.0.4
I'll try my best to describe the error, feel free to ask if something is not clear.
Bug
Oops, an error occurred!
Argument 2 passed to TYPO3\CMS\Form\Service\TranslationService::translateFormElementError() must be of the type integer, float given, called in C:\projects\myproject\vendor\typo3\cms\typo3\sysext\form\Classes\ViewHelpers\TranslateElementErrorViewHelper.php on line 72
Caused by
This function in RecaptchaValidator.php
:
public function isValid($value)
{
$captcha = \Evoweb\Recaptcha\Services\CaptchaService::getInstance();
if ($captcha !== null) {
$status = $captcha->validateReCaptcha();
if ($status == false || $status['error'] !== '') {
$this->addError(
$this->translateErrorMessage(
'error_recaptcha_' . $status['error'],
'recaptcha'
),
1447258047591
);
}
}
}
The error is caused by the value 1447258047591
, which is interpreted as a float value in my system.
If I change the code to a lower value like 2
it's working again. Happens when using standard reCAPTCHA (not invisible) and not checking it.
I'm not informed about "standardized" Typo3 status codes or if I could just change that value, so I'm interested in your thoughts @garbast.
Edit:
Maximum integer value on 32bit version of php is 2147483647.
System
PHP 7.1.8 (cli) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Windows 10 Pro
XAMPP
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.