Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cleanup ReCaptcha services #14333

Merged
merged 9 commits into from
Oct 19, 2023
Merged

Cleanup ReCaptcha services #14333

merged 9 commits into from
Oct 19, 2023

Conversation

MikeAlhayek
Copy link
Member

Based on a discussion we had today @sebastienros comment

@jtkech this may reduce some memory allocation reported in #14117

@@ -42,7 +41,9 @@ public async Task<bool> VerifyAsync(string responseToken, string secretKey)
});
try
{
var response = await _httpClient.PostAsync("siteverify", content);
var client = _httpClientFactory.CreateClient(Name);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is assuming that IHttpClientFactory is registered at the tenant level and not the host level so that each tenant for the same resolved name will get a different instance, because it has a custom configuration (Api Url).

But if we didn't set the base uri and have it instead in the POST call then we can even share the same client for all services in the tenant without base Uri.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think here the options are evaluated every time the new client is created. So it would use the current tenant's options. We may have to remove the ReCaptchSettings from the singleton service too

Copy link
Member Author

@MikeAlhayek MikeAlhayek Sep 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sebastienros I did some cleanup. I think ReCaptchaService is okay to make it scoped. Since there is no abstractions here, I removed ReCaptchaClient. I think it's over engineering and adds unnecessary complexity. Now, we register ReCaptchaService as scoped service which should be good in this case. Also, we now use IHttpClientFactory. I also replace Newtonsoft with System.Text.Json as an added bonus.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IHttpClientFactory, was it removed in the meantime?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We still use it. We register HttpClient for the type, so injecting HttpClient in the constructor will return the same instance for that type

@MikeAlhayek MikeAlhayek changed the title Change how ReCaptchaClient is registered Cleanup ReCaptchaClient is registered Sep 14, 2023
@MikeAlhayek MikeAlhayek changed the title Cleanup ReCaptchaClient is registered Cleanup ReCaptcha services Sep 14, 2023
@jtkech
Copy link
Member

jtkech commented Sep 14, 2023

@MikeAlhayek

Yes I know see #14117 (comment) and then #14117 (comment).

I already made something locally, here what I did #14335.

I will look at what you did.

@MikeAlhayek
Copy link
Member Author

@jtkech thank you! I think my approach simplify the process even more by eliminating the need for ReCaptchaClient. let me know what you think

@jtkech
Copy link
Member

jtkech commented Sep 14, 2023

Yes I first thought about it but then I tried to make as few changes as possible.

Good to read https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

In #14335 I kept the typed client pattern.

For the sake of brevity, this guidance shows the most structured way to use IHttpClientFactory, which is to use Typed Clients (Service Agent pattern).

But I have no personal preference, both may do the same.

@@ -13,12 +13,12 @@ public static class ServiceCollectionExtensions
{
public static IServiceCollection AddReCaptcha(this IServiceCollection services, Action<ReCaptchaSettings> configure = null)
{
services.AddHttpClient<ReCaptchaClient>()
services.AddScoped<ReCaptchaService>()
.AddHttpClient<ReCaptchaService>()
Copy link
Member

@jtkech jtkech Sep 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the typed client is now tied to ReCaptchaService, because it is also injected by ReCaptchaLoginFilter on each request, an HttpClient will be still created, by using the IHttpClientFactory but still on each request.

One way would be to make ReCaptchaService a singleton but not good to hold a fully built HttpClient a too long time.

I will add to #14348 the simple fix I did in #14335 which resolves the client lazily, because they are both related to #14117, I may change the lifetime of ReCaptchaService, at least a scoped service, maybe a singleton if it no longer injects the client, will see.

But not incompatible with what you did here because other changes and cleanups look good.

@MikeAlhayek MikeAlhayek enabled auto-merge (squash) October 19, 2023 18:44
@MikeAlhayek MikeAlhayek merged commit e228e45 into main Oct 19, 2023
3 checks passed
@MikeAlhayek MikeAlhayek deleted the ma/recaptcha branch October 19, 2023 18:54
@jtkech
Copy link
Member

jtkech commented Oct 19, 2023

As said here https://github.com/OrchardCMS/OrchardCore/pull/14333/files#r1341924709

If the typed client is now tied to ReCaptchaService, because it is also injected by ReCaptchaLoginFilter on each request, an HttpClient will be still created, by using the IHttpClientFactory but still on each request.

So here the HttpClient is still created on each request.

One solution was to let the HttpClient tied to the RecaptchaClient service but only resolve it on demand, as already done in #14348 that was merged.

Or no longer add a typed client (tied to a service) and in ReCaptchaService inject and then use explicitly the IHttpClientFactory on demand.

@MikeAlhayek
Copy link
Member Author

MikeAlhayek commented Oct 19, 2023

@jtkech so do you rather inject IHttpClientFactory (as I originally had in the ReCaptchaService), or change ReCaptchaService to a singleton instead?

@jtkech
Copy link
Member

jtkech commented Oct 19, 2023

Not a singleton as holding an HttpClient a too long time is not good.

Yes, one solution is to explicitly use the factory on demand.

What I did in #14348 was to keep the typed client pattern and just resolve the tied service on demand.

@jtkech
Copy link
Member

jtkech commented Oct 19, 2023

I can make a PR for whatever solution we prefer

@MikeAlhayek
Copy link
Member Author

@jtkech sorry saw your last comment a bit late. I did a follow up PR to address your recommendation.
Note that we have to user either named or types HttpClient since we are using a policy/behavior for that client.

@jtkech
Copy link
Member

jtkech commented Oct 19, 2023

No problem, will look at it

DrewScoggins added a commit to dotnet-perf-bot/OrchardCore that referenced this pull request Dec 1, 2023
* mkdocs-material 9.2.8

* Release 1.7 (OrchardCMS#14111)

* Switch to 1.8.0-preview

* Position the modal over the navbar (OrchardCMS#14270)

* Add 1.8 release notes file. (OrchardCMS#14277)

* jQuery 3.7.1 (OrchardCMS#14231)

* Add @brutoledo as a contributor

* Add @dannyd89 as a contributor

* Typo SMS features

* Update libphonenumber-csharp 8.13.20 (OrchardCMS#14287)

* NLog.Web.AspNetCore 5.3.4 (OrchardCMS#14283)

* leaflet 1.9.4 (OrchardCMS#14054)

* bootstrap-select 1.14.0-beta3 (OrchardCMS#14282)

* Fixes invalid cookie name (OrchardCMS#14280)

* Add @ludovic-th as a contributor

* Move Moq into tests libraries (OrchardCMS#14260)

* Microsoft.Identity.Web 2.13.4 (OrchardCMS#14292)

* BenchmarkDotNet 0.13.8 (OrchardCMS#14293)

* mkdocs-material 9.3.0

* mkdocs-material 9.3.1

* Remove duplicate alert in settings (OrchardCMS#14299)

* Make WorkflowType extension able (OrchardCMS#14275)

* NET 6.0.22, 7.0.11 (OrchardCMS#14320)

* Update OpenIddict 4.8.0 (OrchardCMS#14321)

* Update Jint 3.0.0-beta-2051 (OrchardCMS#14322)

* Add IsViewOrPageResult() extension (OrchardCMS#14228)

* Use language keywords instead of framework type names for type references (IDE0049) (OrchardCMS#14273)

* Few missing language types in .cs (OrchardCMS#14323)

* Language Types in Razor files (OrchardCMS#14324)

* Handle InvalidToken in UserService.ProcessValidationErrors() (OrchardCMS#14331)

Co-authored-by: Mike Alhayek <[email protected]>

* Make SRI hashes consistent (OrchardCMS#13775)

* Update Form Migrations Create() (OrchardCMS#14272)

* Fix media item icon (OrchardCMS#14342)

* Update Azure.Storage.Blobs 12.18.0 (OrchardCMS#14326)

* mkdocs 1.5.3

* mkdocs-material 9.3.2

* Update Jint to 3.0.0-beta-2052 (OrchardCMS#14369)

* Update libphonenumber-csharp 8.13.21 (OrchardCMS#14376)

* xunit 2.5.1, xunit.runner.visualstudio 2.5.1, xunit.runner.visualstudio 1.3.0 (OrchardCMS#14379)

* Azure.Identity 1.10.1 (OrchardCMS#14378)

* ZString 2.5.1 (OrchardCMS#14377)

* mkdocs-material 9.4.0

* mkdocs-material 9.4.1

* mkdocs-material 9.4.2

* Fix Monaco doc link (OrchardCMS#14387)

* Upgrade to Bootstrap 5.3.2 (OrchardCMS#14294)

* Fixing Icon-Picker and cleanup sass (OrchardCMS#14393)

* Set html classes to make the scripts work again (removed in OrchardCMS#9371) (OrchardCMS#14367)

* Add a fallback function to crypto.randomUUID (OrchardCMS#14371)

* Update HtmlSantizer 8.0.718 (OrchardCMS#14395)

* Update Microsoft.Identity.Web 2.14.0 (OrchardCMS#14394)

* SASS files cleanup in TheAdmin theme (OrchardCMS#14399)

* Fix validation color in the login layout (OrchardCMS#14400)

* Update Fluid 2.5.0 (OrchardCMS#14402)

* Trim Async suffix (OrchardCMS#14407)

Co-authored-by: Vincent Jacquet <[email protected]>

* Typos in OrchardCore.Notifications (OrchardCMS#14409)

* Update libphonenumber-csharp 8.13.22 (OrchardCMS#14408)

* Fix doc typo (OrchardCMS#14411)

* mkdocs-material 9.4.3

* fix: workflow module page list issue when using PostgreSQL OrchardCMS#14334 (OrchardCMS#14412)

* Add @emrahtokalak as a contributor

* Add @vjacquet as a contributor

* Fix randomUUID, modal dialog and duplicate alerts

* Add a fallback function to crypto.randomUUID (OrchardCMS#14371)
* Fix modal dialog location
* Remove duplicate alert in settings (OrchardCMS#14299)
Co-authored-by: Hisham Bin Ateya <[email protected]>

* Add OC.Notifications.Abstractions docs (OrchardCMS#14427)

* Fix `Creating a modular ASP.NET Core application` tutorial (OrchardCMS#14415)

Emphasize that reference must be added from the applicaiton to the module

* mkdocs-material 9.4.4

* Fix form validation and link decoration (BS 5.3) (OrchardCMS#14432)

* Fix admin menu background color on small screen. (OrchardCMS#14434)

* Open the front page in the same browser instead of a blank tab. (OrchardCMS#14435)

* Fix Publish Later Buttons (OrchardCMS#14438)

* Cleanup Archive/Publish Later and remove unnecessary assets and resources (OrchardCMS#14441)

* BenchmarkDotNet 0.13.9 (OrchardCMS#14436)

* Update HtmlSantizer 8.0.723 (OrchardCMS#14429)

* Microsoft.Identity.Web 2.15.1 (OrchardCMS#14437)

* AdminBranding (OrchardCMS#14453)

* Admin Navbar link (OrchardCMS#14454)

* Upgrade TheTheme to use Bootstrap 5.3.2 (OrchardCMS#14451)

* Fix sortable widgets (OrchardCMS#14467)

* Remove "Cannot update your own roles" warning (OrchardCMS#14440)

* Fix null exception in EmailTask (OrchardCMS#14471)

* mkdocs-material 9.4.5

* Fix WidgetsListPart UI (OrchardCMS#14461)

* Memory Leaks (OrchardCMS#14348)

* Update 7.0.12 & 6.0.23 (OrchardCMS#14478)

* OpenIddict 4.9.0 (OrchardCMS#14463)

* Fix an exception in ListPart with header (OrchardCMS#14473)

* fix: workflow module page list issue when using PostgreSQL OrchardCMS#14334 (OrchardCMS#14412) (OrchardCMS#14428)

* Fix roles filter (OrchardCMS#14468)

* Docs tabs

* Enable tabs

* Docs missing links

* Docs enable footer (Previous, Next link)

* Typo Release 1.8

* Docs reference links

* Azure.Identity 1.10.2 (OrchardCMS#14494)

* Update Taxomony field (OrchardCMS#14477)

* Introduce a new Narbar shape (OrchardCMS#14488)

* Can't Reload Stream Config Provider (OrchardCMS#14499)

* Update YesSQL 3.4.0 (OrchardCMS#14491)

* NRE in query editor (OrchardCMS#14501)

* Set index length limit for MySQL (OrchardCMS#14500)

Fix OrchardCMS#14338

* Fix a typo (OrchardCMS#14503)

* Fix TheBlogTheme shared views (OrchardCMS#14493)

* Release 1.7.1 (OrchardCMS#14474)

Fix OrchardCMS#14338

---------

Co-authored-by: yaricrolletservico <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>

* Fix mysql functional tests (OrchardCMS#14502)

* Release 1.7.1 (OrchardCMS#14506)

Co-authored-by: Sébastien Ros <[email protected]>

* Add @yaricrolletservico as a contributor

* mkdocs-material 9.4.6

* Docs GraphQL: Fix url api/graphql

* Fix messages class names (OrchardCMS#14508)

* Update 1.7.1 release notes (OrchardCMS#14509)

* js-cookie does not need to depend on jQuery (OrchardCMS#14511)

* mkdocs-git-revision-date-localized-plugin 1.2.1

* NLog.Web.AspNetCore 5.3.5

* centrally define media resources (OrchardCMS#14512)

* Fix TheAdmin & TheTheme for RTL languages (OrchardCMS#14486)

* Fixing TheTheme newly intruduced accessibility rules and HTML rules violations (Lombiq Technologies: NEST-462) (OrchardCMS#14523)

* Update libphonenumber-csharp 8.13.23 (OrchardCMS#14529)

* Add @yk as a contributor

* Fix MySQL index length (OrchardCMS#14513)

* Release 1.7.2 (OrchardCMS#14532)

* Revert " Add @yk as a contributor"

This reverts commit ce82352.

* Save Shell Config SubSections (OrchardCMS#14490)

* Microsoft.Identity.Web 2.15.2 (OrchardCMS#14540)

* SMTP should send the email if the SSL certificate is invalid (OrchardCMS#14444)

Co-authored-by: Sébastien Ros <[email protected]>

* Thumbnails for media app (OrchardCMS#14528)

* Add a way to restart a workflow instance (OrchardCMS#14470)

* pymdown-extensions 10.3.1

* Cleanup ReCaptcha services (OrchardCMS#14333)

Co-authored-by: Sébastien Ros <[email protected]>

* Change how ReCaptchaService consumes HttpClient (OrchardCMS#14544)

* Move ContentRootPoFileLocationProvider to OC.Localization.Core.PortableObject folder (OrchardCMS#13713)

* User Accounts and Custom User Settings Deployment (OrchardCMS#14208)

Co-authored-by: Mike Alhayek <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>

* xunit 2.5.3 (OrchardCMS#14558)

* Azure.Identity 1.10.3 (OrchardCMS#14557)

* Microsoft.Identity.Web 2.15.3 (OrchardCMS#14556)

* Jint 3.0.0-beta-2053 (OrchardCMS#14560)

* Media caches cleanups (OrchardCMS#14087)

* Add KeyVault without building a config (OrchardCMS#14550)

* Dotnet 8.0 (OrchardCMS#14058)

* Missing sdk (OrchardCMS#14561)

* js-cookie 3.0.5 (OrchardCMS#14559)

* HtmlSanitizer 8.0.746 (OrchardCMS#14577)

* correct bootstrap-select dependency (OrchardCMS#14578)

* Throw descriptive exception when a field is added with no type. (OrchardCMS#14569)

* Add extensions for IDisplayManager (OrchardCMS#14579)

* Register ReCaptchaService as singleton (OrchardCMS#14583)

Co-authored-by: Sébastien Ros <[email protected]>

* Assign the technical name of the field as the display name by default (OrchardCMS#14571)

* Use shape when rendering Http errors to allow cusomization from the UI (OrchardCMS#14545)

* Fix field wrappers CSS class names (OrchardCMS#14547)

* Cleanup ReCaptchaService after changing the registration type (OrchardCMS#14587)

* .NET 6.0.24, 7.0.13 (OrchardCMS#14575)

* Update GetPartWrapperCssClasses and GetFieldWrapperCssClasses helpers (OrchardCMS#14591)

* mkdocs-material 9.4.7

* Improve AdminDashboard Styling (OrchardCMS#14593)

* Monaco 0.44.0

* remove admin.css resource dependency on audit trail list (OrchardCMS#14608)

fixes OrchardCMS#14607

* Update the Admin Dashboard documentation. (OrchardCMS#14602)

* Monaco js error fix (OrchardCMS#14601)

* Remove admin.js dependency on fields and parts (OrchardCMS#14600)

* Update libphonenumber-csharp 8.13.24 (OrchardCMS#14619)

* xunit 2.6.0 (OrchardCMS#14618)

* Update StackExchange.Redis 2.7.4 (OrchardCMS#14620)

* Use CommitAsync() instead od Commit() (OrchardCMS#14622)

* BenchmarkDotNet 0.13.10 (OrchardCMS#14623)

* Add a shortcode for cache busting (OrchardCMS#14621)

Co-authored-by: Zoltán Lehóczky <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>

* Invalidate cache on updating store (OrchardCMS#14612)

* Improve performance for CssClass extensions (OrchardCMS#14615)

* Do not show dashboard widget when `DashboardWidget` is removed. (OrchardCMS#14603)

* mkdocs-material 9.4.8

* Update Jint 3.0.0-beta-2054 (OrchardCMS#14633)

* Address CssClasses helper warning (OrchardCMS#14643)

* Fix content preview editor resource dependency (OrchardCMS#14642)

* Fix the Content-preview script (OrchardCMS#14644)

* Azure.Storage.Blobs 12.19.0 (OrchardCMS#14647)

* xunit 2.6.1 (OrchardCMS#14646)

* Register TwoFactorAuthenticationClaimsProvider service (OrchardCMS#14651)

Fix OrchardCMS#14650

* Fix monaco editor widget error

* Initialize logger for YesSql to enable logging (OrchardCMS#14659)

* Cleanup workflow activities (OrchardCMS#14597)

* Microsoft.NET.Test.Sdk 17.8.0 (OrchardCMS#14665)

* pymdown-extensions 10.4

* Minor performance update for HtmlContentBuilderExtensions (OrchardCMS#14664)

* Update MailKit & MimiKit 4.3.0 (OrchardCMS#14669)

* Update xUnit Analyzers 1.5.0 (OrchardCMS#14670)

* Update Azure.Extensions.AspNetCore.Configuration.Secrets 1.3.0 (OrchardCMS#14672)

* Update Jint 3.0.0-beta-2055 (OrchardCMS#14671)

* Log a message every time Redis ConnectionMultiplexer is created

* Update Azure Identity 1.10.4 (OrchardCMS#14690)

* .NET 8.0.0 (OrchardCMS#14688)

* Update Azure Blobs 12.19.1 (OrchardCMS#14691)

* Update .NET 7.0.14 & .NET 6.0.25 (OrchardCMS#14689)

* Fix missing claims for OpenID code flow. (OrchardCMS#14686)

* OpenIddict 4.10.0 (OrchardCMS#14692)

* Add form originated http redirect task (OrchardCMS#14610)

* Set the docker image to .NET 8 (OrchardCMS#14696)

* Update workflows and test runners to use .net 8 (OrchardCMS#14702)

* Update YesSql to version 3.5.0 (OrchardCMS#14706)

* Update Moq 4.20.69 (OrchardCMS#14705)

* Drop support for .NET 6/7 (OrchardCMS#14695)

* mkdocs-material 9.4.9

* Update Microsoft.SourceLink.GitHub 8.0.0 (OrchardCMS#14714)

* Remove 'Async' term from a synchronous method (OrchardCMS#14710)

* Missing connection dispose (OrchardCMS#14709)

* Use C# 12.0 (OrchardCMS#14713)

* Little cleanup (OrchardCMS#14711)

* Register DataProtection_Azure asynchronously (OrchardCMS#14687)

* Typos in Media (OrchardCMS#14708)

* Update DocumentFormat.OpenXml 3.0.0 (OrchardCMS#14718)

* mkdocs-material 9.4.10

* xUnit VS runner (OrchardCMS#14725)

* Update xunit analyzers 1.6.0 (OrchardCMS#14724)

* Update xunit 2.6.2 (OrchardCMS#14723)

* Should not invalidate the cache of a Volatile Document. (OrchardCMS#14720)

As it is never persisted and can't be retrieved from a given store, see PR comment.

* Update Jint 3.0.0-beta-2056 (OrchardCMS#14729)

* Fix the Github release action on Windows (OrchardCMS#14707)

* Add a way to Remove User from a Role (Issue OrchardCMS#14632) (OrchardCMS#14652)

---------

Co-authored-by: Mike Alhayek <[email protected]>

* Update Microsoft.Identity.Web 2.15.5 (OrchardCMS#14733)

* Update libphonenumber-csharp  8.13.24 (OrchardCMS#14734)

* Fix Docker build (OrchardCMS#14736)

* Fix docker build (OrchardCMS#14737)

* Fix doc semantic error (OrchardCMS#14742)

* mkdocs-material>=9.4.11

* Add Async method to ContentDefinitionManager to prevent possible thread starvation (OrchardCMS#14668)

* Cleanup notifications module (OrchardCMS#14745)

* Pre-render Navbar to allow resource injection (OrchardCMS#14747)

* Add As/Put method to ISite to allow caching (OrchardCMS#14372)

* Typo (OrchardCMS#14741)

* Cleanup (OrchardCMS#14740)

* Remove compiler directives (OrchardCMS#14739)

* mkdocs-material 9.4.12

* Update HtmlSanitizer 8.0.795 (OrchardCMS#14753)

* Update  AngleSharp 1.0.6 (OrchardCMS#14673)

* pymdown-extensions 10.5

* mkdocs-material 9.4.13

* Pre-render Navbar to allow resource injection (OrchardCMS#14755)

* Don't throw lock timeout if shell activated (OrchardCMS#14756)

* Azure DP Initializer (OrchardCMS#14750)

* mkdocs-material 9.4.14

* Update Microsoft.Identity.Web 2.16.0 (OrchardCMS#14778)

* Missing OC.Media dependency (OrchardCMS#14758)

* Remove the double scroll in the notification item (OrchardCMS#14781)

* Update libphonenumber-csharp 8.13.26 (OrchardCMS#14788)

* Fix multi-targeting file locks (OrchardCMS#14732)

* Fix send button style in OC.Email (OrchardCMS#14804)

* Adding helpful methods for ContentPart, ContentType builders and Cont… (OrchardCMS#14717)

* Add full type name for Lucene lock type

In net9.0 the runtime now exposes it's own `Lock` type, dotnet/runtime#87672. This causes
a build break as there is a collision between the Lucene type and the
runtime type.

---------

Co-authored-by: Antoine Griffard <[email protected]>
Co-authored-by: Sébastien Ros <[email protected]>
Co-authored-by: Mike Alhayek <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>
Co-authored-by: ludovic-th <[email protected]>
Co-authored-by: Tony Han <[email protected]>
Co-authored-by: Jean-Thierry Kéchichian <[email protected]>
Co-authored-by: Steven Spits <[email protected]>
Co-authored-by: vjacquet <[email protected]>
Co-authored-by: Vincent Jacquet <[email protected]>
Co-authored-by: Szymon Seliga <[email protected]>
Co-authored-by: Emrah Tokalak <[email protected]>
Co-authored-by: Andrii Chebukin <[email protected]>
Co-authored-by: yaricrolletservico <[email protected]>
Co-authored-by: Thomas Bolon <[email protected]>
Co-authored-by: yk <[email protected]>
Co-authored-by: Krisztián Németh <[email protected]>
Co-authored-by: lampersky <[email protected]>
Co-authored-by: Szabolcs Deme <[email protected]>
Co-authored-by: Zoltán Lehóczky <[email protected]>
Co-authored-by: Spyros <[email protected]>
Co-authored-by: Matt Varblow <[email protected]>
Co-authored-by: Banzai316 <[email protected]>
Co-authored-by: minhtaile2712 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants