diff --git a/0001-oath-toolkit-2.6.5-lockfile.patch b/0001-oath-toolkit-2.6.5-lockfile.patch new file mode 100755 index 0000000000000000000000000000000000000000..e26c0eb461e892b71ac1ea00614201af0782ed4a --- /dev/null +++ b/0001-oath-toolkit-2.6.5-lockfile.patch @@ -0,0 +1,195 @@ +diff --git a/liboath/global.c b/liboath/global.c +index 89c18c5..7fc7b8a 100644 +--- a/liboath/global.c ++++ b/liboath/global.c +@@ -25,9 +25,12 @@ + + #include /* For snprintf, getline. */ + #include /* For strverscmp. */ ++#include /* For free. */ + + #include "gc.h" + ++char *oath_lockfile_path = NULL; ++ + /** + * oath_init: + * +@@ -52,6 +55,8 @@ oath_init (void) + if (gc_init () != GC_OK) + return OATH_CRYPTO_ERROR; + ++ oath_lockfile_path = NULL; ++ + return OATH_OK; + } + +@@ -71,6 +76,11 @@ oath_done (void) + { + gc_done (); + ++ if (oath_lockfile_path) ++ { ++ free(oath_lockfile_path); ++ oath_lockfile_path = NULL; ++ } + return OATH_OK; + } + +@@ -99,3 +109,23 @@ oath_check_version (const char *req_version) + + return NULL; + } ++ ++int ++oath_set_lockfile_path(const char *lockfile) ++{ ++ int l; ++ ++ if (oath_lockfile_path) ++ { ++ free(oath_lockfile_path); ++ oath_lockfile_path = NULL; ++ } ++ ++ if (lockfile) ++ { ++ l = asprintf (&oath_lockfile_path, "%s", lockfile); ++ if (oath_lockfile_path == NULL || ((size_t) l) != strlen (lockfile)) ++ return OATH_PRINTF_ERROR; ++ } ++ return OATH_OK; ++} +diff --git a/liboath/liboath.map b/liboath/liboath.map +index 5e31cef..436cd65 100644 +--- a/liboath/liboath.map ++++ b/liboath/liboath.map +@@ -75,6 +75,7 @@ LIBOATH_2.2.0 + global: + oath_totp_validate3; + oath_totp_validate3_callback; ++ oath_set_lockfile_path; + } LIBOATH_1.12.0; + + LIBOATH_2.6.0 +diff --git a/liboath/oath.h b/liboath/oath.h +index 9d1a277..7ceeaa7 100644 +--- a/liboath/oath.h ++++ b/liboath/oath.h +@@ -136,11 +136,15 @@ typedef enum + + /* Global */ + ++extern char *oath_lockfile_path; ++ + extern OATHAPI int oath_init (void); + extern OATHAPI int oath_done (void); + + extern OATHAPI const char *oath_check_version (const char *req_version); + ++extern OATHAPI int oath_set_lockfile_path(const char *lockfile); ++ + /* Error handling */ + + extern OATHAPI const char *oath_strerror (int err); +diff --git a/liboath/oath.h.in b/liboath/oath.h.in +index 8654342..17fddd3 100644 +--- a/liboath/oath.h.in ++++ b/liboath/oath.h.in +@@ -136,11 +136,15 @@ typedef enum + + /* Global */ + ++extern char *oath_lockfile_path; ++ + extern OATHAPI int oath_init (void); + extern OATHAPI int oath_done (void); + + extern OATHAPI const char *oath_check_version (const char *req_version); + ++extern OATHAPI int oath_set_lockfile_path(const char *lockfile); ++ + /* Error handling */ + + extern OATHAPI const char *oath_strerror (int err); +diff --git a/liboath/usersfile.c b/liboath/usersfile.c +index 9da30fe..d9bd943 100644 +--- a/liboath/usersfile.c ++++ b/liboath/usersfile.c +@@ -323,9 +323,18 @@ update_usersfile (const char *usersfile, + { + int l; + +- l = asprintf (&lockfile, "%s.lock", usersfile); +- if (lockfile == NULL || ((size_t) l) != strlen (usersfile) + 5) +- return OATH_PRINTF_ERROR; ++ if (oath_lockfile_path) ++ { ++ l = asprintf (&lockfile, "%s", oath_lockfile_path); ++ if (lockfile == NULL || ((size_t) l) != strlen (oath_lockfile_path)) ++ return OATH_PRINTF_ERROR; ++ } ++ else ++ { ++ l = asprintf (&lockfile, "%s.lock", usersfile); ++ if (lockfile == NULL || ((size_t) l) != strlen (usersfile) + 5) ++ return OATH_PRINTF_ERROR; ++ } + + lockfh = fopen (lockfile, "w"); + if (!lockfh) +diff --git a/pam_oath/pam_oath.c b/pam_oath/pam_oath.c +index 89310b5..def004f 100644 +--- a/pam_oath/pam_oath.c ++++ b/pam_oath/pam_oath.c +@@ -70,6 +70,7 @@ struct cfg + int try_first_pass; + int use_first_pass; + char *usersfile; ++ char *lockfile; + unsigned digits; + unsigned window; + }; +@@ -84,6 +85,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) + cfg->try_first_pass = 0; + cfg->use_first_pass = 0; + cfg->usersfile = NULL; ++ cfg->lockfile = NULL; + cfg->digits = -1; + cfg->window = 5; + +@@ -99,6 +101,8 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) + cfg->use_first_pass = 1; + if (strncmp (argv[i], "usersfile=", 10) == 0) + cfg->usersfile = (char *) argv[i] + 10; ++ if (strncmp (argv[i], "lockfile=", 9) == 0) ++ cfg->lockfile = (char *) argv[i] + 9; + if (strncmp (argv[i], "digits=", 7) == 0) + cfg->digits = atoi (argv[i] + 7); + if (strncmp (argv[i], "window=", 7) == 0) +@@ -124,6 +128,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) + D (("try_first_pass=%d", cfg->try_first_pass)); + D (("use_first_pass=%d", cfg->use_first_pass)); + D (("usersfile=%s", cfg->usersfile ? cfg->usersfile : "(null)")); ++ D (("lockfile=%s", cfg->lockfile ? cfg->lockfile : "(null)")); + D (("digits=%d", cfg->digits)); + D (("window=%d", cfg->window)); + } +@@ -209,6 +214,17 @@ pam_sm_authenticate (pam_handle_t * pamh, + goto done; + } + ++ if (cfg.lockfile) ++ rc = oath_set_lockfile_path(cfg.lockfile); ++ else ++ rc = oath_set_lockfile_path("/var/lock/pam_oath.lock"); ++ if (rc != OATH_OK) ++ { ++ DBG (("oath_set_lockfile_path() failed (%d)", rc)); ++ retval = PAM_AUTHINFO_UNAVAIL; ++ goto done; ++ } ++ + if (password == NULL) + { + retval = pam_get_item (pamh, PAM_CONV, (const void **) &conv); diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 48a27f84f107814adc73606bc775bbfa278a563c..0000000000000000000000000000000000000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# oath-toolkit - -#### Description -The OATH Toolkit provide components for building one-time password authentication systems.It contains shared libraries,command line tools and a PAM module. - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index 8565a81a95cba3c1ac1d35d70ae3de78aea7d862..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# oath-toolkit - -#### 介绍 -The OATH Toolkit provide components for building one-time password authentication systems.It contains shared libraries,command line tools and a PAM module. - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/oath-toolkit-2.6.5.tar.gz b/oath-toolkit-2.6.5.tar.gz new file mode 100755 index 0000000000000000000000000000000000000000..826ebebf4ed24a18b5c634d5a3ed45438ee0c6e7 Binary files /dev/null and b/oath-toolkit-2.6.5.tar.gz differ diff --git a/oath-toolkit.spec b/oath-toolkit.spec new file mode 100755 index 0000000000000000000000000000000000000000..011cc658030cfa7d871c0ddfb2b0b9bff440d8b4 --- /dev/null +++ b/oath-toolkit.spec @@ -0,0 +1,176 @@ +Name: oath-toolkit +Version: 2.6.5 +Release: 1%{?dist} +License: GPLv3+ +Summary: One-time password components +BuildRequires: pam-devel, gtk-doc, libtool, libtool-ltdl-devel +BuildRequires: xmlsec1-devel, xmlsec1-openssl-devel, autoconf, automake +Source0: http://download.savannah.gnu.org/releases/%{name}/%{name}-%{version}.tar.gz +URL: http://www.nongnu.org/oath-toolkit/ + +Patch1: 0001-oath-toolkit-2.6.5-lockfile.patch + +%description +The OATH Toolkit provide components for building one-time password +authentication systems. It contains shared libraries, command line tools and a +PAM module. Supported technologies include the event-based HOTP algorithm +(RFC4226) and the time-based TOTP algorithm (RFC6238). OATH stands for Open +AuTHentication, which is the organization that specify the algorithms. For +managing secret key files, the Portable Symmetric Key Container (PSKC) format +described in RFC6030 is supported. + +%package -n liboath +Summary: Library for OATH handling +License: LGPLv2+ +Provides: bundled(gnulib) + +%description -n liboath +OATH stands for Open AuTHentication, which is the organization that +specify the algorithms. Supported technologies include the event-based +HOTP algorithm (RFC4226) and the time-based TOTP algorithm (RFC6238). + +%package -n liboath-devel +Summary: Development files for liboath +License: LGPLv2+ +Requires: liboath%{?_isa} = %{version}-%{release} + +%description -n liboath-devel +Development files for liboath. + +%package -n liboath-doc +Summary: Documentation files for liboath +License: LGPLv2+ +Requires: liboath = %{version}-%{release} +Requires: gtk-doc +BuildArch: noarch + +%description -n liboath-doc +Documentation files for liboath. + +%package -n libpskc +Summary: Library for PSKC handling +License: LGPLv2+ +Requires: xml-common +Provides: bundled(gnulib) + +%description -n libpskc +Library for managing secret key files, the Portable Symmetric Key +Container (PSKC) format described in RFC6030 is supported. + +%package -n libpskc-devel +Summary: Development files for libpskc +License: LGPLv2+ +Requires: libpskc%{?_isa} = %{version}-%{release} + +%description -n libpskc-devel +Development files for libpskc. + +%package -n libpskc-doc +Summary: Documentation files for libpskc +License: LGPLv2+ +Requires: libpskc = %{version}-%{release} +Requires: gtk-doc +BuildArch: noarch + +%description -n libpskc-doc +Documentation files for libpskc. + +%package -n oathtool +Summary: A command line tool for generating and validating OTPs +License: GPLv3+ +Provides: bundled(gnulib) + +%description -n oathtool +A command line tool for generating and validating OTPs. + +%package -n pskctool +Summary: A command line tool for manipulating PSKC data +Provides: bundled(gnulib) +Requires: xmlsec1-openssl%{?_isa} + +%description -n pskctool +A command line tool for manipulating PSKC data. + +%package -n pam_oath +Summary: A PAM module for pluggable login authentication for OATH +Requires: pam + +%description -n pam_oath +A PAM module for pluggable login authentication for OATH. + +%prep +%setup -q +%patch1 -p1 -b .lockfile + +%build +autoreconf -fi +%configure --with-pam-dir=%{_libdir}/security + +# Kill rpaths and link with --as-needed +for d in liboath libpskc pskctool oathtool pam_oath +do + sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' $d/libtool + sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' $d/libtool + sed -i 's| -shared | -Wl,--as-needed\0|g' $d/libtool +done + +make %{?_smp_mflags} + +%install +make %{?_smp_mflags} DESTDIR=%{buildroot} install + +# Remove static objects and libtool files +rm -f %{buildroot}%{_libdir}/*.{a,la} +rm -f %{buildroot}%{_libdir}/security/*.la + +# Make /etc/liboath directory +mkdir -p -m 0600 %{buildroot}%{_sysconfdir}/liboath + +%ldconfig_scriptlets -n liboath + +%ldconfig_scriptlets -n libpskc + +%files -n liboath +%doc liboath/COPYING +%attr(0600, root, root) %dir %{_sysconfdir}/liboath +%{_libdir}/liboath.so.* + +%files -n liboath-devel +%{_includedir}/liboath +%{_libdir}/liboath.so +%{_libdir}/pkgconfig/liboath.pc + +%files -n liboath-doc +%{_mandir}/man3/oath* +%{_datadir}/gtk-doc/html/liboath/* + +%files -n libpskc +%doc libpskc/README +%{_libdir}/libpskc.so.* +%{_datadir}/xml/pskc + +%files -n libpskc-devel +%{_includedir}/pskc +%{_libdir}/libpskc.so +%{_libdir}/pkgconfig/libpskc.pc + +%files -n libpskc-doc +%{_mandir}/man3/pskc* +%{_datadir}/gtk-doc/html/libpskc/* + +%files -n oathtool +%doc oathtool/COPYING +%{_bindir}/oathtool +%{_mandir}/man1/oathtool.* + +%files -n pskctool +%{_bindir}/pskctool +%{_mandir}/man1/pskctool.* + +%files -n pam_oath +%doc pam_oath/README pam_oath/COPYING +%{_libdir}/security/pam_oath.so + +%changelog +* Tue Jan 19 2021 yanglongkang - 2.6.5-1 +- Package init diff --git a/oath-toolkit.yaml b/oath-toolkit.yaml new file mode 100755 index 0000000000000000000000000000000000000000..10f5b9267865b43cf1e1546f5ff7629f63b7681d --- /dev/null +++ b/oath-toolkit.yaml @@ -0,0 +1,4 @@ +version_control: git +src_repo: https://gitlab.com/oath-toolkit/oath-toolkit.git +tag_prefix: oath-toolkit +separator: "-"