59 Commits

Author SHA1 Message Date
a734ceff71 Release 1.94.1 2021-11-03 15:34:26 +01:00
0595f416f9 data: Fix udev event delivery for systemd service
PrivateNetwork=true is a bad idea, as it means that udev events cannot
be delivered. Remove it, we already restrict the address families
sufficiently anyway.

Closes: #119
2021-11-03 10:46:03 +00:00
38c21e3952 Fix typo in 0.5.1 release notes 2021-11-02 15:13:05 +00:00
50943b1bd4 build: Do not use positional arguments in i18n.merge_file
This was never really used and it's breaking meson 60.
While this may just become a warning in 60.1, it's just better to avoid
using it.

See: https://github.com/mesonbuild/meson/issues/9441
2021-11-02 15:06:29 +00:00
245dcfa218 fix: fix typo in man page 2021-10-30 16:49:45 -03:00
090016fdcd Translated using Weblate (Spanish)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Emilio Herrera <ehespinosa57@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/es/
Translation: fprintd/fprintd
2021-10-03 17:05:10 +02:00
90babad082 Translated using Weblate (Croatian)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Gogo Gogsi <linux.hr@protonmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/hr/
Translation: fprintd/fprintd
2021-10-03 17:05:10 +02:00
47af2bada5 Update it.po 2021-09-15 15:26:45 +00:00
c1bc6b4da0 Translated using Weblate (Czech)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Pavel Borecki <pavel.borecki@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/cs/
Translation: fprintd/fprintd
2021-09-15 17:24:36 +02:00
0bb8271ede Translated using Weblate (German)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/de/
Translation: fprintd/fprintd
2021-09-15 17:24:36 +02:00
b393eddd4b Translated using Weblate (Croatian)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Gogo Gogsi <linux.hr@protonmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/hr/
Translation: fprintd/fprintd
2021-09-15 17:24:36 +02:00
2c9cf975a2 Translated using Weblate (Japanese)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Takuro Onoue <kusanaginoturugi@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/ja/
Translation: fprintd/fprintd
2021-09-15 17:24:36 +02:00
29a976b483 Translated using Weblate (Marathi)
Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Marathi)

Currently translated at 5.0% (3 of 60 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: girish joshi <girish946@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/mr/
Translation: fprintd/fprintd
2021-09-15 17:24:36 +02:00
7d4331b29a ci: Reference image directly for forks
Otherwise forks will not find the image and things fall apart (due to
the method of how we build the image).
2021-09-15 17:20:14 +02:00
b440acb57d tests: Use dbusmock start_system_bus instead of GLib server 2021-09-15 15:06:06 +00:00
0cf0fea902 tests: Better cleanup helper processes and objects
We were leaking the bus connections for the proxy objects. Also, now the
subprocesses will be forcefully killed at shutdown.
2021-09-15 15:06:06 +00:00
b3d6bf0825 tests: Set G_MESSAGES_DEBUG=all for daemon as it is needed
Otherwise executing the test script outside of the meson environment
will fail as the inhibitor test relies on being able to parse the log.
2021-09-15 15:06:06 +00:00
fc65055279 device: Always report selected finger if there is only one
If the user specified "any" finger, then we would mirror this back even
if there is only one finger available. Change it so that we act as if
that finger was passed explicitly, meaning we use the "verify" method
and also send the signal for the selected finger accordingly.
2021-09-15 15:00:14 +00:00
02468366b2 ci: Add patch to dependencies
Seems like this is not pulled in indirectly anymore.
2021-09-15 16:48:54 +02:00
3d309ea400 ci: Update to new FDO templates 2021-09-15 16:33:31 +02:00
b483edbe92 device.policy: Fix permission dialogue titles
Fix the action description for some actions which are used to both
enroll and delete fingerprints for users.

Closes: #116
2021-09-02 17:14:07 +02:00
e4c155d5b8 tests: Give fprintd some more time to be ready
While the delay inhibitor is grabbed almost immediately, this can be
slow enough to not have happened immediately after the bus name has been
registered. Add a generous timeout to prevent issues.
2021-08-25 15:27:26 +02:00
717a919996 tests: Make class cleanup more robust
Use addClassCleanup rather than doing cleanup in tearDownClass, which
may not be called in all cases.
2021-08-25 15:22:42 +02:00
e6fc854a9a tests: Use addCleanup to stop polkitd 2021-08-25 15:19:43 +02:00
5d7422e17a tests: Cleanup inhibitor fifo properly
Unlink the fifo itself and use addCleanup to close it.
2021-08-25 13:43:30 +02:00
fc7e058e93 Release 1.94.0 2021-08-20 13:59:06 +00:00
ff4ba1da47 data: Allow access to hidraw devices
The elanspi driver needs access to a hidraw device in order to reset the
SPI reader.
2021-08-20 13:59:06 +00:00
626128a0fa device: Remove local storage prints if they've been removed from device
If a print we have stored locally is not available in device anymore, we
need to cleanup the local database.

We do not get a proper DATA_NOT_FOUND error for most devices (indeed, at
this point no device does this properly). As such, do this when we see a
DATA_NOT_FOUND error and the first time that we get a verify-no-match
results on a device which is capable of listing all known prints.

Co-Authored-by: Marco Trevisan (Treviño) <mail@3v1n0.net>
2021-08-19 18:22:36 +02:00
0bba073dff device: Handle data not-found error as verify-no-match
In case we got a data-not-found error, it means that the device has not
such prints stored, and thus the verification failed, and there's no
need to expose the internal reasons to fprintd clients.
2021-08-18 13:09:38 +02:00
ec74c849be Translated using Weblate (Indonesian)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Andika Triwidada <andika@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/id/
Translation: fprintd/fprintd
2021-08-17 04:04:53 +02:00
e09d90c81b Update ca.po 2021-08-15 12:03:43 +00:00
e3b0d52ce5 device: Catch client disconnect during Release
If the client disconnected while the release call was stopping the
current action, then the disconnect will be processed. This means that
the device can be closed already and the session is destroyed.

Add a check for this, in the same way that the vanished handler deals
with this corner case.
2021-08-11 08:58:26 +00:00
70182083a1 Implement suspend/resume handling 2021-08-09 13:25:11 +02:00
66e7df1105 Keep alive fprintd if any device is WARM or HOT
This renames the internal "in-use" property to "busy" and redefines the
value to be TRUE either if a client is connected or if the device is
considered WARM or HOT.

This prevents fprintd shutdown while devices are warm in order to ensure
that the libfprint hardware protection is functional.
2021-08-09 13:25:11 +02:00
96b911913e data: Allow tuning USB parameters
Newer libfprint versions try to tune the wakeup and persist option of
USB devices. Add access rules to permit this.
2021-08-06 15:31:24 +02:00
37e6939fa9 tests: Verify PAM VerifyStop/disconnect behaviour
For verify-match, the PAM module should simply drop off the bus. In
other cases it should correctly run VerifyStop and Release the device.
Verify this for verify-match and verify-no-match.
2021-08-02 13:00:43 +02:00
bb23b7e9d0 pam: Immediately return verify-match/verify-no-match
In the verify-match case, this means disconnecting from the bus rather
than stopping the verification. This is the only way to make sure that
the result is immediately reported and we do not wait for the device to
be idle again (which generally means waiting for finger removal).

In the verify-no-match case we simply send the string first before the
operation is stopped. An exceeded retry limit is only reported after
VerifyStop has finished.
2021-08-02 13:00:43 +02:00
80eb673e83 tests: Remove broken test_verify_stop_restarts_immediately test
Before VerifyStart can be called again the current verify operation
needs to be completed. This requires waiting for VerifyStop to happen.

As such, remove the test, which is expected to fail randomly.
2021-08-02 13:00:43 +02:00
88d7d97c0d device: Remove incorrect comment about delaying verify-no-match result
We report a verify-match/verify-no-match immediately to the user. The
comment is not accurate.
2021-08-02 13:00:43 +02:00
6bc19c8892 tests: Speed up tests by only using parts of the image
We just need large enough samples to tell them apart correctly. For this
a 128x128 area from the center of each image is sufficient.

This speeds up the test run considerably. Other ways of achieving this
could be to also lower the number of enroll steps for the image device.
2021-07-31 11:53:33 +02:00
c690542e7c ci: Conveniently expose coverage report 2021-07-31 11:53:33 +02:00
5f6e80de01 file_storage: Ensure username/finger match our expectations
Otherwise we would need to track this separately, which would be a bit
of a pain.

The alternative would be simply overriding the values.
2021-07-30 23:52:00 +02:00
3c8ac241b8 tests: Try to show backtrace when killed by SIGTERM
This means that we may manage to show a backtrace if meson kills the
test process due to a timeout.
2021-07-30 23:52:00 +02:00
2bf6d6a266 device: Print error if deletion fails during garbage collection 2021-07-30 23:52:00 +02:00
be45b44337 meson: Set GLIB_VERSION_{MIN_REQUIRED,MAX_ALLOWED}
To help catch errors where we accidentally use the wrong symbols.

Closes: #42
2021-07-30 15:52:22 +02:00
572c119fd4 device: Do not use GLib 2.62 API to extend GPtrArray
We are currently only depending on 2.56.
2021-07-30 15:52:22 +02:00
980bab5135 device: Do not use GLib 2.58 API to pop from GPtrArray
We currently only depend on GLib 2.52.
2021-07-30 15:52:22 +02:00
161278cacd device: Add a memory barrier when getting session pointer
The test suite ran into a very rare error where it seemed to get stuck
during authorization. A possible explanation is that the priv->_session
pointer re-fetching is optimized away and the pointer just continues to
contain the invalid placeholder rather than an updated value.

Use g_atomic_pointer_get in order to avoid this possibility entirely.
2021-07-26 13:09:13 +00:00
2dd1cd8fc3 Translated using Weblate (French)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Claude Paroz <claude@2xlibre.net>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/fr/
Translation: fprintd/fprintd
2021-07-25 14:04:40 +02:00
0de01da150 Translated using Weblate (Polish)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Piotr Drąg <piotrdrag@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/pl/
Translation: fprintd/fprintd
2021-07-24 13:08:32 +02:00
0844002b78 Translated using Weblate (Finnish)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Jan Kuparinen <copper_fin@hotmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/fi/
Translation: fprintd/fprintd
2021-07-23 14:04:35 +02:00
9ae3c16f2d tests: Pull more OutputChecker fixes
While debugging the g-s-d testsuite a few more issues in the
OutputChecker code came up. Pull in these fixes ensuring that EOF and
the read side FD are handled correctly.
2021-07-23 13:50:52 +02:00
f4995dcabe tests: Pull OutputChecker fixes
Mark the thread as daemon. Also use poll and fix a wrong variable
reference.
2021-07-19 21:38:25 +00:00
8c0876ae49 Translated using Weblate (Korean)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: simmon <simmon@nplob.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/ko/
Translation: fprintd/fprintd
2021-07-16 22:04:35 +02:00
3a96b6f2f0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/pt_BR/
Translation: fprintd/fprintd
2021-07-16 22:04:35 +02:00
688f9b0acf Translated using Weblate (Swedish)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Anders Jonsson <anders.jonsson@norsjovallen.se>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/sv/
Translation: fprintd/fprintd
2021-07-16 22:04:35 +02:00
5b9e237884 Translated using Weblate (Turkish)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/tr/
Translation: fprintd/fprintd
2021-07-16 22:04:35 +02:00
8288c0efc7 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (60 of 60 strings)

Co-authored-by: Yuri Chornoivan <yurchor@ukr.net>
Translate-URL: https://translate.fedoraproject.org/projects/fprintd/fprintd/uk/
Translation: fprintd/fprintd
2021-07-16 22:04:35 +02:00
0d2dbc6179 Switch to the Fedora weblate instance for translations
Closes: #78
2021-07-01 13:11:20 +02:00
37 changed files with 1006 additions and 364 deletions

View File

@ -2,7 +2,7 @@ include:
- project: 'libfprint/libfprint'
ref: master
file: '/.gitlab-ci/libfprint-templates.yaml'
- project: 'wayland/ci-templates'
- project: 'freedesktop/ci-templates'
ref: master
file: '/templates/fedora.yml'
@ -10,6 +10,7 @@ variables:
extends: .libfprint_common_variables
FDO_DISTRIBUTION_TAG: latest
FDO_DISTRIBUTION_VERSION: rawhide
FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME"
FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
DEPENDENCIES: dbus-glib-devel
gcc
@ -21,6 +22,7 @@ variables:
libasan
libfprint-devel
meson
patch
pam-devel
polkit-devel
python3-dbusmock
@ -95,10 +97,11 @@ test_dev:
- ninja -C _build coverage
- cat _build/meson-logs/coverage.txt
artifacts:
name: log-and-coverage
when: always
expose_as: 'Coverage Report'
paths:
- _build/meson-logs
- _build/meson-logs/coveragereport/index.html
expire_in: 1 week
test_dev_with_sanitizer:
extends:
@ -122,6 +125,7 @@ container_fedora_build:
- $FPRINT_CRON_TASK == "BUILD_CI_IMAGES"
variables:
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
FDO_FORCE_REBUILD: 1
# a list of packages to install
FDO_DISTRIBUTION_PACKAGES:
$DEPENDENCIES

View File

@ -1,8 +0,0 @@
[main]
host = https://www.transifex.com
[fprintd.fprintd-po-fprintd-pot]
file_filter = po/<lang>.po
source_file = po/fprintd.pot
source_lang = en

33
NEWS
View File

@ -1,6 +1,37 @@
This file lists notable changes in each release. For the full history of all
changes, see ChangeLog.
Version 1.94.1:
API users, please adjust now to planned API changes in 2.0:
- EnrollStart will throw an error if the finger was enrolled already
- Interactive DBus authentication will only happen when requested
Highlights.
- Fix systemd unit so that udev hotplug events are processed
- Report back the selected finger if there is only one
- Change PolicyKit strings for clarity
- Various fixes to the testsuite
- Plenty of translation updates
Version 1.94.0:
API users, please adjust now to planned API changes in 2.0:
- EnrollStart will throw an error if the finger was enrolled already
- Interactive DBus authentication will only happen when requested
Highlights:
- Implement suspend/resume handling.
This requires writing "power/persist" and "power/wakeup" in sysfs.
- Support libfprint overheat protections
- Delete host prints when device prints disappeared
- pam: Immediately return success information
- Plenty of updated translations thanks to move to Fedora Weblate
- Fix possible race when retrieving session information
- Fix possible race when a client disconnects
- GLib 2.56 compatibility fixes
Version 1.92.0:
API users, please adjust now to planned API changes in 2.0:
@ -140,7 +171,7 @@ version 0.6.0:
one reader available
version 0.5.1:
- Add max_tries and timeout arguments to PAM module
- Add max-tries and timeout arguments to PAM module
- Add ability to require the fingerprint for enrolled users
- Add "-f <finger>" option to enroll utilities

7
README
View File

@ -12,6 +12,13 @@ Licensed under the GPL version 2 or any later version (see COPYING).
A PAM login module is included in the 'pam' directory.
Translating
===========
fprintd and pam_fprintd are translated using weblate. Please visit
https://translate.fedoraproject.org/projects/fprintd/ to contribute
translations.
API use cases
=============

View File

@ -1,17 +0,0 @@
Updating translations
=====================
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:
https://gitlab.freedesktop.org/libfprint/fprintd/
Tokens:
dKfMSehAGCsQ5gxT4r2DAp9PyEMsKAMp / hadess

View File

@ -196,10 +196,10 @@ Will list the user's enrolled fingerprints.
.RS 8
Will verify the user's fingerprints against the database.
.RE
.SS "fprintd-enroll"
.SS "fprintd-delete"
.IX Subsection "fprintd-enroll"
.RS 8
Will enroll the user's right index finger into the database.
Will delete the user's right index finger into the database.
.RE
.SH "AUTHOR"
.IX Header "AUTHOR"

View File

@ -79,11 +79,11 @@ Will verify the user's fingerprints against the database.
=back
=head2 fprintd-enroll
=head2 fprintd-delete
=over 8
Will enroll the user's right index finger into the database.
Will delete the user's right index finger into the database.
=back
@ -102,4 +102,3 @@ By default, fprintd stores the fingerprints in B</var/lib/fprint/>
=item B<gnome-control-center>
=back

View File

@ -21,7 +21,6 @@ PrivateTmp=true
SystemCallFilter=@system-service
# Network
PrivateNetwork=true
RestrictAddressFamilies=AF_UNIX AF_LOCAL AF_NETLINK
# Execute Mappings
@ -40,3 +39,7 @@ NoNewPrivileges=true
ProtectClock=yes
DeviceAllow=char-usb_device rw
DeviceAllow=char-spi rw
DeviceAllow=char-hidraw rw
# Allow tuning USB parameters (wakeup and persist)
ReadWritePaths=/sys/devices

View File

@ -24,7 +24,7 @@ if get_option('systemd')
endif
polkit_policy = 'net.reactivated.fprint.device.policy'
polkit_policy_target = i18n.merge_file(polkit_policy,
polkit_policy_target = i18n.merge_file(
input: '@0@.in'.format(polkit_policy),
output: polkit_policy,
po_dir: meson.source_root() / 'po',

View File

@ -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 or Delete fingerprints</description>
<message>Privileges are required to enroll or delete 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 manage fingerprints for</description>
<message>Privileges are required to manage fingerprints for other users.</message>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>

View File

@ -1,5 +1,5 @@
project('fprintd', 'c',
version: '1.92.0',
version: '1.94.1',
license: 'GPLv2+',
default_options: [
'buildtype=debugoptimized',
@ -64,7 +64,15 @@ add_project_arguments(common_cflags, language: 'c')
host_system = host_machine.system()
# NOTE: Bump gdbus-codegen min version once we can depend on 2.64!
glib_min_version = '2.56'
libfprint_min_version = '1.92.0'
libfprint_min_version = '1.94.0'
glib_version_def = 'GLIB_VERSION_@0@_@1@'.format(
glib_min_version.split('.')[0], glib_min_version.split('.')[1])
common_cflags = cc.get_supported_arguments([
'-DGLIB_VERSION_MIN_REQUIRED=' + glib_version_def,
'-DGLIB_VERSION_MAX_ALLOWED=' + glib_version_def,
])
add_project_arguments(common_cflags, language: 'c')
fprintd_installdir = get_option('prefix') / get_option('libexecdir')
fprintd_plugindir = get_option('prefix') / get_option('libdir') / meson.project_name() / 'modules'

View File

@ -536,6 +536,14 @@ do_verify (sd_bus *bus,
data->timed_out = true;
send_info_msg (data->pamh, _("Verification timed out"));
}
else
{
if (str_equal (data->result, "verify-no-match"))
send_err_msg (data->pamh, _("Failed to match fingerprint"));
else if (str_equal (data->result, "verify-match"))
/* Simply disconnect from bus if we return PAM_SUCCESS */
return PAM_SUCCESS;
}
/* Ignore errors from VerifyStop */
data->verify_started = false;
@ -557,11 +565,7 @@ do_verify (sd_bus *bus,
{
if (str_equal (data->result, "verify-no-match"))
{
send_err_msg (data->pamh, _("Failed to match fingerprint"));
}
else if (str_equal (data->result, "verify-match"))
{
return PAM_SUCCESS;
/* Nothing to do at this point. */
}
else if (str_equal (data->result, "verify-unknown-error"))
{
@ -743,10 +747,16 @@ do_auth (pam_handle_t *pamh, const char *username)
if (claim_device (pamh, bus, data->dev, username))
{
int ret = do_verify (bus, data);
/* Simply disconnect from bus if we return PAM_SUCCESS */
if (ret != PAM_SUCCESS)
release_device (pamh, bus, data->dev);
sd_bus_close (bus);
return ret;
}
sd_bus_close (bus);
return PAM_AUTHINFO_UNAVAIL;
}

View File

@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:46+0000\n"
"PO-Revision-Date: 2021-08-15 14:02+0200\n"
"Last-Translator: Robert Antoni Buj i Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan (http://www.transifex.com/freedesktop/fprintd/"
"language/ca/)\n"
@ -19,6 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -263,7 +264,7 @@ msgstr "Passeu el dit un altre cop"
#: pam/fingerprint-strings.h:176 pam/fingerprint-strings.h:204
msgid "Swipe was too short, try again"
msgstr "Lectura incorrecta, torneu-ho a intentar"
msgstr "Lectura incorrecta. Torneu-ho a intentar"
#: pam/fingerprint-strings.h:178 pam/fingerprint-strings.h:206
msgid "Your finger was not centered, try swiping your finger again"
@ -275,13 +276,12 @@ msgstr "Retireu el dit i intenteu passar el dit de nou"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "S'ha esgotat el temps d'espera de la verificació"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Comprova una empremta"
msgstr "L'empremta no coincideix"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Hi ha hagut un error desconegut"

View File

@ -4,21 +4,23 @@
#
# Translators:
# Marek Černocký <marek@manet.cz>, 2013
# Pavel Borecki <pavel.borecki@gmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-09-04 23:04+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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"
"X-Generator: Weblate 4.8\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -275,13 +277,12 @@ msgstr "Sejměte prst a zkuste s ním přejet znovu"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Překročen časový limit pro ověření"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Ověřit otisk prstů"
msgstr "Nepodařilo se najít shodu s otiskem"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Došlo k neznámé chybě"

View File

@ -3,21 +3,22 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ettore Atalan <atalanttore@googlemail.com>, 2014
# Ettore Atalan <atalanttore@googlemail.com>, 2014, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
"PO-Revision-Date: 2021-08-22 13:04+0000\n"
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
"Language-Team: German (http://www.transifex.com/freedesktop/fprintd/language/"
"de/)\n"
"Language-Team: German <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.8\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -281,13 +282,12 @@ msgstr ""
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Zeitüberschreitung bei der Verifizierung"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Einen Fingerabdruck überprüfen"
msgstr "Fehler beim Abgleich des Fingerabdrucks"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Ein unbekannter Fehler ist aufgetreten"

View File

@ -6,20 +6,22 @@
# Adolfo Jayme Barrientos, 2015
# Adolfo Jayme Barrientos, 2014
# 0f759dd1ea6c4c76cedc299039ca4f23_7584d04 <454cc45058db9632179dc8079c0c1af3_5311>, 2012
# Emilio Herrera <ehespinosa57@gmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-09-30 15:05+0000\n"
"Last-Translator: Emilio Herrera <ehespinosa57@gmail.com>\n"
"Language-Team: Spanish <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.8\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -276,13 +278,12 @@ msgstr "Quite su dedo e intente deslizarlo de nuevo"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Se ha agotado el tiempo de la verificación"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Comprobar una huella"
msgstr "La huella no coincide"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Ocurrió un error desconocido"

View File

@ -6,20 +6,22 @@
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2013,2018
# Kimmo Kujansuu <mrkujansuu@gmail.com>, 2019
# Ville Skyttä <ville.skytta@iki.fi>, 2011,2016
# Jan Kuparinen <copper_fin@hotmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2019-04-19 20:32+0000\n"
"Last-Translator: Kimmo Kujansuu <mrkujansuu@gmail.com>\n"
"Language-Team: Finnish (http://www.transifex.com/freedesktop/fprintd/"
"language/fi/)\n"
"PO-Revision-Date: 2021-07-23 12:04+0000\n"
"Last-Translator: Jan Kuparinen <copper_fin@hotmail.com>\n"
"Language-Team: Finnish <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/fi/>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.7.2\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -277,13 +279,12 @@ msgstr "Poista sormi ja yritä pyyhkäistä uudelleen"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Vahvistus aikakatkaistiin"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Vahvista sormenjälki"
msgstr "Sormenjäljen vahvistaminen epäonnistui"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Tapahtui tuntematon virhe"

View File

@ -3,22 +3,23 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Claude Paroz <claude@2xlibre.net>, 2012
# Claude Paroz <claude@2xlibre.net>, 2011
# Claude Paroz <claude@2xlibre.net>, 2012, 2021.
# Claude Paroz <claude@2xlibre.net>, 2011, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:42+0000\n"
"PO-Revision-Date: 2021-07-25 12:04+0000\n"
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
"Language-Team: French (http://www.transifex.com/freedesktop/fprintd/language/"
"fr/)\n"
"Language-Team: French <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.7.2\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -41,18 +42,18 @@ msgstr ""
#: data/net.reactivated.fprint.device.policy.in:33
msgid "Select a user to enroll"
msgstr "Choisir un utilisateur pour l'introduction"
msgstr "Choisir un utilisateur pour lintroduction"
#: data/net.reactivated.fprint.device.policy.in:34
msgid "Privileges are required to enroll new fingerprints for other users."
msgstr ""
"Des permissions sont nécessaires pour introduire de nouvelles empreintes "
"digitales pour d'autres utilisateurs."
"digitales pour dautres utilisateurs."
#: src/device.c:690
#, c-format
msgid "Device was not claimed before use"
msgstr "Le périphérique n'a pas été réservé avant utilisation"
msgstr "Le périphérique na pas été réservé avant utilisation"
#: src/device.c:699
#, c-format
@ -61,7 +62,7 @@ msgstr "Le périphérique est déjà utilisé par un autre utilisateur"
#: pam/fingerprint-strings.h:50
msgid "Place your finger on the fingerprint reader"
msgstr "Placez votre doigt sur le lecteur d'empreintes"
msgstr "Placez votre doigt sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:51
#, c-format
@ -70,7 +71,7 @@ msgstr "Placez votre doigt sur %s"
#: pam/fingerprint-strings.h:52
msgid "Swipe your finger across the fingerprint reader"
msgstr "Faites glisser votre doigt sur le lecteur d'empreintes"
msgstr "Faites glisser votre doigt sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:53
#, c-format
@ -79,7 +80,7 @@ msgstr "Faites glisser votre doigt sur %s"
#: pam/fingerprint-strings.h:55
msgid "Place your left thumb on the fingerprint reader"
msgstr "Placez votre pouce gauche sur le lecteur d'empreintes"
msgstr "Placez votre pouce gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:56
#, c-format
@ -88,7 +89,7 @@ msgstr "Placez votre pouce gauche sur %s"
#: pam/fingerprint-strings.h:57
msgid "Swipe your left thumb across the fingerprint reader"
msgstr "Faites glisser votre pouce gauche sur le lecteur d'empreintes"
msgstr "Faites glisser votre pouce gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:58
#, c-format
@ -97,7 +98,7 @@ msgstr "Faites glisser votre pouce gauche sur %s"
#: pam/fingerprint-strings.h:60
msgid "Place your left index finger on the fingerprint reader"
msgstr "Placez votre index gauche sur le lecteur d'empreintes"
msgstr "Placez votre index gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:61
#, c-format
@ -115,7 +116,7 @@ msgstr "Faites glisser votre index gauche sur %s"
#: pam/fingerprint-strings.h:65
msgid "Place your left middle finger on the fingerprint reader"
msgstr "Placez votre majeur gauche sur le lecteur d'empreintes"
msgstr "Placez votre majeur gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:66
#, c-format
@ -124,7 +125,7 @@ msgstr "Placez votre majeur gauche sur %s"
#: pam/fingerprint-strings.h:67
msgid "Swipe your left middle finger across the fingerprint reader"
msgstr "Faites glisser votre majeur gauche sur le lecteur d'empreintes"
msgstr "Faites glisser votre majeur gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:68
#, c-format
@ -133,7 +134,7 @@ msgstr "Faites glisser votre majeur gauche sur %s"
#: pam/fingerprint-strings.h:70
msgid "Place your left ring finger on the fingerprint reader"
msgstr "Placez votre annulaire gauche sur le lecteur d'empreintes"
msgstr "Placez votre annulaire gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:71
#, c-format
@ -142,7 +143,7 @@ msgstr "Placez votre annulaire gauche sur %s"
#: pam/fingerprint-strings.h:72
msgid "Swipe your left ring finger across the fingerprint reader"
msgstr "Faites glisser votre annulaire gauche sur le lecteur d'empreintes"
msgstr "Faites glisser votre annulaire gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:73
#, c-format
@ -151,7 +152,7 @@ msgstr "Faites glisser votre annulaire gauche sur %s"
#: pam/fingerprint-strings.h:75
msgid "Place your left little finger on the fingerprint reader"
msgstr "Placez votre auriculaire gauche sur le lecteur d'empreintes"
msgstr "Placez votre auriculaire gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:76
#, c-format
@ -160,7 +161,7 @@ msgstr "Placez votre auriculaire gauche sur %s"
#: pam/fingerprint-strings.h:77
msgid "Swipe your left little finger across the fingerprint reader"
msgstr "Faites glisser votre auriculaire gauche sur le lecteur d'empreintes"
msgstr "Faites glisser votre auriculaire gauche sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:78
#, c-format
@ -169,7 +170,7 @@ msgstr "Faites glisser votre auriculaire gauche sur %s"
#: pam/fingerprint-strings.h:80
msgid "Place your right thumb on the fingerprint reader"
msgstr "Placez votre pouce droit sur le lecteur d'empreintes"
msgstr "Placez votre pouce droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:81
#, c-format
@ -178,7 +179,7 @@ msgstr "Placez votre pouce droit sur %s"
#: pam/fingerprint-strings.h:82
msgid "Swipe your right thumb across the fingerprint reader"
msgstr "Faites glisser votre pouce droit sur le lecteur d'empreintes"
msgstr "Faites glisser votre pouce droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:83
#, c-format
@ -187,7 +188,7 @@ msgstr "Faites glisser votre pouce droit sur %s"
#: pam/fingerprint-strings.h:85
msgid "Place your right index finger on the fingerprint reader"
msgstr "Placez votre index droit sur le lecteur d'empreintes"
msgstr "Placez votre index droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:86
#, c-format
@ -196,7 +197,7 @@ msgstr "Placez votre index droit sur %s"
#: pam/fingerprint-strings.h:87
msgid "Swipe your right index finger across the fingerprint reader"
msgstr "Faites glisser votre index droit sur le lecteur d'empreintes"
msgstr "Faites glisser votre index droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:88
#, c-format
@ -205,7 +206,7 @@ msgstr "Faites glisser votre index droit sur %s"
#: pam/fingerprint-strings.h:90
msgid "Place your right middle finger on the fingerprint reader"
msgstr "Placez votre majeur droit sur le lecteur d'empreintes"
msgstr "Placez votre majeur droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:91
#, c-format
@ -214,7 +215,7 @@ msgstr "Placez votre majeur droit sur %s"
#: pam/fingerprint-strings.h:92
msgid "Swipe your right middle finger across the fingerprint reader"
msgstr "Faites glisser votre majeur droit sur le lecteur d'empreintes"
msgstr "Faites glisser votre majeur droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:93
#, c-format
@ -223,7 +224,7 @@ msgstr "Faites glisser votre majeur droit sur %s"
#: pam/fingerprint-strings.h:95
msgid "Place your right ring finger on the fingerprint reader"
msgstr "Placez votre annulaire droit sur le lecteur d'empreintes"
msgstr "Placez votre annulaire droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:96
#, c-format
@ -232,7 +233,7 @@ msgstr "Placez votre annulaire droit sur %s"
#: pam/fingerprint-strings.h:97
msgid "Swipe your right ring finger across the fingerprint reader"
msgstr "Faites glisser votre annulaire droit sur le lecteur d'empreintes"
msgstr "Faites glisser votre annulaire droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:98
#, c-format
@ -241,7 +242,7 @@ msgstr "Faites glisser votre annulaire droit sur %s"
#: pam/fingerprint-strings.h:100
msgid "Place your right little finger on the fingerprint reader"
msgstr "Placez votre auriculaire droit sur le lecteur d'empreintes"
msgstr "Placez votre auriculaire droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:101
#, c-format
@ -250,7 +251,7 @@ msgstr "Placez votre auriculaire droit sur %s"
#: pam/fingerprint-strings.h:102
msgid "Swipe your right little finger across the fingerprint reader"
msgstr "Faites glisser votre auriculaire droit sur le lecteur d'empreintes"
msgstr "Faites glisser votre auriculaire droit sur le lecteur dempreintes"
#: pam/fingerprint-strings.h:103
#, c-format
@ -271,8 +272,7 @@ msgstr "Le glissement était trop bref, essayez une nouvelle fois"
#: pam/fingerprint-strings.h:178 pam/fingerprint-strings.h:206
msgid "Your finger was not centered, try swiping your finger again"
msgstr ""
"Votre doigt n'était pas centré, essayez de le glisser une nouvelle fois"
msgstr "Votre doigt nétait pas centré, essayez de le glisser une nouvelle fois"
#: pam/fingerprint-strings.h:180 pam/fingerprint-strings.h:208
msgid "Remove your finger, and try swiping your finger again"
@ -281,12 +281,12 @@ msgstr ""
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Le délai de vérification a expiré"
#: pam/pam_fprintd.c:560
msgid "Failed to match fingerprint"
msgstr "Echec de reconnaissance de l'empreinte digitale"
msgstr "Échec de reconnaissance de lempreinte digitale"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Une erreur inconnue est survenue"

View File

@ -4,21 +4,23 @@
#
# Translators:
# Tomislav Krznar <tomislav.krznar@gmail.com>, 2012
# Gogo Gogsi <linux.hr@protonmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-10-03 15:05+0000\n"
"Last-Translator: Gogo Gogsi <linux.hr@protonmail.com>\n"
"Language-Team: Croatian <https://translate.fedoraproject.org/projects/"
"fprintd/fprintd/hr/>\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.8\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -275,13 +277,12 @@ msgstr "Maknite prst i pokušajte ga povući ponovo"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Provjera je istekla"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Provjeri otiske prstiju"
msgstr "Neuspjelo podudaranje otiska prstiju"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Dogodila se nepoznata greška"

View File

@ -3,21 +3,22 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Andika Triwidada <andika@gmail.com>, 2012
# Andika Triwidada <andika@gmail.com>, 2012, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
"PO-Revision-Date: 2021-08-17 02:04+0000\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"Language-Team: Indonesian (http://www.transifex.com/freedesktop/fprintd/"
"language/id/)\n"
"Language-Team: Indonesian <https://translate.fedoraproject.org/projects/"
"fprintd/fprintd/id/>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.7.2\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -274,13 +275,12 @@ msgstr "Angkat jari Anda, lalu coba gesekkan lagi"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Verifikasi habis waktu"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Periksa kebenaran sidik jari"
msgstr "Gagal mencocokkan sidik jari"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Terjadi kesalahan yang tidak dikenal"

View File

@ -4,13 +4,14 @@
#
# Translators:
# Milo Casagrande <milo@ubuntu.com>, 2013
# Albano Battistella <albano_battistella@hotmail.com>, 2021
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"PO-Revision-Date: 2021-08-21 12:08+0200\n"
"Last-Translator: Albano Battistella <albano_battistella@hotmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/freedesktop/fprintd/"
"language/it/)\n"
"Language: it\n"
@ -274,13 +275,12 @@ msgstr "Rimuovere il dito e ripetere un altro passaggio"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Verifica terminata"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Verifica una impronta"
msgstr "Impossibile abbinare l'impronta digitale"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Si è verificato un errore sconosciuto"

View File

@ -4,21 +4,22 @@
#
# Translators:
# e93ed3aa97dec2eb31063731872555fc_1460a05 <71305a0095156d8e18373a5b7cfeb79e_8587>, 2011, 2012
# Takuro Onoue <kusanaginoturugi@gmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 10:41+0000\n"
"Last-Translator: e93ed3aa97dec2eb31063731872555fc_1460a05 "
"<71305a0095156d8e18373a5b7cfeb79e_8587>\n"
"Language-Team: Japanese (http://www.transifex.com/freedesktop/fprintd/"
"language/ja/)\n"
"PO-Revision-Date: 2021-09-09 03:04+0000\n"
"Last-Translator: Takuro Onoue <kusanaginoturugi@gmail.com>\n"
"Language-Team: Japanese <https://translate.fedoraproject.org/projects/"
"fprintd/fprintd/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.8\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -274,13 +275,12 @@ msgstr "指をどかして、もう一度指をなぞってみてください"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "検証がタイムアウトしました"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "指紋の検証"
msgstr "指紋の検証に失敗しました"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "不明なエラーが発生しました"

View File

@ -9,20 +9,22 @@
# Shinjo Park <kde@peremen.name>, 2015
# Seong-ho Cho <darkcircle.0426@gmail.com>, 2011,2013
# Shinjo Park <kde@peremen.name>, 2015
# simmon <simmon@nplob.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-07-16 20:04+0000\n"
"Last-Translator: simmon <simmon@nplob.com>\n"
"Language-Team: Korean <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/ko/>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.7.1\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -279,13 +281,12 @@ msgstr "손가락을 뗀 다음 인식기에 다시 문질러 보십시오"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "인증 시간 초과"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "지문 검증"
msgstr "지문과 일치하지 않습니다"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "알 수 없는 오류가 발생했습니다"

130
po/mr.po
View File

@ -3,281 +3,287 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# girish joshi <girish946@gmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-08-29 17:04+0000\n"
"Last-Translator: girish joshi <girish946@gmail.com>\n"
"Language-Team: Marathi <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/mr/>\n"
"Language: mr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.8\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
msgstr ""
msgstr "फिंगरप्रिंट सत्यापित करा"
#: data/net.reactivated.fprint.device.policy.in:14
msgid "Privileges are required to verify fingerprints."
msgstr ""
msgstr "फिंगरप्रिंट सत्यापित करण्यासाठी विशेषाधिकार आवश्यक आहेत."
#: data/net.reactivated.fprint.device.policy.in:23
msgid "Enroll new fingerprints"
msgstr ""
msgstr "नवीन फिंगरप्रिंट्स नोंदवा"
#: data/net.reactivated.fprint.device.policy.in:24
msgid "Privileges are required to enroll new fingerprints."
msgstr ""
msgstr "फिंगरप्रिंट सत्यापित करण्यासाठी विशेषाधिकार आवश्यक आहेत."
#: data/net.reactivated.fprint.device.policy.in:33
msgid "Select a user to enroll"
msgstr ""
msgstr "नोंदणी करण्यासाठी वापरकर्ता निवडा"
#: data/net.reactivated.fprint.device.policy.in:34
msgid "Privileges are required to enroll new fingerprints for other users."
msgstr ""
"इतर वापरकर्त्यांसाठी नवीन फिंगरप्रिंट्स नोंदणी करण्यासाठी विशेषाधिकार आवश्यक "
"आहेत."
#: src/device.c:690
#, c-format
msgid "Device was not claimed before use"
msgstr ""
msgstr "डिव्हाइस वापरण्यापूर्वी दावा केला नाही"
#: src/device.c:699
#, c-format
msgid "Device already in use by another user"
msgstr ""
msgstr "डिव्हाइस आधीपासून दुसर्या वापरकर्त्याद्वारे वापरात आहे"
#: pam/fingerprint-strings.h:50
msgid "Place your finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपले बोट ठेवा"
#: pam/fingerprint-strings.h:51
#, c-format
msgid "Place your finger on %s"
msgstr ""
msgstr "%s वर आपले बोट ठेवा"
#: pam/fingerprint-strings.h:52
msgid "Swipe your finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपले बोट स्वाइप करा"
#: pam/fingerprint-strings.h:53
#, c-format
msgid "Swipe your finger across %s"
msgstr ""
msgstr "%s मध्ये आपले बोट स्वाइप करा"
#: pam/fingerprint-strings.h:55
msgid "Place your left thumb on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपला डावा अंगठा ठेवा"
#: pam/fingerprint-strings.h:56
#, c-format
msgid "Place your left thumb on %s"
msgstr ""
msgstr "%s वर आपला डावा अंगठा ठेवा"
#: pam/fingerprint-strings.h:57
msgid "Swipe your left thumb across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरमध्ये आपला डावा अंगठा स्वाइप करा"
#: pam/fingerprint-strings.h:58
#, c-format
msgid "Swipe your left thumb across %s"
msgstr ""
msgstr "%s मध्ये आपला डावा अंगठा स्वाइप करा"
#: pam/fingerprint-strings.h:60
msgid "Place your left index finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली डावी तर्जनी ठेवा"
#: pam/fingerprint-strings.h:61
#, c-format
msgid "Place your left index finger on %s"
msgstr ""
msgstr "%s वर आपली डावी तर्जनी ठेवा"
#: pam/fingerprint-strings.h:62
msgid "Swipe your left index finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली डावी तर्जनी स्वाइप करा"
#: pam/fingerprint-strings.h:63
#, c-format
msgid "Swipe your left index finger across %s"
msgstr ""
msgstr "%s मध्ये आपली डावी तर्जनी स्वाइप करा"
#: pam/fingerprint-strings.h:65
msgid "Place your left middle finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपले डाव्या हाताचे मध्यम बोट ठेवा"
#: pam/fingerprint-strings.h:66
#, c-format
msgid "Place your left middle finger on %s"
msgstr ""
msgstr "%s वर आपल्या डाव्या हाताचे मध्यम बोट ठेवा"
#: pam/fingerprint-strings.h:67
msgid "Swipe your left middle finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपल्या डाव्या हाताचे मध्यम बोट स्वाइप करा"
#: pam/fingerprint-strings.h:68
#, c-format
msgid "Swipe your left middle finger across %s"
msgstr ""
msgstr "%s मध्ये आपल्या डाव्या हाताचे मध्यम बोट स्वाइप करा"
#: pam/fingerprint-strings.h:70
msgid "Place your left ring finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली डावी अनामिका (रिंग फिंगर) ठेवा"
#: pam/fingerprint-strings.h:71
#, c-format
msgid "Place your left ring finger on %s"
msgstr ""
msgstr "%s वर आपली डावी अनामिका (रिंग फिंगर) ठेवा"
#: pam/fingerprint-strings.h:72
msgid "Swipe your left ring finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली डावी अनामिका (रिंग फिंगर) स्वाइप करा"
#: pam/fingerprint-strings.h:73
#, c-format
msgid "Swipe your left ring finger across %s"
msgstr ""
msgstr "%s मध्ये आपली डावी अनामिका (रिंग फिंगर) स्वाइप करा"
#: pam/fingerprint-strings.h:75
msgid "Place your left little finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली डावी करंगळी ठेवा"
#: pam/fingerprint-strings.h:76
#, c-format
msgid "Place your left little finger on %s"
msgstr ""
msgstr "%s वर आपली डावी करंगळी ठेवा"
#: pam/fingerprint-strings.h:77
msgid "Swipe your left little finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली डावी करंगळी स्वाइप करा"
#: pam/fingerprint-strings.h:78
#, c-format
msgid "Swipe your left little finger across %s"
msgstr ""
msgstr "%s मध्ये आपली डावी करंगळी स्वाइप करा"
#: pam/fingerprint-strings.h:80
msgid "Place your right thumb on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपला उजवा अंगठा ठेवा"
#: pam/fingerprint-strings.h:81
#, c-format
msgid "Place your right thumb on %s"
msgstr ""
msgstr "%s वर आपला उजवा अंगठा ठेवा"
#: pam/fingerprint-strings.h:82
msgid "Swipe your right thumb across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरमध्ये आपला उजवा अंगठा स्वाइप करा"
#: pam/fingerprint-strings.h:83
#, c-format
msgid "Swipe your right thumb across %s"
msgstr ""
msgstr "%s मध्ये आपला उजवा अंगठा स्वाइप करा"
#: pam/fingerprint-strings.h:85
msgid "Place your right index finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली उजवी तर्जनी ठेवा"
#: pam/fingerprint-strings.h:86
#, c-format
msgid "Place your right index finger on %s"
msgstr ""
msgstr "%s वर आपली उजवी तर्जनी ठेवा"
#: pam/fingerprint-strings.h:87
msgid "Swipe your right index finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली उजवी तर्जनी स्वाइप करा"
#: pam/fingerprint-strings.h:88
#, c-format
msgid "Swipe your right index finger across %s"
msgstr ""
msgstr "%s मध्ये आपली उजवी तर्जनी स्वाइप करा"
#: pam/fingerprint-strings.h:90
msgid "Place your right middle finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली उजवी तर्जनी ठेवा"
#: pam/fingerprint-strings.h:91
#, c-format
msgid "Place your right middle finger on %s"
msgstr ""
msgstr "%s वर आपल्या उजव्या हाताचे मधले बोट ठेवा"
#: pam/fingerprint-strings.h:92
msgid "Swipe your right middle finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपल्या उजव्या हाताचे मधले बोट स्वाइप करा"
#: pam/fingerprint-strings.h:93
#, c-format
msgid "Swipe your right middle finger across %s"
msgstr ""
msgstr "%s मध्ये आपल्या उजव्या हाताचे मधले स्वाइप करा"
#: pam/fingerprint-strings.h:95
msgid "Place your right ring finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपल्या उजव्या हाताची अनामिक (रिंग फिंगर) ठेवा"
#: pam/fingerprint-strings.h:96
#, c-format
msgid "Place your right ring finger on %s"
msgstr ""
msgstr "%s वर आपल्या उजव्या हाताची अनामिक (रिंग फिंगर) ठेवा"
#: pam/fingerprint-strings.h:97
msgid "Swipe your right ring finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपल्या उजव्या हाताची अनामिक (रिंग फिंगर) स्वाइप करा"
#: pam/fingerprint-strings.h:98
#, c-format
msgid "Swipe your right ring finger across %s"
msgstr ""
msgstr "%s मध्ये आपल्या उजव्या हाताची अनामिक (रिंग फिंगर) स्वाइप करा"
#: pam/fingerprint-strings.h:100
msgid "Place your right little finger on the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली उजवी करंगळी ठेवा"
#: pam/fingerprint-strings.h:101
#, c-format
msgid "Place your right little finger on %s"
msgstr ""
msgstr "%s वर आपली उजवी करंगळी ठेवा"
#: pam/fingerprint-strings.h:102
msgid "Swipe your right little finger across the fingerprint reader"
msgstr ""
msgstr "फिंगरप्रिंट रीडरवर आपली उजवी करंगळी स्वाइप करा"
#: pam/fingerprint-strings.h:103
#, c-format
msgid "Swipe your right little finger across %s"
msgstr ""
msgstr "%s मध्ये आपली उजवी करंगळी स्वाइप करा"
#: pam/fingerprint-strings.h:171 pam/fingerprint-strings.h:199
msgid "Place your finger on the reader again"
msgstr ""
msgstr "पुन्हा रीडर वर आपले बोट ठेवा"
#: pam/fingerprint-strings.h:173 pam/fingerprint-strings.h:201
msgid "Swipe your finger again"
msgstr ""
msgstr "पुन्हा आपले बोट स्वाइप करा"
#: pam/fingerprint-strings.h:176 pam/fingerprint-strings.h:204
msgid "Swipe was too short, try again"
msgstr ""
msgstr "स्वाइप खूप लहान होते, पुन्हा प्रयत्न करा"
#: pam/fingerprint-strings.h:178 pam/fingerprint-strings.h:206
msgid "Your finger was not centered, try swiping your finger again"
msgstr ""
"आपली बोट केंद्रीत नव्हती, पुन्हा आपल्या बोटाने स्वाइप करण्याचा प्रयत्न करा"
#: pam/fingerprint-strings.h:180 pam/fingerprint-strings.h:208
msgid "Remove your finger, and try swiping your finger again"
msgstr ""
"आपली बोट काढून टाका आणि पुन्हा आपल्या बोटाने स्वाइप करण्याचा प्रयत्न करा"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "सत्यापन कालबाह्य झाले"
#: pam/pam_fprintd.c:560
msgid "Failed to match fingerprint"
msgstr ""
msgstr "फिंगरप्रिंटशी जुळण्यासाठी अयशस्वी"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "एक अज्ञात त्रुटी आली"

View File

@ -3,16 +3,16 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Piotr Drąg <piotrdrag@gmail.com>, 2012,2016
# Piotr Drąg <piotrdrag@gmail.com>, 2012,2016, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
"PO-Revision-Date: 2021-07-24 11:08+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/freedesktop/fprintd/language/"
"pl/)\n"
"Language-Team: Polish <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -20,6 +20,7 @@ msgstr ""
"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"
"X-Generator: Weblate 4.7.2\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -278,13 +279,12 @@ msgstr ""
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Weryfikacja przekroczyła czas oczekiwania"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Weryfikowanie odcisków palców"
msgstr "Dopasowanie odcisku palca się nie powiodło"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Wystąpił nieznany błąd"

View File

@ -4,20 +4,22 @@
#
# Translators:
# Rafael Fontenelle <rffontenelle@gmail.com>, 2012
# Rafael Fontenelle <rafaelff@gnome.org>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-07-16 20:04+0000\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
"Language-Team: Portuguese (Brazil) <https://translate.fedoraproject.org/"
"projects/fprintd/fprintd/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.7.1\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -271,17 +273,16 @@ msgstr "Seu dedo não estava no centro, tente pressioná-lo novamente"
#: pam/fingerprint-strings.h:180 pam/fingerprint-strings.h:208
msgid "Remove your finger, and try swiping your finger again"
msgstr "Remova seu dedo e tente pressioná-lo novamente."
msgstr "Remova seu dedo e tente pressioná-lo novamente"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Verificação expirou"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Verificar uma impressão digital"
msgstr "Falha ao corresponder a impressão digital"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Ocorreu um erro desconhecido"

View File

@ -3,20 +3,22 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\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"
"PO-Revision-Date: 2021-07-16 20:04+0000\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/sv/>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.7.1\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -273,13 +275,12 @@ msgstr "Ta bort ditt finger och prova att dra ditt finger igen"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Tidsgräns för verifiering överskreds"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Verifiera fingeravtryck"
msgstr "Misslyckades med att matcha fingeravtryck"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Ett okänt fel inträffade"

View File

@ -5,20 +5,22 @@
# Translators:
# Caner Başaran <basaran.caner@gmail.com>, 2014
# Emin Tufan Çetin <etcetin@gmail.com>, 2020
# Oğuz Ersen <oguzersen@protonmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2020-02-29 10:08+0000\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Turkish (http://www.transifex.com/freedesktop/fprintd/"
"language/tr/)\n"
"PO-Revision-Date: 2021-07-16 20:04+0000\n"
"Last-Translator: Oğuz Ersen <oguzersen@protonmail.com>\n"
"Language-Team: Turkish <https://translate.fedoraproject.org/projects/fprintd/"
"fprintd/tr/>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Plural-Forms: nplurals=2; plural=(n>1);\n"
"X-Generator: Weblate 4.7.1\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -147,21 +149,21 @@ msgstr "Sol yüzük parmağınızı %s üzerinde kaydırın"
#: pam/fingerprint-strings.h:75
msgid "Place your left little finger on the fingerprint reader"
msgstr "Sol küçük parmağınızı parmak izi okuyucuya yerleştirin"
msgstr "Sol serçe parmağınızı parmak izi okuyucuya yerleştirin"
#: pam/fingerprint-strings.h:76
#, c-format
msgid "Place your left little finger on %s"
msgstr "Sol küçük parmağınızı %s üzerine yerleştirin"
msgstr "Sol serçe parmağınızı %s üzerine yerleştirin"
#: pam/fingerprint-strings.h:77
msgid "Swipe your left little finger across the fingerprint reader"
msgstr "Sol küçük parmağınızı parmak izi okuyucu üzerinde kaydırın"
msgstr "Sol serçe parmağınızı parmak izi okuyucu üzerinde kaydırın"
#: pam/fingerprint-strings.h:78
#, c-format
msgid "Swipe your left little finger across %s"
msgstr "Sol küçük parmağınızı %s üzerinde kaydırın"
msgstr "Sol serçe parmağınızı %s üzerinde kaydırın"
#: pam/fingerprint-strings.h:80
msgid "Place your right thumb on the fingerprint reader"
@ -237,21 +239,21 @@ msgstr "Sağ yüzük parmağınızı %s üzerinde kaydırın"
#: pam/fingerprint-strings.h:100
msgid "Place your right little finger on the fingerprint reader"
msgstr "Sağ küçük parmağınızı parmak izi okuyucuya yerleştirin"
msgstr "Sağ serçe parmağınızı parmak izi okuyucuya yerleştirin"
#: pam/fingerprint-strings.h:101
#, c-format
msgid "Place your right little finger on %s"
msgstr "Sağ küçük parmağınızı %s üzerine yerleştirin"
msgstr "Sağ serçe parmağınızı %s üzerine yerleştirin"
#: pam/fingerprint-strings.h:102
msgid "Swipe your right little finger across the fingerprint reader"
msgstr "Sağ küçük parmağınızı parmak izi okuyucu üzerinde kaydırın"
msgstr "Sağ serçe parmağınızı parmak izi okuyucu üzerinde kaydırın"
#: pam/fingerprint-strings.h:103
#, c-format
msgid "Swipe your right little finger across %s"
msgstr "Sağ küçük parmağınızı %s üzerinde kaydırın"
msgstr "Sağ serçe parmağınızı %s üzerinde kaydırın"
#: pam/fingerprint-strings.h:171 pam/fingerprint-strings.h:199
msgid "Place your finger on the reader again"
@ -275,13 +277,12 @@ msgstr "Parmağınızı kaldırın ve yeniden kaydırmayı deneyin"
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Doğrulama zaman aşımına uğradı"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Parmak izini doğrula"
msgstr "Parmak izi eşleştirilemedi"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Bilinmeyen bir hata oluştu"

View File

@ -4,24 +4,25 @@
#
# Translators:
# Richard Hughes <richard@hughsie.com>, 2011
# Yuri Chornoivan <yurchor@ukr.net>, 2009, 2010, 2011, 2012
# Yuri Chornoivan <yurchor@ukr.net>, 2009, 2010, 2011, 2012, 2021.
msgid ""
msgstr ""
"Project-Id-Version: fprintd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-30 14:00+0200\n"
"PO-Revision-Date: 2017-09-19 09:08+0000\n"
"PO-Revision-Date: 2021-07-16 20:04+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian (http://www.transifex.com/freedesktop/fprintd/"
"language/uk/)\n"
"Language-Team: Ukrainian <https://translate.fedoraproject.org/projects/"
"fprintd/fprintd/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != "
"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % "
"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || "
"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 "
"? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > "
"14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % "
"100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
"X-Generator: Weblate 4.7.1\n"
#: data/net.reactivated.fprint.device.policy.in:13
msgid "Verify a fingerprint"
@ -283,13 +284,12 @@ msgstr "Приберіть ваш палець і повторіть спроб
#: pam/pam_fprintd.c:537
msgid "Verification timed out"
msgstr ""
msgstr "Перевищено час перевірки"
#: pam/pam_fprintd.c:560
#, fuzzy
msgid "Failed to match fingerprint"
msgstr "Перевірити відбиток"
msgstr "Не вдалося встановити відповідність відбитка"
#: pam/pam_fprintd.c:576
msgid "An unknown error occurred"
msgstr ""
msgstr "Сталася невідома помилка"

View File

@ -101,6 +101,8 @@ typedef struct
FpDevice *dev;
SessionData *_session;
gboolean local_storage_checked;
guint verify_stop_wait_timeout_id;
PolkitAuthority *auth;
@ -127,7 +129,7 @@ G_DEFINE_TYPE_WITH_CODE (FprintDevice, fprint_device,
enum fprint_device_properties {
FPRINT_DEVICE_CONSTRUCT_DEV = 1,
FPRINT_DEVICE_IN_USE,
FPRINT_DEVICE_BUSY,
};
enum fprint_device_signals {
@ -168,7 +170,7 @@ session_data_get (FprintDevicePrivate *priv)
/* Get the current pointer and mark the pointer as "busy". */
do
{
cur = priv->_session;
cur = g_atomic_pointer_get (&priv->_session);
/* Swap if cur is valid, otherwise busy loop. */
}
while (cur == invalid || !g_atomic_pointer_compare_and_exchange (&priv->_session, cur, invalid));
@ -205,7 +207,7 @@ session_data_set_new (FprintDevicePrivate *priv, gchar *sender, gchar *username)
/* Get the current (but not if it is busy) and put the new one in place. */
do
{
old = priv->_session;
old = g_atomic_pointer_get (&priv->_session);
/* Swap if old is valid, otherwise busy loop as someone is ref'ing it currently. */
}
while (old == invalid || !g_atomic_pointer_compare_and_exchange (&priv->_session, old, new));
@ -293,8 +295,10 @@ fprint_device_get_property (GObject *object, guint property_id,
g_value_set_object (value, priv->dev);
break;
case FPRINT_DEVICE_IN_USE:
g_value_set_boolean (value, g_hash_table_size (priv->clients) != 0);
case FPRINT_DEVICE_BUSY:
g_value_set_boolean (value,
g_hash_table_size (priv->clients) != 0 ||
fp_device_get_temperature (priv->dev) > FP_TEMPERATURE_COLD);
break;
default:
@ -359,6 +363,14 @@ on_finger_status_changed (FprintDevice *rdev,
g_debug ("Finger needed %d", needed);
}
static void
on_temperature_changed (FprintDevice *rdev,
GParamSpec *spec,
FpDevice *device)
{
g_object_notify (G_OBJECT (rdev), "busy");
}
static void
fprint_device_constructed (GObject *object)
{
@ -383,6 +395,11 @@ fprint_device_constructed (GObject *object)
rdev, G_CONNECT_SWAPPED);
on_finger_status_changed (rdev, NULL, priv->dev);
g_signal_connect_object (priv->dev, "notify::temperature",
G_CALLBACK (on_temperature_changed),
rdev, G_CONNECT_SWAPPED);
on_temperature_changed (rdev, NULL, priv->dev);
G_OBJECT_CLASS (fprint_device_parent_class)->constructed (object);
}
@ -405,11 +422,11 @@ fprint_device_class_init (FprintDeviceClass *klass)
g_object_class_install_property (gobject_class,
FPRINT_DEVICE_CONSTRUCT_DEV, pspec);
pspec = g_param_spec_boolean ("in-use", "In use",
"Whether the device is currently in use", FALSE,
pspec = g_param_spec_boolean ("busy", "Busy",
"Whether the device is in use or too warm", FALSE,
G_PARAM_READABLE);
g_object_class_install_property (gobject_class,
FPRINT_DEVICE_IN_USE, pspec);
FPRINT_DEVICE_BUSY, pspec);
signals[SIGNAL_VERIFY_STATUS] =
g_signal_lookup ("verify-status", FPRINT_TYPE_DEVICE);
@ -460,6 +477,81 @@ _fprint_device_get_id (FprintDevice *rdev)
return priv->id;
}
static void
suspend_cb (GObject *source_obj,
GAsyncResult *res,
gpointer user_data)
{
g_autoptr(GTask) task = user_data;
GError *error = NULL;
fp_device_suspend_finish (FP_DEVICE (source_obj), res, &error);
if (error)
g_task_return_error (task, error);
else
g_task_return_boolean (task, TRUE);
}
static void
resume_cb (GObject *source_obj,
GAsyncResult *res,
gpointer user_data)
{
g_autoptr(GTask) task = user_data;
GError *error = NULL;
fp_device_resume_finish (FP_DEVICE (source_obj), res, &error);
if (error)
g_task_return_error (task, error);
else
g_task_return_boolean (task, TRUE);
}
void
fprint_device_suspend (FprintDevice *rdev,
GAsyncReadyCallback callback,
void *user_data)
{
GTask *task = NULL;
FprintDevicePrivate *priv = fprint_device_get_instance_private (rdev);
/* Just forward to libfprint. */
task = g_task_new (rdev, NULL, callback, user_data);
fp_device_suspend (priv->dev, NULL, suspend_cb, task);
}
void
fprint_device_resume (FprintDevice *rdev,
GAsyncReadyCallback callback,
void *user_data)
{
GTask *task = NULL;
FprintDevicePrivate *priv = fprint_device_get_instance_private (rdev);
/* Just forward to libfprint. */
task = g_task_new (rdev, NULL, callback, user_data);
fp_device_resume (priv->dev, NULL, resume_cb, task);
}
void
fprint_device_suspend_finish (FprintDevice *rdev,
GAsyncResult *res,
GError **error)
{
g_task_propagate_boolean (G_TASK (res), error);
}
void
fprint_device_resume_finish (FprintDevice *rdev,
GAsyncResult *res,
GError **error)
{
g_task_propagate_boolean (G_TASK (res), error);
}
static const char *
fp_finger_to_name (FpFinger finger)
{
@ -521,7 +613,8 @@ verify_result_to_name (gboolean match, GError *error)
*/
if (g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_PROTO))
return "verify-disconnected";
else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) ||
g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_NOT_FOUND))
return "verify-no-match";
return "verify-unknown-error";
@ -891,7 +984,7 @@ _fprint_device_client_vanished (GDBusConnection *connection,
g_hash_table_remove (priv->clients, name);
if (g_hash_table_size (priv->clients) == 0)
g_object_notify (G_OBJECT (rdev), "in-use");
g_object_notify (G_OBJECT (rdev), "busy");
}
static void
@ -911,7 +1004,7 @@ _fprint_device_add_client (FprintDevice *rdev, const char *sender)
rdev,
NULL);
g_hash_table_insert (priv->clients, g_strdup (sender), GUINT_TO_POINTER (id));
g_object_notify (G_OBJECT (rdev), "in-use");
g_object_notify (G_OBJECT (rdev), "busy");
}
}
@ -1081,6 +1174,14 @@ fprint_device_release (FprintDBusDevice *dbus_dev,
}
session = session_data_get (priv);
/* We iterated the mainloop, the session may have disappeared already. */
if (!session)
{
fprint_dbus_device_complete_release (FPRINT_DBUS_DEVICE (rdev), invocation);
return TRUE;
}
session->invocation = g_object_ref (invocation);
priv->current_action = ACTION_CLOSE;
@ -1124,6 +1225,7 @@ load_all_prints (FprintDevice *rdev)
{
g_autoptr(GPtrArray) res = g_ptr_array_new_with_free_func (g_object_unref);
GSList *user, *users = NULL;
guint i;
users = store.discover_users ();
@ -1132,7 +1234,9 @@ load_all_prints (FprintDevice *rdev)
const char *username = user->data;
g_autoptr(GPtrArray) prints = load_user_prints (rdev, username);
g_ptr_array_extend_and_steal (res, g_steal_pointer (&prints));
/* TODO: Use g_ptr_array_extend_and_steal with GLib >= 2.62 */
for (i = 0; i < prints->len; i++)
g_ptr_array_add (res, g_object_ref (g_ptr_array_index (prints, i)));
}
g_slist_free_full (users, g_free);
@ -1171,6 +1275,93 @@ report_verify_status (FprintDevice *rdev,
session->verify_status_reported = TRUE;
}
static void
check_local_storage (FprintDevice *rdev,
gboolean found_match,
GError *error)
{
g_autoptr(GError) err = NULL;
g_autoptr(GPtrArray) device_prints = NULL;
g_autoptr(GPtrArray) host_prints = NULL;
FprintDevicePrivate *priv = fprint_device_get_instance_private (rdev);
unsigned i;
g_return_if_fail (priv->current_action == ACTION_VERIFY ||
priv->current_action == ACTION_IDENTIFY);
/* This only ever sense if the device can list prints. */
if (!fp_device_has_feature (priv->dev, FP_DEVICE_FEATURE_STORAGE_LIST))
return;
/* We do not have any proper driver that correctly reports DATA_NOT_FOUND
* errors. Only synaptics, but there the feature is being disabled on the
* firmware side.
* As such, just always run a test the first time we get a match failure.
*/
if (g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_NOT_FOUND))
{
if (priv->local_storage_checked)
g_warning ("Device %s reported that a passed print did not exist during action %d, but we verified the local storage!",
fp_device_get_name (priv->dev), priv->current_action);
else
g_debug ("Device %s reported that a passed print did not exist during action %d",
fp_device_get_name (priv->dev), priv->current_action);
}
else if (error || priv->local_storage_checked)
{
return;
}
else if (!found_match)
{
g_debug ("Device %s failed to match during action %d, verifying local storage",
fp_device_get_name (priv->dev), priv->current_action);
}
else
{
return;
}
priv->local_storage_checked = TRUE;
device_prints = fp_device_list_prints_sync (priv->dev, NULL, &err);
if (!device_prints)
{
g_warning ("Failed to query prints: %s", err->message);
return;
}
host_prints = load_all_prints (rdev);
for (i = 0; i < host_prints->len; i++)
{
FpPrint *print = g_ptr_array_index (host_prints, i);
int r;
if (g_ptr_array_find_with_equal_func (device_prints,
print,
(GEqualFunc) fp_print_equal,
NULL))
continue;
/* Print not known by device, remove locally */
if ((r = store.print_data_delete (priv->dev,
fp_print_get_finger (print),
fp_print_get_username (print))) == 0)
{
g_message ("Deleted stored finger %d for user %s as it is unknown to device.",
fp_print_get_finger (print),
fp_print_get_username (print));
}
else
{
g_warning ("Error deleting finger %d for user %s that is unknown to device: %d!",
fp_print_get_finger (print),
fp_print_get_username (print),
r);
}
}
}
static gboolean
can_start_action (FprintDevice *rdev, GError **error)
{
@ -1345,8 +1536,6 @@ match_cb (FpDevice *device,
cancelled = g_cancellable_is_cancelled (priv->current_cancellable);
matched = match != NULL && cancelled == FALSE;
/* No-match is reported only after the operation completes.
* This avoids problems when the operation is immediately restarted. */
report_verify_status (rdev, matched, error);
}
@ -1389,6 +1578,8 @@ verify_cb (FpDevice *dev, GAsyncResult *res, void *user_data)
error->message);
}
check_local_storage (rdev, match, error);
stoppable_action_completed (rdev);
}
}
@ -1432,6 +1623,8 @@ identify_cb (FpDevice *dev, GAsyncResult *res, void *user_data)
error->message);
}
check_local_storage (rdev, match != NULL, error);
stoppable_action_completed (rdev);
}
}
@ -1474,7 +1667,15 @@ fprint_device_verify_start (FprintDBusDevice *dbus_dev,
g_dbus_method_invocation_return_gerror (invocation, error);
return TRUE;
}
if (fp_device_has_feature (priv->dev, FP_DEVICE_FEATURE_IDENTIFY))
else if (gallery->len == 1)
{
FpPrint *fprint = g_ptr_array_index (gallery, 0);
/* If we only have a single finger, then do verify on that.
* This also means we report it back correctly to the user. */
finger = fp_print_get_finger (fprint);
}
else if (fp_device_has_feature (priv->dev, FP_DEVICE_FEATURE_IDENTIFY))
{
guint i;
@ -1506,7 +1707,9 @@ fprint_device_verify_start (FprintDBusDevice *dbus_dev,
if (gallery)
{
print = g_ptr_array_steal_index_fast (gallery, 0);
/* TODO: Use g_ptr_array_remove_index_fast with GLib >= 2.58 */
print = g_object_ref (g_ptr_array_index (gallery, 0));
g_ptr_array_remove_index_fast (gallery, 0);
finger = fp_print_get_finger (print);
}
else
@ -1931,7 +2134,8 @@ enroll_identify_cb (FpDevice *dev, GAsyncResult *res, void *user_data)
priv->current_cancellable,
&error))
{
g_warning ("Failed to garbage collect duplicate print, cannot continue with enroll.");
g_warning ("Failed to garbage collect duplicate print, cannot continue with enroll: %s",
error->message);
g_signal_emit (rdev, signals[SIGNAL_ENROLL_STATUS], 0, "enroll-duplicate", TRUE);
stoppable_action_completed (rdev);

View File

@ -220,6 +220,14 @@ file_storage_print_data_load (FpDevice *dev,
if (r)
return r;
/* Make sure the username/finger matches our expectations. */
if (fp_print_get_finger (new) != finger)
return -EINVAL;
if (g_strcmp0 (fp_print_get_username (new), username) != 0)
return -EINVAL;
/* And that the print is compatible with the device. */
if (!fp_print_compatible (new, dev))
return -EINVAL;

View File

@ -95,6 +95,22 @@ struct _FprintDevice
FprintDevice *fprint_device_new (FpDevice *dev);
guint32 _fprint_device_get_id (FprintDevice *rdev);
void fprint_device_suspend (FprintDevice *rdev,
GAsyncReadyCallback callback,
void *user_data);
void fprint_device_resume (FprintDevice *rdev,
GAsyncReadyCallback callback,
void *user_data);
void fprint_device_suspend_finish (FprintDevice *rdev,
GAsyncResult *result,
GError **error);
void fprint_device_resume_finish (FprintDevice *rdev,
GAsyncResult *res,
GError **error);
/* Print */
/* TODO */

View File

@ -24,9 +24,14 @@
#include <glib/gi18n.h>
#include <fprint.h>
#include <glib-object.h>
#include <gio/gunixfdlist.h>
#include "fprintd.h"
#define LOGIND_BUS_NAME "org.freedesktop.login1"
#define LOGIND_IFACE_NAME "org.freedesktop.login1.Manager"
#define LOGIND_OBJ_PATH "/org/freedesktop/login1"
static void fprint_manager_constructed (GObject *object);
static gboolean fprint_manager_get_devices (FprintManager *manager,
GPtrArray **devices,
@ -43,6 +48,9 @@ typedef struct
FpContext *context;
gboolean no_timeout;
guint timeout_id;
gint prepare_for_sleep_pending;
guint prepare_for_sleep_id;
gint sleep_inhibit_fd;
} FprintManagerPrivate;
G_DEFINE_TYPE_WITH_CODE (FprintManager, fprint_manager, G_TYPE_OBJECT, G_ADD_PRIVATE (FprintManager))
@ -60,6 +68,10 @@ fprint_manager_finalize (GObject *object)
{
FprintManagerPrivate *priv = fprint_manager_get_instance_private (FPRINT_MANAGER (object));
if (priv->prepare_for_sleep_id)
g_dbus_connection_signal_unsubscribe (priv->connection,
priv->prepare_for_sleep_id);
g_clear_object (&priv->object_manager);
g_clear_object (&priv->dbus_manager);
g_clear_object (&priv->connection);
@ -152,14 +164,14 @@ fprint_manager_timeout_cb (FprintManager *manager)
}
static void
fprint_manager_in_use_notified (FprintDevice *rdev, GParamSpec *spec, FprintManager *manager)
fprint_manager_busy_notified (FprintDevice *rdev, GParamSpec *spec, FprintManager *manager)
{
FprintManagerPrivate *priv = fprint_manager_get_instance_private (manager);
guint num_devices_used = 0;
guint num_devices_busy = 0;
g_autolist (GDBusObject) devices = NULL;
GList *l;
gboolean in_use;
gboolean busy;
if (priv->timeout_id > 0)
{
@ -177,12 +189,12 @@ fprint_manager_in_use_notified (FprintDevice *rdev, GParamSpec *spec, FprintMana
FprintDBusObjectSkeleton *object = l->data;
dev = fprint_dbus_object_skeleton_get_device (object);
g_object_get (G_OBJECT (dev), "in-use", &in_use, NULL);
if (in_use != FALSE)
num_devices_used++;
g_object_get (G_OBJECT (dev), "busy", &busy, NULL);
if (busy != FALSE)
num_devices_busy++;
}
if (num_devices_used == 0)
if (num_devices_busy == 0)
priv->timeout_id = g_timeout_add_seconds (TIMEOUT, (GSourceFunc) fprint_manager_timeout_cb, manager);
}
@ -227,6 +239,153 @@ handle_get_default_device (FprintManager *manager,
return TRUE;
}
static void
fprint_device_suspend_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
g_autoptr(GError) error = NULL;
FprintManager *manager = FPRINT_MANAGER (user_data);
FprintManagerPrivate *priv = fprint_manager_get_instance_private (manager);
/* Fetch the result (except for the NULL dummy call). */
if (source_object != NULL)
{
fprint_device_suspend_finish (FPRINT_DEVICE (source_object), res, &error);
if (error)
{
if (!g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_NOT_OPEN) &&
!g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_NOT_SUPPORTED))
g_message ("Unexpected error while suspending device: %s", error->message);
}
}
priv->prepare_for_sleep_pending -= 1;
/* Close FD when all devices are prepared for sleeping. */
if (priv->prepare_for_sleep_pending == 0)
{
if (priv->sleep_inhibit_fd >= 0)
close (priv->sleep_inhibit_fd);
priv->sleep_inhibit_fd = -1;
g_debug ("Released delay inhibitor for sleep.");
}
g_object_unref (manager);
}
static void
logind_sleep_inhibit_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
g_autoptr(GVariant) data = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(GUnixFDList) out_fd_list = NULL;
g_autoptr(FprintManager) manager = FPRINT_MANAGER (user_data);
FprintManagerPrivate *priv = fprint_manager_get_instance_private (manager);
gint fd_offset;
data = g_dbus_connection_call_with_unix_fd_list_finish (priv->connection, &out_fd_list, res, &error);
if (!data)
{
g_warning ("Failed to install a sleep delay inhibitor: %s", error->message);
return;
}
if (priv->sleep_inhibit_fd >= 0)
close (priv->sleep_inhibit_fd);
g_debug ("Got delay inhibitor for sleep.");
g_variant_get (data, "(h)", &fd_offset);
priv->sleep_inhibit_fd = g_unix_fd_list_get (out_fd_list, fd_offset, NULL);
}
static void
handle_prepare_for_sleep_signal (GDBusConnection *connection,
const gchar *sender_name,
const gchar *object_path,
const gchar *interface_name,
const gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
g_autolist (GDBusObject) devices = NULL;
FprintManager *manager = FPRINT_MANAGER (user_data);
FprintManagerPrivate *priv = fprint_manager_get_instance_private (manager);
gboolean prepare_for_sleep;
GList *l;
if (!g_variant_check_format_string (parameters, "(b)", FALSE))
{
g_warning ("Received incorrect parameter for PrepareForSleep signal");
return;
}
g_variant_get (parameters, "(b)", &prepare_for_sleep);
/* called one more time to handle the case of no devices */
if (prepare_for_sleep)
priv->prepare_for_sleep_pending = 1;
devices = g_dbus_object_manager_get_objects (priv->object_manager);
g_debug ("Preparing devices for %s", prepare_for_sleep ? "sleep" : "resume");
for (l = devices; l != NULL; l = l->next)
{
g_autoptr(FprintDevice) dev = NULL;
FprintDBusObjectSkeleton *object = l->data;
dev = fprint_dbus_object_skeleton_get_device (object);
if (prepare_for_sleep)
{
priv->prepare_for_sleep_pending += 1;
g_object_ref (manager);
fprint_device_suspend (dev, fprint_device_suspend_cb, manager);
}
else
{
fprint_device_resume (dev, NULL, NULL);
}
}
if (prepare_for_sleep)
{
/* "Notify" the initial dummy device we added, handling no devices that suspending */
g_object_ref (manager);
fprint_device_suspend_cb (NULL, NULL, manager);
}
else
{
GVariant *arg = NULL;
arg = g_variant_new ("(ssss)",
"sleep",
"net.reactivated.Fprint",
"Suspend fingerprint readers",
"delay");
/* Grab a sleep inhibitor. */
g_dbus_connection_call_with_unix_fd_list (priv->connection,
LOGIND_BUS_NAME,
LOGIND_OBJ_PATH,
LOGIND_IFACE_NAME,
"Inhibit",
arg,
G_VARIANT_TYPE ("(h)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
NULL,
logind_sleep_inhibit_cb,
g_object_ref (manager));
}
}
static void
device_added_cb (FprintManager *manager, FpDevice *device, FpContext *context)
{
@ -238,8 +397,8 @@ device_added_cb (FprintManager *manager, FpDevice *device, FpContext *context)
rdev = fprint_device_new (device);
g_signal_connect (G_OBJECT (rdev), "notify::in-use",
G_CALLBACK (fprint_manager_in_use_notified), manager);
g_signal_connect (G_OBJECT (rdev), "notify::busy",
G_CALLBACK (fprint_manager_busy_notified), manager);
path = get_device_path (rdev);
@ -282,14 +441,15 @@ device_removed_cb (FprintManager *manager, FpDevice *device, FpContext *context)
break;
}
/* The device that disappeared might have been in-use.
/* The device that disappeared might have been busy.
* Do we need to do anything else in this case to clean up more gracefully? */
fprint_manager_in_use_notified (NULL, NULL, manager);
fprint_manager_busy_notified (NULL, NULL, manager);
}
static void
fprint_manager_constructed (GObject *object)
{
g_autoptr(GVariant) param_false = NULL;
FprintManager *manager = FPRINT_MANAGER (object);
FprintManagerPrivate *priv = fprint_manager_get_instance_private (manager);
GDBusObjectManagerServer *object_manager_server;
@ -319,6 +479,20 @@ fprint_manager_constructed (GObject *object)
g_dbus_object_manager_server_set_connection (object_manager_server,
priv->connection);
priv->prepare_for_sleep_id = g_dbus_connection_signal_subscribe (priv->connection,
LOGIND_BUS_NAME,
LOGIND_IFACE_NAME,
"PrepareForSleep",
LOGIND_OBJ_PATH,
NULL,
G_DBUS_SIGNAL_FLAGS_NONE,
handle_prepare_for_sleep_signal,
manager,
NULL);
/* Fake a resume as that triggers the inhibitor to be taken. */
param_false = g_variant_new ("(b)", FALSE);
handle_prepare_for_sleep_signal (priv->connection, NULL, NULL, NULL, NULL, param_false, manager);
/* And register the signals for initial enumeration and hotplug. */
g_signal_connect_object (priv->context,
"device-added",

View File

@ -38,6 +38,7 @@ gi.require_version('FPrint', '2.0')
from gi.repository import GLib, Gio, FPrint
from output_checker import OutputChecker
import cairo
import signal
try:
from subprocess import DEVNULL
@ -120,6 +121,8 @@ class Connection:
self.con.close()
del self.con
# Speed up tests by only loading a 128x128px area from the center
MAX_IMG_SIZE = 128
def load_image(img):
png = cairo.ImageSurface.create_from_png(img)
@ -128,7 +131,13 @@ def load_image(img):
h = png.get_height()
w = (w + 3) // 4 * 4
h = (h + 3) // 4 * 4
img = cairo.ImageSurface(cairo.Format.A8, w, h)
w_out = min(MAX_IMG_SIZE, w)
h_out = min(MAX_IMG_SIZE, h)
x = (w - w_out) // 2
y = (h - h_out) // 2
img = cairo.ImageSurface(cairo.Format.A8, w_out, h_out)
cr = cairo.Context(img)
cr.set_source_rgba(1, 1, 1, 1)
@ -137,7 +146,7 @@ def load_image(img):
cr.set_source_rgba(0, 0, 0, 0)
cr.set_operator(cairo.OPERATOR_SOURCE)
cr.set_source_surface(png)
cr.set_source_surface(png, -x, -y)
cr.paint()
return img
@ -164,6 +173,11 @@ class FPrintdTest(dbusmock.DBusTestCase):
@classmethod
def setUpClass(cls):
# Try to generate backtrace if meson kills as with SIGTERM
def r(*args):
raise KeyboardInterrupt()
signal.signal(signal.SIGTERM, r)
super().setUpClass()
fprintd = None
cls._polkitd = None
@ -187,6 +201,7 @@ class FPrintdTest(dbusmock.DBusTestCase):
cls.tmpdir = tempfile.mkdtemp(prefix='libfprint-')
cls.addClassCleanup(shutil.rmtree, cls.tmpdir)
cls.sockaddr = os.path.join(cls.tmpdir, 'virtual-image.socket')
os.environ[cls.socket_env] = cls.sockaddr
@ -196,26 +211,18 @@ class FPrintdTest(dbusmock.DBusTestCase):
n = os.path.basename(f)[:-4]
cls.prints[n] = load_image(f)
cls.test_bus = Gio.TestDBus.new(Gio.TestDBusFlags.NONE)
cls.test_bus.up()
cls.test_bus.unset()
addr = cls.test_bus.get_bus_address()
os.environ['DBUS_SYSTEM_BUS_ADDRESS'] = addr
cls.dbus = Gio.DBusConnection.new_for_address_sync(addr,
cls.start_system_bus()
cls.dbus = Gio.DBusConnection.new_for_address_sync(os.environ['DBUS_SYSTEM_BUS_ADDRESS'],
Gio.DBusConnectionFlags.MESSAGE_BUS_CONNECTION |
Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT, None, None)
assert cls.dbus.is_closed() == False
cls.addClassCleanup(cls.dbus.close)
@classmethod
def tearDownClass(cls):
cls.dbus.close()
cls.test_bus.down()
del cls.dbus
del cls.test_bus
shutil.rmtree(cls.tmpdir)
dbusmock.DBusTestCase.tearDownClass()
del cls.dbus
def daemon_start(self, driver='Virtual image device for debugging'):
timeout = get_timeout('daemon_start') # seconds
@ -223,6 +230,8 @@ class FPrintdTest(dbusmock.DBusTestCase):
env['G_DEBUG'] = 'fatal-criticals'
env['STATE_DIRECTORY'] = (self.state_dir + ':' + '/hopefully/a/state_dir_path/that/shouldnt/be/writable')
env['RUNTIME_DIRECTORY'] = self.run_dir
# The tests parses the debug output for suspend inhibitor debugging
env['G_MESSAGES_DEBUG'] = 'all'
argv = [self.paths['daemon'], '-t']
valgrind = os.getenv('VALGRIND')
@ -233,10 +242,16 @@ class FPrintdTest(dbusmock.DBusTestCase):
argv.insert(2, '--suppressions=%s' % valgrind)
self.valgrind = True
self.kill_daemon = False
self.daemon_log = OutputChecker()
self.addCleanup(self.daemon_log.force_close)
self.daemon = subprocess.Popen(argv,
env=env,
stdout=None,
stdout=self.daemon_log.fd,
stderr=subprocess.STDOUT)
self.daemon_log.writer_attached()
#subprocess.Popen(['/usr/bin/dbus-monitor', '--system'])
self.addCleanup(self.daemon_stop)
timeout_count = timeout * 10
@ -296,6 +311,8 @@ class FPrintdTest(dbusmock.DBusTestCase):
else:
raise(e)
self.daemon_log.assert_closed()
if not self.kill_daemon:
self.assertLess(self.daemon.returncode, 128)
self.assertGreaterEqual(self.daemon.returncode, 0)
@ -314,14 +331,23 @@ class FPrintdTest(dbusmock.DBusTestCase):
self._polkitd, self._polkitd_obj = self.spawn_server_template(
polkitd_template, {}, stdout=subprocess.PIPE)
self.addCleanup(self.stop_server, '_polkitd', '_polkitd_obj')
return self._polkitd
def polkitd_stop(self):
if self._polkitd is None:
def stop_server(self, proc_attr, obj_attr):
proc = getattr(self, proc_attr, None)
if proc is None:
return
self._polkitd.terminate()
self._polkitd.wait()
proc.terminate()
try:
proc.wait(timeout=1)
except subprocess.TimeoutExpired as e:
proc.kill()
delattr(self, proc_attr)
delattr(self, obj_attr)
def polkitd_allow_all(self):
self._polkitd_obj.SetAllowed([FprintDevicePermission.set_username,
@ -340,6 +366,10 @@ class FPrintdTest(dbusmock.DBusTestCase):
self._async_call_res = {}
os.environ['FP_DRIVERS_WHITELIST'] = self.device_driver
# Always start fake polkitd because of
# https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/95
self.polkitd_start()
def assertFprintError(self, fprint_error):
if isinstance(fprint_error, list) or isinstance(fprint_error, tuple):
fprint_error = [ re.escape(e) for e in fprint_error ]
@ -576,9 +606,25 @@ class FPrintdVirtualDeviceBaseTest(FPrintdVirtualImageDeviceBaseTests):
self.manager = None
self.device = None
self.polkitd_start()
fifo_path = os.path.join(self.tmpdir, 'logind_inhibit_fifo')
os.mkfifo(fifo_path)
self.addCleanup(os.unlink, fifo_path)
self.logind_inhibit_fifo = os.open(fifo_path, os.O_RDONLY | os.O_NONBLOCK | os.O_CLOEXEC)
self.addCleanup(os.close, self.logind_inhibit_fifo)
# EOF without a writer, BlockingIOError with a writer
self.assertFalse(self.holds_inhibitor())
self.logind, self.logind_obj = self.spawn_server_template('logind', { })
self.logind_obj.AddMethod('org.freedesktop.login1.Manager', 'Inhibit', 'ssss', 'h',
'ret = os.open("%s", os.O_WRONLY)\n' % fifo_path +
'from gi.repository import GLib\n' +
'GLib.idle_add(lambda fd: os.close(fd), ret)')
self.addCleanup(self.stop_server, 'logind', 'logind_obj')
self.daemon_start(self.driver_name)
self.wait_got_delay_inhibitor(timeout=5)
if self.device is None:
self.skipTest("Need {} device to run the test".format(self.device_driver))
@ -623,7 +669,6 @@ class FPrintdVirtualDeviceBaseTest(FPrintdVirtualImageDeviceBaseTests):
self._changed_properties = []
def tearDown(self):
self.polkitd_stop()
self.device = None
self.manager = None
@ -658,6 +703,23 @@ class FPrintdVirtualDeviceBaseTest(FPrintdVirtualImageDeviceBaseTests):
if expected is not None:
self.assertEqual(self._last_result, expected)
def holds_inhibitor(self):
try:
if os.read(self.logind_inhibit_fifo, 1) == b'':
return False
except BlockingIOError:
return True
raise AssertionError("logind inhibitor fifo in unexpected state")
def wait_got_delay_inhibitor(self, timeout=0):
self.daemon_log.check_line('Got delay inhibitor for sleep', timeout=timeout)
self.assertTrue(self.holds_inhibitor())
def wait_released_delay_inhibitor(self, timeout=0):
self.daemon_log.check_line('Released delay inhibitor for sleep', timeout=timeout)
self.assertFalse(self.holds_inhibitor())
def enroll_image(self, img, device=None, finger='right-index-finger',
expected_result='enroll-completed', claim_user=None,
start=True, stop=True):
@ -1032,6 +1094,51 @@ class FPrintdVirtualStorageDeviceTests(FPrintdVirtualStorageDeviceBaseTest):
prints = self.get_stored_prints()
self.assertEqual(set(prints), set(garbage_prints))
def test_local_storage_cleanup_data_error(self):
# Enroll a print and delete it
self.enroll_print('deleted-print', finger='left-thumb')
self.send_command('REMOVE', 'deleted-print')
# Note: would be thrown anyway by the storage device if we scan something
self.send_error(FPrint.DeviceError.DATA_NOT_FOUND)
self.device.VerifyStart('(s)', 'any')
self.wait_for_result('verify-no-match')
self.device.VerifyStop()
# At this point, there is no print left
with self.assertFprintError('NoEnrolledPrints'):
self.device.ListEnrolledFingers('(s)', 'testuser')
def test_local_storage_cleanup_no_match(self):
# Enroll a print and delete it
self.enroll_print('existing-print', finger='right-index-finger')
self.enroll_print('deleted-print', finger='left-thumb')
self.send_command('REMOVE', 'deleted-print')
# We need to send a print that is known to the device
self.send_image('other-print')
self.device.VerifyStart('(s)', 'right-index-finger')
self.wait_for_result('verify-no-match')
self.device.VerifyStop()
# At this point, the deleted print has disappeared
self.assertEqual(set(self.device.ListEnrolledFingers('(s)', 'testuser')), {'right-index-finger'})
# Now, do the same thing, and the print will not be deleted
self.enroll_print('deleted-print', finger='left-thumb')
self.send_command('REMOVE', 'deleted-print')
self.send_image('other-print')
self.device.VerifyStart('(s)', 'right-index-finger')
self.wait_for_result('verify-no-match')
self.device.VerifyStop()
# At this point, the deleted print is still there
self.assertEqual(set(self.device.ListEnrolledFingers('(s)', 'testuser')), {'right-index-finger', 'left-thumb'})
def test_enroll_with_one_stage_only(self):
self._maybe_reduce_enroll_stages(stages=1)
@ -1524,6 +1631,72 @@ class FPrintdVirtualDeviceTest(FPrintdVirtualDeviceBaseTest):
self.assertIn(GLib.Variant('()', ()), self.get_all_async_replies())
def test_suspend_inhibit_unclaimed(self):
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [True])
self.daemon_log.check_line('Preparing devices for sleep', timeout=1)
self.wait_released_delay_inhibitor(timeout=1)
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [False])
self.daemon_log.check_line('Preparing devices for resume', timeout=1)
self.wait_got_delay_inhibitor(timeout=1)
def test_suspend_inhibit_claimed(self):
self.device.Claim('(s)', 'testuser')
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [True])
self.daemon_log.check_line('Preparing devices for sleep', timeout=1)
self.wait_released_delay_inhibitor(timeout=1)
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [False])
self.daemon_log.check_line('Preparing devices for resume', timeout=1)
self.wait_got_delay_inhibitor(timeout=1)
self.device.Release()
def test_suspend_inhibit_cancels_enroll(self):
self.device.Claim('(s)', 'testuser')
self.device.EnrollStart('(s)', 'right-thumb')
# Now prepare for sleep, which will trigger an internal cancellation
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [True])
self.daemon_log.check_line('Preparing devices for sleep', timeout=1)
self.wait_for_result(expected='enroll-unknown-error')
self.wait_released_delay_inhibitor(timeout=1)
self.assertEqual(os.read(self.logind_inhibit_fifo, 1), b'')
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [False])
self.daemon_log.check_line('Preparing devices for resume', timeout=1)
self.wait_got_delay_inhibitor(timeout=1)
self.device.Release()
def test_suspend_prevents_enroll(self):
self.device.Claim('(s)', 'testuser')
# Now prepare for sleep, which will trigger an internal cancellation
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [True])
self.daemon_log.check_line('Preparing devices for sleep', timeout=1)
self.wait_released_delay_inhibitor(timeout=1)
self.device.EnrollStart('(s)', 'right-thumb')
self.wait_for_result(expected='enroll-unknown-error')
self.logind_obj.EmitSignal("", "PrepareForSleep", "b", [False])
self.daemon_log.check_line('Preparing devices for resume', timeout=1)
self.wait_got_delay_inhibitor(timeout=1)
self.device.Release()
class FPrintdVirtualDeviceStorageTest(FPrintdVirtualStorageDeviceBaseTest,
FPrintdVirtualDeviceTest):
@ -1839,14 +2012,14 @@ class FPrintdVirtualDeviceClaimedTest(FPrintdVirtualDeviceBaseTest):
self.wait_for_result()
self.assertTrue(self._verify_stopped)
self.assertEqual(self._last_result, 'verify-match')
self.assertEqual(self._selected_finger, 'any')
self.assertEqual(self._selected_finger, 'left-thumb')
self.device.VerifyStop()
def test_verify_wrong_finger_no_match(self):
self.enroll_image('whorl', finger='right-thumb')
self.device.VerifyStart('(s)', 'right-toe')
self.send_image('tented_arch')
self.assertVerifyNoMatch(selected_finger='any')
self.assertVerifyNoMatch(selected_finger='right-thumb')
self.device.VerifyStop()
def test_verify_any_finger_match(self):
@ -1882,9 +2055,9 @@ class FPrintdVirtualDeviceClaimedTest(FPrintdVirtualDeviceBaseTest):
self.device.VerifyStart('(s)', 'any')
self.send_image(print)
if should_match:
self.assertVerifyMatch(selected_finger='any')
self.assertVerifyMatch()
else:
self.assertVerifyNoMatch(selected_finger='any')
self.assertVerifyNoMatch()
self.device.VerifyStop()
self.device.Release()
@ -2580,7 +2753,7 @@ class FPrintdVirtualDeviceVerificationTests(FPrintdVirtualDeviceBaseTest):
self.assertVerifyError(FPrint.DeviceError.DATA_INVALID, 'verify-unknown-error')
def test_verify_error_data_not_found(self):
self.assertVerifyError(FPrint.DeviceError.DATA_NOT_FOUND, 'verify-unknown-error')
self.assertVerifyError(FPrint.DeviceError.DATA_NOT_FOUND, 'verify-no-match')
def test_verify_error_data_full(self):
self.assertVerifyError(FPrint.DeviceError.DATA_FULL, 'verify-unknown-error')
@ -2665,15 +2838,6 @@ class FPrintdVirtualDeviceVerificationTests(FPrintdVirtualDeviceBaseTest):
self.assertIsNone(self._last_result)
self.assertFalse(self.finger_present)
def test_verify_stop_restarts_immediately(self):
self.send_image('tented_arch')
self.assertVerifyNoMatch()
self.call_device_method_async('VerifyStop', '()', [])
self.call_device_method_async('VerifyStart', '(s)', [self.verify_finger])
self.wait_for_device_reply(expected_replies=2)
def test_verify_stop_waits_for_completion(self):
self.stop_on_teardown = False
@ -2930,7 +3094,7 @@ class FPrindConcurrentPolkitRequestsTest(FPrintdVirtualStorageDeviceBaseTest):
self.device.Claim('(s)', '')
self.device.VerifyStart('(s)', 'any')
self.send_image('whorl')
self.assertVerifyMatch(selected_finger='any')
self.assertVerifyMatch(selected_finger='left-thumb')
self.device.VerifyStop()
self.device.Release()

