From 17e69f75cab7ba4914af37464301f9b6da381642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Fri, 3 Feb 2017 15:51:14 +0000 Subject: [PATCH] updated to qt5 with more information than ever before --- COPYING | 2 +- ChangeLog | 11 + INSTALL | 2 +- ax_init_standard_project.m4 | 74 +++++- bootstrap.sh | 447 ++++++++++++++++++++++++++++++++++-- build-in-docker.conf | 24 +- build-in-docker.sh | 105 +++++++-- configure.ac | 1 + debian/changelog.in | 4 +- debian/control.in | 8 +- debian/rules | 2 +- resolve-debbuilddeps.sh | 13 +- resolve-rpmbuilddeps.sh | 37 ++- src/tokentool.hxx | 213 ++++++++++++----- 14 files changed, 791 insertions(+), 152 deletions(-) mode change 100644 => 100755 debian/rules diff --git a/COPYING b/COPYING index 88798ab..caeca07 120000 --- a/COPYING +++ b/COPYING @@ -1 +1 @@ -/usr/share/automake-1.15/COPYING \ No newline at end of file +/usr/share/automake-1.14/COPYING \ No newline at end of file diff --git a/ChangeLog b/ChangeLog index 32341e9..7779997 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2016-11-11 13:38 + + * [r10] COPYING, ChangeLog, INSTALL, autogen.sh[ADD], + ax_cxx_compile_stdcxx_11.m4, ax_init_standard_project.m4, + bootstrap.sh, build-in-docker.conf[ADD], build-in-docker.sh, + doc/footer.html.in[ADD], doc/header.html.in[ADD], + doc/plantuml.jar[ADD], doc/style.css[ADD], + mac-create-app-bundle.sh, makefile_test.inc.am[ADD], + resolve-debbuilddeps.sh, resolve-rpmbuilddeps.sh, sql-to-dot.sed: + fixed build in docker + 2015-11-13 16:04 marc * [r9] ax_init_standard_project.m4, bootstrap.sh, makefile.am, diff --git a/INSTALL b/INSTALL index ddcdb76..f812f5a 120000 --- a/INSTALL +++ b/INSTALL @@ -1 +1 @@ -/usr/share/automake-1.15/INSTALL \ No newline at end of file +/usr/share/automake-1.14/INSTALL \ No newline at end of file diff --git a/ax_init_standard_project.m4 b/ax_init_standard_project.m4 index 37215c6..8aa6ee9 100644 --- a/ax_init_standard_project.m4 +++ b/ax_init_standard_project.m4 @@ -167,6 +167,12 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_TARNAME//[^a-zA-Z0-9]/_}'" AX_SUBST(NUMBERS) AX_SUBST(HOME) + DEB_DEPEND_IFEXISTS= + DEB_BUILD_DEPEND= + DEB_DEPEND= + AC_SUBST(DEB_DEPEND_IFEXISTS) + AC_SUBST(DEB_BUILD_DEPEND) + AC_SUBST(DEB_DEPEND) if test -f README.md; then README=$(tail -n +3 README.md) DESCRIPTION=$(head -1 README.md) @@ -196,9 +202,9 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ CHANGELOG=$(.*,\1,') - PACKAGER=$(gpg -K 2>/dev/null | sed -n 's,uid *\(\[[ultimate\]] *\)\?,,p' | head -1) - if -z "${PACKAGER}"; then + PACKAGER=$(gpg -K --display-charset utf-8 --lock-never 2>/dev/null | sed -n 's,uid *\(\[[ultimate\]] *\)\?,,p' | head -1) + if test -z "${PACKAGER}"; then PACKAGER="$AUTHOR" fi AX_SUBST(AUTHOR) @@ -220,6 +226,8 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ SOURCE_DOWNLOAD="${SOURCE_DOWNLOAD:-${AUTHOR_URL}/downloads/${PACKAGE_NAME}}" AX_SUBST(PROJECT_URL) AX_SUBST(SOURCE_DOWNLOAD) + VENDOR=$((lsb_release -is 2>/dev/null || echo unknown) | tr ' ' '_') + AX_SUBST(VENDOR) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) AX_SUBST(DISTRO) ARCH=$((@<:@@<:@ $(uname -sm) =~ 64 @:>@@:>@ && echo amd64) || (@<:@@<:@ $(uname -sm) =~ 'i?86' @:>@@:>@ && echo i386 || uname -sm)) @@ -422,7 +430,7 @@ EOF # use this in configure.ac to support CppUnit for C++ unit tests AC_DEFUN([AX_USE_CPPUNIT], [ - AM_PATH_CPPUNIT([1.0.0], [have_cppunit="yes"], [have_cppunit="no"]) + PKG_CHECK_MODULES(CPPUNIT, cppunit, [have_cppunit="yes"], [have_cppunit="no"]) # infos and warnings if test "$have_cppunit" = "no"; then AC_MSG_WARN([Missing cppunit development library! @@ -443,8 +451,23 @@ maintainer-clean-example-targets: EOF ]) -# use this in configure.ac to support C++ examples +# use this in configure.ac to support NodeJS AC_DEFUN([AX_USE_NODEJS], [ + AC_PATH_PROG(ANDROID, [android], [0], + [${PATH}${PATH_SEPARATOR}${ANDROID_HOME}/tools]) + AC_CONFIG_FILES([nodejs/package.json]) + AC_CONFIG_FILES([nodejs/makefile]) + AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-nodejs-targets], [nodejs/makefile.in]) + test -f nodejs/makefile.in && cat >> nodejs/makefile.in <> examples/makefile.in <> cordova/makefile.in < #include #include #include +#include int main(int argc, char *argv[]) try { QApplication a(argc, argv); + a.setApplicationDisplayName(a.tr("${PACKAGE_NAME}")); + a.setApplicationName(${PACKAGE_NAME}::package_name().c_str()); + a.setApplicationVersion(${PACKAGE_NAME}::version().c_str()); QCommandLineParser parser; parser.addHelpOption(); parser.process(a); @@ -705,6 +729,7 @@ class ${PackageName}: public QMainWindow, protected Ui::${PackageName} { Q_OBJECT; public: explicit ${PackageName}(QWidget *parent = 0): QMainWindow(parent) { + setTitle(tr("${PACKAGE_NAME}[*]")); setupUi(this); } virtual ~${PackageName}() {} @@ -839,6 +864,349 @@ ${HEADER}dist_bin_SCRIPTS = MAINTAINERCLEANFILES = makefile.in EOF +if testtag AX_USE_NODEJS; then + checkdir nodejs + checkdir nodejs/public + checkdir nodejs/public/images + checkdir nodejs/etc + checkdir nodejs/etc/systemd +fi +to --condition AX_USE_NODEJS nodejs/makefile.am <= 0.0.1", + "socket.io": "~1.4.4", + "socketio-auth": "0.0.5", + "ldapauth": "git+https://github.com/DimensionSoftware/node-ldapauth.git" + }, + "description": "@DESCRIPTION@", + "main": "@PACKAGE_NAME@.js", + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "@AUTHOR@", + "license": "@LICENSE@", + "path": { + "prefix": "@PREFIX@", + "sysconf": "@SYSCONFDIR@", + "pkgdata": "@PKGDATADIR@", + "localstate": "@LOCALSTATEDIR@", + "log": "@LOCALSTATEDIR@/log/@PACKAGE_NAME@.log", + "config": "@SYSCONFDIR@/@PACKAGE_NAME@.json", + "nodejs": "@PKGDATADIR@/nodejs" + } +} +EOF +to --condition AX_USE_NODEJS nodejs/etc/${PACKAGE_NAME}.json < /var/run/${PACKAGE_NAME}.pid + # there are some useful defaults + # do not edit this file, overwrite values in /etc/default/${PACKAGE_NAME} + EXEC_${PACKAGE_NAME^^}="/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME}" + ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" + ${PACKAGE_NAME^^}_USER="${PACKAGE_NAME}" + ${PACKAGE_NAME^^}_PORT="" + [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} + if test -n "\${${PACKAGE_NAME^^}_USER}"; then + exec sudo -u "\${${PACKAGE_NAME^^}_USER}" \${EXEC_${PACKAGE_NAME^^}} \${${PACKAGE_NAME^^}_PORT} >> \${${PACKAGE_NAME^^}_LOG} 2>&1 + else + exec \${EXEC_${PACKAGE_NAME^^}} \${${PACKAGE_NAME^^}_PORT} >> \${${PACKAGE_NAME^^}_LOG} 2>&1 + fi +end script + +pre-start script + ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" + [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} + # Date format same as (new Date()).toISOString() for consistency + echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> \${${PACKAGE_NAME^^}_LOG} +end script + +pre-stop script + ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" + [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} + rm /var/run/${PACKAGE_NAME}.pid + echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> \${${PACKAGE_NAME^^}_LOG} +end script +EOF +to --condition AX_USE_NODEJS nodejs/etc/systemd/system/${PACKAGE_NAME}.service < /var/log/${PACKAGE_NAME}.log +Restart=on-abort + +[Install] +WantedBy=multi-user.target +EOF +to --condition AX_USE_NODEJS nodejs/public/javascripts/${PACKAGE_NAME}.js < new connection from "+userdata.username); + + function emit(signal, data, info) { + if (typeof data == 'string' && !data.match("\n")) { + console.log("<- signal: "+signal+"("+data+")"); + } else { + console.log("<- signal: "+signal); + } + if (info) console.log(info); + socket.emit(signal, data); + } + + function fail(txt, data) { + console.log("** "+txt, data); + emit("fail", txt); + } + + /* + socket + .on("xxx", xxx) + .on("yyy", yyy; + */ + + } + + // Handle Connection + require('socketio-auth')(io, { + authenticate: function (socket, data, callback) { + console.log("=> authenticate: ", data.username); + //get credentials sent by the client + var username = data.username; + var password = data.password; + authentication(data.username, data.password, + function() { + console.log("####LOGIN-SUCESS####"); + callback(null, true) + }, + function() { + console.log("####LOGIN-FAIL####"); + callback(new Error("wrong credentials")) + }); + }, + postAuthenticate: connection, + timeout: "none" + }); + + return module; +} +EOF +to --condition AX_USE_NODEJS nodejs/views/index.ejs < + + + + + + + + $(head -1 README) + + + +

