%define duodir duo_unix-2.2.2
%define baseversion 2.2.2

%global moduletype contrib
%global modulename authlogin_duo

# Disable by default as the tests require root and write to /etc/pam.d
%bcond_without dotests

Name:           duo_unix
Version:        2.2.2
Release:        1
Summary:        Duo two-factor authentication for UNIX systems
Patch0:         %{name}-2.2.2-tests_conflicts.patch
Patch1:         %{name}-2.2.2-config_h_guard.patch

License:        GPLv2
URL:            https://www.duosecurity.com/
Source0:        https://github.com/duosecurity/duo_unix/archive/refs/tags/%{name}-%{version}.tar.gz 
BuildArch:      ppc 

Suggests:       %{name}-doc = %{version}-%{release}

BuildRequires:  make
%if %{toolchain} == "gcc"
Requires:       libgcc >= 10.3.0
%endif

%if %{with dotests}
BuildRequires:  python3.12 >= 3.11.13
%endif

# The third-party Duo package provided by the vendor ships pam_duo in the
# duo_unix package; we recommend the subpackage here to avoid lockout issues
# for systems accidentally being upgraded from the vendor package to this one
# See RHBZ#2134160 for more details.
Recommends:     pam_duo = %{version}-%{release}

%description
Duo provides simple two-factor authentication as a service via:

    1.  Phone callback
    2.  SMS-delivered one-time passcode
    3.  Duo mobile app to generate one-time passcode
    4.  Duo mobile app for smartphone push authentication
    5.  Duo hardware token to generate one-time passcode

This package allows an admin (or ordinary user) to quickly add Duo
authentication to any UNIX login without setting up secondary user
accounts, directory synchronization, servers, or hardware.

%package        doc
Summary:        Documentation and license files for %{name}
BuildArch:      noarch

%description    doc
Documentation and license files for %{name}

#%package -n     pam_duo
#Summary:        A PAM module for duo authentication
#Suggests:       %{name}-doc = %{version}-%{release}
#
#%description -n pam_duo
#A PAM module for duo authentication

%package        devel
Summary:        Development files and documentation for duo_unix
Requires:       %{name} = %{version}-%{release}
#Requires:       pam_duo = %{version}-%{release}

%description    devel
Development files and documentation for duo_unix


%prep
%setup -q -n %{name}-%{name}-%{version}
%patch0

# Duplicate source for 32 & 64 bits
rm -rf   /tmp/%{name}-%{version}-32bit
cp -pr . /tmp/%{name}-%{version}-32bit
rm -rf ..?* .[!.]* *
mv       /tmp/%{name}-%{version}-32bit 32bit
cp -pr 32bit 64bit


# PAM with ssh in 64-bit is not yet supported as ssh is still 32-bit by default.
# So let's build the 32-bit duo_pam only.
# Let's still keep the 64-bit .so in .a file.

%build

export PATH=/opt/freeware/bin:$PATH


cd 32bit
export CC="%{__cc__} -O2"
export CXX="%{__cxx__} -O2"
./bootstrap
./configure \
  --prefix=%{_prefix}\
  --sbindir=%{_prefix}/sbin \
  --mandir=%{_mandir} \
  --libexecdir=%{_libexecdir} \
  --docdir=%{_datadir}/doc/%{name}-%{version} \
  --libdir=%{_libdir} \
  --with-pam=%{_libdir}/security \
  --sysconfdir=%{_sysconfdir}/duo \
  --includedir=%{_includedir}/duo

/opt/freeware/bin/patch -p1 < %{PATCH1}

gmake

/usr/sbin/slibclean

cd ../64bit
export CC="%{__cc__} -O2 -maix64"
export CXX="%{__cxx__} -O2 -maix64"
export OBJECT_MODE=64
./bootstrap
./configure \
  --prefix=%{_prefix}\
  --sbindir=%{_prefix}/sbin \
  --mandir=%{_mandir} \
  --libexecdir=%{_libexecdir}64 \
  --docdir=%{_datadir}/doc/%{name}-%{version} \
  --libdir=%{_libdir}64 \
  --with-pam=%{_libdir}/security \
  --sysconfdir=%{_sysconfdir}/duo \
  --includedir=%{_includedir}/duo

/opt/freeware/bin/patch -p1 < %{PATCH1}

gmake

%install
[ "${RPM_BUILD_ROOT}" != "/" ] && rm -rf ${RPM_BUILD_ROOT}
export PATH=/opt/freeware/bin:$PATH
export AR="/usr/bin/ar -X32_64"

cd 32bit
gmake VERBOSE=1 DESTDIR=${RPM_BUILD_ROOT} install
chmod 0755 ${RPM_BUILD_ROOT}%{_sbindir}/*
mv  ${RPM_BUILD_ROOT}%{_sbindir}/login_duo ${RPM_BUILD_ROOT}%{_sbindir}/login_duo_32bit
(
   cd ${RPM_BUILD_ROOT}%{_sbindir}/
   ln -s login_duo_32bit login_duo
)

mkdir -p %{buildroot}/usr/lib/security %{buildroot}%{_libdir}/security
install -p ./pam_duo/.libs/pam_duo.so %{buildroot}%{_libdir}/security
cd %{buildroot}
ln -sf %{_libdir}/security/pam_duo.so %{buildroot}/usr/lib/security/pam_duo.so
cd -


cd ../64bit
export OBJECT_MODE=64
gmake V=1 install DESTDIR="${RPM_BUILD_ROOT}"

chmod 0755 ${RPM_BUILD_ROOT}%{_sbindir}/*
mv  ${RPM_BUILD_ROOT}%{_sbindir}/login_duo ${RPM_BUILD_ROOT}%{_sbindir}/login_duo_64bit

mkdir -p %{buildroot}/usr/lib/security %{buildroot}%{_libdir}64/security
install -p ./pam_duo/.libs/pam_duo.so %{buildroot}%{_libdir}64/security



%check
%if %{with dotests}
cd 32bit
mkdir pexpect_dep
pip3.12 install pexpect --target ./pexpect_dep
export PYTHONPATH=${PWD}/pexpect_dep
make -i check

cd ../64bit
export OBJECT_MODE=64
mkdir pexpect_dep
pip3.12 install pexpect --target ./pexpect_dep
export PYTHONPATH=${PWD}/pexpect_dep
make -i check

%endif

%clean
[ "${RPM_BUILD_ROOT}" != "/" ] && rm -rf ${RPM_BUILD_ROOT}

%files
%defattr(-,root,system)
%doc 32bit/LICENSES
%dir %{_sysconfdir}/duo
%attr(0755, root, system) %{_sbindir}/login_duo*
%{_sbindir}/duo_unix_support.sh
%{_libdir}/security/pam_duo.so
%{_libdir}64/security/pam_duo.so
/usr/lib/security/pam_duo.so
%config(noreplace) %attr(0600, root, system) %{_sysconfdir}/duo/pam_duo.conf
%attr(0600, sshd, root) %config(noreplace) %{_sysconfdir}/duo/login_duo.conf
%{_mandir}/man8/login_duo.8*
%{_mandir}/man8/pam_duo.*

%files doc
%doc 32bit/README.md 32bit/AUTHORS 32bit/CHANGES

%files devel
%exclude %{_includedir}/duo/unity.h
%exclude %{_includedir}/duo/duo_private.h
%exclude %{_includedir}/duo/common_ini_test.h
%dir %{_includedir}/duo
%{_includedir}/duo/duo.h
%{_includedir}/duo/util.h
%{_includedir}/duo/shell.h
%{_libdir}64/pkgconfig/libduo.pc
%{_mandir}/man3/duo.3*


%changelog
* Wed Jan 21 2026 Shubham Gupta <shubham.gupta36@ibm.com> - 2.2.2-1
- Update to version 2.2.2

* Fri Sep 8 2023 Sangeetha Bandi<sanbandi@in.ibm.com> -  1.12.1-1
- First port to AIX 