View File

@ -43,25 +43,34 @@ class OutputChecker(object):
fcntl.fcntl(self._pipe_fd_w, fcntl.F_GETFL) | os.O_CLOEXEC)
# Start copier thread
self._thread = threading.Thread(target=self._copy)
self._thread = threading.Thread(target=self._copy, daemon=True)
self._thread.start()
def _copy(self):
p = select.poll()
p.register(self._pipe_fd_r)
while True:
try:
# Be lazy and wake up occasionally in case _pipe_fd_r became invalid
# The reason to do this is because os.read() will *not* return if the
# FD is forcefully closed.
select.select([self._pipe_fd_r], [], [], 0.1)
p.poll(0.1)
r = os.read(self._pipe_fd_r, 1024)
if not r:
os.close(self._pipe_fd_r)
self._pipe_fd_r = -1
self._lines_sem.release()
return
except OSError as e:
if e.errno == errno.EWOULDBLOCK:
continue
# We get a bad file descriptor error when the outside closes the FD
if self._pipe_fd_r >= 0:
os.close(self._pipe_fd_r)
self._pipe_fd_r = -1
self._lines_sem.release()
return
l = r.split(b'\n')
@ -86,6 +95,13 @@ class OutputChecker(object):
try:
l = self._lines.pop(0)
except IndexError:
# EOF, throw error
if self._pipe_fd_r == -1:
if failmsg:
raise AssertionError("No further messages: " % failmsg)
else:
raise AssertionError('No client waiting for needle %s' % (str(needle_re)))
# Check if should wake up
if not self._lines_sem.acquire(timeout = deadline - time.time()):
if failmsg:
@ -119,6 +135,10 @@ class OutputChecker(object):
try:
l = self._lines.pop(0)
except IndexError:
# EOF, so everything good
if self._pipe_fd_r == -1:
break
# Check if should wake up
if not self._lines_sem.acquire(timeout = deadline - time.time()):
# Timed out, so everything is good
@ -130,7 +150,7 @@ class OutputChecker(object):
if failmsg:
raise AssertionError(failmsg)
else:
raise AssertionError('Found needle %s but shouldn\'t have been there (timeout: %0.2f)' % (str(needle_re), timeout))
raise AssertionError('Found needle %s but shouldn\'t have been there (timeout: %0.2f)' % (str(needle_re), wait))
return ret
@ -157,6 +177,7 @@ class OutputChecker(object):
fd = self._pipe_fd_r
self._pipe_fd_r = -1
if fd >= 0:
os.close(fd)
self._thread.join()
@ -170,9 +191,9 @@ class OutputChecker(object):
self._pipe_fd_w = -1
def __del__(self):
if self._pipe_fd_r > 0:
if self._pipe_fd_r >= 0:
os.close(self._pipe_fd_r)
if self._pipe_fd_w > 0:
self._pipe_fd_r = -1
if self._pipe_fd_w >= 0:
os.close(self._pipe_fd_w)
assert not self._thread.is_alive()
self._pipe_fd_w = -1

View File

@ -143,6 +143,12 @@ class TestPamFprintd(dbusmock.DBusTestCase):
self.assertRegex(res.info[0], r'Swipe your left little finger across the fingerprint reader')
self.assertEqual(len(res.errors), 0)
# Check that we can stop verification and release the device. i.e.
# this has not been done by PAM already (the real fprintd would notice
# the disconnect, the mock service does not).
self.device_mock.VerifyStop()
self.device_mock.Release()
def test_pam_fprintd_no_fingers(self):
self.setup_device()
self.device_mock.SetEnrolledFingers('toto', dbus.Array(set([]), signature='s'))
@ -199,6 +205,13 @@ class TestPamFprintd(dbusmock.DBusTestCase):
self.assertRegex(res.errors[0], r'Failed to match fingerprint')
self.assertRegex(res.errors[0], r'Failed to match fingerprint')
# Check that we can cannot stop verification or release the device. i.e.
# PAM should have correctly done this after verification was done.
with self.assertRaisesRegex(dbus.exceptions.DBusException, r'net\.reactivated\.Fprint\.Error\.NoActionInProgress'):
self.device_mock.VerifyStop()
with self.assertRaisesRegex(dbus.exceptions.DBusException, r'net\.reactivated\.Fprint\.Error\.ClaimDevice'):
self.device_mock.Release()
def test_pam_fprintd_blocks_unexpected_auth2(self):
self.setup_device()
script = [

View File

@ -1,9 +0,0 @@
#!/bin/sh
test -f .tx/config || exit 1
echo Pulling translations from Transifex
tx --root `dirname $0` pull --all --force --skip
echo Pushing strings to Transifex
tx push --source