$(head -1 README)

+

generated by bootstrap, please edit

+ + + +EOF +to --condition AX_USE_NODEJS nodejs/views/layout.ejs < +EOF echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition 'AX_USE_DOXYGEN|AX_USE_PERLDOC' doc/makefile.am if testtag AX_BUILD_TEST; then to test/runtests.sh < ${0%/*}/test/runtests.sh @@ -1102,17 +1470,18 @@ if testtag AX_USE_DEBIAN_PACKAGING; then -- @PACKAGER@ @BUILD_DATE@ EOF - BUILD_DEPENDS="debhelper, ${VCSDEPENDS} pkg-config, automake, libtool, autotools-dev, pandoc, lsb-release, fakeroot, $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_PERLDOC; then echo -n ", libpod-tree-perl"; fi; if testtag AX_USE_PLANTUML; then echo -n ", default-jre-headless|default-jre"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)" + RUN_DEPENDS="$(if testtag AX_USE_NODEJS; then echo -n ", nodejs, npm"; fi)" + BUILD_DEPENDS="debhelper, fakeroot, ${VCSDEPENDS_DEB} pkg-config, automake, libtool, autotools-dev, pandoc, lsb-release$(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen, default-jre-headless|default-jre"; fi; if testtag AX_USE_PERLDOC; then echo -n ", libpod-tree-perl"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)" to debian/control.in < 6 || 0%{?rhl} > 6 || 0%{?centos} > 6 || 0%{?fedora} || 0%{?mageia} +BuildRequires: rpm-sign +%endif +%if 0%{?mageia} +BuildRequires: gnupg, lsb-release$( + if testtag AX_USE_LIBTOOL; then + echo -n ", libltdl-devel" + fi +) +%else +BuildRequires: gpg, redhat-lsb$( + if testtag AX_USE_LIBTOOL; then + echo -n ", libtool-ltdl-devel" + fi +) +%endif %if ! ( 0%{?centos} || 0%{?centos_ver} || 0%{?centos_version} ) $(if testtag AX_USE_DOXYGEN; then echo -n "BuildRequires: mscgen"; fi) $(if testtag AX_REQUIRE_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n "BuildRequires: qt5-qtbase-devel, qt5-qttools, qt5-qtwebkit-devel"; fi) @@ -1217,7 +1606,9 @@ echo echo This package contains only the shared libraries required at runtime. fi) - +$(if ! testtag 'AX_USE_LIBTOOL|AX_USE_CXX'; then + echo '%global debug_package %{nil}' +fi) %prep %setup -q ./configure --prefix=/usr \\ @@ -1242,6 +1633,7 @@ else echo '/usr/bin/*' echo '/usr/share/applications/*' fi) +/usr/share/@PACKAGE_NAME@ %doc $(if testtag AX_USE_LIBTOOL; then cat < ChangeLog";; @@ -1352,10 +1744,15 @@ Cflags: -I\${includedir} @CPPFLAGS@ Requires: @PKG_REQUIREMENTS@ EOF to build-in-docker.conf < /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64) +host= +flags=() wait=0 if test -e ./build-in-docker.conf; then # you can preconfigure the variables in file build-in-docker.conf # if you do so, add the file to EXTRA_DIST in makefile.am source ./build-in-docker.conf fi + while test $# -gt 0; do case "$1" in (-h|--help) @@ -25,9 +33,12 @@ while test $# -gt 0; do echo "OPTIONS:" echo echo " -h, --help show this help" - echo " -m, --mode mode: apt or yum, default: ${mode}" + echo " -m, --mode mode: deb, rpm, win, default: ${mode}" echo " -i, --image use given docker image instead of ${img}" + echo " -a, --arch build for given hardware architecture" echo " -t, --targets targets specify build targets, default: ${targets}" + echo " --host host for cross compiling, e.g. i686-w64-mingw32" + echo " -f, --flag add flag to ./bootstrap.sh or ./configure" echo " -r, --repo add given apt repository" echo " -k, --key add public key from url" echo " -e, --env = set environment variable in docker" @@ -37,6 +48,10 @@ while test $# -gt 0; do echo " -w, --wait on error keep docker container and wait for enter" echo echo " The option -i must be after -m, because mode sets a new default image" + echo " The option -m must be after -t, because mode may be auto detected from targets" + echo " The option -m must be after -h, because mode may set a host" + echo " If target is either deb or rpm, mode is set to the same value" + echo " If target is win, host is set to i686-w64-mingw32" echo echo " The options -r -k -e -d -p -c can be repeated several times." echo @@ -67,8 +82,11 @@ while test $# -gt 0; do (-m|--mode) shift; mode="$1" case "$mode" in - (apt) img="ubuntu:latest";; + (deb|apt) img="ubuntu:latest";; + (rpm|zypper) img="opensuse:latest";; (yum) img="centos:latest";; + (dnf) img="fedora:latest";; + (win) img="ubuntu:latest"; host="${host:---host=i686-w64-mingw32}";; (*) echo "**** ERROR: unknown mode '$1', try --help" 1>&2 exit 1 @@ -78,10 +96,25 @@ while test $# -gt 0; do (-i|--image) shift; img="$1" ;; + (-a|--arch) shift; + arch="$1" + ;; (-t|--targets) shift; targets="$1" + if test "$1" = "deb" -o "$1" = "rpm"; then + # set mode to same value + set -- "-m" "$@" + continue + fi + ;; + (--host) shift; + host="--host=$1" + ;; + (-f|--flag) shift; + flags+=("$1") ;; (-r|--repo) shift; + echo "OPTION: $1" repos+=("$1") ;; (-k|--key) shift; @@ -140,7 +173,8 @@ function traperror() { read fi echo -n " ... cleanup docker: " - docker rm -f "${DOCKER_ID}" + docker stop "${DOCKER_ID}" || true + docker rm "${DOCKER_ID}" echo "returning status: $e" echo "--->" exit $e @@ -167,14 +201,14 @@ function ifthenelse() { os="${arg%%:::*}" thenpart="${arg#*:::}" if test "${thenpart/:::/}" = "${thenpart}"; then - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; fi' + docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; fi' else elsepart="${thenpart##*:::}" thenpart="${thenpart%:::*}" if test -n "${thenpart}"; then - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi' + docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi' else - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then true; else '"${cmd//ARG/${elsepart}}"'; fi' + docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64)" =~ ${os} ]]; then true; else '"${cmd//ARG/${elsepart}}"'; fi' fi fi fi @@ -183,10 +217,25 @@ function ifthenelse() { set -x docker pull $img -DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -e HOME="${HOME}" -w /workdir $img sleep infinity) +DOCKER_ID=$(docker create ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT +if ! [[ $arch =~ $myarch ]]; then + docker cp "/usr/bin/qemu-${arch}-static" "${DOCKER_ID}:/usr/bin/qemu-${arch}-static" +fi +docker start "${DOCKER_ID}" +if ! docker exec ${DOCKER_ID} getent group $(id -g) > /dev/null 2>&1; then + docker exec ${DOCKER_ID} groupadd -g $(id -g) $(id -gn) +fi +if ! docker exec ${DOCKER_ID} getent passwd $(id -u) > /dev/null 2>&1; then + docker exec ${DOCKER_ID} useradd -m -u $(id -u) -g $(id -g) -d"${HOME}" $(id -un) +fi +docker exec ${DOCKER_ID} chown $(id -u):$(id -g) "${HOME}" case $mode in - (apt) + (deb|apt) + if [[ "${img}" =~ "ubuntu" ]]; then + docker exec ${DOCKER_ID} locale-gen ${LANG} + docker exec ${DOCKER_ID} update-locale LANG=${LANG} + fi OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends' for f in 'libpam-systemd:amd64' 'policykit*' 'colord'; do docker exec ${DOCKER_ID} bash -c "echo 'Package: $f' >> /etc/apt/preferences" @@ -199,7 +248,7 @@ case $mode in docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release || \ docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release; for repo in "${repos[@]}"; do - ifthenelse "${repo}" "apt-add-repository ARG" + ifthenelse "${repo}" "apt-add-repository 'ARG'" done for key in "${keys[@]}"; do wget -O- "$key" \ @@ -214,8 +263,7 @@ case $mode in done docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh ;; - (yum) - ./bootstrap.sh -t dist + (rpm|yum|dnf|zypper|urpmi) if [[ "$img" =~ "centos" ]]; then docker exec ${DOCKER_ID} yum install -y redhat-lsb docker exec -i ${DOCKER_ID} bash -c 'cat > /etc/yum.repos.d/wandisco-svn.repo' <&1 | grep -q 'N: Unable to locate package')" && ! ${DO} dpkg -l "${f}"; then - TO_INSTALL+=" ${f}" + if test -n "$(${DO} apt-cache policy -q ${f})" && ((! $(${DO} apt-cache policy ${f} 2>&1 | grep -q 'N: Unable to locate package')) && (! ${DO} dpkg -l "${f}")); then + DEPS+=" ${f}" fi done + for f in $(sed -n 's, *AX_DEB_BUILD_DEPEND(\([^)]*\)).*,\1,p' configure.ac); do + DEPS+=" ${f}" + done trap "rm debian/control" INT TERM EXIT - sed 's,@DEB_DEPEND_IFEXISTS@,,g' debian/control.in | \ + sed 's,@\(DEB_DEPEND_IFEXISTS\|AX_DEB_BUILD_DEPEND\|AX_DEB_DEPEND\)@,,g' debian/control.in | \ sed 's,@[^@]*@, dummytext,g' > debian/control fi install dpkg-dev -DEPS=$(LANG= ${DO} dpkg-checkbuilddeps 2>&1 || true) -DEPS=$(echo "$DEPS" | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}') +DEPS+=" $(LANG= ${DO} dpkg-checkbuilddeps 2>&1 | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}')" for pa in ${DEPS}; do if test ${pa//|/} = ${pa}; then diff --git a/resolve-rpmbuilddeps.sh b/resolve-rpmbuilddeps.sh index 5ddd1b2..1ed2408 100755 --- a/resolve-rpmbuilddeps.sh +++ b/resolve-rpmbuilddeps.sh @@ -10,35 +10,34 @@ ## 1 2 3 4 5 6 7 8 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 +INSTALL_TOOL=${INSTALL_TOOL:-$((test -x /usr/bin/zypper && echo zypper install -y) || (test -x /usr/bin/dnf && echo dnf install -y) || (test -x /usr/bin/yum && echo yum install -y) || (test -x /usr/sbin/urpmi && echo urpmi --auto))} SCHROOTNAME="$1" PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac) -PKGCONFIGS="${2:-epel-release}" # packages to configure yum + +TRAP_CMD= +if test -e ${PACKAGE_NAME}.spec.in -a ! -e ${PACKAGE_NAME}.spec; then + TRAP_CMD+="rm ${PACKAGE_NAME}.spec;" + trap "${TRAP_CMD}" INT TERM EXIT + sed 's,@RPM_DEPEND_IFEXISTS@,,g' ${PACKAGE_NAME}.spec.in | \ + sed 's,@[^@]*@, dummytext,g' > ${PACKAGE_NAME}.spec +fi + +TGZFILE=$(sed -n '/^Name: */{s///;h};/^Version: */{s///;H;x;s/\n/-/;s/$/.tar.gz/;p}' ${PACKAGE_NAME}.spec) +if ! test -e $TGZFILE; then + TRAP_CMD+="rm ${TGZFILE};" + trap "${TRAP_CMD}" INT TERM EXIT + touch $TGZFILE +fi if test -n "${SCHROOTNAME}"; then FILES=$(LANG= schroot -c ${SCHROOTNAME} -- rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') if test -n "${FILES}"; then - FIRST=$(echo "${FILES}" | egrep -o "${PKGCONFIGS// /|}") - if test -n "${FIRST}"; then - schroot -c ${SCHROOTNAME} -u root -- yum install -y ${FIRST} || \ - schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FIRST} || \ - schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FIRST} - fi - schroot -c ${SCHROOTNAME} -u root -- yum install -y ${FILES} || \ - schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FILES} || \ - schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FILES} + schroot -c ${SCHROOTNAME} -u root -- ${INSTALL_TOOL} ${FILES} fi else FILES=$(LANG= rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') if test -n "${FILES}"; then - FIRST=$(echo "${FILES}" | egrep -o "${PKGCONFIGS// /|}") - if test -n "${FIRST}"; then - yum install -y ${FIRST} || \ - zypper install -y ${FIRST} || \ - dnf install -y ${FIRST} - fi - yum install -y ${FILES} || \ - zypper install -y ${FILES} || \ - dnf install -y ${FILES} + ${INSTALL_TOOL} ${FILES} fi fi diff --git a/src/tokentool.hxx b/src/tokentool.hxx index 3c7af69..ed049d3 100644 --- a/src/tokentool.hxx +++ b/src/tokentool.hxx @@ -12,7 +12,10 @@ #include #include #include +#include #include +#include +#include #include #include @@ -20,12 +23,6 @@ #include -#if QT_VERSION >= 0x050000 -namespace QSsl { - typedef AlternativeNameEntryType AlternateNameEntryType; -} -#endif - inline QString qs(const std::string& s) { return QString::fromStdString(s); } @@ -302,61 +299,163 @@ class tokentool: public QMainWindow, protected Ui::tokentool { void addCertificate(const std::string& label, const std::string& id, const QSslCertificate& cert) { if (cert.isNull()) return; + QString txt; + QSslKey pubkey(cert.publicKey()); + QTreeWidgetItem *twi(0); QTreeWidgetItem* c(new QTreeWidgetItem(QStringList()<setData(0, Qt::UserRole, qs(id)); + // c->setData(0, Qt::UserRole, qs(id)); _certificates->addTopLevelItem(c); c->addChild - ((new QTreeWidgetItem - (QStringList()<addChild - ((new QTreeWidgetItem - (QStringList()<addChild - ((new QTreeWidgetItem - (QStringList()<addChild - ((it = new QTreeWidgetItem(QStringList()<=QSslCertificate::Organization; - si=(QSslCertificate::SubjectInfo)((int)si-1)) - if (!cert.subjectInfo(si).isEmpty()) { - it->addChild - ((new QTreeWidgetItem(subjectInfo(si) - <setExpanded(true); - QMultiMap -#if QT_VERSION <0x050000 - asns(cert.alternateSubjectNames()) -#else - asns(cert.subjectAlternativeNames()) -#endif - ; - for (QMultiMap::iterator - asn(asns.begin()); asn!=asns.end(); ++asn) - it->addChild - ((new QTreeWidgetItem - (QStringList()<addChild + (new QTreeWidgetItem + (QStringList()<addChild + (twi = new QTreeWidgetItem + (QStringList()<addChild + (new QTreeWidgetItem + (QStringList()<setExpanded(true); + c->addChild + (twi = new QTreeWidgetItem + (QStringList()<addChild + (new QTreeWidgetItem + (QStringList()<setExpanded(true); c->addChild - ((it = new QTreeWidgetItem(QStringList()<=QSslCertificate::Organization; - si=(QSslCertificate::SubjectInfo)((int)si-1)) - if (!cert.issuerInfo(si).isEmpty()) - it->addChild - ((new QTreeWidgetItem(subjectInfo(si) - <setExpanded(true); + (twi = new QTreeWidgetItem + (QStringList()<addChild + (new QTreeWidgetItem // not used: oid + (QStringList()<<(v.first.isEmpty() + ? ext.name() + : tr("%1[%2]", "element of a certificate extension map;" + " %1: extension name, %2: map entry name") + .arg(ext.name()).arg(v.first))<setExpanded(true); + c->addChild + (twi = new QTreeWidgetItem + (QStringList()<addChild(new QTreeWidgetItem(QStringList()<setExpanded(true); + /// @bug error: ‘const class QSslCertificate’ has no member named ‘isSelfSigned’ + // if (cert.isSelfSigned()) + // for (int i=0; icolumnCount(); ++i) + // c->setBackground(i, Qt::darkYellow); + if (cert.isBlacklisted()) + for (int i=0; icolumnCount(); ++i) + c->setBackground(i, Qt::red); + +// c->addChild +// ((it = new QTreeWidgetItem(QStringList()<=QSslCertificate::Organization; +// si=(QSslCertificate::SubjectInfo)((int)si-1)) +// if (!cert.subjectInfo(si).isEmpty()) { +// it->addChild +// ((new QTreeWidgetItem(subjectInfo(si) +// <setExpanded(true); +// QMultiMap +// #if QT_VERSION <0x050000 +// asns(cert.alternateSubjectNames()) +// #else +// asns(cert.subjectAlternativeNames()) +// #endif +// ; +// for (QMultiMap::iterator +// asn(asns.begin()); asn!=asns.end(); ++asn) +// it->addChild +// ((new QTreeWidgetItem +// (QStringList()<addChild +// ((it = new QTreeWidgetItem(QStringList()<=QSslCertificate::Organization; +// si=(QSslCertificate::SubjectInfo)((int)si-1)) +// if (!cert.issuerInfo(si).isEmpty()) +// it->addChild +// ((new QTreeWidgetItem(subjectInfo(si) +// <setExpanded(true); _certificates->resizeColumnToContents(0); _certificates->resizeColumnToContents(1); } private: + QMultiMap stringify(const QVariant& v) { + QMultiMap res; + switch (v.type()) { + case QVariant::ByteArray: { + bool nonprint(false); + QString txt(QString::fromUtf8(v.toByteArray())); + for (QChar& c: txt) { + if (!c.isPrint()) + if (c=='\n'||c=='\r') { + c = '\n'; + } else { + txt.replace(c, tr("[%1]", + "stringified representation of nonprintable character;" + " %1: value in hex") + .arg(QString::fromLocal8Bit(QString(c).toUtf8().toHex()))); + nonprint = true; + } + } + res.insert(QString(), txt); + } break; + case QVariant::List: + for (const QVariant& vv: v.toList()) + res.insert(QString(), QStringList(stringify(vv).values()).join('\n')); + break; + case QVariant::Map: + for (auto vv: v.toMap().toStdMap()) + res.insert(vv.first, QStringList(stringify(vv.second).values()).join('\n')); + break; + case QVariant::StringList: + for (const auto& vv: v.toStringList()) + res.insert(QString(), vv); + break; + case QVariant::String: + res.insert(QString(), v.toString()); + break; + default: + res.insert(v.typeName(), v.toString()); + } + return res; + } void deleteCert(QTreeWidgetItem* item) { if (!_slot) return; if (_pin->text().isEmpty()) { @@ -388,13 +487,13 @@ class tokentool: public QMainWindow, protected Ui::tokentool { } setup(); } - QString alternateName(QSsl::AlternateNameEntryType an) { - switch (an) { - case QSsl::EmailEntry: return tr("E-Mail"); - case QSsl::DnsEntry: return tr("URL"); - } - return tr("error", "unknown certificate subject alternate name"); - } + // QString alternateName(QSsl::AlternateNameEntryType an) { + // switch (an) { + // case QSsl::EmailEntry: return tr("E-Mail"); + // case QSsl::DnsEntry: return tr("URL"); + // } + // return tr("error", "unknown certificate subject alternate name"); + // } QStringList subjectInfo(QSslCertificate::SubjectInfo si) { QStringList res; switch (si) {