mirror of
https://gitlab.com/mishakmak/pam-fprint-grosshack.git
synced 2026-04-09 04:13:33 +02:00
Compare commits
172 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 580cceb50e | |||
| b90b21f26b | |||
| 6d583cb5d8 | |||
| c776068cd2 | |||
| b8d80fcb35 | |||
| 32c2ccdd8c | |||
| 58784f7002 | |||
| f295e6c571 | |||
| b02825620a | |||
| 2327307b81 | |||
| 7c1ae363a8 | |||
| a18af36a03 | |||
| 526b2e8c53 | |||
| 73625233f6 | |||
| 08de7e33a4 | |||
| c871dfc998 | |||
| dccc5796b6 | |||
| 0994cc314e | |||
| 09b1f1f1db | |||
| e10417a907 | |||
| 8f75563920 | |||
| 2e00c7a4b1 | |||
| 72d8a0f512 | |||
| 130d6cdb63 | |||
| e2fd52190a | |||
| 7d8450e5ab | |||
| 95e95d2910 | |||
| 75aeff4acd | |||
| bebd3d2a98 | |||
| 0e2bf7e804 | |||
| f5a2c21f90 | |||
| 53d80c1474 | |||
| 9bed3bed3f | |||
| 1a094c1a09 | |||
| 4ed46deaf2 | |||
| 0724413eda | |||
| eb6dbb6953 | |||
| 5c5849dca7 | |||
| 048181ae7f | |||
| 8e3345a60f | |||
| 33a21b5089 | |||
| dd006382f5 | |||
| a34432ccf9 | |||
| f2804921a3 | |||
| 74577a6806 | |||
| 2076025208 | |||
| 77126ccf1f | |||
| 46b7d7c1a7 | |||
| 791a208afd | |||
| b832002c97 | |||
| 8a2f276003 | |||
| aab923e3cd | |||
| cc4bac3410 | |||
| 18d4aa6d7d | |||
| 046ec8dbf4 | |||
| 874b4556ef | |||
| c2aa5c0b9a | |||
| f745c49112 | |||
| 319d859107 | |||
| b97903f781 | |||
| a30697a28d | |||
| aad3212d22 | |||
| 3624bcb114 | |||
| 8fbc59a258 | |||
| 5a8da0022a | |||
| 6089ba6f40 | |||
| ee6e8a6fa3 | |||
| 42f5280a03 | |||
| affffaf134 | |||
| 6ab270fb1a | |||
| 2d0bed6b13 | |||
| c43134e36f | |||
| b9d23ddb87 | |||
| 205dedae4f | |||
| d70f15b5e8 | |||
| 6f63beb1fc | |||
| f7557c6ee7 | |||
| 0b598965b0 | |||
| 8325d347d6 | |||
| 0bdf801043 | |||
| 6e3b053372 | |||
| c6e72c5f28 | |||
| 986a42bcd1 | |||
| 0c6bab8640 | |||
| b99afd19f0 | |||
| 3d6dfabd8d | |||
| 67adcb59ed | |||
| db0ab55bef | |||
| 00b79d1a2f | |||
| f1517af09a | |||
| c0bf1515fd | |||
| 872089883c | |||
| 431755becd | |||
| 0a42b90390 | |||
| cd3ed2e450 | |||
| c929d39df1 | |||
| 1a5ef6c5a7 | |||
| ce3406b20f | |||
| 0d407db171 | |||
| 4eb751a218 | |||
| 0f44267ea1 | |||
| 9baea4494b | |||
| 41afbd1ced | |||
| f2d6921b74 | |||
| b690daa95f | |||
| deb3c25e51 | |||
| a520896325 | |||
| 707ed01059 | |||
| 6903c36157 | |||
| d0df422f9b | |||
| 882740f8a1 | |||
| 5043ef3c7d | |||
| cdd79a0935 | |||
| 776b4f4cec | |||
| 31bfd1b055 | |||
| 74838f9efc | |||
| 54ba81191e | |||
| 521ba9b124 | |||
| 3db69c2c2f | |||
| b2ff316e20 | |||
| 94f54c0638 | |||
| 9c8d062669 | |||
| ca482036c7 | |||
| d7821aa790 | |||
| 16cb1a8ec6 | |||
| 31ba9ebea4 | |||
| 8893c2f906 | |||
| 3520cb56d1 | |||
| 96444b4156 | |||
| c0ba475fbf | |||
| 704c19b87a | |||
| 8f90390c6b | |||
| e061990fa9 | |||
| 011310e30c | |||
| 3274a31153 | |||
| d6c4e8ba64 | |||
| 48976d0031 | |||
| cbf4a47af3 | |||
| bfbac18606 | |||
| 09529c396b | |||
| 94a9815362 | |||
| 9ed8767cb3 | |||
| 8ae7abc6c2 | |||
| dd9d7cc35d | |||
| dbeeb95756 | |||
| 5e76441210 | |||
| 8de9164be0 | |||
| 267e6b3238 | |||
| 51f4dce4e7 | |||
| 0c76397a6e | |||
| 815256717b | |||
| 9e32cd5257 | |||
| 32b9f1b056 | |||
| 12ef09a1c9 | |||
| 596172e42d | |||
| d37d8a233a | |||
| 3550ac5f05 | |||
| 111681c57d | |||
| 6eed9f1244 | |||
| 04bd6bab46 | |||
| fa4af3ee67 | |||
| 31b985f547 | |||
| 661684b1f5 | |||
| 2322244c5a | |||
| 8e0c030f62 | |||
| 4234902671 | |||
| 78ffe68426 | |||
| 2704e72308 | |||
| f39f28830a | |||
| e6d291b248 | |||
| a2f2526df6 | |||
| 2f78c46dcf |
37
.gitignore
vendored
37
.gitignore
vendored
@ -1,46 +1,11 @@
|
||||
/*.bak
|
||||
/*.lo
|
||||
/*.o
|
||||
/*.orig
|
||||
/*.rej
|
||||
/*.tab.c
|
||||
/*~
|
||||
/.*.sw[nop]
|
||||
/.deps
|
||||
/.dirstamp
|
||||
/.gitignore
|
||||
/.libs
|
||||
/GPATH
|
||||
/GRTAGS
|
||||
/GSYMS
|
||||
/GTAGS
|
||||
/ID
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/TAGS
|
||||
/_libs
|
||||
/autom4te.cache
|
||||
/config.cache
|
||||
/config.h
|
||||
/config.log
|
||||
/config.lt
|
||||
/config.status
|
||||
/config.status.lineno
|
||||
/configure
|
||||
/configure.lineno
|
||||
/intltool-extract.in
|
||||
/intltool-merge.in
|
||||
/intltool-update.in
|
||||
/libtool
|
||||
/po/*.gmo
|
||||
/po/*.mo
|
||||
/po/.intltool-merge-cache
|
||||
/po/Makefile
|
||||
/po/Makefile.in
|
||||
/po/Makefile.in.in
|
||||
/po/POTFILES
|
||||
/po/fprintd.pot
|
||||
/po/stamp-it
|
||||
/so_locations
|
||||
/stamp-h1
|
||||
/_build
|
||||
/tags
|
||||
|
||||
98
.gitlab-ci.yml
Normal file
98
.gitlab-ci.yml
Normal file
@ -0,0 +1,98 @@
|
||||
include:
|
||||
- project: 'libfprint/libfprint'
|
||||
ref: master
|
||||
file: '/.gitlab-ci/libfprint-templates.yaml'
|
||||
- project: 'wayland/ci-templates'
|
||||
ref: master
|
||||
file: '/templates/fedora.yml'
|
||||
|
||||
variables:
|
||||
extends: .libfprint_common_variables
|
||||
FEDORA_TAG: rawhide
|
||||
FEDORA_VERSION: rawhide
|
||||
FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FEDORA_VERSION:$FEDORA_TAG"
|
||||
DEPENDENCIES: dbus-glib-devel
|
||||
gcc
|
||||
gcovr
|
||||
gettext
|
||||
git
|
||||
glibc-devel
|
||||
gtk-doc
|
||||
libfprint-devel
|
||||
meson
|
||||
pam-devel
|
||||
polkit-devel
|
||||
python3-dbusmock
|
||||
python3-libpamtest
|
||||
systemd-devel
|
||||
|
||||
image: "$FEDORA_IMAGE"
|
||||
|
||||
.install_libfprint_dev: &install_libfprint_dev
|
||||
before_script:
|
||||
# Make sure we don't build or link against the system libfprint
|
||||
- dnf remove -y libfprint-devel
|
||||
- git clone https://gitlab.freedesktop.org/libfprint/libfprint.git
|
||||
- cd libfprint
|
||||
- meson . _build --prefix=/usr -Ddrivers=virtual_image -Ddoc=false
|
||||
- ninja -C _build
|
||||
- ninja -C _build install
|
||||
- cd ..
|
||||
# So we don't get error about this libfprint file
|
||||
- echo "libfprint/demo/gtk-libfprint-test.ui" >> po/POTFILES.skip
|
||||
|
||||
build_stable:
|
||||
except:
|
||||
variables:
|
||||
- $FPRINT_CRON_TASK == "BUILD_CI_IMAGES"
|
||||
# FIXME: Stable builds will fail until libfprintv 2 reaches rawhide
|
||||
allow_failure: true
|
||||
script:
|
||||
- meson _build
|
||||
- ninja -C _build -v
|
||||
- ninja -C _build -v install
|
||||
|
||||
build_dev:
|
||||
except:
|
||||
variables:
|
||||
- $FPRINT_CRON_TASK == "BUILD_CI_IMAGES"
|
||||
<<: *install_libfprint_dev
|
||||
script:
|
||||
- meson _build --werror -Dgtk_doc=true
|
||||
- ninja -C _build -v
|
||||
- ninja -C _build -v install
|
||||
artifacts:
|
||||
name: log
|
||||
when: on_failure
|
||||
paths:
|
||||
- _build/meson-logs/*.txt
|
||||
|
||||
test_dev:
|
||||
except:
|
||||
variables:
|
||||
- $FPRINT_CRON_TASK == "BUILD_CI_IMAGES"
|
||||
stage: test
|
||||
<<: *install_libfprint_dev
|
||||
script:
|
||||
- meson _build -Db_coverage=true
|
||||
- meson test -C _build --verbose --no-stdsplit --timeout-multiplier 3
|
||||
- ninja -C _build coverage
|
||||
- cat _build/meson-logs/coverage.txt
|
||||
artifacts:
|
||||
name: log-and-coverage
|
||||
when: always
|
||||
paths:
|
||||
- _build/meson-logs
|
||||
|
||||
# CONTAINERS creation stage
|
||||
container_fedora_build:
|
||||
extends: .fedora@container-build
|
||||
only:
|
||||
variables:
|
||||
- $FPRINT_CRON_TASK == "BUILD_CI_IMAGES"
|
||||
variables:
|
||||
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
|
||||
# a list of packages to install
|
||||
FEDORA_RPMS:
|
||||
$DEPENDENCIES
|
||||
$LIBFPRINT_DEPENDENCIES
|
||||
237
INSTALL
237
INSTALL
@ -1,237 +0,0 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006, 2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
6. Often, you can also type `make uninstall' to remove the installed
|
||||
files again.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that the
|
||||
`configure' script does not know about. Run `./configure --help' for
|
||||
details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out automatically,
|
||||
but needs to determine by the type of machine the package will run on.
|
||||
Usually, assuming the package is built to be run on the _same_
|
||||
architectures, `configure' can figure that out, but if it prints a
|
||||
message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share, you
|
||||
can create a site shell script called `config.site' that gives default
|
||||
values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
29
Makefile.am
29
Makefile.am
@ -1,29 +0,0 @@
|
||||
AUTOMAKE_OPTIONS = dist-bzip2
|
||||
SUBDIRS = src data tests pam doc po
|
||||
EXTRA_DIST = TODO intltool-extract.in intltool-merge.in intltool-update.in
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-systemdsystemunitdir='$${libdir}/systemd/system-distcheck'
|
||||
|
||||
all: check create-pot
|
||||
|
||||
check: check-translations
|
||||
|
||||
create-pot:
|
||||
$(MAKE) -C po fprintd.pot
|
||||
|
||||
check-translations:
|
||||
@for i in $(top_srcdir)/po/*.po ; do \
|
||||
if ! grep -q `basename $$i | sed 's,.po,,'` $(top_srcdir)/po/LINGUAS ; then \
|
||||
echo '**********************************'; \
|
||||
echo '***' `basename $$i | sed 's,.po,,'` missing from po/LINGUAS '***' ; \
|
||||
echo '**********************************'; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
done;
|
||||
|
||||
update-translations: create-pot check-translations
|
||||
@tx -r $(srcdir) pull --all --force --skip
|
||||
@if [ ! -d .tx ] ; then mkdir .tx ; fi ; cp -f $(srcdir)/.tx/config .tx/
|
||||
@tx push --source
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
32
NEWS
32
NEWS
@ -1,6 +1,38 @@
|
||||
This file lists notable changes in each release. For the full history of all
|
||||
changes, see ChangeLog.
|
||||
|
||||
version 1.90.1:
|
||||
- Add support for prints saved on the fingerprint device itself
|
||||
- Add integration tests using the virtual image driver, and further
|
||||
tests for the utilities
|
||||
- Port build system to meson
|
||||
- Loads of build warnings and memory leak fixes
|
||||
|
||||
- PAM module:
|
||||
- Port PAM module to sd-bus from dbus-glib
|
||||
- Use systemd to not ask for a fingerprint scan on remote logins
|
||||
- Add man page for PAM module
|
||||
- Add tests
|
||||
|
||||
This version requires libfprint 1.90.1, a 2.0 pre-release.
|
||||
|
||||
version 0.9.0:
|
||||
- Fix hangs when there the verification error was "retry"
|
||||
- Update for fp_get_pollfds() changes
|
||||
- Fix "client_username" memory leak, fix memory leak when saving a file
|
||||
- Create the fingerprint storage directory at install time,
|
||||
the storage path is now hard-coded as /var/lib/fprint and created by
|
||||
systemd when the service is started
|
||||
|
||||
version 0.8.1:
|
||||
- Fix build when builddir != srcdir
|
||||
- Fix possible crash on exit
|
||||
- Avoid warnings in copy/paste header
|
||||
- Sandbox fprintd daemon more
|
||||
- Update website address
|
||||
- Minimise debug output
|
||||
- Updated translations
|
||||
|
||||
version 0.8.0:
|
||||
- Lockdown the daemon to minimise potential security issues
|
||||
- Don't wake up readers when there's no enrolled fingerprints
|
||||
|
||||
2
README
2
README
@ -1,7 +1,7 @@
|
||||
fprintd
|
||||
=======
|
||||
|
||||
http://www.reactivated.net/fprint/wiki/Fprintd
|
||||
https://fprint.freedesktop.org/
|
||||
|
||||
Daemon to offer libfprint functionality over D-Bus
|
||||
Might eat your kangaroo.
|
||||
|
||||
@ -1,10 +1,16 @@
|
||||
Transifex.net Token Verification
|
||||
=================================
|
||||
Updating translations
|
||||
=====================
|
||||
|
||||
The list of tokens bellow guarantee the respective users to be able to enable
|
||||
The update-transifex.sh script should be run regularly to both pull
|
||||
translations from the Transifex service, and push new strings to translate.
|
||||
|
||||
Transifex.net Token Verification
|
||||
================================
|
||||
|
||||
The list of tokens below guarantee the respective users to be able to enable
|
||||
submission on components using the following repository url:
|
||||
|
||||
ssh://git.freedesktop.org/git/libfprint/fprintd
|
||||
https://gitlab.freedesktop.org/libfprint/fprintd/
|
||||
|
||||
Tokens:
|
||||
|
||||
|
||||
12
TODO
12
TODO
@ -1,17 +1,5 @@
|
||||
Identification
|
||||
Image transfer
|
||||
|
||||
Verify PAM messages fit with GDM/gnome-screensaver
|
||||
|
||||
Register fprintd' po file with Transifex, Rosetta or the Translation Project
|
||||
|
||||
Support insertion/removal of devices
|
||||
|
||||
Add some hardware protection by making sure devices aren't opened and
|
||||
reading for more than a certain amount of time.
|
||||
|
||||
Add POS use case
|
||||
|
||||
Automatically show the fingerprint registration when logged in and
|
||||
not having any registered prints?
|
||||
http://uk.youtube.com/watch?v=F_x_vwCltbc
|
||||
|
||||
182
acinclude.m4
182
acinclude.m4
@ -1,182 +0,0 @@
|
||||
dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR)
|
||||
dnl
|
||||
dnl example
|
||||
dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir)
|
||||
dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local
|
||||
|
||||
AC_DEFUN([AS_AC_EXPAND],
|
||||
[
|
||||
EXP_VAR=[$1]
|
||||
FROM_VAR=[$2]
|
||||
|
||||
dnl first expand prefix and exec_prefix if necessary
|
||||
prefix_save=$prefix
|
||||
exec_prefix_save=$exec_prefix
|
||||
|
||||
dnl if no prefix given, then use /usr/local, the default prefix
|
||||
if test "x$prefix" = "xNONE"; then
|
||||
prefix=$ac_default_prefix
|
||||
fi
|
||||
dnl if no exec_prefix given, then use prefix
|
||||
if test "x$exec_prefix" = "xNONE"; then
|
||||
exec_prefix=$prefix
|
||||
fi
|
||||
|
||||
full_var="$FROM_VAR"
|
||||
dnl loop until it doesn't change anymore
|
||||
while true; do
|
||||
new_full_var="`eval echo $full_var`"
|
||||
if test "x$new_full_var"="x$full_var"; then break; fi
|
||||
full_var=$new_full_var
|
||||
done
|
||||
|
||||
dnl clean up
|
||||
full_var=$new_full_var
|
||||
AC_SUBST([$1], "$full_var")
|
||||
|
||||
dnl restore prefix and exec_prefix
|
||||
prefix=$prefix_save
|
||||
exec_prefix=$exec_prefix_save
|
||||
])
|
||||
|
||||
dnl GNOME_COMPILE_WARNINGS
|
||||
dnl Turn on many useful compiler warnings
|
||||
dnl For now, only works on GCC
|
||||
AC_DEFUN([GNOME_COMPILE_WARNINGS],[
|
||||
dnl ******************************
|
||||
dnl More compiler warnings
|
||||
dnl ******************************
|
||||
|
||||
AC_ARG_ENABLE(compile-warnings,
|
||||
AC_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],
|
||||
[Turn on compiler warnings]),,
|
||||
[enable_compile_warnings="m4_default([$1],[yes])"])
|
||||
|
||||
warnCFLAGS=
|
||||
if test "x$GCC" != xyes; then
|
||||
enable_compile_warnings=no
|
||||
fi
|
||||
|
||||
warning_flags=
|
||||
realsave_CFLAGS="$CFLAGS"
|
||||
|
||||
case "$enable_compile_warnings" in
|
||||
no)
|
||||
warning_flags=
|
||||
;;
|
||||
minimum)
|
||||
warning_flags="-Wall"
|
||||
;;
|
||||
yes)
|
||||
warning_flags="-Wall -Wmissing-prototypes"
|
||||
;;
|
||||
maximum|error)
|
||||
warning_flags="-Wall -Wmissing-prototypes -Wnested-externs -Wpointer-arith"
|
||||
CFLAGS="$warning_flags $CFLAGS"
|
||||
for option in -Wno-sign-compare; do
|
||||
SAVE_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $option"
|
||||
AC_MSG_CHECKING([whether gcc understands $option])
|
||||
AC_TRY_COMPILE([], [],
|
||||
has_option=yes,
|
||||
has_option=no,)
|
||||
CFLAGS="$SAVE_CFLAGS"
|
||||
AC_MSG_RESULT($has_option)
|
||||
if test $has_option = yes; then
|
||||
warning_flags="$warning_flags $option"
|
||||
fi
|
||||
unset has_option
|
||||
unset SAVE_CFLAGS
|
||||
done
|
||||
unset option
|
||||
if test "$enable_compile_warnings" = "error" ; then
|
||||
warning_flags="$warning_flags -Werror"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR(Unknown argument '$enable_compile_warnings' to --enable-compile-warnings)
|
||||
;;
|
||||
esac
|
||||
CFLAGS="$realsave_CFLAGS"
|
||||
AC_MSG_CHECKING(what warning flags to pass to the C compiler)
|
||||
AC_MSG_RESULT($warning_flags)
|
||||
|
||||
AC_ARG_ENABLE(iso-c,
|
||||
AC_HELP_STRING([--enable-iso-c],
|
||||
[Try to warn if code is not ISO C ]),,
|
||||
[enable_iso_c=no])
|
||||
|
||||
AC_MSG_CHECKING(what language compliance flags to pass to the C compiler)
|
||||
complCFLAGS=
|
||||
if test "x$enable_iso_c" != "xno"; then
|
||||
if test "x$GCC" = "xyes"; then
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-ansi[\ \ ]*) ;;
|
||||
*) complCFLAGS="$complCFLAGS -ansi" ;;
|
||||
esac
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-pedantic[\ \ ]*) ;;
|
||||
*) complCFLAGS="$complCFLAGS -pedantic" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($complCFLAGS)
|
||||
|
||||
WARN_CFLAGS="$warning_flags $complCFLAGS"
|
||||
AC_SUBST(WARN_CFLAGS)
|
||||
])
|
||||
|
||||
dnl For C++, do basically the same thing.
|
||||
|
||||
AC_DEFUN([GNOME_CXX_WARNINGS],[
|
||||
AC_ARG_ENABLE(cxx-warnings,
|
||||
AC_HELP_STRING([--enable-cxx-warnings=@<:@no/minimum/yes@:>@]
|
||||
[Turn on compiler warnings.]),,
|
||||
[enable_cxx_warnings="m4_default([$1],[minimum])"])
|
||||
|
||||
AC_MSG_CHECKING(what warning flags to pass to the C++ compiler)
|
||||
warnCXXFLAGS=
|
||||
if test "x$GXX" != xyes; then
|
||||
enable_cxx_warnings=no
|
||||
fi
|
||||
if test "x$enable_cxx_warnings" != "xno"; then
|
||||
if test "x$GXX" = "xyes"; then
|
||||
case " $CXXFLAGS " in
|
||||
*[\ \ ]-Wall[\ \ ]*) ;;
|
||||
*) warnCXXFLAGS="-Wall -Wno-unused" ;;
|
||||
esac
|
||||
|
||||
## -W is not all that useful. And it cannot be controlled
|
||||
## with individual -Wno-xxx flags, unlike -Wall
|
||||
if test "x$enable_cxx_warnings" = "xyes"; then
|
||||
warnCXXFLAGS="$warnCXXFLAGS -Wshadow -Woverloaded-virtual"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($warnCXXFLAGS)
|
||||
|
||||
AC_ARG_ENABLE(iso-cxx,
|
||||
AC_HELP_STRING([--enable-iso-cxx],
|
||||
[Try to warn if code is not ISO C++ ]),,
|
||||
[enable_iso_cxx=no])
|
||||
|
||||
AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler)
|
||||
complCXXFLAGS=
|
||||
if test "x$enable_iso_cxx" != "xno"; then
|
||||
if test "x$GXX" = "xyes"; then
|
||||
case " $CXXFLAGS " in
|
||||
*[\ \ ]-ansi[\ \ ]*) ;;
|
||||
*) complCXXFLAGS="$complCXXFLAGS -ansi" ;;
|
||||
esac
|
||||
|
||||
case " $CXXFLAGS " in
|
||||
*[\ \ ]-pedantic[\ \ ]*) ;;
|
||||
*) complCXXFLAGS="$complCXXFLAGS -pedantic" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($complCXXFLAGS)
|
||||
|
||||
WARN_CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS"
|
||||
AC_SUBST(WARN_CXXFLAGS)
|
||||
])
|
||||
20
autogen.sh
20
autogen.sh
@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
pushd $srcdir
|
||||
|
||||
aclocal || exit 1
|
||||
autoheader || exit 1
|
||||
glib-gettextize -f -c || exit 1
|
||||
gtkdocize --copy || exit 1
|
||||
intltoolize -c -f || exit 1
|
||||
libtoolize -c || exit 1
|
||||
autoconf || exit 1
|
||||
automake -a -c || exit 1
|
||||
popd
|
||||
|
||||
if test -z "$NOCONFIGURE"; then
|
||||
$srcdir/configure --enable-maintainer-mode $*
|
||||
fi
|
||||
3
code-of-conduct.md
Normal file
3
code-of-conduct.md
Normal file
@ -0,0 +1,3 @@
|
||||
This project and its community follow the [Freedesktop.org code of conduct]
|
||||
|
||||
[Freedesktop.org code of conduct]: https://www.freedesktop.org/wiki/CodeOfConduct/
|
||||
11
config.h.in
Normal file
11
config.h.in
Normal file
@ -0,0 +1,11 @@
|
||||
/* Define to the Gettext package name */
|
||||
#mesondefine GETTEXT_PACKAGE
|
||||
|
||||
/* Version number of package */
|
||||
#mesondefine PACKAGE_VERSION
|
||||
|
||||
/* Where the configuration file will be located */
|
||||
#mesondefine SYSCONFDIR
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#mesondefine VERSION
|
||||
87
configure.ac
87
configure.ac
@ -1,87 +0,0 @@
|
||||
AC_INIT([fprintd], [0.8.0])
|
||||
AM_INIT_AUTOMAKE([1.11 dist-xz no-dist-gzip check-news])
|
||||
AC_CONFIG_SRCDIR([src/main.c])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
# Enable silent build when available (Automake 1.11)
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
|
||||
AC_PREREQ([2.50])
|
||||
AC_PROG_LIBTOOL
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
|
||||
GETTEXT_PACKAGE=fprintd
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], [Define to the Gettext package name])
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
IT_PROG_INTLTOOL([0.35.0])
|
||||
|
||||
PKG_CHECK_MODULES(FPRINT, [libfprint > 0.1.0])
|
||||
AC_SUBST(FPRINT_LIBS)
|
||||
AC_SUBST(FPRINT_CFLAGS)
|
||||
|
||||
PKG_CHECK_MODULES(GLIB, glib-2.0 dbus-glib-1)
|
||||
AC_SUBST(GLIB_CFLAGS)
|
||||
AC_SUBST(GLIB_LIBS)
|
||||
|
||||
PKG_CHECK_MODULES(DAEMON, glib-2.0 dbus-glib-1 gmodule-2.0 polkit-gobject-1 >= 0.91 gio-2.0 >= 2.26)
|
||||
AC_SUBST(DAEMON_LIBS)
|
||||
AC_SUBST(DAEMON_CFLAGS)
|
||||
|
||||
AC_ARG_ENABLE(pam, AC_HELP_STRING([--enable-pam],[Build the fprintd PAM module]), enable_pam="$enableval", enable_pam=yes)
|
||||
has_pam=no
|
||||
if test x$enable_pam = xyes; then
|
||||
has_pam=yes
|
||||
AC_CHECK_HEADER([security/pam_modules.h], [has_pam=yes] , [has_pam=no])
|
||||
if test x$has_pam = xyes; then
|
||||
has_pam=no
|
||||
AC_CHECK_LIB(pam, pam_start, [PAM_LIBS="-lpam"
|
||||
has_pam=yes],
|
||||
has_pam=no)
|
||||
fi
|
||||
AC_SUBST(PAM_LIBS)
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_PAM, test "x$has_pam" = "xyes")
|
||||
|
||||
AC_MSG_CHECKING(for PAM headers and library)
|
||||
AC_MSG_RESULT([$has_pam])
|
||||
|
||||
|
||||
AC_CHECK_PROG([XMLLINT], [xmllint], [xmllint])
|
||||
AC_CHECK_PROG([XSLTPROC], [xsltproc], [xsltproc])
|
||||
AC_CHECK_PROG([POD2MAN], [pod2man], [pod2man])
|
||||
AM_CONDITIONAL(BUILD_MAN, test x"$POD2MAN" != "x")
|
||||
|
||||
GTK_DOC_CHECK([1.3])
|
||||
|
||||
AC_ARG_WITH([systemdsystemunitdir],
|
||||
AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
|
||||
[],
|
||||
[with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
|
||||
AS_IF([test "x$with_systemdsystemunitdir" != "xno"], [
|
||||
AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
|
||||
])
|
||||
AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$systemdsystemunitdir"])
|
||||
|
||||
AS_AC_EXPAND(DATADIR, $datadir)
|
||||
|
||||
DBUS_SERVICES_DIR="$DATADIR/dbus-1/services"
|
||||
AC_SUBST(DBUS_SERVICES_DIR)
|
||||
AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Where services dir for DBUS is])
|
||||
|
||||
AC_DEFINE_UNQUOTED(SYSCONFDIR, "$sysconfdir", [Where the configuration file will be located])
|
||||
|
||||
GNOME_COMPILE_WARNINGS
|
||||
|
||||
AC_OUTPUT([
|
||||
Makefile
|
||||
src/Makefile
|
||||
data/Makefile
|
||||
tests/Makefile
|
||||
pam/Makefile
|
||||
doc/Makefile
|
||||
doc/version.xml
|
||||
doc/dbus/Makefile
|
||||
po/Makefile.in
|
||||
])
|
||||
@ -1,44 +0,0 @@
|
||||
|
||||
dbus_servicesdir = $(datadir)/dbus-1/system-services
|
||||
dbus_services_in_files = net.reactivated.Fprint.service.in
|
||||
dbus_services_DATA = $(dbus_services_in_files:.service.in=.service)
|
||||
|
||||
$(dbus_services_DATA): $(dbus_services_in_files)
|
||||
sed -e "s|\@LIBEXECDIR\@|$(libexecdir)|" $< > $@
|
||||
|
||||
dbus_confdir = $(sysconfdir)/dbus-1/system.d
|
||||
dbus_conf_DATA = net.reactivated.Fprint.conf
|
||||
|
||||
systemdservice_in_files = fprintd.service.in
|
||||
|
||||
if HAVE_SYSTEMD
|
||||
systemdservicedir = $(systemdsystemunitdir)
|
||||
systemdservice_DATA = $(systemdservice_in_files:.service.in=.service)
|
||||
$(systemdservice_DATA): $(systemdservice_in_files) Makefile
|
||||
@sed -e "s|\@libexecdir\@|$(libexecdir)|" -e "s|\@localstatedir\@|$(localstatedir)|" $< > $@
|
||||
endif
|
||||
|
||||
polkitdir = $(datadir)/polkit-1/actions
|
||||
polkit_in_files = net.reactivated.fprint.device.policy.in
|
||||
|
||||
@INTLTOOL_POLICY_RULE@
|
||||
polkit_DATA = $(polkit_in_files:.policy.in=.policy)
|
||||
|
||||
confdir = $(sysconfdir)/
|
||||
conf_DATA = fprintd.conf
|
||||
|
||||
man_MANS =
|
||||
|
||||
if BUILD_MAN
|
||||
man_MANS += fprintd.1
|
||||
fprintd.1: fprintd.pod
|
||||
$(AM_V_GEN) pod2man -c "" -s 1 -q none -n fprintd -r freedesktop $< > $@
|
||||
endif
|
||||
|
||||
EXTRA_DIST = $(dbus_services_in_files) $(dbus_conf_DATA) $(polkit_in_files) $(conf_DATA) $(systemdservice_in_files) fprintd.pod
|
||||
CLEANFILES = $(polkit_DATA) $(dbus_services_DATA) $(systemdservice_DATA) fprintd.1
|
||||
|
||||
check:
|
||||
@$(XMLLINT) --noout $(polkit_DATA)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
|
||||
.\" Automatically generated by Pod::Man 4.12 (Pod::Simple 3.39)
|
||||
.\"
|
||||
.\" Standard preamble:
|
||||
.\" ========================================================================
|
||||
@ -38,27 +38,36 @@
|
||||
. ds PI \(*p
|
||||
. ds L" ``
|
||||
. ds R" ''
|
||||
. ds C`
|
||||
. ds C'
|
||||
'br\}
|
||||
.\"
|
||||
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\"
|
||||
.\" If the F register is turned on, we'll generate index entries on stderr for
|
||||
.\" If the F register is >0, we'll generate index entries on stderr for
|
||||
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
||||
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
||||
.\" output yourself in some meaningful fashion.
|
||||
.ie \nF \{\
|
||||
.\"
|
||||
.\" Avoid warning from groff about undefined register 'F'.
|
||||
.de IX
|
||||
..
|
||||
.nr rF 0
|
||||
.if \n(.g .if rF .nr rF 1
|
||||
.if (\n(rF:(\n(.g==0)) \{\
|
||||
. if \nF \{\
|
||||
. de IX
|
||||
. tm Index:\\$1\t\\n%\t"\\$2"
|
||||
..
|
||||
. if !\nF==2 \{\
|
||||
. nr % 0
|
||||
. rr F
|
||||
. nr F 2
|
||||
. \}
|
||||
.el \{\
|
||||
. de IX
|
||||
..
|
||||
. \}
|
||||
.\}
|
||||
.rr rF
|
||||
.\"
|
||||
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
||||
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
||||
@ -124,16 +133,16 @@
|
||||
.\" ========================================================================
|
||||
.\"
|
||||
.IX Title "fprintd 1"
|
||||
.TH fprintd 1 "2010-08-16" "freedesktop" ""
|
||||
.TH fprintd 1 "2020-01-24" "freedesktop" ""
|
||||
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||
.\" way too many mistakes in technical documents.
|
||||
.if n .ad l
|
||||
.nh
|
||||
.SH "NAME"
|
||||
fprintd \- Fingerprint management daemon, and test applications
|
||||
.SH "SYNOPSYS"
|
||||
.IX Header "SYNOPSYS"
|
||||
\&\fBfprintd-enroll\fR [username]
|
||||
.SH "SYNOPSIS"
|
||||
.IX Header "SYNOPSIS"
|
||||
\&\fBfprintd-enroll\fR [\-f finger] [usename]
|
||||
.PP
|
||||
\&\fBfprintd-list\fR username [usernames...]
|
||||
.PP
|
||||
@ -185,7 +194,7 @@ Will list the user's enrolled fingerprints.
|
||||
.SS "fprintd-verify"
|
||||
.IX Subsection "fprintd-verify"
|
||||
.RS 8
|
||||
Will enroll the user's right index finger into the database.
|
||||
Will verify the user's fingerprints against the database.
|
||||
.RE
|
||||
.SS "fprintd-enroll"
|
||||
.IX Subsection "fprintd-enroll"
|
||||
@ -200,5 +209,5 @@ Will enroll the user's right index finger into the database.
|
||||
By default, fprintd stores the fingerprints in \fB/var/lib/fprint/\fR
|
||||
.SH "SEE ALSO"
|
||||
.IX Header "SEE ALSO"
|
||||
.IP "\fBdbus-daemon\fR, \fBgnome-about-me\fR" 8
|
||||
.IX Item "dbus-daemon, gnome-about-me"
|
||||
.IP "\fBgnome-control-center\fR" 8
|
||||
.IX Item "gnome-control-center"
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
fprintd - Fingerprint management daemon, and test applications
|
||||
|
||||
=head1 SYNOPSYS
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<fprintd-enroll> [-f finger] [usename]
|
||||
|
||||
@ -75,7 +75,7 @@ Will list the user's enrolled fingerprints.
|
||||
|
||||
=over 8
|
||||
|
||||
Will enroll the user's right index finger into the database.
|
||||
Will verify the user's fingerprints against the database.
|
||||
|
||||
=back
|
||||
|
||||
@ -99,7 +99,7 @@ By default, fprintd stores the fingerprints in B</var/lib/fprint/>
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<dbus-daemon>, B<gnome-about-me>
|
||||
=item B<gnome-control-center>
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@ -11,12 +11,14 @@ ExecStart=@libexecdir@/fprintd
|
||||
ProtectSystem=strict
|
||||
ProtectKernelTunables=true
|
||||
ProtectControlGroups=true
|
||||
ReadWritePaths=@localstatedir@/lib/fprint
|
||||
# This always corresponds to /var/lib/fprint
|
||||
StateDirectory=fprint
|
||||
ProtectHome=true
|
||||
PrivateTmp=true
|
||||
|
||||
# Network
|
||||
PrivateNetwork=true
|
||||
RestrictAddressFamilies=AF_UNIX AF_LOCAL AF_NETLINK
|
||||
|
||||
# Execute Mappings
|
||||
MemoryDenyWriteExecute=true
|
||||
|
||||
70
data/meson.build
Normal file
70
data/meson.build
Normal file
@ -0,0 +1,70 @@
|
||||
install_data('net.reactivated.Fprint.conf',
|
||||
install_dir: dbus_conf_dir)
|
||||
|
||||
configure_file(
|
||||
configuration: configuration_data({
|
||||
'LIBEXECDIR': fprintd_installdir,
|
||||
}),
|
||||
input: 'net.reactivated.Fprint.service.in',
|
||||
output: 'net.reactivated.Fprint.service',
|
||||
install: true,
|
||||
install_dir: dbus_service_dir,
|
||||
)
|
||||
|
||||
configure_file(
|
||||
configuration: configuration_data({
|
||||
'libexecdir': fprintd_installdir,
|
||||
}),
|
||||
input: 'fprintd.service.in',
|
||||
output: 'fprintd.service',
|
||||
install: true,
|
||||
install_dir: systemd_unit_dir,
|
||||
)
|
||||
|
||||
polkit_policy = 'net.reactivated.fprint.device.policy'
|
||||
polkit_policy_target = i18n.merge_file(polkit_policy,
|
||||
input: '@0@.in'.format(polkit_policy),
|
||||
output: polkit_policy,
|
||||
po_dir: meson.source_root() / 'po',
|
||||
install: true,
|
||||
install_dir: polkit_policy_directory,
|
||||
)
|
||||
|
||||
if xmllint.found()
|
||||
test(polkit_policy,
|
||||
xmllint,
|
||||
depends: polkit_policy_target,
|
||||
args: [
|
||||
'--noout',
|
||||
polkit_policy_target.full_path(),
|
||||
])
|
||||
endif
|
||||
|
||||
install_data('fprintd.conf',
|
||||
install_dir: sysconfdir)
|
||||
|
||||
if get_option('man')
|
||||
manfiles = {
|
||||
'fprintd': 1,
|
||||
'pam_fprintd': 8,
|
||||
}
|
||||
|
||||
foreach man_name, man_section: manfiles
|
||||
custom_target('man_' + man_name + '.' + man_section.to_string(),
|
||||
input: man_name + '.pod',
|
||||
output: man_name + '.' + man_section.to_string(),
|
||||
command: [
|
||||
pod2man,
|
||||
'-c', '',
|
||||
'-s', man_section.to_string(),
|
||||
'-q', 'none',
|
||||
'-n', man_name,
|
||||
'-r', 'freedesktop',
|
||||
'@INPUT@',
|
||||
'@OUTPUT@',
|
||||
],
|
||||
install: true,
|
||||
install_dir: datadir / 'man' / 'man' + man_section.to_string(),
|
||||
)
|
||||
endforeach
|
||||
endif
|
||||
@ -6,12 +6,12 @@
|
||||
<policyconfig>
|
||||
|
||||
<vendor>The FPrint Project</vendor>
|
||||
<vendor_url>http://reactivated.net/fprint/</vendor_url>
|
||||
<vendor_url>https://fprint.freedesktop.org/</vendor_url>
|
||||
<icon_name>fprint</icon_name>
|
||||
|
||||
<action id="net.reactivated.fprint.device.verify">
|
||||
<_description>Verify a fingerprint</_description>
|
||||
<_message>Privileges are required to verify fingerprints.</_message>
|
||||
<description>Verify a fingerprint</description>
|
||||
<message>Privileges are required to verify fingerprints.</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
@ -20,8 +20,8 @@
|
||||
</action>
|
||||
|
||||
<action id="net.reactivated.fprint.device.enroll">
|
||||
<_description>Enroll new fingerprints</_description>
|
||||
<_message>Privileges are required to enroll new fingerprints.</_message>
|
||||
<description>Enroll new fingerprints</description>
|
||||
<message>Privileges are required to enroll new fingerprints.</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
@ -30,8 +30,8 @@
|
||||
</action>
|
||||
|
||||
<action id="net.reactivated.fprint.device.setusername">
|
||||
<_description>Select a user to enroll</_description>
|
||||
<_message>Privileges are required to enroll new fingerprints for other users.</_message>
|
||||
<description>Select a user to enroll</description>
|
||||
<message>Privileges are required to enroll new fingerprints for other users.</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
|
||||
184
data/pam_fprintd.8
Normal file
184
data/pam_fprintd.8
Normal file
@ -0,0 +1,184 @@
|
||||
.\" Automatically generated by Pod::Man 4.12 (Pod::Simple 3.39)
|
||||
.\"
|
||||
.\" Standard preamble:
|
||||
.\" ========================================================================
|
||||
.de Sp \" Vertical space (when we can't use .PP)
|
||||
.if t .sp .5v
|
||||
.if n .sp
|
||||
..
|
||||
.de Vb \" Begin verbatim text
|
||||
.ft CW
|
||||
.nf
|
||||
.ne \\$1
|
||||
..
|
||||
.de Ve \" End verbatim text
|
||||
.ft R
|
||||
.fi
|
||||
..
|
||||
.\" Set up some character translations and predefined strings. \*(-- will
|
||||
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
|
||||
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
|
||||
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
|
||||
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
|
||||
.\" nothing in troff, for use with C<>.
|
||||
.tr \(*W-
|
||||
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
||||
.ie n \{\
|
||||
. ds -- \(*W-
|
||||
. ds PI pi
|
||||
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
||||
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
||||
. ds L" ""
|
||||
. ds R" ""
|
||||
. ds C`
|
||||
. ds C'
|
||||
'br\}
|
||||
.el\{\
|
||||
. ds -- \|\(em\|
|
||||
. ds PI \(*p
|
||||
. ds L" ``
|
||||
. ds R" ''
|
||||
. ds C`
|
||||
. ds C'
|
||||
'br\}
|
||||
.\"
|
||||
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\"
|
||||
.\" If the F register is >0, we'll generate index entries on stderr for
|
||||
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
||||
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
||||
.\" output yourself in some meaningful fashion.
|
||||
.\"
|
||||
.\" Avoid warning from groff about undefined register 'F'.
|
||||
.de IX
|
||||
..
|
||||
.nr rF 0
|
||||
.if \n(.g .if rF .nr rF 1
|
||||
.if (\n(rF:(\n(.g==0)) \{\
|
||||
. if \nF \{\
|
||||
. de IX
|
||||
. tm Index:\\$1\t\\n%\t"\\$2"
|
||||
..
|
||||
. if !\nF==2 \{\
|
||||
. nr % 0
|
||||
. nr F 2
|
||||
. \}
|
||||
. \}
|
||||
.\}
|
||||
.rr rF
|
||||
.\"
|
||||
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
||||
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
||||
. \" fudge factors for nroff and troff
|
||||
.if n \{\
|
||||
. ds #H 0
|
||||
. ds #V .8m
|
||||
. ds #F .3m
|
||||
. ds #[ \f1
|
||||
. ds #] \fP
|
||||
.\}
|
||||
.if t \{\
|
||||
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
||||
. ds #V .6m
|
||||
. ds #F 0
|
||||
. ds #[ \&
|
||||
. ds #] \&
|
||||
.\}
|
||||
. \" simple accents for nroff and troff
|
||||
.if n \{\
|
||||
. ds ' \&
|
||||
. ds ` \&
|
||||
. ds ^ \&
|
||||
. ds , \&
|
||||
. ds ~ ~
|
||||
. ds /
|
||||
.\}
|
||||
.if t \{\
|
||||
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
||||
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
||||
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
||||
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
||||
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
||||
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
||||
.\}
|
||||
. \" troff and (daisy-wheel) nroff accents
|
||||
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
||||
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
||||
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
||||
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
||||
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
||||
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
||||
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
||||
.ds ae a\h'-(\w'a'u*4/10)'e
|
||||
.ds Ae A\h'-(\w'A'u*4/10)'E
|
||||
. \" corrections for vroff
|
||||
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
||||
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
||||
. \" for low resolution devices (crt and lpr)
|
||||
.if \n(.H>23 .if \n(.V>19 \
|
||||
\{\
|
||||
. ds : e
|
||||
. ds 8 ss
|
||||
. ds o a
|
||||
. ds d- d\h'-1'\(ga
|
||||
. ds D- D\h'-1'\(hy
|
||||
. ds th \o'bp'
|
||||
. ds Th \o'LP'
|
||||
. ds ae ae
|
||||
. ds Ae AE
|
||||
.\}
|
||||
.rm #[ #] #H #V #F C
|
||||
.\" ========================================================================
|
||||
.\"
|
||||
.IX Title "pam_fprintd 8"
|
||||
.TH pam_fprintd 8 "2020-01-24" "freedesktop" ""
|
||||
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||
.\" way too many mistakes in technical documents.
|
||||
.if n .ad l
|
||||
.nh
|
||||
.SH "NAME"
|
||||
pam_fprintd \- PAM module to authenticate against fprintd, the fingerprint daemon
|
||||
.SH "SYNOPSIS"
|
||||
.IX Header "SYNOPSIS"
|
||||
\&\fBpam_fprintd.so\fR [debug|debug=[\fIon\fR|\fIoff\fR|\fItrue\fR|\fIfalse\fR|\fI1\fR|\fI0\fR]] [max\-tries=\fI\s-1MAX_TRIES\s0\fR] [timeout=\fI\s-1TIMEOUT\s0\fR]
|
||||
.SH "DESCRIPTION"
|
||||
.IX Header "DESCRIPTION"
|
||||
The pam_fprintd module is used to verify a user's fingerprints against fingerprints
|
||||
enrolled using fprintd, the fingerprint management daemon.
|
||||
.SH "OPTIONS"
|
||||
.IX Header "OPTIONS"
|
||||
.IP "\fBdebug\fR" 8
|
||||
.IX Item "debug"
|
||||
.PD 0
|
||||
.IP "\fBdebug=[\f(BIon\fB|\f(BIoff\fB|\f(BItrue\fB|\f(BIfalse\fB|\f(BI1\fB|\f(BI0\fB]\fR" 8
|
||||
.IX Item "debug=[on|off|true|false|1|0]"
|
||||
.PD
|
||||
Whether debug should be turned on or off. Debug messages will be generated using
|
||||
pam_syslog which means that they will be saved in the systemd journal by default.
|
||||
.IP "\fBmax\-tries=\f(BI\s-1MAX_TRIES\s0\fB\fR" 8
|
||||
.IX Item "max-tries=MAX_TRIES"
|
||||
The number of attempts at fingerprint authentication to try before returning an
|
||||
authentication failure. The minimum, and default, number of tries is 3.
|
||||
.IP "\fBtimeout=\f(BI\s-1TIMEOUT\s0\fB\fR" 8
|
||||
.IX Item "timeout=TIMEOUT"
|
||||
The amount of time before returning an authentication failure. The default timeout
|
||||
is 30 seconds, with 10 seconds being the minimum.
|
||||
.SH "LIMITATIONS"
|
||||
.IX Header "LIMITATIONS"
|
||||
The \s-1PAM\s0 stack is by design a serialised authentication, so it is not
|
||||
possible for pam_fprintd to allow authentication through passwords and
|
||||
fingerprints at the same time.
|
||||
.PP
|
||||
It is up to the application using the \s-1PAM\s0 services to implement separate
|
||||
\&\s-1PAM\s0 processes and run separate authentication stacks separately. This
|
||||
is the way multiple authentication methods are made available to users
|
||||
of gdm for example.
|
||||
.SH "AUTHOR"
|
||||
.IX Header "AUTHOR"
|
||||
\&\fBfprintd\fR was written by Bastien Nocera.
|
||||
.SH "SEE ALSO"
|
||||
.IX Header "SEE ALSO"
|
||||
.IP "\fBfprintd\fR, \fB\s-1PAM\s0\fR" 8
|
||||
.IX Item "fprintd, PAM"
|
||||
63
data/pam_fprintd.pod
Normal file
63
data/pam_fprintd.pod
Normal file
@ -0,0 +1,63 @@
|
||||
=head1 NAME
|
||||
|
||||
pam_fprintd - PAM module to authenticate against fprintd, the fingerprint daemon
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<pam_fprintd.so> [debug|debug=[I<on>|I<off>|I<true>|I<false>|I<1>|I<0>]] [max-tries=I<MAX_TRIES>] [timeout=I<TIMEOUT>]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The pam_fprintd module is used to verify a user's fingerprints against fingerprints
|
||||
enrolled using fprintd, the fingerprint management daemon.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<debug>
|
||||
|
||||
=item B<debug=[I<on>|I<off>|I<true>|I<false>|I<1>|I<0>]>
|
||||
|
||||
Whether debug should be turned on or off. Debug messages will be generated using
|
||||
pam_syslog which means that they will be saved in the systemd journal by default.
|
||||
|
||||
=item B<max-tries=I<MAX_TRIES>>
|
||||
|
||||
The number of attempts at fingerprint authentication to try before returning an
|
||||
authentication failure. The minimum, and default, number of tries is 3.
|
||||
|
||||
=item B<timeout=I<TIMEOUT>>
|
||||
|
||||
The amount of time before returning an authentication failure. The default timeout
|
||||
is 30 seconds, with 10 seconds being the minimum.
|
||||
|
||||
=back
|
||||
|
||||
=head1 LIMITATIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=back
|
||||
|
||||
The PAM stack is by design a serialised authentication, so it is not
|
||||
possible for pam_fprintd to allow authentication through passwords and
|
||||
fingerprints at the same time.
|
||||
|
||||
It is up to the application using the PAM services to implement separate
|
||||
PAM processes and run separate authentication stacks separately. This
|
||||
is the way multiple authentication methods are made available to users
|
||||
of gdm for example.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
B<fprintd> was written by Bastien Nocera.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<fprintd>, B<PAM>
|
||||
|
||||
=back
|
||||
|
||||
@ -1,81 +0,0 @@
|
||||
|
||||
SUBDIRS = dbus
|
||||
|
||||
NULL =
|
||||
|
||||
AUTOMAKE_OPTIONS = 1.7
|
||||
|
||||
# The name of the module.
|
||||
DOC_MODULE=fprintd
|
||||
|
||||
# The top-level SGML file.
|
||||
DOC_MAIN_SGML_FILE=fprintd-docs.xml
|
||||
|
||||
# Extra options to supply to gtkdoc-scan
|
||||
SCAN_OPTIONS=--ignore-headers=config.h
|
||||
|
||||
# The directory containing the source code. Relative to $(srcdir)
|
||||
DOC_SOURCE_DIR=../src
|
||||
|
||||
# Used for dependencies
|
||||
HFILE_GLOB=
|
||||
#$(top_srcdir)/policy/*.h
|
||||
CFILE_GLOB=
|
||||
#$(top_srcdir)/policy/*.c
|
||||
|
||||
# Headers to ignore
|
||||
IGNORE_HFILES= \
|
||||
$(NULL)
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling scan program. Only needed
|
||||
# if $(DOC_MODULE).types is non-empty.
|
||||
INCLUDES = \
|
||||
$(GLIB_CFLAGS) \
|
||||
-I$(top_srcdir)/src \
|
||||
$(NULL)
|
||||
|
||||
GTKDOC_LIBS = \
|
||||
$(GLIB_LIBS) \
|
||||
$(top_builddir)/src/libfprintd.la \
|
||||
$(NULL)
|
||||
|
||||
# Extra options to supply to gtkdoc-mkdb
|
||||
MKDB_OPTIONS=--sgml-mode --output-format=xml
|
||||
|
||||
# Extra options to supply to gtkdoc-mktmpl
|
||||
MKTMPL_OPTIONS=
|
||||
|
||||
# Non-autogenerated SGML files to be included in $(DOC_MAIN_SGML_FILE)
|
||||
content_files = \
|
||||
version.xml \
|
||||
dbus/net.reactivated.Fprint.Manager.ref.xml \
|
||||
dbus/net.reactivated.Fprint.Device.ref.xml \
|
||||
$(NULL)
|
||||
|
||||
# Images to copy into HTML directory
|
||||
HTML_IMAGES = \
|
||||
$(NULL)
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref
|
||||
FIXXREF_OPTIONS=
|
||||
|
||||
DISTCLEANFILES = \
|
||||
net.reactivated.Fprint.Manager.ref.xml \
|
||||
net.reactivated.Fprint.Device.ref.xml
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
*~ \
|
||||
Makefile.in \
|
||||
fprintd.types \
|
||||
fprintd-*.txt \
|
||||
$(NULL)
|
||||
|
||||
if ENABLE_GTK_DOC
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
else
|
||||
EXTRA_DIST = fprintd-docs.xml
|
||||
endif
|
||||
|
||||
# Version information for marking the documentation
|
||||
EXTRA_DIST += version.xml.in
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
|
||||
noinst_DATA = net.reactivated.Fprint.Manager.ref.xml net.reactivated.Fprint.Device.ref.xml
|
||||
|
||||
net.reactivated.Fprint.Manager.ref.xml : $(top_srcdir)/src/manager.xml $(top_srcdir)/doc/dbus/spec-to-docbook.xsl
|
||||
echo "<?xml version=\"1.0\"?>""<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\">" > $@
|
||||
$(XSLTPROC) $(top_srcdir)/doc/dbus/spec-to-docbook.xsl $< | tail -n +2 >> $@
|
||||
|
||||
net.reactivated.Fprint.Device.ref.xml : $(top_srcdir)/src/device.xml $(top_srcdir)/doc/dbus/spec-to-docbook.xsl
|
||||
echo "<?xml version=\"1.0\"?>""<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\">" > $@
|
||||
$(XSLTPROC) $(top_srcdir)/doc/dbus/spec-to-docbook.xsl $< | tail -n +2 >> $@
|
||||
|
||||
EXTRA_DIST = spec-to-docbook.xsl dbus-introspect-docs.dtd
|
||||
|
||||
clean-local :
|
||||
rm -f *~ *.ref.xml
|
||||
29
doc/dbus/meson.build
Normal file
29
doc/dbus/meson.build
Normal file
@ -0,0 +1,29 @@
|
||||
docbook_xml_header = custom_target('docbook_xml_header',
|
||||
output: 'docbook-xml-header.xml',
|
||||
command: [
|
||||
'echo', '-n',
|
||||
'<?xml version="1.0"?>',
|
||||
'<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">',
|
||||
],
|
||||
capture: true,
|
||||
)
|
||||
|
||||
dbus_interfaces_refs = []
|
||||
foreach interface_file: dbus_interfaces_files
|
||||
basename = run_command('basename', interface_file.full_path(), '.xml').stdout().strip()
|
||||
dbus_interfaces_refs += custom_target(basename + '_ref',
|
||||
input: docbook_xml_header,
|
||||
output: basename + '.ref.xml',
|
||||
build_by_default: true,
|
||||
depends: interface_file,
|
||||
capture: true,
|
||||
command: [
|
||||
bash, '-c',
|
||||
'cat @INPUT@;' +
|
||||
xsltproc.path() + ' @0@/@1@ '.format(
|
||||
meson.source_root(),
|
||||
files('spec-to-docbook.xsl')[0]) +
|
||||
interface_file.full_path() + '| tail -n +2;',
|
||||
],
|
||||
)
|
||||
endforeach
|
||||
27
doc/meson.build
Normal file
27
doc/meson.build
Normal file
@ -0,0 +1,27 @@
|
||||
subdir('dbus')
|
||||
|
||||
version_file = configure_file(
|
||||
input: 'version.xml.in',
|
||||
output: 'version.xml',
|
||||
configuration: configuration_data({
|
||||
'VERSION': meson.project_version(),
|
||||
}),
|
||||
)
|
||||
|
||||
gnome.gtkdoc(meson.project_name(),
|
||||
main_xml: 'fprintd-docs.xml',
|
||||
src_dir: meson.source_root() / 'src',
|
||||
dependencies: [
|
||||
declare_dependency(
|
||||
sources: dbus_interfaces_refs,
|
||||
link_with: libfprintd_private,
|
||||
),
|
||||
],
|
||||
content_files: [
|
||||
version_file,
|
||||
dbus_interfaces_refs,
|
||||
],
|
||||
ignore_headers: [
|
||||
'config.h',
|
||||
],
|
||||
install: true)
|
||||
196
git.mk
196
git.mk
@ -1,196 +0,0 @@
|
||||
# git.mk
|
||||
#
|
||||
# Copyright 2009, Red Hat, Inc.
|
||||
# Written by Behdad Esfahbod
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification,
|
||||
# are permitted in any medium without royalty provided the copyright
|
||||
# notice and this notice are preserved.
|
||||
#
|
||||
# The canonical source for this file is pango/git.mk, or whereever the
|
||||
# header of pango/git.mk suggests in the future.
|
||||
#
|
||||
# To use in your project, import this file in your git repo's toplevel,
|
||||
# then do "make -f git.mk". This modifies all Makefile.am files in
|
||||
# your project to include git.mk.
|
||||
#
|
||||
# This enables automatic .gitignore generation. If you need to ignore
|
||||
# more files, add them to the GITIGNOREFILES variable in your Makefile.am.
|
||||
# But think twice before doing that. If a file has to be in .gitignore,
|
||||
# chances are very high that it's a generated file and should be in one
|
||||
# of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES.
|
||||
#
|
||||
# The only case that you need to manually add a file to GITIGNOREFILES is
|
||||
# when remove files in one of mostlyclean-local, clean-local, distclean-local,
|
||||
# or maintainer-clean-local.
|
||||
#
|
||||
# Note that for files like editor backup, etc, there are better places to
|
||||
# ignore them. See "man gitignore".
|
||||
#
|
||||
# If "make maintainer-clean" removes the files but they are not recognized
|
||||
# by this script (that is, if "git status" shows untracked files still), send
|
||||
# me the output of "git status" as well as your Makefile.am and Makefile for
|
||||
# the directories involved.
|
||||
#
|
||||
# For a list of toplevel files that should be in MAINTAINERCLEANFILES, see
|
||||
# pango/Makefile.am.
|
||||
#
|
||||
# Don't EXTRA_DIST this file. It is supposed to only live in git clones,
|
||||
# not tarballs. It serves no useful purpose in tarballs and clutters the
|
||||
# build dir.
|
||||
#
|
||||
# This file knows how to handle autoconf, automake, libtool, gtk-doc,
|
||||
# gnome-doc-utils, intltool, GSettings.
|
||||
#
|
||||
#
|
||||
# KNOWN ISSUES:
|
||||
#
|
||||
# - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the
|
||||
# submodule doesn't find us. If you have configure.{in,ac} files in
|
||||
# subdirs, add a proxy git.mk file in those dirs that simply does:
|
||||
# "include $(top_srcdir)/../git.mk". Add more ..'s to your taste.
|
||||
# And add those files to git. See vte/gnome-pty-helper/git.mk for
|
||||
# example.
|
||||
#
|
||||
|
||||
git-all: git-mk-install
|
||||
|
||||
git-mk-install:
|
||||
@echo Installing git makefile
|
||||
@any_failed=; find $(top_srcdir) -name Makefile.am | while read x; do \
|
||||
if grep 'include .*/git.mk' $$x >/dev/null; then \
|
||||
echo $$x already includes git.mk; \
|
||||
else \
|
||||
failed=; \
|
||||
echo "Updating $$x"; \
|
||||
{ cat $$x; \
|
||||
echo ''; \
|
||||
echo '-include $$(top_srcdir)/git.mk'; \
|
||||
} > $$x.tmp || failed=1; \
|
||||
if test x$$failed = x; then \
|
||||
mv $$x.tmp $$x || failed=1; \
|
||||
fi; \
|
||||
if test x$$failed = x; then : else \
|
||||
echo Failed updating $$x; >&2 \
|
||||
any_failed=1; \
|
||||
fi; \
|
||||
fi; done; test -z "$$any_failed"
|
||||
|
||||
.PHONY: git-all git-mk-install
|
||||
|
||||
|
||||
### .gitignore generation
|
||||
|
||||
$(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk
|
||||
$(AM_V_GEN) \
|
||||
{ \
|
||||
if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \
|
||||
for x in \
|
||||
$(DOC_MODULE)-decl-list.txt \
|
||||
$(DOC_MODULE)-decl.txt \
|
||||
tmpl/$(DOC_MODULE)-unused.sgml \
|
||||
"tmpl/*.bak" \
|
||||
xml html \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test "x$(DOC_MODULE)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \
|
||||
for x in \
|
||||
$(_DOC_C_DOCS) \
|
||||
$(_DOC_LC_DOCS) \
|
||||
$(_DOC_OMF_ALL) \
|
||||
$(_DOC_DSK_ALL) \
|
||||
$(_DOC_HTML_ALL) \
|
||||
$(_DOC_POFILES) \
|
||||
$(_DOC_MOFILES) \
|
||||
$(DOC_H_FILE) \
|
||||
"*/.xml2po.mo" \
|
||||
"*/*.omf.out" \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test "x$(gsettings_SCHEMAS)" = x; then :; else \
|
||||
for x in \
|
||||
$(gsettings_SCHEMAS:.xml=.valid) \
|
||||
$(gsettings__enum_file) \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test -f $(srcdir)/po/Makefile.in.in; then \
|
||||
for x in \
|
||||
po/Makefile.in.in \
|
||||
po/Makefile.in \
|
||||
po/Makefile \
|
||||
po/POTFILES \
|
||||
po/stamp-it \
|
||||
po/.intltool-merge-cache \
|
||||
"po/*.gmo" \
|
||||
"po/*.mo" \
|
||||
po/$(GETTEXT_PACKAGE).pot \
|
||||
intltool-extract.in \
|
||||
intltool-merge.in \
|
||||
intltool-update.in \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
if test -f $(srcdir)/configure; then \
|
||||
for x in \
|
||||
autom4te.cache \
|
||||
configure \
|
||||
config.h \
|
||||
stamp-h1 \
|
||||
libtool \
|
||||
config.lt \
|
||||
; do echo /$$x; done; \
|
||||
fi; \
|
||||
for x in \
|
||||
.gitignore \
|
||||
$(GITIGNOREFILES) \
|
||||
$(CLEANFILES) \
|
||||
$(PROGRAMS) \
|
||||
$(check_PROGRAMS) \
|
||||
$(EXTRA_PROGRAMS) \
|
||||
$(LTLIBRARIES) \
|
||||
so_locations \
|
||||
.libs _libs \
|
||||
$(MOSTLYCLEANFILES) \
|
||||
"*.$(OBJEXT)" \
|
||||
"*.lo" \
|
||||
$(DISTCLEANFILES) \
|
||||
$(am__CONFIG_DISTCLEAN_FILES) \
|
||||
$(CONFIG_CLEAN_FILES) \
|
||||
TAGS ID GTAGS GRTAGS GSYMS GPATH tags \
|
||||
"*.tab.c" \
|
||||
$(MAINTAINERCLEANFILES) \
|
||||
$(BUILT_SOURCES) \
|
||||
$(DEPDIR) \
|
||||
Makefile \
|
||||
Makefile.in \
|
||||
"*.orig" \
|
||||
"*.rej" \
|
||||
"*.bak" \
|
||||
"*~" \
|
||||
".*.sw[nop]" \
|
||||
".dirstamp" \
|
||||
; do echo /$$x; done; \
|
||||
} | \
|
||||
sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \
|
||||
sed 's@/[.]/@/@g' | \
|
||||
LC_ALL=C sort | uniq > $@.tmp && \
|
||||
mv $@.tmp $@;
|
||||
|
||||
all: $(srcdir)/.gitignore gitignore-recurse-maybe
|
||||
gitignore-recurse-maybe:
|
||||
@if test "x$(SUBDIRS)" = "x$(DIST_SUBDIRS)"; then :; else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) gitignore-recurse; \
|
||||
fi;
|
||||
gitignore-recurse:
|
||||
@for subdir in $(DIST_SUBDIRS); do \
|
||||
case " $(SUBDIRS) " in \
|
||||
*" $$subdir "*) :;; \
|
||||
*) test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) .gitignore gitignore-recurse || echo "Skipping $$subdir");; \
|
||||
esac; \
|
||||
done
|
||||
gitignore: $(srcdir)/.gitignore gitignore-recurse
|
||||
|
||||
maintainer-clean: gitignore-clean
|
||||
gitignore-clean:
|
||||
-rm -f $(srcdir)/.gitignore
|
||||
|
||||
.PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe
|
||||
182
meson.build
Normal file
182
meson.build
Normal file
@ -0,0 +1,182 @@
|
||||
project('fprintd', 'c',
|
||||
version: '1.90.1',
|
||||
license: 'GPLv2+',
|
||||
default_options: [
|
||||
'buildtype=debugoptimized',
|
||||
'warning_level=1',
|
||||
'c_std=gnu99',
|
||||
],
|
||||
meson_version: '>= 0.50.0')
|
||||
|
||||
gnome = import('gnome')
|
||||
i18n = import('i18n')
|
||||
|
||||
cc = meson.get_compiler('c')
|
||||
host_system = host_machine.system()
|
||||
glib_min_version = '2.56'
|
||||
libfprint_min_version = '1.90.0'
|
||||
|
||||
fprintd_installdir = get_option('prefix') / get_option('libexecdir')
|
||||
fprintd_plugindir = get_option('prefix') / get_option('libdir') / meson.project_name() / 'modules'
|
||||
storage_path = get_option('prefix') / get_option('localstatedir') / 'lib/fprint'
|
||||
localedir = get_option('prefix') / get_option('localedir')
|
||||
datadir = get_option('prefix') / get_option('datadir')
|
||||
sysconfdir = get_option('sysconfdir')
|
||||
if get_option('prefix') != '/usr'
|
||||
sysconfdir = get_option('prefix') / sysconfdir
|
||||
endif
|
||||
|
||||
common_cflags = cc.get_supported_arguments([
|
||||
'-fno-strict-aliasing',
|
||||
'-Wall',
|
||||
'-Wcast-align',
|
||||
'-Werror=address',
|
||||
'-Werror=array-bounds',
|
||||
'-Werror=empty-body',
|
||||
'-Werror=implicit',
|
||||
'-Werror=init-self',
|
||||
'-Werror=int-to-pointer-cast',
|
||||
'-Werror=main',
|
||||
'-Werror=missing-braces',
|
||||
'-Werror=nonnull',
|
||||
'-Werror=pointer-to-int-cast',
|
||||
'-Werror=redundant-decls',
|
||||
'-Werror=return-type',
|
||||
'-Werror=sequence-point',
|
||||
'-Werror=trigraphs',
|
||||
'-Werror=write-strings',
|
||||
'-Wformat-nonliteral',
|
||||
'-Wformat-security',
|
||||
'-Wformat=2',
|
||||
'-Wignored-qualifiers',
|
||||
'-Wimplicit-function-declaration',
|
||||
'-Wlogical-op',
|
||||
'-Wmissing-declarations',
|
||||
'-Wmissing-format-attribute',
|
||||
'-Wmissing-include-dirs',
|
||||
'-Wmissing-noreturn',
|
||||
'-Wmissing-prototypes',
|
||||
'-Wnested-externs',
|
||||
'-Wold-style-definition',
|
||||
'-Wpointer-arith',
|
||||
'-Wshadow',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wtype-limits',
|
||||
'-Wundef',
|
||||
'-Wunused',
|
||||
])
|
||||
add_project_arguments(common_cflags, language: 'c')
|
||||
|
||||
# Dependencies
|
||||
glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
|
||||
gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version)
|
||||
gmodule_dep = dependency('gmodule-2.0', version: '>=' + glib_min_version)
|
||||
libfprint_dep = dependency('libfprint-2', version: '>=' + libfprint_min_version)
|
||||
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.91')
|
||||
dbus_dep = dependency('dbus-1', required: false)
|
||||
dbus_glib_dep = dependency('dbus-glib-1')
|
||||
libsystemd_dep = dependency('libsystemd', required: get_option('pam'))
|
||||
pam_dep = cc.find_library('pam',
|
||||
required: get_option('pam'),
|
||||
has_headers: 'security/pam_modules.h',
|
||||
)
|
||||
|
||||
pod2man = find_program('pod2man', required: get_option('man'))
|
||||
xsltproc = find_program('xsltproc', required: get_option('gtk_doc'))
|
||||
|
||||
# StateDirectory was introduced in systemd 235
|
||||
systemd_dep = dependency('systemd', version: '>= 235')
|
||||
systemd_unit_dir = get_option('systemd_system_unit_dir')
|
||||
|
||||
if systemd_unit_dir == ''
|
||||
systemd_unit_dir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
|
||||
endif
|
||||
|
||||
dbus_service_dir = get_option('dbus_service_dir')
|
||||
dbus_data_dir = datadir
|
||||
dbus_interfaces_dir = ''
|
||||
|
||||
if dbus_dep.found()
|
||||
if dbus_service_dir == ''
|
||||
dbus_service_dir = dbus_dep.get_pkgconfig_variable('system_bus_services_dir')
|
||||
endif
|
||||
dbus_interfaces_dir = dbus_dep.get_pkgconfig_variable('interfaces_dir')
|
||||
dbus_data_dir = dbus_dep.get_pkgconfig_variable('datadir')
|
||||
endif
|
||||
|
||||
dbus_conf_dir = dbus_data_dir / 'dbus-1/system.d'
|
||||
|
||||
if dbus_service_dir == ''
|
||||
dbus_service_dir = datadir / 'dbus-1/system-services'
|
||||
endif
|
||||
if dbus_interfaces_dir == ''
|
||||
dbus_interfaces_dir = datadir / 'dbus-1/interfaces'
|
||||
endif
|
||||
|
||||
polkit_policy_directory = polkit_gobject_dep.get_pkgconfig_variable('policydir')
|
||||
|
||||
# Tests dependencies
|
||||
pam_wrapper_dep = dependency('pam_wrapper', required: get_option('pam'))
|
||||
|
||||
xmllint = find_program('xmllint', required: false)
|
||||
python3 = find_program('python3') # No meson without it!
|
||||
python3_test_modules = {
|
||||
'cairo': true,
|
||||
'dbus': true,
|
||||
'dbusmock': true,
|
||||
'gi': true,
|
||||
'pypamtest': get_option('pam'),
|
||||
}
|
||||
python3_available_modules = []
|
||||
|
||||
foreach module, required : python3_test_modules
|
||||
if required and run_command(python3, '-c', 'import @0@'.format(module)).returncode() != 0
|
||||
error('Python3 module \'' + module + '\' required by test suite not found')
|
||||
endif
|
||||
endforeach
|
||||
|
||||
cdata = configuration_data()
|
||||
cdata.set_quoted('GETTEXT_PACKAGE', meson.project_name())
|
||||
cdata.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
cdata.set_quoted('VERSION', meson.project_version())
|
||||
cdata.set_quoted('SYSCONFDIR', sysconfdir)
|
||||
|
||||
config_h = configure_file(
|
||||
input: 'config.h.in',
|
||||
output: 'config.h',
|
||||
configuration: cdata
|
||||
)
|
||||
|
||||
subdir('src')
|
||||
subdir('data')
|
||||
subdir('utils')
|
||||
if get_option('pam')
|
||||
subdir('pam')
|
||||
endif
|
||||
if get_option('gtk_doc')
|
||||
subdir('doc')
|
||||
endif
|
||||
subdir('tests')
|
||||
subdir('po')
|
||||
|
||||
output = []
|
||||
output += 'System paths:'
|
||||
output += ' prefix: ' + get_option('prefix')
|
||||
output += ' fprintd daemon directory: ' + fprintd_installdir
|
||||
output += ' fprintd modules directory: ' + fprintd_plugindir
|
||||
output += ' fprintd prints storage directory: ' + storage_path
|
||||
output += ' DBus configuration directory: ' + dbus_conf_dir
|
||||
output += ' DBus service directory: ' + dbus_service_dir
|
||||
output += ' DBus interfaces directory: ' + dbus_interfaces_dir
|
||||
output += ' Polkit policy directory: ' + polkit_policy_directory
|
||||
output += ' Systemd service directory: ' + systemd_unit_dir
|
||||
if get_option('pam')
|
||||
output += ' PAM module directory: ' + pam_modules_dir
|
||||
endif
|
||||
output += '\nOptional features:\n'
|
||||
output += ' PAM module: ' + pam_dep.found().to_string()
|
||||
output += ' Manuals: ' + get_option('man').to_string()
|
||||
output += ' GTK Doc: ' + get_option('gtk_doc').to_string()
|
||||
output += ' XML Linter ' + xmllint.found().to_string()
|
||||
|
||||
message('\n'+'\n'.join(output)+'\n')
|
||||
21
meson_options.txt
Normal file
21
meson_options.txt
Normal file
@ -0,0 +1,21 @@
|
||||
option('pam',
|
||||
description: 'Build the fprintd PAM module',
|
||||
type: 'boolean',
|
||||
value: true)
|
||||
option('man',
|
||||
description: 'Generate the man files',
|
||||
type: 'boolean',
|
||||
value: true)
|
||||
option('systemd_system_unit_dir',
|
||||
description: 'Directory for systemd service files',
|
||||
type: 'string')
|
||||
option('dbus_service_dir',
|
||||
description: 'Directory for dbus service files',
|
||||
type: 'string')
|
||||
option('pam_modules_dir',
|
||||
description: 'Directory for PAM modules',
|
||||
type: 'string')
|
||||
option('gtk_doc',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Use gtk-doc to build documentation')
|
||||
@ -1,22 +0,0 @@
|
||||
if HAVE_PAM
|
||||
|
||||
pammod_LTLIBRARIES = pam_fprintd.la
|
||||
pammoddir=$(libdir)/security
|
||||
|
||||
pam_fprintd_la_SOURCES = pam_fprintd.c $(MARSHALFILES)
|
||||
pam_fprintd_la_CFLAGS = -fPIC $(WARN_CFLAGS) $(GLIB_CFLAGS) -DLOCALEDIR="\"$(localedir)\""
|
||||
pam_fprintd_la_LDFLAGS = -avoid-version -module -Wl,-z,nodelete
|
||||
pam_fprintd_la_LIBADD = $(PAM_LIBS) $(GLIB_LIBS)
|
||||
|
||||
MARSHALFILES = marshal.c marshal.h
|
||||
GLIB_GENMARSHAL=`pkg-config --variable=glib_genmarshal glib-2.0`
|
||||
BUILT_SOURCES = $(MARSHALFILES)
|
||||
|
||||
marshal.h: $(top_srcdir)/src/fprintd-marshal.list
|
||||
( $(GLIB_GENMARSHAL) --prefix=fprintd_marshal $(top_srcdir)/src/fprintd-marshal.list --header > marshal.h )
|
||||
marshal.c: marshal.h
|
||||
( $(GLIB_GENMARSHAL) --prefix=fprintd_marshal $(top_srcdir)/src/fprintd-marshal.list --body --header > marshal.c )
|
||||
|
||||
endif
|
||||
|
||||
EXTRA_DIST = pam_fprintd.c fingerprint-strings.h
|
||||
@ -20,6 +20,23 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#error _GNU_SOURCE must be defined
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define GNUC_UNUSED __attribute__((__unused__))
|
||||
|
||||
static bool str_equal (const char *a, const char *b)
|
||||
{
|
||||
if (a == NULL && b == NULL)
|
||||
return true;
|
||||
if (a == NULL || b == NULL)
|
||||
return false;
|
||||
return (strcmp (a, b) == 0);
|
||||
}
|
||||
|
||||
struct {
|
||||
const char *dbus_name;
|
||||
const char *place_str_generic;
|
||||
@ -88,7 +105,7 @@ struct {
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
|
||||
static char *finger_str_to_msg(const char *finger_name, const char *driver_name, gboolean is_swipe)
|
||||
GNUC_UNUSED static char *finger_str_to_msg(const char *finger_name, const char *driver_name, bool is_swipe)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -96,17 +113,25 @@ static char *finger_str_to_msg(const char *finger_name, const char *driver_name,
|
||||
return NULL;
|
||||
|
||||
for (i = 0; fingers[i].dbus_name != NULL; i++) {
|
||||
if (g_str_equal (fingers[i].dbus_name, finger_name)) {
|
||||
if (is_swipe == FALSE) {
|
||||
if (driver_name)
|
||||
return g_strdup_printf (TR (fingers[i].place_str_specific), driver_name);
|
||||
else
|
||||
return g_strdup (TR (fingers[i].place_str_generic));
|
||||
if (str_equal (fingers[i].dbus_name, finger_name)) {
|
||||
if (is_swipe == false) {
|
||||
if (driver_name) {
|
||||
char *s;
|
||||
int ret;
|
||||
ret = asprintf (&s, TR (fingers[i].place_str_specific), driver_name);
|
||||
return ret >= 0 ? s : NULL;
|
||||
} else {
|
||||
if (driver_name)
|
||||
return g_strdup_printf (TR (fingers[i].swipe_str_specific), driver_name);
|
||||
else
|
||||
return g_strdup (TR (fingers[i].swipe_str_generic));
|
||||
return strdup (TR (fingers[i].place_str_generic));
|
||||
}
|
||||
} else {
|
||||
if (driver_name) {
|
||||
char *s;
|
||||
int ret;
|
||||
ret = asprintf (&s, TR (fingers[i].swipe_str_specific), driver_name);
|
||||
return ret >= 0 ? s : NULL;
|
||||
} else {
|
||||
return strdup (TR (fingers[i].swipe_str_generic));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -121,13 +146,13 @@ static char *finger_str_to_msg(const char *finger_name, const char *driver_name,
|
||||
* verify-match
|
||||
* verify-unknown-error
|
||||
*/
|
||||
static const char *verify_result_str_to_msg(const char *result, gboolean is_swipe)
|
||||
GNUC_UNUSED static const char *verify_result_str_to_msg(const char *result, bool is_swipe)
|
||||
{
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strcmp (result, "verify-retry-scan") == 0) {
|
||||
if (is_swipe == FALSE)
|
||||
if (is_swipe == false)
|
||||
return N_("Place your finger on the reader again");
|
||||
else
|
||||
return N_("Swipe your finger again");
|
||||
@ -147,13 +172,13 @@ static const char *verify_result_str_to_msg(const char *result, gboolean is_swip
|
||||
* enroll-failed
|
||||
* enroll-unknown-error
|
||||
*/
|
||||
static const char *enroll_result_str_to_msg(const char *result, gboolean is_swipe)
|
||||
GNUC_UNUSED static const char *enroll_result_str_to_msg(const char *result, bool is_swipe)
|
||||
{
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strcmp (result, "enroll-retry-scan") == 0 || strcmp (result, "enroll-stage-passed") == 0) {
|
||||
if (is_swipe == FALSE)
|
||||
if (is_swipe == false)
|
||||
return N_("Place your finger on the reader again");
|
||||
else
|
||||
return N_("Swipe your finger again");
|
||||
|
||||
30
pam/meson.build
Normal file
30
pam/meson.build
Normal file
@ -0,0 +1,30 @@
|
||||
mapfile = files('pam_fprintd.ver')
|
||||
pam_modules_dir = get_option('pam_modules_dir')
|
||||
if pam_modules_dir == ''
|
||||
pam_modules_dir = '/' / get_option('libdir') / 'security'
|
||||
endif
|
||||
|
||||
pam_fprintd = shared_module('pam_fprintd',
|
||||
name_prefix: '',
|
||||
include_directories: [
|
||||
include_directories('..'),
|
||||
],
|
||||
sources: [
|
||||
'pam_fprintd.c',
|
||||
'fingerprint-strings.h',
|
||||
],
|
||||
dependencies: [
|
||||
libsystemd_dep,
|
||||
pam_dep,
|
||||
],
|
||||
c_args: [
|
||||
'-DLOCALEDIR="@0@"'.format(localedir),
|
||||
],
|
||||
link_args: [
|
||||
'-Wl,--version-script,@0@/@1@'.format(meson.source_root(), mapfile[0]),
|
||||
'-Wl,--unresolved-symbols=report-all',
|
||||
],
|
||||
link_depends: mapfile,
|
||||
install: true,
|
||||
install_dir: pam_modules_dir,
|
||||
)
|
||||
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* pam_fprint: PAM module for fingerprint authentication through fprintd
|
||||
* Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
|
||||
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
|
||||
* Copyright (C) 2008-2014, 2017-2020 Bastien Nocera <hadess@hadess.net>
|
||||
*
|
||||
* 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
|
||||
@ -20,50 +20,64 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include <dbus/dbus-glib-bindings.h>
|
||||
#include <dbus/dbus-glib-lowlevel.h>
|
||||
#include <libintl.h>
|
||||
#include <systemd/sd-bus.h>
|
||||
#include <systemd/sd-login.h>
|
||||
|
||||
#define PAM_SM_AUTH
|
||||
#include <security/pam_modules.h>
|
||||
#include <security/pam_ext.h>
|
||||
|
||||
#include "marshal.h"
|
||||
|
||||
#define _(s) ((char *) dgettext (GETTEXT_PACKAGE, s))
|
||||
#define TR(s) dgettext(GETTEXT_PACKAGE, s)
|
||||
#define N_(s) (s)
|
||||
|
||||
#include "fingerprint-strings.h"
|
||||
|
||||
#define DEFAULT_MAX_TRIES 3
|
||||
#define DEFAULT_TIMEOUT 30
|
||||
#define MIN_TIMEOUT 10
|
||||
|
||||
#define DEBUG_MATCH "debug="
|
||||
#define MAX_TRIES_MATCH "max-tries="
|
||||
#define TIMEOUT_MATCH "timeout="
|
||||
|
||||
#define D(pamh, ...) { \
|
||||
if (debug) { \
|
||||
char *s; \
|
||||
s = g_strdup_printf (__VA_ARGS__); \
|
||||
send_debug_msg (pamh, s); \
|
||||
g_free (s); \
|
||||
} \
|
||||
static bool debug = false;
|
||||
static unsigned max_tries = DEFAULT_MAX_TRIES;
|
||||
static unsigned timeout = DEFAULT_TIMEOUT;
|
||||
|
||||
#define USEC_PER_SEC ((uint64_t) 1000000ULL)
|
||||
#define NSEC_PER_USEC ((uint64_t) 1000ULL)
|
||||
|
||||
static uint64_t
|
||||
now (void)
|
||||
{
|
||||
struct timespec ts;
|
||||
clock_gettime (CLOCK_MONOTONIC, &ts);
|
||||
return (uint64_t) ts.tv_sec * USEC_PER_SEC + (uint64_t) ts.tv_nsec / NSEC_PER_USEC;
|
||||
}
|
||||
|
||||
static bool str_has_prefix (const char *s, const char *prefix)
|
||||
{
|
||||
if (s == NULL || prefix == NULL)
|
||||
return false;
|
||||
return (strncmp (s, prefix, strlen (prefix)) == 0);
|
||||
}
|
||||
|
||||
static gboolean debug = FALSE;
|
||||
static guint max_tries = DEFAULT_MAX_TRIES;
|
||||
static guint timeout = DEFAULT_TIMEOUT;
|
||||
|
||||
static gboolean send_info_msg(pam_handle_t *pamh, const char *msg)
|
||||
static bool send_msg(pam_handle_t *pamh, const char *msg, int style)
|
||||
{
|
||||
const struct pam_message mymsg = {
|
||||
.msg_style = PAM_TEXT_INFO,
|
||||
.msg_style = style,
|
||||
.msg = msg,
|
||||
};
|
||||
const struct pam_message *msgp = &mymsg;
|
||||
@ -73,413 +87,542 @@ static gboolean send_info_msg(pam_handle_t *pamh, const char *msg)
|
||||
|
||||
r = pam_get_item(pamh, PAM_CONV, (const void **) &pc);
|
||||
if (r != PAM_SUCCESS)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
if (!pc || !pc->conv)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
return (pc->conv(1, &msgp, &resp, pc->appdata_ptr) == PAM_SUCCESS);
|
||||
}
|
||||
|
||||
static gboolean send_err_msg(pam_handle_t *pamh, const char *msg)
|
||||
static bool send_info_msg(pam_handle_t *pamh, const char *msg)
|
||||
{
|
||||
const struct pam_message mymsg = {
|
||||
.msg_style = PAM_ERROR_MSG,
|
||||
.msg = msg,
|
||||
};
|
||||
const struct pam_message *msgp = &mymsg;
|
||||
const struct pam_conv *pc;
|
||||
struct pam_response *resp;
|
||||
return send_msg(pamh, msg, PAM_TEXT_INFO);
|
||||
}
|
||||
|
||||
static bool send_err_msg(pam_handle_t *pamh, const char *msg)
|
||||
{
|
||||
return send_msg(pamh, msg, PAM_ERROR_MSG);
|
||||
}
|
||||
|
||||
static char *
|
||||
open_device (pam_handle_t *pamh,
|
||||
sd_bus *bus,
|
||||
bool *has_multiple_devices)
|
||||
{
|
||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
sd_bus_message *m = NULL;
|
||||
size_t num_devices;
|
||||
const char *path = NULL;
|
||||
char *ret;
|
||||
const char *s;
|
||||
int r;
|
||||
|
||||
r = pam_get_item(pamh, PAM_CONV, (const void **) &pc);
|
||||
if (r != PAM_SUCCESS)
|
||||
return FALSE;
|
||||
*has_multiple_devices = false;
|
||||
|
||||
if (!pc || !pc->conv)
|
||||
return FALSE;
|
||||
|
||||
return (pc->conv(1, &msgp, &resp, pc->appdata_ptr) == PAM_SUCCESS);
|
||||
}
|
||||
|
||||
static void send_debug_msg(pam_handle_t *pamh, const char *msg)
|
||||
{
|
||||
gconstpointer item;
|
||||
const char *service;
|
||||
|
||||
if (pam_get_item(pamh, PAM_SERVICE, &item) != PAM_SUCCESS || !item)
|
||||
service = "<unknown>";
|
||||
else
|
||||
service = item;
|
||||
|
||||
openlog (service, LOG_CONS | LOG_PID, LOG_AUTHPRIV);
|
||||
|
||||
syslog (LOG_AUTHPRIV|LOG_WARNING, "%s(%s): %s", "pam_fprintd", service, msg);
|
||||
|
||||
closelog ();
|
||||
|
||||
}
|
||||
|
||||
static DBusGProxy *create_manager (pam_handle_t *pamh, DBusGConnection **ret_conn, GMainLoop **ret_loop)
|
||||
{
|
||||
DBusGConnection *connection;
|
||||
DBusConnection *conn;
|
||||
DBusGProxy *manager;
|
||||
DBusError error;
|
||||
GMainLoop *loop;
|
||||
GMainContext *ctx;
|
||||
|
||||
/* Otherwise dbus-glib doesn't setup it value types */
|
||||
connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
|
||||
|
||||
if (connection != NULL)
|
||||
dbus_g_connection_unref (connection);
|
||||
|
||||
/* And set us up a private D-Bus connection */
|
||||
dbus_error_init (&error);
|
||||
conn = dbus_bus_get_private (DBUS_BUS_SYSTEM, &error);
|
||||
if (conn == NULL) {
|
||||
D(pamh, "Error with getting the bus: %s", error.message);
|
||||
dbus_error_free (&error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Set up our own main loop context */
|
||||
ctx = g_main_context_new ();
|
||||
loop = g_main_loop_new (ctx, FALSE);
|
||||
dbus_connection_setup_with_g_main (conn, ctx);
|
||||
|
||||
connection = dbus_connection_get_g_connection (conn);
|
||||
|
||||
manager = dbus_g_proxy_new_for_name(connection,
|
||||
r = sd_bus_call_method (bus,
|
||||
"net.reactivated.Fprint",
|
||||
"/net/reactivated/Fprint/Manager",
|
||||
"net.reactivated.Fprint.Manager");
|
||||
*ret_conn = connection;
|
||||
*ret_loop = loop;
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
static void close_and_unref (DBusGConnection *connection)
|
||||
{
|
||||
DBusConnection *conn;
|
||||
|
||||
conn = dbus_g_connection_get_connection (connection);
|
||||
dbus_connection_close (conn);
|
||||
dbus_g_connection_unref (connection);
|
||||
}
|
||||
|
||||
static void unref_loop (GMainLoop *loop)
|
||||
{
|
||||
GMainContext *ctx;
|
||||
|
||||
/* The main context was created separately, so
|
||||
* we'll need to unref it ourselves */
|
||||
ctx = g_main_loop_get_context (loop);
|
||||
g_main_loop_unref (loop);
|
||||
g_main_context_unref (ctx);
|
||||
}
|
||||
|
||||
#define DBUS_TYPE_G_OBJECT_PATH_ARRAY (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH))
|
||||
|
||||
static DBusGProxy *open_device(pam_handle_t *pamh, DBusGConnection *connection, DBusGProxy *manager, gboolean *has_multiple_devices)
|
||||
{
|
||||
GError *error = NULL;
|
||||
const char *path;
|
||||
DBusGProxy *dev;
|
||||
GPtrArray *paths_array;
|
||||
const char **paths;
|
||||
|
||||
if (!dbus_g_proxy_call (manager, "GetDevices", &error,
|
||||
G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH_ARRAY,
|
||||
&paths_array, G_TYPE_INVALID)) {
|
||||
D(pamh, "get_devices failed: %s", error->message);
|
||||
g_error_free (error);
|
||||
"net.reactivated.Fprint.Manager",
|
||||
"GetDevices",
|
||||
&error,
|
||||
&m,
|
||||
NULL);
|
||||
if (r < 0) {
|
||||
pam_syslog (pamh, LOG_ERR, "GetDevices failed: %s", error.message);
|
||||
sd_bus_error_free (&error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (paths_array == NULL || paths_array->len == 0) {
|
||||
if (paths_array != NULL)
|
||||
g_ptr_array_free (paths_array, TRUE);
|
||||
D(pamh, "No devices found\n");
|
||||
return NULL;
|
||||
r = sd_bus_message_enter_container (m, 'a', "o");
|
||||
if (r < 0) {
|
||||
pam_syslog (pamh, LOG_ERR, "Failed to parse answer from GetDevices(): %d", r);
|
||||
goto out;
|
||||
}
|
||||
|
||||
*has_multiple_devices = (paths_array->len > 1);
|
||||
paths = (const char **)paths_array->pdata;
|
||||
path = paths[0];
|
||||
r = sd_bus_message_read_basic (m, 'o', &path);
|
||||
if (r < 0)
|
||||
goto out;
|
||||
|
||||
D(pamh, "Using device %s\n", path);
|
||||
num_devices = 1;
|
||||
while ((r = sd_bus_message_read_basic(m, 'o', &s)) > 0)
|
||||
num_devices++;
|
||||
*has_multiple_devices = (num_devices > 1);
|
||||
if (debug)
|
||||
pam_syslog(pamh, LOG_DEBUG, "Using device %s (out of %ld devices)", path, num_devices);
|
||||
|
||||
dev = dbus_g_proxy_new_for_name(connection,
|
||||
"net.reactivated.Fprint",
|
||||
path,
|
||||
"net.reactivated.Fprint.Device");
|
||||
sd_bus_message_exit_container (m);
|
||||
|
||||
g_ptr_array_free (paths_array, TRUE);
|
||||
|
||||
return dev;
|
||||
out:
|
||||
ret = path ? strdup (path) : NULL;
|
||||
sd_bus_message_unref (m);
|
||||
return ret;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
guint max_tries;
|
||||
unsigned max_tries;
|
||||
char *result;
|
||||
gboolean timed_out;
|
||||
gboolean is_swipe;
|
||||
bool timed_out;
|
||||
bool is_swipe;
|
||||
pam_handle_t *pamh;
|
||||
GMainLoop *loop;
|
||||
|
||||
char *driver;
|
||||
} verify_data;
|
||||
|
||||
static void verify_result(GObject *object, const char *result, gboolean done, gpointer user_data)
|
||||
static int
|
||||
verify_result (sd_bus_message *m,
|
||||
void *userdata,
|
||||
sd_bus_error *ret_error)
|
||||
{
|
||||
verify_data *data = user_data;
|
||||
verify_data *data = userdata;
|
||||
const char *msg;
|
||||
const char *result = NULL;
|
||||
/* see https://github.com/systemd/systemd/issues/14643 */
|
||||
uint64_t done = false;
|
||||
int r;
|
||||
|
||||
D(data->pamh, "Verify result: %s\n", result);
|
||||
if (done != FALSE) {
|
||||
data->result = g_strdup (result);
|
||||
g_main_loop_quit (data->loop);
|
||||
return;
|
||||
if (!sd_bus_message_is_signal(m, "net.reactivated.Fprint.Device", "VerifyStatus")) {
|
||||
pam_syslog (data->pamh, LOG_ERR, "Not the signal we expected (iface: %s, member: %s)",
|
||||
sd_bus_message_get_interface (m),
|
||||
sd_bus_message_get_member (m));
|
||||
return 0;
|
||||
}
|
||||
|
||||
msg = TR(verify_result_str_to_msg (result, data->is_swipe));
|
||||
if ((r = sd_bus_message_read (m, "sb", &result, &done)) < 0) {
|
||||
pam_syslog (data->pamh, LOG_ERR, "Failed to parse VerifyResult signal: %d", r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (debug)
|
||||
pam_syslog (data->pamh, LOG_DEBUG, "Verify result: %s (done: %d)", result, done ? 1 : 0);
|
||||
|
||||
if (done) {
|
||||
data->result = strdup (result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
msg = _(verify_result_str_to_msg (result, data->is_swipe));
|
||||
send_err_msg (data->pamh, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void verify_finger_selected(GObject *object, const char *finger_name, gpointer user_data)
|
||||
static int
|
||||
verify_finger_selected (sd_bus_message *m,
|
||||
void *userdata,
|
||||
sd_bus_error *ret_error)
|
||||
{
|
||||
verify_data *data = user_data;
|
||||
verify_data *data = userdata;
|
||||
const char *finger_name = NULL;
|
||||
char *msg;
|
||||
|
||||
if (sd_bus_message_read_basic (m, 's', &finger_name) < 0) {
|
||||
pam_syslog (data->pamh, LOG_ERR, "Failed to parse VerifyFingerSelected signal: %m");
|
||||
return 0;
|
||||
}
|
||||
|
||||
msg = finger_str_to_msg(finger_name, data->driver, data->is_swipe);
|
||||
|
||||
D(data->pamh, "verify_finger_selected %s", msg);
|
||||
if (debug)
|
||||
pam_syslog (data->pamh, LOG_DEBUG, "verify_finger_selected %s", msg);
|
||||
send_info_msg (data->pamh, msg);
|
||||
g_free (msg);
|
||||
free (msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static gboolean verify_timeout_cb (gpointer user_data)
|
||||
{
|
||||
verify_data *data = user_data;
|
||||
/* See https://github.com/systemd/systemd/issues/14636 */
|
||||
static int
|
||||
get_property_string (sd_bus *bus,
|
||||
const char *destination,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *member,
|
||||
sd_bus_error *error,
|
||||
char **ret) {
|
||||
|
||||
data->timed_out = TRUE;
|
||||
send_info_msg (data->pamh, "Verification timed out");
|
||||
g_main_loop_quit (data->loop);
|
||||
sd_bus_message *reply = NULL;
|
||||
const char *s;
|
||||
char *n;
|
||||
int r;
|
||||
|
||||
return FALSE;
|
||||
r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", interface, member);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_enter_container(reply, 'v', "s");
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
r = sd_bus_message_read_basic(reply, 's', &s);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
n = strdup(s);
|
||||
if (!n) {
|
||||
r = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
static int do_verify(GMainLoop *loop, pam_handle_t *pamh, DBusGProxy *dev, gboolean has_multiple_devices)
|
||||
sd_bus_message_unref (reply);
|
||||
|
||||
*ret = n;
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
if (reply != NULL)
|
||||
sd_bus_message_unref (reply);
|
||||
return sd_bus_error_set_errno(error, r);
|
||||
}
|
||||
|
||||
static int
|
||||
do_verify (pam_handle_t *pamh,
|
||||
sd_bus *bus,
|
||||
const char *dev,
|
||||
bool has_multiple_devices)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GHashTable *props;
|
||||
DBusGProxy *p;
|
||||
verify_data *data;
|
||||
sd_bus_slot *verify_status_slot, *verify_finger_selected_slot;
|
||||
char *scan_type = NULL;
|
||||
int ret;
|
||||
int r;
|
||||
|
||||
data = g_new0 (verify_data, 1);
|
||||
data = calloc (1, sizeof(verify_data));
|
||||
data->max_tries = max_tries;
|
||||
data->pamh = pamh;
|
||||
data->loop = loop;
|
||||
|
||||
/* Get some properties for the device */
|
||||
p = dbus_g_proxy_new_from_proxy (dev, "org.freedesktop.DBus.Properties", NULL);
|
||||
r = get_property_string (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"scan-type",
|
||||
NULL,
|
||||
&scan_type);
|
||||
if (r < 0)
|
||||
pam_syslog (data->pamh, LOG_ERR, "Failed to get scan-type for %s: %d", dev, r);
|
||||
if (debug)
|
||||
pam_syslog (data->pamh, LOG_DEBUG, "scan-type for %s: %s", dev, scan_type);
|
||||
if (str_equal (scan_type, "swipe"))
|
||||
data->is_swipe = true;
|
||||
free (scan_type);
|
||||
|
||||
if (dbus_g_proxy_call (p, "GetAll", NULL, G_TYPE_STRING, "net.reactivated.Fprint.Device", G_TYPE_INVALID,
|
||||
dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &props, G_TYPE_INVALID)) {
|
||||
const char *scan_type;
|
||||
if (has_multiple_devices)
|
||||
data->driver = g_value_dup_string (g_hash_table_lookup (props, "name"));
|
||||
scan_type = g_value_dup_string (g_hash_table_lookup (props, "scan-type"));
|
||||
if (g_str_equal (scan_type, "swipe"))
|
||||
data->is_swipe = TRUE;
|
||||
g_hash_table_destroy (props);
|
||||
if (has_multiple_devices) {
|
||||
get_property_string (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"name",
|
||||
NULL,
|
||||
&data->driver);
|
||||
if (r < 0)
|
||||
pam_syslog (data->pamh, LOG_ERR, "Failed to get driver name for %s: %d", dev, r);
|
||||
if (debug && r == 0)
|
||||
pam_syslog (data->pamh, LOG_DEBUG, "driver name for %s: %s", dev, data->driver);
|
||||
}
|
||||
|
||||
g_object_unref (p);
|
||||
verify_status_slot = NULL;
|
||||
sd_bus_match_signal (bus,
|
||||
&verify_status_slot,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"VerifyStatus",
|
||||
verify_result,
|
||||
data);
|
||||
|
||||
dbus_g_proxy_add_signal(dev, "VerifyStatus", G_TYPE_STRING, G_TYPE_BOOLEAN, NULL);
|
||||
dbus_g_proxy_add_signal(dev, "VerifyFingerSelected", G_TYPE_STRING, NULL);
|
||||
dbus_g_proxy_connect_signal(dev, "VerifyStatus", G_CALLBACK(verify_result),
|
||||
data, NULL);
|
||||
dbus_g_proxy_connect_signal(dev, "VerifyFingerSelected", G_CALLBACK(verify_finger_selected),
|
||||
data, NULL);
|
||||
verify_finger_selected_slot = NULL;
|
||||
sd_bus_match_signal (bus,
|
||||
&verify_finger_selected_slot,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"VerifyFingerSelected",
|
||||
verify_finger_selected,
|
||||
data);
|
||||
|
||||
ret = PAM_AUTH_ERR;
|
||||
|
||||
while (ret == PAM_AUTH_ERR && data->max_tries > 0) {
|
||||
GSource *source;
|
||||
uint64_t verification_end = now () + (timeout * USEC_PER_SEC);
|
||||
sd_bus_message *m = NULL;
|
||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
||||
/* Set up the timeout on our non-default context */
|
||||
source = g_timeout_source_new_seconds (timeout);
|
||||
g_source_attach (source, g_main_loop_get_context (loop));
|
||||
g_source_set_callback (source, verify_timeout_cb, data, NULL);
|
||||
data->timed_out = false;
|
||||
|
||||
data->timed_out = FALSE;
|
||||
r = sd_bus_call_method (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"VerifyStart",
|
||||
&error,
|
||||
&m,
|
||||
"s",
|
||||
"any");
|
||||
|
||||
if (!dbus_g_proxy_call (dev, "VerifyStart", &error, G_TYPE_STRING, "any", G_TYPE_INVALID, G_TYPE_INVALID)) {
|
||||
if (dbus_g_error_has_name(error, "net.reactivated.Fprint.Error.NoEnrolledPrints"))
|
||||
if (r < 0) {
|
||||
if (sd_bus_error_has_name (&error, "net.reactivated.Fprint.Error.NoEnrolledPrints"))
|
||||
ret = PAM_USER_UNKNOWN;
|
||||
|
||||
D(pamh, "VerifyStart failed: %s", error->message);
|
||||
g_error_free (error);
|
||||
|
||||
g_source_destroy (source);
|
||||
g_source_unref (source);
|
||||
if (debug)
|
||||
pam_syslog (pamh, LOG_DEBUG, "VerifyStart failed: %s", error.message);
|
||||
sd_bus_error_free (&error);
|
||||
break;
|
||||
}
|
||||
|
||||
g_main_loop_run (loop);
|
||||
for (;;) {
|
||||
int64_t wait_time;
|
||||
|
||||
g_source_destroy (source);
|
||||
g_source_unref (source);
|
||||
wait_time = verification_end - now();
|
||||
if (wait_time <= 0)
|
||||
break;
|
||||
|
||||
r = sd_bus_process (bus, NULL);
|
||||
if (r < 0)
|
||||
break;
|
||||
if (data->result != NULL)
|
||||
break;
|
||||
if (r == 0) {
|
||||
if (debug) {
|
||||
pam_syslog(pamh, LOG_DEBUG, "Waiting for %"PRId64" seconds (%"PRId64" usecs)",
|
||||
wait_time / USEC_PER_SEC,
|
||||
wait_time);
|
||||
}
|
||||
r = sd_bus_wait (bus, wait_time);
|
||||
if (r < 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (now () >= verification_end) {
|
||||
data->timed_out = true;
|
||||
send_info_msg (data->pamh, _("Verification timed out"));
|
||||
}
|
||||
|
||||
/* Ignore errors from VerifyStop */
|
||||
dbus_g_proxy_call (dev, "VerifyStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
|
||||
sd_bus_call_method (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"VerifyStop",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (data->timed_out) {
|
||||
ret = PAM_AUTHINFO_UNAVAIL;
|
||||
break;
|
||||
} else {
|
||||
if (g_str_equal (data->result, "verify-no-match")) {
|
||||
if (str_equal (data->result, "verify-no-match")) {
|
||||
send_err_msg (data->pamh, "Failed to match fingerprint");
|
||||
ret = PAM_AUTH_ERR;
|
||||
} else if (g_str_equal (data->result, "verify-match"))
|
||||
} else if (str_equal (data->result, "verify-match")) {
|
||||
ret = PAM_SUCCESS;
|
||||
else if (g_str_equal (data->result, "verify-unknown-error"))
|
||||
break;
|
||||
} else if (str_equal (data->result, "verify-unknown-error")) {
|
||||
ret = PAM_AUTHINFO_UNAVAIL;
|
||||
else if (g_str_equal (data->result, "verify-disconnected")) {
|
||||
} else if (str_equal (data->result, "verify-disconnected")) {
|
||||
ret = PAM_AUTHINFO_UNAVAIL;
|
||||
g_free (data->result);
|
||||
free (data->result);
|
||||
break;
|
||||
} else {
|
||||
send_info_msg (data->pamh, "An unknown error occured");
|
||||
send_info_msg (data->pamh, _("An unknown error occurred"));
|
||||
ret = PAM_AUTH_ERR;
|
||||
g_free (data->result);
|
||||
free (data->result);
|
||||
break;
|
||||
}
|
||||
g_free (data->result);
|
||||
free (data->result);
|
||||
data->result = NULL;
|
||||
}
|
||||
data->max_tries--;
|
||||
}
|
||||
|
||||
dbus_g_proxy_disconnect_signal(dev, "VerifyStatus", G_CALLBACK(verify_result), data);
|
||||
dbus_g_proxy_disconnect_signal(dev, "VerifyFingerSelected", G_CALLBACK(verify_finger_selected), data);
|
||||
if (data->max_tries == 0)
|
||||
ret = PAM_MAXTRIES;
|
||||
|
||||
g_free (data->driver);
|
||||
g_free (data);
|
||||
sd_bus_slot_unref (verify_status_slot);
|
||||
sd_bus_slot_unref (verify_finger_selected_slot);
|
||||
|
||||
if (data->result)
|
||||
free (data->result);
|
||||
free (data->driver);
|
||||
free (data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gboolean user_has_prints(DBusGProxy *dev, const char *username)
|
||||
static bool
|
||||
user_has_prints (pam_handle_t *pamh,
|
||||
sd_bus *bus,
|
||||
const char *dev,
|
||||
const char *username)
|
||||
{
|
||||
char **fingers;
|
||||
gboolean have_prints;
|
||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
sd_bus_message *m = NULL;
|
||||
size_t num_fingers = 0;
|
||||
const char *s;
|
||||
int r;
|
||||
|
||||
if (!dbus_g_proxy_call (dev, "ListEnrolledFingers", NULL,
|
||||
G_TYPE_STRING, username, G_TYPE_INVALID,
|
||||
G_TYPE_STRV, &fingers, G_TYPE_INVALID)) {
|
||||
r = sd_bus_call_method (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"ListEnrolledFingers",
|
||||
&error,
|
||||
&m,
|
||||
"s",
|
||||
username);
|
||||
if (r < 0) {
|
||||
/* If ListEnrolledFingers fails then verification should
|
||||
* also fail (both use the same underlying call), so we
|
||||
* report FALSE here and bail out early. */
|
||||
return FALSE;
|
||||
* report false here and bail out early. */
|
||||
if (debug) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "ListEnrolledFingers failed for %s: %s",
|
||||
username, error.message);
|
||||
}
|
||||
sd_bus_error_free (&error);
|
||||
return false;
|
||||
}
|
||||
|
||||
have_prints = fingers != NULL && g_strv_length (fingers) > 0;
|
||||
g_strfreev (fingers);
|
||||
|
||||
return have_prints;
|
||||
r = sd_bus_message_enter_container (m, 'a', "s");
|
||||
if (r < 0) {
|
||||
pam_syslog (pamh, LOG_ERR, "Failed to parse answer from ListEnrolledFingers(): %d", r);
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void release_device(pam_handle_t *pamh, DBusGProxy *dev)
|
||||
num_fingers = 0;
|
||||
while ((r = sd_bus_message_read_basic(m, 's', &s)) > 0)
|
||||
num_fingers++;
|
||||
sd_bus_message_exit_container (m);
|
||||
|
||||
out:
|
||||
sd_bus_message_unref (m);
|
||||
return (num_fingers > 0);
|
||||
}
|
||||
|
||||
static void
|
||||
release_device (pam_handle_t *pamh,
|
||||
sd_bus *bus,
|
||||
const char *dev)
|
||||
{
|
||||
GError *error = NULL;
|
||||
if (!dbus_g_proxy_call (dev, "Release", &error, G_TYPE_INVALID, G_TYPE_INVALID)) {
|
||||
D(pamh, "ReleaseDevice failed: %s\n", error->message);
|
||||
g_error_free (error);
|
||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
int r;
|
||||
|
||||
r = sd_bus_call_method (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"Release",
|
||||
&error,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
if (r < 0) {
|
||||
pam_syslog (pamh, LOG_ERR, "ReleaseDevice failed: %s", error.message);
|
||||
sd_bus_error_free (&error);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean claim_device(pam_handle_t *pamh, DBusGProxy *dev, const char *username)
|
||||
static bool
|
||||
claim_device (pam_handle_t *pamh,
|
||||
sd_bus *bus,
|
||||
const char *dev,
|
||||
const char *username)
|
||||
{
|
||||
GError *error = NULL;
|
||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
int r;
|
||||
|
||||
if (!dbus_g_proxy_call (dev, "Claim", &error, G_TYPE_STRING, username, G_TYPE_INVALID, G_TYPE_INVALID)) {
|
||||
D(pamh, "failed to claim device %s\n", error->message);
|
||||
g_error_free (error);
|
||||
return FALSE;
|
||||
r = sd_bus_call_method (bus,
|
||||
"net.reactivated.Fprint",
|
||||
dev,
|
||||
"net.reactivated.Fprint.Device",
|
||||
"Claim",
|
||||
&error,
|
||||
NULL,
|
||||
"s",
|
||||
username);
|
||||
if (r < 0) {
|
||||
if (debug)
|
||||
pam_syslog (pamh, LOG_DEBUG, "failed to claim device %s", error.message);
|
||||
sd_bus_error_free (&error);
|
||||
return false;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
static int do_auth(pam_handle_t *pamh, const char *username)
|
||||
{
|
||||
DBusGProxy *manager;
|
||||
DBusGConnection *connection;
|
||||
DBusGProxy *dev;
|
||||
GMainLoop *loop;
|
||||
gboolean have_prints;
|
||||
gboolean has_multiple_devices;
|
||||
char *dev;
|
||||
bool have_prints;
|
||||
bool has_multiple_devices;
|
||||
int ret = PAM_AUTHINFO_UNAVAIL;
|
||||
sd_bus *bus = NULL;
|
||||
|
||||
manager = create_manager (pamh, &connection, &loop);
|
||||
if (manager == NULL)
|
||||
return PAM_AUTHINFO_UNAVAIL;
|
||||
|
||||
dev = open_device(pamh, connection, manager, &has_multiple_devices);
|
||||
g_object_unref (manager);
|
||||
if (!dev) {
|
||||
unref_loop (loop);
|
||||
close_and_unref (connection);
|
||||
if (sd_bus_open_system (&bus) < 0) {
|
||||
pam_syslog (pamh, LOG_ERR, "Error with getting the bus: %m");
|
||||
return PAM_AUTHINFO_UNAVAIL;
|
||||
}
|
||||
|
||||
have_prints = user_has_prints(dev, username);
|
||||
D(pamh, "prints registered: %s\n", have_prints ? "yes" : "no");
|
||||
|
||||
if (have_prints) {
|
||||
if (claim_device (pamh, dev, username)) {
|
||||
ret = do_verify (loop, pamh, dev, has_multiple_devices);
|
||||
release_device (pamh, dev);
|
||||
}
|
||||
dev = open_device (pamh, bus, &has_multiple_devices);
|
||||
if (dev == NULL) {
|
||||
sd_bus_unref (bus);
|
||||
return PAM_AUTHINFO_UNAVAIL;
|
||||
}
|
||||
|
||||
unref_loop (loop);
|
||||
g_object_unref (dev);
|
||||
close_and_unref (connection);
|
||||
have_prints = user_has_prints (pamh, bus, dev, username);
|
||||
if (debug)
|
||||
pam_syslog (pamh, LOG_DEBUG, "prints registered: %s\n", have_prints ? "yes" : "no");
|
||||
|
||||
if (!have_prints)
|
||||
goto out;
|
||||
|
||||
if (claim_device (pamh, bus, dev, username)) {
|
||||
ret = do_verify (pamh, bus, dev, has_multiple_devices);
|
||||
release_device (pamh, bus, dev);
|
||||
}
|
||||
|
||||
out:
|
||||
free (dev);
|
||||
sd_bus_unref (bus);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_remote (pam_handle_t *pamh)
|
||||
{
|
||||
const char *rhost = NULL;
|
||||
|
||||
pam_get_item(pamh, PAM_RHOST, (const void **)(const void*) &rhost);
|
||||
|
||||
/* NULL or empty rhost if the host information is not available or set.
|
||||
* "localhost" if the host is local.
|
||||
* We want to not run for known remote hosts */
|
||||
if (rhost != NULL &&
|
||||
*rhost != '\0' &&
|
||||
strcmp (rhost, "localhost") != 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (sd_session_is_remote (NULL) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc,
|
||||
const char **argv)
|
||||
{
|
||||
const char *rhost = NULL;
|
||||
const char *username;
|
||||
guint i;
|
||||
unsigned i;
|
||||
int r;
|
||||
|
||||
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||
|
||||
#if !GLIB_CHECK_VERSION (2, 36, 0)
|
||||
g_type_init();
|
||||
#endif
|
||||
|
||||
dbus_g_object_register_marshaller (fprintd_marshal_VOID__STRING_BOOLEAN,
|
||||
G_TYPE_NONE, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INVALID);
|
||||
|
||||
pam_get_item(pamh, PAM_RHOST, (const void **)(const void*) &rhost);
|
||||
if (rhost != NULL && strlen(rhost) > 0) {
|
||||
/* remote login (e.g. over SSH) */
|
||||
if (is_remote (pamh))
|
||||
return PAM_AUTHINFO_UNAVAIL;
|
||||
}
|
||||
|
||||
r = pam_get_user(pamh, &username, NULL);
|
||||
if (r != PAM_SUCCESS)
|
||||
@ -487,21 +630,48 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc,
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
if (argv[i] != NULL) {
|
||||
if(g_str_equal (argv[i], "debug")) {
|
||||
g_message ("debug on");
|
||||
debug = TRUE;
|
||||
if (str_equal (argv[i], "debug")) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "debug on");
|
||||
debug = true;
|
||||
} else if (str_has_prefix (argv[i], DEBUG_MATCH)) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "debug on");
|
||||
const char *value;
|
||||
|
||||
value = argv[i] + strlen (DEBUG_MATCH);
|
||||
if (str_equal (value, "on") ||
|
||||
str_equal (value, "true") ||
|
||||
str_equal (value, "1")) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "debug on");
|
||||
debug = true;
|
||||
} else if (str_equal (value, "off") ||
|
||||
str_equal (value, "false") ||
|
||||
str_equal (value, "0")) {
|
||||
debug = false;
|
||||
} else {
|
||||
pam_syslog (pamh, LOG_DEBUG, "invalid debug value '%s', disabling", value);
|
||||
}
|
||||
else if (strncmp(argv[i], MAX_TRIES_MATCH, strlen (MAX_TRIES_MATCH)) == 0 && strlen(argv[i]) == strlen (MAX_TRIES_MATCH) + 1) {
|
||||
} else if (str_has_prefix (argv[i], MAX_TRIES_MATCH) && strlen(argv[i]) == strlen (MAX_TRIES_MATCH) + 1) {
|
||||
max_tries = atoi (argv[i] + strlen (MAX_TRIES_MATCH));
|
||||
if (max_tries < 1)
|
||||
max_tries = DEFAULT_MAX_TRIES;
|
||||
D(pamh, "max_tries specified as: %d", max_tries);
|
||||
if (max_tries < 1) {
|
||||
if (debug) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "invalid max tries '%s', using %d",
|
||||
argv[i] + strlen (MAX_TRIES_MATCH), DEFAULT_MAX_TRIES);
|
||||
}
|
||||
else if (strncmp(argv[i], TIMEOUT_MATCH, strlen (TIMEOUT_MATCH)) == 0 && strlen(argv[i]) <= strlen (TIMEOUT_MATCH) + 2) {
|
||||
max_tries = DEFAULT_MAX_TRIES;
|
||||
}
|
||||
if (debug)
|
||||
pam_syslog (pamh, LOG_DEBUG, "max_tries specified as: %d", max_tries);
|
||||
} else if (str_has_prefix (argv[i], TIMEOUT_MATCH) && strlen(argv[i]) <= strlen (TIMEOUT_MATCH) + 2) {
|
||||
timeout = atoi (argv[i] + strlen (TIMEOUT_MATCH));
|
||||
if (timeout < 10)
|
||||
timeout = DEFAULT_TIMEOUT;
|
||||
D(pamh, "timeout specified as: %d", timeout);
|
||||
if (timeout < MIN_TIMEOUT) {
|
||||
if (debug) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "timeout %d secs too low, using %d",
|
||||
timeout, MIN_TIMEOUT);
|
||||
}
|
||||
timeout = MIN_TIMEOUT;
|
||||
} else if (debug) {
|
||||
pam_syslog (pamh, LOG_DEBUG, "timeout specified as: %d secs", timeout);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
6
pam/pam_fprintd.ver
Normal file
6
pam/pam_fprintd.ver
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
global:
|
||||
pam_*;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
@ -1,6 +1,8 @@
|
||||
ar
|
||||
as
|
||||
ast
|
||||
az
|
||||
be
|
||||
bg
|
||||
bn_IN
|
||||
ca
|
||||
@ -19,6 +21,7 @@ fa
|
||||
fi
|
||||
fo
|
||||
fr
|
||||
fur
|
||||
ga
|
||||
gl
|
||||
gu
|
||||
|
||||
@ -3,3 +3,4 @@ src/main.c
|
||||
src/manager.c
|
||||
src/device.c
|
||||
pam/fingerprint-strings.h
|
||||
pam/pam_fprintd.c
|
||||
|
||||
4
po/ar.po
4
po/ar.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/freedesktop/fprintd/language/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
2
po/as.po
2
po/as.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Assamese (http://www.transifex.com/freedesktop/fprintd/language/as/)\n"
|
||||
|
||||
270
po/ast.po
Normal file
270
po/ast.po
Normal file
@ -0,0 +1,270 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-27 03:15+0000\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Asturian (http://www.transifex.com/freedesktop/fprintd/language/ast/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ast\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:2
|
||||
msgid "Privileges are required to verify fingerprints."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:3
|
||||
msgid "Enroll new fingerprints"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:4
|
||||
msgid "Privileges are required to enroll new fingerprints."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:5
|
||||
msgid "Select a user to enroll"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:6
|
||||
msgid "Privileges are required to enroll new fingerprints for other users."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/device.c:385
|
||||
#, c-format
|
||||
msgid "Device was not claimed before use"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/device.c:395
|
||||
#, c-format
|
||||
msgid "Device already in use by another user"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:31
|
||||
msgid "Place your finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:32
|
||||
#, c-format
|
||||
msgid "Place your finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:33
|
||||
msgid "Swipe your finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:34
|
||||
#, c-format
|
||||
msgid "Swipe your finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:36
|
||||
msgid "Place your left thumb on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:37
|
||||
#, c-format
|
||||
msgid "Place your left thumb on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:38
|
||||
msgid "Swipe your left thumb across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:39
|
||||
#, c-format
|
||||
msgid "Swipe your left thumb across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:41
|
||||
msgid "Place your left index finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:42
|
||||
#, c-format
|
||||
msgid "Place your left index finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:43
|
||||
msgid "Swipe your left index finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:44
|
||||
#, c-format
|
||||
msgid "Swipe your left index finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:46
|
||||
msgid "Place your left middle finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:47
|
||||
#, c-format
|
||||
msgid "Place your left middle finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:48
|
||||
msgid "Swipe your left middle finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:49
|
||||
#, c-format
|
||||
msgid "Swipe your left middle finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:51
|
||||
msgid "Place your left ring finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:52
|
||||
#, c-format
|
||||
msgid "Place your left ring finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:53
|
||||
msgid "Swipe your left ring finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:54
|
||||
#, c-format
|
||||
msgid "Swipe your left ring finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:56
|
||||
msgid "Place your left little finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:57
|
||||
#, c-format
|
||||
msgid "Place your left little finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:58
|
||||
msgid "Swipe your left little finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:59
|
||||
#, c-format
|
||||
msgid "Swipe your left little finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:61
|
||||
msgid "Place your right thumb on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:62
|
||||
#, c-format
|
||||
msgid "Place your right thumb on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:63
|
||||
msgid "Swipe your right thumb across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:64
|
||||
#, c-format
|
||||
msgid "Swipe your right thumb across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:66
|
||||
msgid "Place your right index finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:67
|
||||
#, c-format
|
||||
msgid "Place your right index finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:68
|
||||
msgid "Swipe your right index finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:69
|
||||
#, c-format
|
||||
msgid "Swipe your right index finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:71
|
||||
msgid "Place your right middle finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:72
|
||||
#, c-format
|
||||
msgid "Place your right middle finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:73
|
||||
msgid "Swipe your right middle finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:74
|
||||
#, c-format
|
||||
msgid "Swipe your right middle finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:76
|
||||
msgid "Place your right ring finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:77
|
||||
#, c-format
|
||||
msgid "Place your right ring finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:78
|
||||
msgid "Swipe your right ring finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:79
|
||||
#, c-format
|
||||
msgid "Swipe your right ring finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:81
|
||||
msgid "Place your right little finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:82
|
||||
#, c-format
|
||||
msgid "Place your right little finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:83
|
||||
msgid "Swipe your right little finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:84
|
||||
#, c-format
|
||||
msgid "Swipe your right little finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:131 ../pam/fingerprint-strings.h:157
|
||||
msgid "Place your finger on the reader again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:133 ../pam/fingerprint-strings.h:159
|
||||
msgid "Swipe your finger again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:136 ../pam/fingerprint-strings.h:162
|
||||
msgid "Swipe was too short, try again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:138 ../pam/fingerprint-strings.h:164
|
||||
msgid "Your finger was not centered, try swiping your finger again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:140 ../pam/fingerprint-strings.h:166
|
||||
msgid "Remove your finger, and try swiping your finger again"
|
||||
msgstr ""
|
||||
2
po/az.po
2
po/az.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Azerbaijani (http://www.transifex.com/freedesktop/fprintd/language/az/)\n"
|
||||
|
||||
270
po/be.po
Normal file
270
po/be.po
Normal file
@ -0,0 +1,270 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2018-04-08 18:46+0000\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Belarusian (http://www.transifex.com/freedesktop/fprintd/language/be/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: be\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:2
|
||||
msgid "Privileges are required to verify fingerprints."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:3
|
||||
msgid "Enroll new fingerprints"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:4
|
||||
msgid "Privileges are required to enroll new fingerprints."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:5
|
||||
msgid "Select a user to enroll"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:6
|
||||
msgid "Privileges are required to enroll new fingerprints for other users."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/device.c:385
|
||||
#, c-format
|
||||
msgid "Device was not claimed before use"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/device.c:395
|
||||
#, c-format
|
||||
msgid "Device already in use by another user"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:31
|
||||
msgid "Place your finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:32
|
||||
#, c-format
|
||||
msgid "Place your finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:33
|
||||
msgid "Swipe your finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:34
|
||||
#, c-format
|
||||
msgid "Swipe your finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:36
|
||||
msgid "Place your left thumb on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:37
|
||||
#, c-format
|
||||
msgid "Place your left thumb on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:38
|
||||
msgid "Swipe your left thumb across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:39
|
||||
#, c-format
|
||||
msgid "Swipe your left thumb across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:41
|
||||
msgid "Place your left index finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:42
|
||||
#, c-format
|
||||
msgid "Place your left index finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:43
|
||||
msgid "Swipe your left index finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:44
|
||||
#, c-format
|
||||
msgid "Swipe your left index finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:46
|
||||
msgid "Place your left middle finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:47
|
||||
#, c-format
|
||||
msgid "Place your left middle finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:48
|
||||
msgid "Swipe your left middle finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:49
|
||||
#, c-format
|
||||
msgid "Swipe your left middle finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:51
|
||||
msgid "Place your left ring finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:52
|
||||
#, c-format
|
||||
msgid "Place your left ring finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:53
|
||||
msgid "Swipe your left ring finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:54
|
||||
#, c-format
|
||||
msgid "Swipe your left ring finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:56
|
||||
msgid "Place your left little finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:57
|
||||
#, c-format
|
||||
msgid "Place your left little finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:58
|
||||
msgid "Swipe your left little finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:59
|
||||
#, c-format
|
||||
msgid "Swipe your left little finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:61
|
||||
msgid "Place your right thumb on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:62
|
||||
#, c-format
|
||||
msgid "Place your right thumb on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:63
|
||||
msgid "Swipe your right thumb across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:64
|
||||
#, c-format
|
||||
msgid "Swipe your right thumb across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:66
|
||||
msgid "Place your right index finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:67
|
||||
#, c-format
|
||||
msgid "Place your right index finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:68
|
||||
msgid "Swipe your right index finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:69
|
||||
#, c-format
|
||||
msgid "Swipe your right index finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:71
|
||||
msgid "Place your right middle finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:72
|
||||
#, c-format
|
||||
msgid "Place your right middle finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:73
|
||||
msgid "Swipe your right middle finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:74
|
||||
#, c-format
|
||||
msgid "Swipe your right middle finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:76
|
||||
msgid "Place your right ring finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:77
|
||||
#, c-format
|
||||
msgid "Place your right ring finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:78
|
||||
msgid "Swipe your right ring finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:79
|
||||
#, c-format
|
||||
msgid "Swipe your right ring finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:81
|
||||
msgid "Place your right little finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:82
|
||||
#, c-format
|
||||
msgid "Place your right little finger on %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:83
|
||||
msgid "Swipe your right little finger across the fingerprint reader"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:84
|
||||
#, c-format
|
||||
msgid "Swipe your right little finger across %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:131 ../pam/fingerprint-strings.h:157
|
||||
msgid "Place your finger on the reader again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:133 ../pam/fingerprint-strings.h:159
|
||||
msgid "Swipe your finger again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:136 ../pam/fingerprint-strings.h:162
|
||||
msgid "Swipe was too short, try again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:138 ../pam/fingerprint-strings.h:164
|
||||
msgid "Your finger was not centered, try swiping your finger again"
|
||||
msgstr ""
|
||||
|
||||
#: ../pam/fingerprint-strings.h:140 ../pam/fingerprint-strings.h:166
|
||||
msgid "Remove your finger, and try swiping your finger again"
|
||||
msgstr ""
|
||||
11
po/bg.po
11
po/bg.po
@ -4,13 +4,14 @@
|
||||
#
|
||||
# Translators:
|
||||
# Alexander Shopov <ash@kambanaria.org>, 2011
|
||||
# Tony Ivanov <duskull88@fastmail.fm>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-12-26 22:04+0000\n"
|
||||
"Last-Translator: Tony Ivanov <duskull88@fastmail.fm>\n"
|
||||
"Language-Team: Bulgarian (http://www.transifex.com/freedesktop/fprintd/language/bg/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -54,12 +55,12 @@ msgstr "Устройството е заето от друг потребите
|
||||
|
||||
#: ../pam/fingerprint-strings.h:31
|
||||
msgid "Place your finger on the fingerprint reader"
|
||||
msgstr ""
|
||||
msgstr "Поставете вашия пръст на четеца за пръстови отпечатъци"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:32
|
||||
#, c-format
|
||||
msgid "Place your finger on %s"
|
||||
msgstr ""
|
||||
msgstr "Поставете вашият пръст на %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:33
|
||||
msgid "Swipe your finger across the fingerprint reader"
|
||||
|
||||
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Bengali (India) (http://www.transifex.com/freedesktop/fprintd/language/bn_IN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/ca.po
4
po/ca.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2015-10-11 18:50+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:46+0000\n"
|
||||
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
|
||||
"Language-Team: Catalan (http://www.transifex.com/freedesktop/fprintd/language/ca/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@ -7,10 +7,10 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Catalan (Valencian) (http://www.transifex.com/freedesktop/fprintd/language/ca@valencia/)\n"
|
||||
"Language-Team: Catalan (Valencian) (http://www.transifex.com/freedesktop/fprintd/language/ca%40valencia/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
14
po/check-translations.sh
Executable file
14
po/check-translations.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
po_dir=$(dirname $0)
|
||||
|
||||
for i in $po_dir/*.po ; do
|
||||
if ! grep -q `basename $i | sed 's,.po,,'` $po_dir/LINGUAS; then
|
||||
echo '**********************************';
|
||||
echo '***' `basename $i | sed 's,.po,,'` missing from po/LINGUAS '***' ;
|
||||
echo '**********************************';
|
||||
exit 1;
|
||||
fi;
|
||||
done;
|
||||
|
||||
exit 0
|
||||
6
po/cs.po
6
po/cs.po
@ -8,15 +8,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/freedesktop/fprintd/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
2
po/cy.po
2
po/cy.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Welsh (http://www.transifex.com/freedesktop/fprintd/language/cy/)\n"
|
||||
|
||||
4
po/da.po
4
po/da.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-12-21 18:41+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 21:51+0000\n"
|
||||
"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
|
||||
"Language-Team: Danish (http://www.transifex.com/freedesktop/fprintd/language/da/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/de.po
4
po/de.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2014-09-22 15:28+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
|
||||
"Language-Team: German (http://www.transifex.com/freedesktop/fprintd/language/de/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/el.po
4
po/el.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:46+0000\n"
|
||||
"Last-Translator: thanos <tomtryf@gmail.com>\n"
|
||||
"Language-Team: Greek (http://www.transifex.com/freedesktop/fprintd/language/el/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
|
||||
"Language-Team: English (United Kingdom) (http://www.transifex.com/freedesktop/fprintd/language/en_GB/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/eo.po
4
po/eo.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 10:24+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Esperanto (http://www.transifex.com/freedesktop/fprintd/language/eo/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
10
po/es.po
10
po/es.po
@ -3,16 +3,16 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Adolfo Jayme-Barrientos, 2015
|
||||
# Adolfo Jayme-Barrientos, 2014
|
||||
# Adolfo Jayme Barrientos, 2015
|
||||
# Adolfo Jayme Barrientos, 2014
|
||||
# Daniel Mustieles <inactive+leo@transifex.com>, 2012
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2015-03-14 20:15+0000\n"
|
||||
"Last-Translator: Adolfo Jayme-Barrientos\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Adolfo Jayme Barrientos\n"
|
||||
"Language-Team: Spanish (http://www.transifex.com/freedesktop/fprintd/language/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
2
po/et.po
2
po/et.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Estonian (http://www.transifex.com/freedesktop/fprintd/language/et/)\n"
|
||||
|
||||
2
po/eu.po
2
po/eu.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Basque (http://www.transifex.com/freedesktop/fprintd/language/eu/)\n"
|
||||
|
||||
4
po/fa.po
4
po/fa.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Persian (http://www.transifex.com/freedesktop/fprintd/language/fa/)\n"
|
||||
@ -15,7 +15,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: fa\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
10
po/fi.po
10
po/fi.po
@ -3,15 +3,15 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2013
|
||||
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2013,2018
|
||||
# Ville Skyttä <ville.skytta@iki.fi>, 2011,2016
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2016-08-04 21:07+0000\n"
|
||||
"Last-Translator: Ville Skyttä <ville.skytta@iki.fi>\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2018-01-25 07:36+0000\n"
|
||||
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
|
||||
"Language-Team: Finnish (http://www.transifex.com/freedesktop/fprintd/language/fi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -21,7 +21,7 @@ msgstr ""
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
msgstr "Tarkista sormenjälki"
|
||||
msgstr "Vahvista sormenjälki"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:2
|
||||
msgid "Privileges are required to verify fingerprints."
|
||||
|
||||
4
po/fo.po
4
po/fo.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Faroese (http://www.transifex.com/freedesktop/fprintd/language/fo/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/fr.po
4
po/fr.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:42+0000\n"
|
||||
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
|
||||
"Language-Team: French (http://www.transifex.com/freedesktop/fprintd/language/fr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
271
po/fur.po
Normal file
271
po/fur.po
Normal file
@ -0,0 +1,271 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Fabio Tomat <f.t.public@gmail.com>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-11-30 14:32+0000\n"
|
||||
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
|
||||
"Language-Team: Friulian (http://www.transifex.com/freedesktop/fprintd/language/fur/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: fur\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
msgstr "Verifiche une impronte digjitâl"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:2
|
||||
msgid "Privileges are required to verify fingerprints."
|
||||
msgstr "I privileçs a son necessaris par verificâ lis improntis digjitâls."
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:3
|
||||
msgid "Enroll new fingerprints"
|
||||
msgstr "Regjistre gnovis improntis digjitâls"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:4
|
||||
msgid "Privileges are required to enroll new fingerprints."
|
||||
msgstr "I privileçs a son necessaris par regjistrâ gnovis improntis digjitâls."
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:5
|
||||
msgid "Select a user to enroll"
|
||||
msgstr "Selezione un utent di regjistrâ"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:6
|
||||
msgid "Privileges are required to enroll new fingerprints for other users."
|
||||
msgstr "I privileçs a son necessaris par regjistrâ gnovis improntis digjitâls par altris utents."
|
||||
|
||||
#: ../src/device.c:385
|
||||
#, c-format
|
||||
msgid "Device was not claimed before use"
|
||||
msgstr "Il dispositîf nol è stât rivendicât prime jessi doprât"
|
||||
|
||||
#: ../src/device.c:395
|
||||
#, c-format
|
||||
msgid "Device already in use by another user"
|
||||
msgstr "Il dispositîf al è za doprât di un altri utent"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:31
|
||||
msgid "Place your finger on the fingerprint reader"
|
||||
msgstr "Met il to dêt sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:32
|
||||
#, c-format
|
||||
msgid "Place your finger on %s"
|
||||
msgstr "Met il to dêt su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:33
|
||||
msgid "Swipe your finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il to dêt sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:34
|
||||
#, c-format
|
||||
msgid "Swipe your finger across %s"
|
||||
msgstr "Fâs cori il to dêt su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:36
|
||||
msgid "Place your left thumb on the fingerprint reader"
|
||||
msgstr "Met il poleâr de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:37
|
||||
#, c-format
|
||||
msgid "Place your left thumb on %s"
|
||||
msgstr "Met il poleâr de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:38
|
||||
msgid "Swipe your left thumb across the fingerprint reader"
|
||||
msgstr "Fâs cori il poleâr de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:39
|
||||
#, c-format
|
||||
msgid "Swipe your left thumb across %s"
|
||||
msgstr "Fâs cori il poleâr de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:41
|
||||
msgid "Place your left index finger on the fingerprint reader"
|
||||
msgstr "Met l'indiç de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:42
|
||||
#, c-format
|
||||
msgid "Place your left index finger on %s"
|
||||
msgstr "Met l'indiç de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:43
|
||||
msgid "Swipe your left index finger across the fingerprint reader"
|
||||
msgstr "Fâs cori l'indiç de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:44
|
||||
#, c-format
|
||||
msgid "Swipe your left index finger across %s"
|
||||
msgstr "Fâs cori l'indiç de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:46
|
||||
msgid "Place your left middle finger on the fingerprint reader"
|
||||
msgstr "Met il dêt di mieç de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:47
|
||||
#, c-format
|
||||
msgid "Place your left middle finger on %s"
|
||||
msgstr "Met il dêt di mieç de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:48
|
||||
msgid "Swipe your left middle finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il dêt di mieç de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:49
|
||||
#, c-format
|
||||
msgid "Swipe your left middle finger across %s"
|
||||
msgstr "Fâs cori il dêt di mieç de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:51
|
||||
msgid "Place your left ring finger on the fingerprint reader"
|
||||
msgstr "Met il dêt dal anel de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:52
|
||||
#, c-format
|
||||
msgid "Place your left ring finger on %s"
|
||||
msgstr "Met il dêt dal anel de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:53
|
||||
msgid "Swipe your left ring finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il dêt dal anel de man çampe sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:54
|
||||
#, c-format
|
||||
msgid "Swipe your left ring finger across %s"
|
||||
msgstr "Fâs cori il dêt dal anel de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:56
|
||||
msgid "Place your left little finger on the fingerprint reader"
|
||||
msgstr "Met il dêt piçul de man çampe su letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:57
|
||||
#, c-format
|
||||
msgid "Place your left little finger on %s"
|
||||
msgstr "Met il dêt piçul de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:58
|
||||
msgid "Swipe your left little finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il dêt piçul de man çampe su letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:59
|
||||
#, c-format
|
||||
msgid "Swipe your left little finger across %s"
|
||||
msgstr "Fâs cori il dêt piçul de man çampe su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:61
|
||||
msgid "Place your right thumb on the fingerprint reader"
|
||||
msgstr "Met il poleâr de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:62
|
||||
#, c-format
|
||||
msgid "Place your right thumb on %s"
|
||||
msgstr "Met il poleâr de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:63
|
||||
msgid "Swipe your right thumb across the fingerprint reader"
|
||||
msgstr "Fâs cori il poleâr de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:64
|
||||
#, c-format
|
||||
msgid "Swipe your right thumb across %s"
|
||||
msgstr "Fâs cori il poleâr de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:66
|
||||
msgid "Place your right index finger on the fingerprint reader"
|
||||
msgstr "Met l'indiç de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:67
|
||||
#, c-format
|
||||
msgid "Place your right index finger on %s"
|
||||
msgstr "Met l'indiç de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:68
|
||||
msgid "Swipe your right index finger across the fingerprint reader"
|
||||
msgstr "Fâs cori l'indiç de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:69
|
||||
#, c-format
|
||||
msgid "Swipe your right index finger across %s"
|
||||
msgstr "Fâs cori l'indiç de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:71
|
||||
msgid "Place your right middle finger on the fingerprint reader"
|
||||
msgstr "Met il dêt di mieç de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:72
|
||||
#, c-format
|
||||
msgid "Place your right middle finger on %s"
|
||||
msgstr "Met il dêt di mieç de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:73
|
||||
msgid "Swipe your right middle finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il dêt di mieç de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:74
|
||||
#, c-format
|
||||
msgid "Swipe your right middle finger across %s"
|
||||
msgstr "Fâs cori il dêt di mieç de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:76
|
||||
msgid "Place your right ring finger on the fingerprint reader"
|
||||
msgstr "Met il dêt dal anel de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:77
|
||||
#, c-format
|
||||
msgid "Place your right ring finger on %s"
|
||||
msgstr "Met il dêt dal anel de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:78
|
||||
msgid "Swipe your right ring finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il dêt dal anel de man drete sul letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:79
|
||||
#, c-format
|
||||
msgid "Swipe your right ring finger across %s"
|
||||
msgstr "Fâs cori il dêt dal anel de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:81
|
||||
msgid "Place your right little finger on the fingerprint reader"
|
||||
msgstr "Met il dêt piçul de man drete su letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:82
|
||||
#, c-format
|
||||
msgid "Place your right little finger on %s"
|
||||
msgstr "Met il dêt piçul de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:83
|
||||
msgid "Swipe your right little finger across the fingerprint reader"
|
||||
msgstr "Fâs cori il dêt piçul de man drete su letôr di improntis digjitâls"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:84
|
||||
#, c-format
|
||||
msgid "Swipe your right little finger across %s"
|
||||
msgstr "Fâs cori il dêt piçul de man drete su %s"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:131 ../pam/fingerprint-strings.h:157
|
||||
msgid "Place your finger on the reader again"
|
||||
msgstr "Torne met il dêt sul letôr"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:133 ../pam/fingerprint-strings.h:159
|
||||
msgid "Swipe your finger again"
|
||||
msgstr "Torne fâs cori il dêt"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:136 ../pam/fingerprint-strings.h:162
|
||||
msgid "Swipe was too short, try again"
|
||||
msgstr "La passade e jere masse curte, torne prove"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:138 ../pam/fingerprint-strings.h:164
|
||||
msgid "Your finger was not centered, try swiping your finger again"
|
||||
msgstr "Il dêt nol jere centrât, prove a tornâ a fâ cori il dêt di gnûf"
|
||||
|
||||
#: ../pam/fingerprint-strings.h:140 ../pam/fingerprint-strings.h:166
|
||||
msgid "Remove your finger, and try swiping your finger again"
|
||||
msgstr "Gjave il dêt e prove a tornâ a fâ cori il dêt di gnûf"
|
||||
4
po/ga.po
4
po/ga.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Irish (http://www.transifex.com/freedesktop/fprintd/language/ga/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/gl.po
4
po/gl.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-23 18:02+0000\n"
|
||||
"Last-Translator: Fran Diéguez <frandieguez@ubuntu.com>\n"
|
||||
"Language-Team: Galician (http://www.transifex.com/freedesktop/fprintd/language/gl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
2
po/gu.po
2
po/gu.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Gujarati (http://www.transifex.com/freedesktop/fprintd/language/gu/)\n"
|
||||
|
||||
6
po/he.po
6
po/he.po
@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Hebrew (http://www.transifex.com/freedesktop/fprintd/language/he/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: he\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
4
po/hi.po
4
po/hi.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Hindi (http://www.transifex.com/freedesktop/fprintd/language/hi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/hr.po
4
po/hr.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 14:12+0000\n"
|
||||
"Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
|
||||
"Language-Team: Croatian (http://www.transifex.com/freedesktop/fprintd/language/hr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/hu.po
4
po/hu.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: kelemeng <kelemeng@ubuntu.com>\n"
|
||||
"Language-Team: Hungarian (http://www.transifex.com/freedesktop/fprintd/language/hu/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/ia.po
4
po/ia.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2015-10-18 19:57+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 14:10+0000\n"
|
||||
"Last-Translator: Martijn Dekker <mcdutchie@hotmail.com>\n"
|
||||
"Language-Team: Interlingua (http://www.transifex.com/freedesktop/fprintd/language/ia/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/id.po
4
po/id.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
||||
"Language-Team: Indonesian (http://www.transifex.com/freedesktop/fprintd/language/id/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/it.po
4
po/it.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
|
||||
"Language-Team: Italian (http://www.transifex.com/freedesktop/fprintd/language/it/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/ja.po
4
po/ja.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 10:41+0000\n"
|
||||
"Last-Translator: Tomoyuki KATO <inactive+katomo@transifex.com>\n"
|
||||
"Language-Team: Japanese (http://www.transifex.com/freedesktop/fprintd/language/ja/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/ka.po
4
po/ka.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Georgian (http://www.transifex.com/freedesktop/fprintd/language/ka/)\n"
|
||||
@ -15,7 +15,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ka\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
6
po/kk.po
6
po/kk.po
@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Kazakh (http://www.transifex.com/freedesktop/fprintd/language/kk/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: kk\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
4
po/kn.po
4
po/kn.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Kannada (http://www.transifex.com/freedesktop/fprintd/language/kn/)\n"
|
||||
@ -15,7 +15,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: kn\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
4
po/ko.po
4
po/ko.po
@ -13,8 +13,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2015-01-17 11:53+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:46+0000\n"
|
||||
"Last-Translator: Shinjo Park <kde@peremen.name>\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/freedesktop/fprintd/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
6
po/lt.po
6
po/lt.po
@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Lithuanian (http://www.transifex.com/freedesktop/fprintd/language/lt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: lt\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
4
po/lv.po
4
po/lv.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 10:32+0000\n"
|
||||
"Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
|
||||
"Language-Team: Latvian (http://www.transifex.com/freedesktop/fprintd/language/lv/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
6
po/meson.build
Normal file
6
po/meson.build
Normal file
@ -0,0 +1,6 @@
|
||||
i18n.gettext(meson.project_name(), preset: 'glib')
|
||||
|
||||
test('check-translations',
|
||||
find_program('check-translations.sh'),
|
||||
suite: ['dist'],
|
||||
)
|
||||
2
po/ml.po
2
po/ml.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Malayalam (http://www.transifex.com/freedesktop/fprintd/language/ml/)\n"
|
||||
|
||||
2
po/mr.po
2
po/mr.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Marathi (http://www.transifex.com/freedesktop/fprintd/language/mr/)\n"
|
||||
|
||||
2
po/ms.po
2
po/ms.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Malay (http://www.transifex.com/freedesktop/fprintd/language/ms/)\n"
|
||||
|
||||
2
po/nb.po
2
po/nb.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Norwegian Bokmål (http://www.transifex.com/freedesktop/fprintd/language/nb/)\n"
|
||||
|
||||
4
po/nl.po
4
po/nl.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 10:52+0000\n"
|
||||
"Last-Translator: Richard E. van der Luit <nippur@fedoraproject.org>\n"
|
||||
"Language-Team: Dutch (http://www.transifex.com/freedesktop/fprintd/language/nl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
2
po/nn.po
2
po/nn.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Norwegian Nynorsk (http://www.transifex.com/freedesktop/fprintd/language/nn/)\n"
|
||||
|
||||
4
po/oc.po
4
po/oc.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2016-02-26 17:03+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-23 20:04+0000\n"
|
||||
"Last-Translator: Cédric Valmary <cvalmary@yahoo.fr>\n"
|
||||
"Language-Team: Occitan (post 1500) (http://www.transifex.com/freedesktop/fprintd/language/oc/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
2
po/or.po
2
po/or.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Oriya (http://www.transifex.com/freedesktop/fprintd/language/or/)\n"
|
||||
|
||||
8
po/pa.po
8
po/pa.po
@ -3,14 +3,14 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# A S Alam <apreet.alam@gmail.com>, 2012-2013
|
||||
# A S Alam <alam.yellow@gmail.com>, 2012-2013
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"Last-Translator: A S Alam <apreet.alam@gmail.com>\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:46+0000\n"
|
||||
"Last-Translator: A S Alam <alam.yellow@gmail.com>\n"
|
||||
"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/freedesktop/fprintd/language/pa/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
6
po/pl.po
6
po/pl.po
@ -8,15 +8,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2016-08-29 15:56+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish (http://www.transifex.com/freedesktop/fprintd/language/pl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: pl\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
4
po/pt.po
4
po/pt.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2015-12-01 10:12+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 21:51+0000\n"
|
||||
"Last-Translator: Pedro Albuquerque <palbuquerque73@gmail.com>\n"
|
||||
"Language-Team: Portuguese (http://www.transifex.com/freedesktop/fprintd/language/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 11:53+0000\n"
|
||||
"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/freedesktop/fprintd/language/pt_BR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/ro.po
4
po/ro.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Romanian (http://www.transifex.com/freedesktop/fprintd/language/ro/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
4
po/ru.po
4
po/ru.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:46+0000\n"
|
||||
"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
|
||||
"Language-Team: Russian (http://www.transifex.com/freedesktop/fprintd/language/ru/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
10
po/sk.po
10
po/sk.po
@ -3,21 +3,21 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# pavolzetor <pavol@klacansky.com>, 2012
|
||||
# pavolzetor <inactive+pavolzetor@transifex.com>, 2012
|
||||
# Pavol Šimo <palo.simo@gmail.com>, 2011
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"Last-Translator: pavolzetor <pavol@klacansky.com>\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:37+0000\n"
|
||||
"Last-Translator: pavolzetor <inactive+pavolzetor@transifex.com>\n"
|
||||
"Language-Team: Slovak (http://www.transifex.com/freedesktop/fprintd/language/sk/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: sk\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
|
||||
|
||||
#: ../data/net.reactivated.fprint.device.policy.in.h:1
|
||||
msgid "Verify a fingerprint"
|
||||
|
||||
4
po/sl.po
4
po/sl.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Matej Urbančič <>\n"
|
||||
"Language-Team: Slovenian (http://www.transifex.com/freedesktop/fprintd/language/sl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
2
po/sq.po
2
po/sq.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Albanian (http://www.transifex.com/freedesktop/fprintd/language/sq/)\n"
|
||||
|
||||
4
po/sr.po
4
po/sr.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2014-11-22 10:45+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
|
||||
"Language-Team: Serbian (http://www.transifex.com/freedesktop/fprintd/language/sr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@ -7,10 +7,10 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2013-11-20 10:37+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-08-03 17:23+0000\n"
|
||||
"Last-Translator: hadess <hadess@hadess.net>\n"
|
||||
"Language-Team: Serbian (Latin) (http://www.transifex.com/freedesktop/fprintd/language/sr@latin/)\n"
|
||||
"Language-Team: Serbian (Latin) (http://www.transifex.com/freedesktop/fprintd/language/sr%40latin/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
4
po/sv.po
4
po/sv.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"PO-Revision-Date: 2014-11-12 22:15+0000\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
|
||||
"Last-Translator: Anders Jonsson <transifex@norsjovallen.se>\n"
|
||||
"Language-Team: Swedish (http://www.transifex.com/freedesktop/fprintd/language/sv/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
2
po/ta.po
2
po/ta.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fprintd\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-13 17:12+0200\n"
|
||||
"POT-Creation-Date: 2018-02-06 14:07+0100\n"
|
||||
"PO-Revision-Date: 2010-11-30 07:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Tamil (http://www.transifex.com/freedesktop/fprintd/language/ta/)\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user