git: 754e77708d67 - 2024Q2 - ftp/libfilezilla: fix build by adding missing patch

From: Kurt Jaeger <pi_at_FreeBSD.org>
Date: Sun, 21 Apr 2024 07:23:02 UTC
The branch 2024Q2 has been updated by pi:

URL: https://cgit.FreeBSD.org/ports/commit/?id=754e77708d675b79550a4c591314df5a60303a21

commit 754e77708d675b79550a4c591314df5a60303a21
Author:     Matthias Andree <mandree@FreeBSD.org>
AuthorDate: 2024-04-21 07:21:14 +0000
Commit:     Kurt Jaeger <pi@FreeBSD.org>
CommitDate: 2024-04-21 07:22:50 +0000

    ftp/libfilezilla: fix build by adding missing patch
    
    PR:     278463
    (cherry picked from commit c392b136785e44d496fb7dc744ee616a9374197e)
---
 ftp/libfilezilla/files/patch-lib_impersonation.cpp | 73 ++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/ftp/libfilezilla/files/patch-lib_impersonation.cpp b/ftp/libfilezilla/files/patch-lib_impersonation.cpp
new file mode 100644
index 000000000000..423e5bf90e44
--- /dev/null
+++ b/ftp/libfilezilla/files/patch-lib_impersonation.cpp
@@ -0,0 +1,73 @@
+FreeBSD defines crypt_r() via <unistd.h>.
+
+--- lib/impersonation.cpp.orig	2023-06-28 13:00:47 UTC
++++ lib/impersonation.cpp
+@@ -8,8 +8,6 @@
+ #include <tuple>
+ 
+ #if FZ_UNIX
+-#include <crypt.h>
+-#include <shadow.h>
+ #endif
+ #include <grp.h>
+ #include <limits.h>
+@@ -98,43 +96,7 @@ std::optional<gid_t> get_group(native_string const& gn
+ 	return {};
+ }
+ 
+-#if FZ_UNIX
+-struct shadow_holder {
+-	shadow_holder() = default;
+-	shadow_holder(shadow_holder const&) = delete;
+-	shadow_holder(shadow_holder &&) = default;
+-
+-	shadow_holder& operator=(shadow_holder const&) = delete;
+-	shadow_holder& operator=(shadow_holder &&) = default;
+-
+-	~shadow_holder() noexcept = default;
+-
+-	struct spwd* shadow_{};
+-
+-	struct spwd shadow_buffer_;
+-	buffer buf_{};
+-};
+-
+-shadow_holder get_shadow(native_string const& username)
+-{
+-	shadow_holder ret;
+-
+-	size_t s = 1024;
+-	int res{};
+-	do {
+-		s *= 2;
+-		ret.buf_.get(s);
+-		res = getspnam_r(username.c_str(), &ret.shadow_buffer_, reinterpret_cast<char*>(ret.buf_.get(s)), s, &ret.shadow_);
+-	} while (res == ERANGE);
+-
+-	if (res) {
+-		ret.shadow_ = nullptr;
+-	}
+-
+-	return ret;
+ }
+-#endif
+-}
+ 
+ class impersonation_token_impl final
+ {
+@@ -191,14 +153,7 @@ bool check_auth(native_string const& username, native_
+ bool check_auth(native_string const& username, native_string const& password)
+ {
+ #if FZ_UNIX
+-	auto shadow = get_shadow(username);
+-	if (shadow.shadow_) {
+-		struct crypt_data data{};
+-		char* encrypted = crypt_r(password.c_str(), shadow.shadow_->sp_pwdp, &data);
+-		if (encrypted && !strcmp(encrypted, shadow.shadow_->sp_pwdp)) {
+-			return true;
+-		}
+-	}
++	return false; // FreeBSD does not have shadow.h support
+ #elif FZ_MAC
+ 	bool ret{};
+