Hello community,
here is the log from the commit of package apache2-mod_authn_otp for
openSUSE:Factory checked in at 2019-06-24 21:52:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/apache2-mod_authn_otp (Old)
and /work/SRC/openSUSE:Factory/.apache2-mod_authn_otp.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "apache2-mod_authn_otp"
Mon Jun 24 21:52:51 2019 rev:9 rq:711566 version:1.1.9
Changes:
--------
---
/work/SRC/openSUSE:Factory/apache2-mod_authn_otp/apache2-mod_authn_otp.changes
2017-11-01 11:09:53.521217230 +0100
+++
/work/SRC/openSUSE:Factory/.apache2-mod_authn_otp.new.4615/apache2-mod_authn_otp.changes
2019-06-24 21:53:51.916129288 +0200
@@ -1,0 +2,7 @@
+Sat Jun 22 18:14:41 UTC 2019 - [email protected]
+
+- Update to version 1.1.9
+ + Added genotpurl(1) utility
+ + Added "-F" flag to otptool(1).
+
+-------------------------------------------------------------------
Old:
----
mod_authn_otp-1.1.8.tar.gz
New:
----
mod_authn_otp-1.1.9.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ apache2-mod_authn_otp.spec ++++++
--- /var/tmp/diff_new_pack.Rp01pw/_old 2019-06-24 21:53:53.188130271 +0200
+++ /var/tmp/diff_new_pack.Rp01pw/_new 2019-06-24 21:53:53.244130314 +0200
@@ -1,7 +1,7 @@
#
# spec file for package apache2-mod_authn_otp
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2012 Archie L. Cobbs <[email protected]>
#
# All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
%define mod_name mod_authn_otp
Name: apache2-%{mod_name}
-Version: 1.1.8
+Version: 1.1.9
Release: 0
Summary: Apache module for one-time password authentication
License: Apache-2.0
@@ -157,7 +157,9 @@
%defattr(-,root,root,-)
%{apache_libexecdir}/%{mod_name}.so
%{_bindir}/otptool
+%{_bindir}/genotpurl
%{_mandir}/man1/otptool.1.gz
+%{_mandir}/man1/genotpurl.1.gz
%doc CHANGES LICENSE README users.sample
%changelog
++++++ mod_authn_otp-1.1.8.tar.gz -> mod_authn_otp-1.1.9.tar.gz ++++++
++++ 2655 lines of diff (skipped)
++++ retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/CHANGES new/mod_authn_otp-1.1.9/CHANGES
--- old/mod_authn_otp-1.1.8/CHANGES 2017-10-30 16:40:57.000000000 +0100
+++ new/mod_authn_otp-1.1.9/CHANGES 2019-06-22 19:59:12.000000000 +0200
@@ -1,3 +1,8 @@
+Version 1.1.9 released June 22, 2019
+
+ - Added genotpurl(1) utility
+ - Added "-F" flag to otptool(1).
+
Version 1.1.8 relesed October 30, 2017
- Added PINFakeBasicAuth configuration option
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/INSTALL new/mod_authn_otp-1.1.9/INSTALL
--- old/mod_authn_otp-1.1.8/INSTALL 2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/INSTALL 2019-06-22 19:58:39.000000000 +0200
@@ -12,3 +12,19 @@
3. Run `make'
4. Run `make install'
+Once the module is installed on your system, you'll also need to do the
+following steps to add it to Apache:
+
+ 1. Add the "mod_authn_otp" module to your Apache config. This usually
+ involves adding a line looking something like this:
+
+ LoadModule authn_otp_module /usr/lib64/apache2/mod_authn_otp.so
+
+ There should already be a bunch of similar "LoadModule" lines nearby.
+
+ 2. Enable the "mod_authn_otp" module, typically by running this command:
+
+ a2enmod authn_otp
+
+ 3. Restart Apache
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/Makefile.am new/mod_authn_otp-1.1.9/Makefile.am
--- old/mod_authn_otp-1.1.8/Makefile.am 2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/Makefile.am 2019-06-22 20:04:49.000000000 +0200
@@ -30,16 +30,19 @@
install-exec-hook:
test -z "$(STRIP)" || $(STRIP) $(DESTDIR)`$(APXS) -q
LIBEXECDIR`/mod_authn_otp.so
test -z "$(STRIP)" || $(STRIP) $(DESTDIR)$(bindir)/otptool
+ test -z "$(STRIP)" || $(STRIP) $(DESTDIR)$(bindir)/genotpurl
-bin_PROGRAMS= otptool
+bin_PROGRAMS= otptool genotpurl
-noinst_HEADERS= otptool.h
+noinst_HEADERS= otptool.h errinc.h base32.h
-man_MANS= otptool.1
+man_MANS= otptool.1 genotpurl.1
otptool_SOURCES= otptool.c hotp.c motp.c phex.c
+genotpurl_SOURCES= genotpurl.c base32.c
+
CLEANFILES= *.la *.lo *.o *.so *.slo .libs/*
-EXTRA_DIST= CHANGES LICENSE mod_authn_otp.c users.sample otptool.1
+EXTRA_DIST= CHANGES LICENSE mod_authn_otp.c genotpurl.c users.sample
otptool.1 genotpurl.1 base32.c
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/base32.c new/mod_authn_otp-1.1.9/base32.c
--- old/mod_authn_otp-1.1.8/base32.c 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/base32.c 2018-07-22 04:26:56.000000000 +0200
@@ -0,0 +1,233 @@
+/**
+ * base32 (de)coder implementation as specified by RFC4648.
+ *
+ * Copyright (c) 2010 Adrien Kunysz
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ **/
+
+#include <assert.h> // assert()
+#include <limits.h> // CHAR_BIT
+
+#include "base32.h"
+
+/**
+ * Let this be a sequence of plain data before encoding:
+ *
+ * 01234567 01234567 01234567 01234567 01234567
+ * +--------+--------+--------+--------+--------+
+ * |< 0 >< 1| >< 2 ><|.3 >< 4.|>< 5 ><.|6 >< 7 >|
+ * +--------+--------+--------+--------+--------+
+ *
+ * There are 5 octets of 8 bits each in each sequence.
+ * There are 8 blocks of 5 bits each in each sequence.
+ *
+ * You probably want to refer to that graph when reading the algorithms in this
+ * file. We use "octet" instead of "byte" intentionnaly as we really work with
+ * 8 bits quantities. This implementation will probably not work properly on
+ * systems that don't have exactly 8 bits per (unsigned) char.
+ **/
+
+static size_t min(size_t x, size_t y)
+{
+ return x < y ? x : y;
+}
+
+static const unsigned char PADDING_CHAR = '=';
+
+/**
+ * Pad the given buffer with len padding characters.
+ */
+static void pad(unsigned char *buf, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ buf[i] = PADDING_CHAR;
+}
+
+/**
+ * This convert a 5 bits value into a base32 character.
+ * Only the 5 least significant bits are used.
+ */
+static unsigned char encode_char(unsigned char c)
+{
+ static unsigned char base32[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+ return base32[c & 0x1F]; // 0001 1111
+}
+
+/**
+ * Decode given character into a 5 bits value.
+ * Returns -1 iff the argument given was an invalid base32 character
+ * or a padding character.
+ */
+static int decode_char(unsigned char c)
+{
+ char retval = -1;
+
+ if (c >= 'A' && c <= 'Z')
+ retval = c - 'A';
+ if (c >= '2' && c <= '7')
+ retval = c - '2' + 26;
+
+ assert(retval == -1 || ((retval & 0x1F) == retval));
+
+ return retval;
+}
+
+/**
+ * Given a block id between 0 and 7 inclusive, this will return the index of
+ * the octet in which this block starts. For example, given 3 it will return 1
+ * because block 3 starts in octet 1:
+ *
+ * +--------+--------+
+ * | ......<|.3 >....|
+ * +--------+--------+
+ * octet 1 | octet 2
+ */
+static int get_octet(int block)
+{
+ assert(block >= 0 && block < 8);
+ return (block*5) / 8;
+}
+
+/**
+ * Given a block id between 0 and 7 inclusive, this will return how many bits
+ * we can drop at the end of the octet in which this block starts.
+ * For example, given block 0 it will return 3 because there are 3 bits
+ * we don't care about at the end:
+ *
+ * +--------+-
+ * |< 0 >...|
+ * +--------+-
+ *
+ * Given block 1, it will return -2 because there
+ * are actually two bits missing to have a complete block:
+ *
+ * +--------+-
+ * |.....< 1|..
+ * +--------+-
+ **/
+static int get_offset(int block)
+{
+ assert(block >= 0 && block < 8);
+ return (8 - 5 - (5*block) % 8);
+}
+
+/**
+ * Like "b >> offset" but it will do the right thing with negative offset.
+ * We need this as bitwise shifting by a negative offset is undefined
+ * behavior.
+ */
+static unsigned char shift_right(unsigned char byte, char offset)
+{
+ if (offset > 0)
+ return byte >> offset;
+ else
+ return byte << -offset;
+}
+
+static unsigned char shift_left(unsigned char byte, char offset)
+{
+ return shift_right(byte, - offset);
+}
+
+/**
+ * Encode a sequence. A sequence is no longer than 5 octets by definition.
+ * Thus passing a length greater than 5 to this function is an error. Encoding
+ * sequences shorter than 5 octets is supported and padding will be added to
the
+ * output as per the specification.
+ */
+static void encode_sequence(const unsigned char *plain, int len, unsigned char
*coded)
+{
+ int block;
+
+ assert(CHAR_BIT == 8); // not sure this would work otherwise
+ assert(len >= 0 && len <= 5);
+
+ for (block = 0; block < 8; block++) {
+ int octet = get_octet(block); // figure out which octet this
block starts in
+ int junk = get_offset(block); // how many bits do we drop from
this octet?
+
+ if (octet >= len) { // we hit the end of the buffer
+ pad(&coded[block], 8 - block);
+ return;
+ }
+
+ unsigned char c = shift_right(plain[octet], junk); // first
part
+
+ if (junk < 0 // is there a second part?
+ && octet < len - 1) // is there still something to read?
+ {
+ c |= shift_right(plain[octet+1], 8 + junk);
+ }
+ coded[block] = encode_char(c);
+ }
+}
+
+void base32_encode(const unsigned char *plain, size_t len, unsigned char
*coded)
+{
+ size_t i;
+ size_t j;
+
+ // All the hard work is done in encode_sequence(),
+ // here we just need to feed it the data sequence by sequence.
+ for (i = 0, j = 0; i < len; i += 5, j += 8) {
+ encode_sequence(&plain[i], min(len - i, 5), &coded[j]);
+ }
+}
+
+static int decode_sequence(const unsigned char *coded, unsigned char *plain)
+{
+ int block;
+
+ assert(CHAR_BIT == 8);
+ assert(coded && plain);
+
+ plain[0] = 0;
+ for (block = 0; block < 8; block++) {
+ int offset = get_offset(block);
+ int octet = get_octet(block);
+
+ int c = decode_char(coded[block]);
+ if (c < 0) // invalid char, stop here
+ return octet;
+
+ plain[octet] |= shift_left(c, offset);
+ if (offset < 0) { // does this block overflows to next octet?
+ assert(octet < 4);
+ plain[octet+1] = shift_left(c, 8 + offset);
+ }
+ }
+ return 5;
+}
+
+size_t base32_decode(const unsigned char *coded, unsigned char *plain)
+{
+ size_t written = 0;
+ size_t i;
+ size_t j;
+
+ for (i = 0, j = 0; ; i += 8, j += 5) {
+ int n = decode_sequence(&coded[i], &plain[j]);
+ written += n;
+ if (n < 5)
+ return written;
+ }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/base32.h new/mod_authn_otp-1.1.9/base32.h
--- old/mod_authn_otp-1.1.8/base32.h 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/base32.h 2018-07-22 04:26:56.000000000 +0200
@@ -0,0 +1,4 @@
+#include <sys/types.h>
+
+extern void base32_encode(const unsigned char *plain, size_t len, unsigned
char *coded);
+extern size_t base32_decode(const unsigned char *coded, unsigned char *plain);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/configure.ac new/mod_authn_otp-1.1.9/configure.ac
--- old/mod_authn_otp-1.1.8/configure.ac 2017-10-30 16:36:25.000000000
+0100
+++ new/mod_authn_otp-1.1.9/configure.ac 2019-06-22 19:59:23.000000000
+0200
@@ -17,7 +17,7 @@
# limitations under the License.
#
-AC_INIT([mod_authn_otp Apache2 authentication module supporting one-time
passwords], [1.1.8], [https://github.com/archiecobbs/mod-authn-otp],
[mod_authn_otp])
+AC_INIT([mod_authn_otp Apache2 authentication module supporting one-time
passwords], [1.1.9], [https://github.com/archiecobbs/mod-authn-otp],
[mod_authn_otp])
AC_CONFIG_AUX_DIR(scripts)
AM_INIT_AUTOMAKE
dnl AM_MAINTAINER_MODE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/errinc.h new/mod_authn_otp-1.1.9/errinc.h
--- old/mod_authn_otp-1.1.8/errinc.h 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/errinc.h 2018-07-22 04:27:53.000000000 +0200
@@ -0,0 +1,48 @@
+
+/*
+ * Copyright 2009 Archie L. Cobbs <[email protected]>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+
+#ifdef HAVE_ERR_H
+#include <err.h>
+#else
+#define err(E, FMT...) do {
\
+ int _esave = (errno);
\
+ fprintf(stderr, "%s: ", PROG_NAME);
\
+ fprintf(stderr, FMT);
\
+ fprintf(stderr, ": %s\n",
strerror(_esave)); \
+ exit(E);
\
+ } while (0)
+#define errx(E, FMT...) do {
\
+ fprintf(stderr, "%s: ", PROG_NAME);
\
+ fprintf(stderr, FMT);
\
+ fprintf(stderr, "\n");
\
+ exit(E);
\
+ } while (0)
+#define warn(FMT...) do {
\
+ int _esave = (errno);
\
+ fprintf(stderr, "%s: ", PROG_NAME);
\
+ fprintf(stderr, FMT);
\
+ fprintf(stderr, ": %s\n",
strerror(_esave)); \
+ } while (0)
+#define warnx(FMT...) do {
\
+ fprintf(stderr, "%s: ", PROG_NAME);
\
+ fprintf(stderr, FMT);
\
+ fprintf(stderr, "\n");
\
+ } while (0)
+#endif
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/genotpurl.1 new/mod_authn_otp-1.1.9/genotpurl.1
--- old/mod_authn_otp-1.1.8/genotpurl.1 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/genotpurl.1 2018-07-22 04:28:45.000000000 +0200
@@ -0,0 +1,112 @@
+.\" -*- nroff -*-
+.\"
+.\" genotpurl - Generate Google Authenticator URLs
+.\"
+.\" Copyright 2009 Archie L. Cobbs <[email protected]>
+.\"
+.\" Licensed under the Apache License, Version 2.0 (the "License");
+.\" you may not use this file except in compliance with the License.
+.\" You may obtain a copy of the License at
+.\"
+.\" http://www.apache.org/licenses/LICENSE-2.0
+.\"
+.\" Unless required by applicable law or agreed to in writing, software
+.\" distributed under the License is distributed on an "AS IS" BASIS,
+.\" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.\" See the License for the specific language governing permissions and
+.\" limitations under the License.
+.\"/
+.Dd July 21, 2018
+.Dt GENOTPURL 1
+.Os
+.Sh NAME
+.Nm genotpurl
+.Nd Generate Google Authenticator URLs
+.Sh SYNOPSIS
+.Nm genotpurl
+.Bk -words
+.Fl I Ar issuer
+.Fl L Ar label
+.Op Fl k Ar key
+.Op Fl i
+.Op Fl c Ar counter
+.Op Fl d Ar num-digits
+.Op Fl p Ar period
+.Ek
+.Sh DESCRIPTION
+.Nm
+is a utility for generating URLs for the Google Authenticator cell phone app,
which
+generates one-time passwords compatible with the HOTP/OATH algorithm defined
by RFC 4226.
+When such and URL is clicked on a cell phone, the token is automatically
installed
+into the Google Authenticator app. This is a convenient way to deploy such
tokens.
+.Pp
+The
+.Ar issuer
+and
+.Ar label
+are required; these strings are displayed in the app along with the current
token value.
+.Pp
+The
+.Ar key
+is the token's binary secret key and is specified as a hexadecimal string.
+If no
+.Ar key
+is given,
+.Nm
+generates a random key and prints it to standard output.
+.Pp
+The
+.Fl i ,
+.Fl c ,
+.Fl d ,
+and
+.Fl p
+flags allow creation of non-standard tokens, but these may not be supported by
Google Authenticator.
+.Sh OPTIONS
+.Bl -tag -width Ds
+.It Fl c
+Specify the starting target counter value for the one-time password generation.
+This flag is incompatible with the
+.Fl t
+flag.
+.It Fl d
+Specify the number of digits in the one-time password.
+The default value is six.
+.It Fl h
+Print the usage message and exit successfully.
+.It Fl I
+Specify token issuer (e.g., "Example Industries, Inc.")
+.It Fl i
+Create an interval-based token instead of a time-based token.
+.It Fl k
+Specify the token binary secret key as a hexadecimal string.
+.Pp
+If no
+.Ar key
+is given,
+.Nm
+generates a random key and prints it to standard output.
+.It Fl L
+Specify token label (e.g., "[email protected]")
+.It Fl p
+Specify the length of a single time interval in seconds.
+The default value is 30 seconds.
+Ignored if
+.Fl i
+is given.
+.El
+.Sh SEE ALSO
+.Rs
+.%T "mod_authn_otp: Apache module for one-time password authentication"
+.%O "https://github.com/archiecobbs/mod-authn-otp"
+.Re
+.Rs
+.%T "Google Authenticator (iOS)"
+.%O "https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8"
+.Re
+.Rs
+.%T "Google Authenticator (Android)"
+.%O
"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en_US"
+.Re
+.Sh AUTHOR
+.An Archie L. Cobbs Aq [email protected]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/genotpurl.c new/mod_authn_otp-1.1.9/genotpurl.c
--- old/mod_authn_otp-1.1.8/genotpurl.c 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/genotpurl.c 2018-07-22 04:27:48.000000000 +0200
@@ -0,0 +1,217 @@
+/*
+ * Generates URLs for Google Authenticator.
+ */
+
+#include <sys/types.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include "errinc.h"
+#include "base32.h"
+
+static void urlencode(FILE *fp, const char *s);
+static void print_key(FILE *fp, const unsigned char *key, u_int len, int
base32);
+static void usage(void);
+
+#define PROG_NAME "genotpurl"
+
+#define DEFAULT_COUNTER 0
+#define DEFAULT_KEYLEN 10
+#define DEFAULT_NUM_DIGITS 6
+#define DEFAULT_PERIOD 30
+
+#define RANDOM_FILE "/dev/urandom"
+
+int
+main(int argc, char **argv)
+{
+#ifdef DEFAULT_ISSUER
+ const char *issuer = DEFAULT_ISSUER;
+#else
+ const char *issuer = NULL;
+#endif
+#ifdef DEFAULT_LABEL
+ const char *label = DEFAULT_LABEL;
+#else
+ const char *label = NULL;
+#endif
+ unsigned int period = DEFAULT_PERIOD;
+ unsigned int counter = DEFAULT_COUNTER;
+ unsigned int num_digits = 6;
+ int time_based = 1;
+ unsigned char *key = NULL;
+ int keylen = DEFAULT_KEYLEN;
+ FILE *fp;
+ int i, j;
+ unsigned int b;
+
+ // Parse command line
+ while ((i = getopt(argc, argv, "c:d:iI:k:L:p:")) != -1) {
+ switch (i) {
+ case 'c':
+ counter = atoi(optarg);
+ break;
+ case 'd':
+ num_digits = atoi(optarg);
+ break;
+ case 'i':
+ time_based = 0;
+ break;
+ case 'I':
+ issuer = optarg;
+ break;
+ case 'k':
+ if (strlen(optarg) % 2 != 0)
+ errx(1, "invalid hex key `%s': odd number of digits", optarg);
+ if ((key = malloc((keylen = strlen(optarg) / 2))) == NULL)
+ err(1, "malloc");
+ for (j = 0; j < keylen; j++) {
+ if (sscanf(optarg + 2 * j, "%2x", &b) != 1)
+ errx(1, "invalid hex key `%s': can't parse", optarg);
+ key[j] = b & 0xff;
+ }
+ break;
+ case 'L':
+ label = optarg;
+ break;
+ case 'p':
+ period = atoi(optarg);
+ break;
+ case '?':
+ default:
+ usage();
+ exit(1);
+ }
+ }
+ argv += optind;
+ argc -= optind;
+ switch (argc) {
+ case 0:
+ break;
+ default:
+ usage();
+ exit(1);
+ }
+
+ // Sanity check
+ if (time_based && counter != DEFAULT_COUNTER)
+ errx(1, "use of `-c' flag is invalid with time-based tokens");
+ if (!time_based && period != DEFAULT_PERIOD)
+ errx(1, "use of `-p' flag is invalid with time-based tokens");
+ if (label == NULL)
+ errx(1, "label required; use `-L' flag");
+ if (issuer == NULL)
+ errx(1, "issuer required; use `-I' flag");
+ if (strchr(issuer, ':') != NULL || strchr(label, ':') != NULL)
+ errx(1, "issuer and label must not contain the colon character");
+ if (time_based && period != DEFAULT_PERIOD)
+ errx(1, "google authenticator does not support time periods other than
%d seconds", DEFAULT_PERIOD);
+ if (num_digits != DEFAULT_NUM_DIGITS)
+ errx(1, "google authenticator does not support number digits other
than %d", DEFAULT_NUM_DIGITS);
+
+ // Generate key (if not supplied)
+ if (key == NULL) {
+ if ((key = malloc((keylen = DEFAULT_KEYLEN))) == NULL)
+ err(1, "malloc");
+ if ((fp = fopen(RANDOM_FILE, "r")) == NULL)
+ err(1, "%s", RANDOM_FILE);
+ if (fread(key, 1, keylen, fp) != keylen)
+ err(1, "%s", RANDOM_FILE);
+ fclose(fp);
+ fprintf(stderr, "generated key (hex): ");
+ print_key(stderr, key, keylen, 0);
+ fprintf(stderr, "\n");
+ }
+
+ // Output URL
+ printf("otpauth://%s/", time_based ? "totp" : "hotp");
+ urlencode(stdout, issuer);
+ printf(":");
+ urlencode(stdout, label);
+ printf("?issuer=");
+ urlencode(stdout, issuer);
+ printf("&secret=");
+ print_key(stdout, key, keylen, 1);
+ if (num_digits != DEFAULT_NUM_DIGITS)
+ printf("&digits=%u", num_digits);
+ if (!time_based)
+ printf("&counter=%u", counter);
+ else if (period != DEFAULT_PERIOD)
+ printf("&period=%u", period);
+ printf("\n");
+
+ // Done
+ return 0;
+}
+
+static void
+urlencode(FILE *fp, const char *s)
+{
+ while (*s != '\0') {
+ if (isalnum(*s))
+ fprintf(fp, "%c", *s);
+ else
+ fprintf(fp, "%%%02x", *s & 0xff);
+ s++;
+ }
+}
+
+static void
+print_key(FILE *fp, const unsigned char *key, u_int len, int base32)
+{
+ unsigned char *buf;
+ u_int buflen;
+ int i;
+
+ if (base32) {
+ buflen = ((len + 4) / 5) * 8;
+ if ((buf = malloc(buflen + 1)) == NULL)
+ err(1, "malloc");
+ buf[buflen] = 0;
+ base32_encode(key, len, buf);
+ assert(buf[buflen] == 0 && (buflen == 0 || buf[buflen - 1] != 0));
+ for (i = 0; i < buflen; i++)
+ fputc(buf[i], fp);
+ free(buf);
+ } else {
+ for (i = 0; i < len; i++)
+ fprintf(fp, "%02x", key[i] & 0xff);
+ }
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "Usage: genotpurl [-i]");
+#ifdef DEFAULT_ISSUER
+ fprintf(stderr, " [-I issuer]");
+#else
+ fprintf(stderr, " -I issuer");
+#endif
+#ifdef DEFAULT_LABEL
+ fprintf(stderr, " [-L label]");
+#else
+ fprintf(stderr, " -L label");
+#endif
+ fprintf(stderr, " [-c counter] [-d num-digits] [-p period] [-k key]\n");
+ fprintf(stderr, "Options:\n");
+ fprintf(stderr, " -c\tInitial counter value (default %d)\n",
DEFAULT_COUNTER);
+ fprintf(stderr, " -d\tNumber of digits (default %d)\n",
DEFAULT_NUM_DIGITS);
+ fprintf(stderr, " -i\tInterval-based instead of time-based\n");
+#ifdef DEFAULT_ISSUER
+ fprintf(stderr, " -I\tSpecify issuer (default \"%s\")\n", DEFAULT_ISSUER);
+#else
+ fprintf(stderr, " -I\tSpecify issuer (REQUIRED)\n");
+#endif
+ fprintf(stderr, " -p\tTime period in seconds (default %d)\n",
DEFAULT_PERIOD);
+ fprintf(stderr, " -k\tSpecify hex key (default auto-generate and
report)\n");
+#ifdef DEFAULT_LABEL
+ fprintf(stderr, " -L\tSpecify label (default \"%s\")\n", DEFAULT_LABEL);
+#else
+ fprintf(stderr, " -L\tSpecify label (REQUIRED)\n");
+#endif
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/mod_authn_otp.c new/mod_authn_otp-1.1.9/mod_authn_otp.c
--- old/mod_authn_otp-1.1.8/mod_authn_otp.c 2017-10-30 16:36:25.000000000
+0100
+++ new/mod_authn_otp-1.1.9/mod_authn_otp.c 2018-05-25 22:58:12.000000000
+0200
@@ -889,7 +889,7 @@
window_start = 1;
window_stop = conf->max_offset;
} else {
- counter = (int)now / user->time_interval + user->offset;
+ counter = (int)(now / user->time_interval) + user->offset;
window_start = -conf->max_offset;
window_stop = conf->max_offset;
@@ -1025,7 +1025,7 @@
}
/* Get expected counter value */
- counter = user->time_interval == 0 ? user->offset : (int)now /
user->time_interval + user->offset;
+ counter = user->time_interval == 0 ? user->offset : (int)(now /
user->time_interval) + user->offset;
/* Generate OTP using expected counter */
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "generating digest hash
for \"%s\" assuming OTP counter %d",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/otptool.1 new/mod_authn_otp-1.1.9/otptool.1
--- old/mod_authn_otp-1.1.8/otptool.1 2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/otptool.1 2018-07-27 15:55:01.000000000 +0200
@@ -25,7 +25,7 @@
.Sh SYNOPSIS
.Nm otptool
.Bk -words
-.Op Fl fht
+.Op Fl Ffht
.Op Fl c Ar counter
.Op Fl d Ar #digits
.Op Fl i Ar secs
@@ -41,7 +41,12 @@
.Pp
The
.Ar key
-is the token's binary secret key and is specified as a hexadecimal string.
+is the token's binary secret key and may be specified on the command line as a
hexadecimal string,
+or read from a file using the
+.Fl F
+or
+.Fl f
+flag.
.Pp
If no
.Ar password
@@ -99,12 +104,12 @@
Otherwise, the default value is the length of
.Ar password ,
if given, or else six if not.
+.It Fl F
+Read the key as a hexadecimal string from the file named
+.Ar key .
.It Fl f
-Read the key from the file named
-.Ar key
-instead of parsing
-.Ar key
-as a hexadecimal string.
+Read the key in raw, binary format from the file named
+.Ar key .
.It Fl h
Print the usage message and exit successfully.
.It Fl i
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/otptool.c new/mod_authn_otp-1.1.9/otptool.c
--- old/mod_authn_otp-1.1.8/otptool.c 2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/otptool.c 2018-07-27 15:57:13.000000000 +0200
@@ -32,14 +32,16 @@
const char *key = NULL;
const char *motp_pin = NULL;
unsigned char keybuf[128];
+ unsigned char filebuf[520];
char otpbuf10[OTP_BUF_SIZE];
char otpbuf16[OTP_BUF_SIZE];
- size_t keylen;
+ size_t keylen = -1;
int time_interval = DEFAULT_TIME_INTERVAL;
int ndigits = -1;
int counter_start;
int counter_stop;
int read_from_file = 0;
+ int parse_ascii_key = 1;
int counter = -1;
int use_time = 0;
int window = 0;
@@ -47,7 +49,7 @@
int i;
/* Parse command line */
- while ((ch = getopt(argc, argv, "c:d:fhi:m:tvw:")) != -1) {
+ while ((ch = getopt(argc, argv, "c:d:fFhi:m:tvw:")) != -1) {
switch (ch) {
case 'c':
if (use_time)
@@ -61,8 +63,13 @@
if (ndigits < 1)
errx(EXIT_USAGE_ERROR, "invalid digit count `%s'", optarg);
break;
+ case 'F':
+ read_from_file = 1;
+ parse_ascii_key = 1;
+ break;
case 'f':
read_from_file = 1;
+ parse_ascii_key = 0;
break;
case 'h':
usage();
@@ -114,19 +121,37 @@
if (ndigits == -1)
ndigits = DEFAULT_NUM_DIGITS;
- /* Read or parse key */
+ /* Read from file if needed */
if (read_from_file) {
FILE *fp;
+ size_t len;
+ /* Read data */
if ((fp = fopen(key, "rb")) == NULL)
err(EXIT_SYSTEM_ERROR, "error reading `%s'", key);
- keylen = fread(keybuf, 1, sizeof(keybuf), fp);
+ len = fread(filebuf, 1, sizeof(filebuf) - 1, fp);
if (ferror(fp))
err(EXIT_SYSTEM_ERROR, "error reading `%s'", key);
if (!feof(fp))
errx(EXIT_SYSTEM_ERROR, "error reading `%s': %s", key, "key is too
long");
fclose(fp);
- } else {
+
+ /* Optionally parse file content as ASCII */
+ if (parse_ascii_key) {
+ filebuf[len] = 0;
+ while (len > 0 && isspace(filebuf[len - 1])) /* trim
whitespace */
+ filebuf[--len] = 0;
+ key = (char *)filebuf;
+ } else {
+ if (len > sizeof(keybuf))
+ errx(EXIT_SYSTEM_ERROR, "error reading `%s': %s", key, "key is
too long");
+ memcpy(keybuf, filebuf, len);
+ keylen = len;
+ }
+ }
+
+ /* Parse key */
+ if (parse_ascii_key) {
for (keylen = 0; keylen < sizeof(keybuf) && key[keylen * 2] != '\0';
keylen++) {
const char *s = &key[keylen * 2];
int nibs[2];
@@ -202,10 +227,11 @@
static void
usage()
{
- fprintf(stderr, "Usage: %s [-fht] [-c counter] [-d digits] [-i interval]
[-m PIN] [-w window] key [otp]\n", PROG_NAME);
+ fprintf(stderr, "Usage: %s [-Ffht] [-c counter] [-d digits] [-i interval]
[-m PIN] [-w window] key [otp]\n", PROG_NAME);
fprintf(stderr, "Options:\n");
fprintf(stderr, " -c\tSpecify the initial counter value (conflicts with
`-t')\n");
- fprintf(stderr, " -f\t`key' refers to the file containing the key\n");
+ fprintf(stderr, " -F\t`key' refers to the file containing the key in
hexadecimal format\n");
+ fprintf(stderr, " -f\t`key' refers to the file containing the key in
binary format\n");
fprintf(stderr, " -h\tDisplay this usage message\n");
fprintf(stderr, " -i\tSpecify time interval in seconds (default %d)\n",
DEFAULT_TIME_INTERVAL);
fprintf(stderr, " -m\tUse mOTP algorithm with given PIN; also implies `-d
6' and `-i 10'\n");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/otptool.h new/mod_authn_otp-1.1.9/otptool.h
--- old/mod_authn_otp-1.1.8/otptool.h 2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/otptool.h 2018-07-22 04:26:56.000000000 +0200
@@ -27,39 +27,12 @@
#include <time.h>
#include <unistd.h>
-#ifdef HAVE_ERR_H
-#include <err.h>
-#else
-#define err(E, FMT...) do {
\
- int _esave = (errno);
\
- fprintf(stderr, "%s: ", PROG_NAME);
\
- fprintf(stderr, FMT);
\
- fprintf(stderr, ": %s\n",
strerror(_esave)); \
- exit(E);
\
- } while (0)
-#define errx(E, FMT...) do {
\
- fprintf(stderr, "%s: ", PROG_NAME);
\
- fprintf(stderr, FMT);
\
- fprintf(stderr, "\n");
\
- exit(E);
\
- } while (0)
-#define warn(FMT...) do {
\
- int _esave = (errno);
\
- fprintf(stderr, "%s: ", PROG_NAME);
\
- fprintf(stderr, FMT);
\
- fprintf(stderr, ": %s\n",
strerror(_esave)); \
- } while (0)
-#define warnx(FMT...) do {
\
- fprintf(stderr, "%s: ", PROG_NAME);
\
- fprintf(stderr, FMT);
\
- fprintf(stderr, "\n");
\
- } while (0)
-#endif
-
#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <openssl/md5.h>
+#include "errinc.h"
+
/* Program name */
#define PROG_NAME "otptool"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/scripts/compile new/mod_authn_otp-1.1.9/scripts/compile
--- old/mod_authn_otp-1.1.8/scripts/compile 1970-01-01 01:00:00.000000000
+0100
+++ new/mod_authn_otp-1.1.9/scripts/compile 2019-06-22 20:07:10.000000000
+0200
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2016-01-11.22; # UTC
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Written by Tom Tromey <[email protected]>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <[email protected]> or send patches to
+# <[email protected]>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <[email protected]>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh
old/mod_authn_otp-1.1.8/scripts/missing new/mod_authn_otp-1.1.9/scripts/missing
--- old/mod_authn_otp-1.1.8/scripts/missing 2017-10-30 16:43:10.000000000
+0100
+++ new/mod_authn_otp-1.1.9/scripts/missing 2019-06-22 20:07:10.000000000
+0200
@@ -1,9 +1,9 @@
#! /bin/sh
# Common wrapper for a few potentially missing GNU programs.
-scriptversion=2012-06-26.16; # UTC
+scriptversion=2016-01-11.22; # UTC
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
# Originally written by Fran,cois Pinard <[email protected]>, 1996.
# This program is free software; you can redistribute it and/or modify
@@ -160,7 +160,7 @@
;;
autom4te*)
echo "You might have modified some maintainer files that require"
- echo "the 'automa4te' program to be rebuilt."
+ echo "the 'autom4te' program to be rebuilt."
program_details 'autom4te'
;;
bison*|yacc*)
@@ -210,6 +210,6 @@
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End: