aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile63
-rw-r--r--configure.ac24
-rw-r--r--docker-entrypoint.sh3
-rw-r--r--po/POTFILES.in133
-rw-r--r--po/de.po1706
-rw-r--r--po/es.po1760
-rw-r--r--po/fr.po1644
-rw-r--r--po/sv.po1719
-rw-r--r--po/vi.po1731
-rw-r--r--po/zh_CN.po1684
-rw-r--r--src/Makefile.am3
-rw-r--r--src/credential/Makefile.am112
-rw-r--r--src/credential/credential.conf.in5
-rw-r--r--src/credential/credential.h221
-rw-r--r--src/credential/credential_api.c513
-rw-r--r--src/credential/credential_misc.c169
-rw-r--r--src/credential/credential_misc.h35
-rw-r--r--src/credential/credential_serialization.c463
-rw-r--r--src/credential/credential_serialization.h159
-rw-r--r--src/credential/gnunet-credential.c602
-rw-r--r--src/credential/gnunet-service-credential.c1238
-rw-r--r--src/credential/plugin_gnsrecord_credential.c353
-rw-r--r--src/credential/plugin_rest_credential.c1179
-rwxr-xr-xsrc/credential/test_credential_collect.sh47
-rwxr-xr-xsrc/credential/test_credential_collect_rest.sh90
-rw-r--r--src/credential/test_credential_defaults.conf24
-rwxr-xr-xsrc/credential/test_credential_issue.sh44
-rwxr-xr-xsrc/credential/test_credential_issue_rest.sh53
-rw-r--r--src/credential/test_credential_lookup.conf28
-rwxr-xr-xsrc/credential/test_credential_verify.sh81
-rwxr-xr-xsrc/credential/test_credential_verify_and.sh81
-rwxr-xr-xsrc/credential/test_credential_verify_rest.sh87
-rwxr-xr-xsrc/credential/test_credential_verify_simple.sh50
-rw-r--r--src/exit/gnunet-daemon-exit.c2
-rw-r--r--src/gns/gns_api.c11
-rw-r--r--src/gns/plugin_gnsrecord_gns.c67
-rw-r--r--src/identity-attribute/Makefile.am44
-rw-r--r--src/identity-attribute/identity_attribute.c245
-rw-r--r--src/identity-attribute/identity_attribute.h56
-rw-r--r--src/identity-attribute/plugin_identity_attribute_gnuid.c184
-rw-r--r--src/identity-provider/Makefile.am69
-rw-r--r--src/identity-provider/gnunet-identity-token.c179
-rw-r--r--src/identity-provider/gnunet-idp.c413
-rw-r--r--src/identity-provider/gnunet-service-identity-provider.c3104
-rw-r--r--src/identity-provider/identity-provider.conf4
-rw-r--r--src/identity-provider/identity_provider.h307
-rw-r--r--src/identity-provider/identity_provider_api.c1205
-rw-r--r--src/identity-provider/identity_token.c964
-rw-r--r--src/identity-provider/identity_token.h346
-rw-r--r--src/identity-provider/jwt.c172
-rw-r--r--src/identity-provider/plugin_gnsrecord_identity_provider.c (renamed from src/identity/plugin_gnsrecord_identity.c)44
-rw-r--r--src/identity-provider/plugin_identity_provider_sqlite.c736
-rw-r--r--src/identity-provider/plugin_rest_identity_provider.c1108
-rw-r--r--src/identity-provider/test_idp.conf28
-rwxr-xr-xsrc/identity-provider/test_idp.sh31
-rwxr-xr-xsrc/identity-provider/test_idp_attribute.sh40
-rwxr-xr-xsrc/identity-provider/test_idp_consume.sh43
-rw-r--r--src/identity-provider/test_idp_defaults.conf24
-rwxr-xr-xsrc/identity-provider/test_idp_issue.sh42
-rwxr-xr-xsrc/identity-provider/test_idp_revoke.sh60
-rw-r--r--src/identity/Makefile.am11
-rw-r--r--src/identity/plugin_rest_identity.c3
-rw-r--r--src/include/gnunet_credential_service.h308
-rw-r--r--src/include/gnunet_crypto_lib.h82
-rw-r--r--src/include/gnunet_gnsrecord_lib.h22
-rw-r--r--src/include/gnunet_identity_attribute_lib.h231
-rw-r--r--src/include/gnunet_identity_attribute_plugin.h149
-rw-r--r--src/include/gnunet_identity_provider_plugin.h123
-rw-r--r--src/include/gnunet_identity_provider_service.h332
-rw-r--r--src/include/gnunet_jsonapi_lib.h2
-rw-r--r--src/include/gnunet_protocols.h42
-rw-r--r--src/include/gnunet_signatures.h5
-rw-r--r--src/jsonapi/jsonapi_document.c32
-rw-r--r--src/jsonapi/jsonapi_resource.c6
-rw-r--r--src/namestore/plugin_rest_namestore.c27
-rw-r--r--src/rest/rest.conf1
-rw-r--r--src/util/Makefile.am24
-rw-r--r--src/util/crypto_abe.c416
-rw-r--r--src/util/test_crypto_abe.c86
79 files changed, 19232 insertions, 8302 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..5a193a46d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,63 @@
1from fedora:26
2
3# Install the required build tools
4RUN dnf -y update && dnf -y install which git automake texinfo gettext-devel autoconf libtool libtool-ltdl-devel libidn-devel libunistring-devel glpk libextractor-devel libmicrohttpd-devel gnutls libgcrypt-devel jansson-devel sqlite-devel npm
5
6WORKDIR /usr/src
7
8# Install gnurl from source at version gnurl-7.54.0
9RUN git clone https://git.taler.net/gnurl.git --branch gnurl-7.54.0
10WORKDIR /usr/src/gnurl
11RUN autoreconf -i
12RUN ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
13--without-libmetalink --without-winidn --without-librtmp \
14--without-nghttp2 --without-nss --without-cyassl \
15--without-polarssl --without-ssl --without-winssl \
16--without-darwinssl --disable-sspi --disable-ntlm-wb --disable-ldap \
17--disable-rtsp --disable-dict --disable-telnet --disable-tftp \
18--disable-pop3 --disable-imap --disable-smtp --disable-gopher \
19--disable-file --disable-ftp --disable-smb
20RUN make install
21WORKDIR /usr/src
22
23RUN dnf -y install wget flex bison
24
25# Install libpbc
26RUN wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz
27RUN tar xvzpf pbc-0.5.14.tar.gz
28WORKDIR /usr/src/pbc-0.5.14
29RUN ./configure --prefix=/usr
30RUN make install
31WORKDIR /usr/src
32
33RUN dnf -y install glib2-devel
34
35# Install libbswabe
36RUN git clone https://github.com/schanzen/libgabe.git
37WORKDIR /usr/src/libgabe
38RUN ./configure --prefix=/usr
39RUN make install
40
41# Install WebUI
42WORKDIR /usr/src/
43RUN git clone https://github.com/schanzen/gnunet-webui.git
44WORKDIR /usr/src/gnunet-webui
45RUN git checkout gnuidentity
46
47RUN mkdir /usr/src/gnunet
48WORKDIR /usr/src/gnunet
49ADD . .
50ARG NUM_JOBS
51RUN ./bootstrap
52RUN ./configure --prefix=/usr/local
53RUN make -j$NUM_JOBS
54RUN make install
55
56RUN groupadd gnunetdns
57RUN adduser --system -m --home-dir /var/lib/gnunet gnunet
58RUN chown gnunet:gnunet /var/lib/gnunet
59RUN echo '[arm]\nSYSTEM_ONLY = YES\nUSER_ONLY = NO\n' > /etc/gnunet.conf
60
61ADD docker-entrypoint.sh .
62
63CMD ["sh", "docker-entrypoint.sh"]
diff --git a/configure.ac b/configure.ac
index c97596971..9ab0a2316 100644
--- a/configure.ac
+++ b/configure.ac
@@ -446,6 +446,27 @@ AC_CHECK_LIB(ogg, ogg_stream_flush_fill,
446 ogg=0) 446 ogg=0)
447 447
448 448
449PKG_CHECK_MODULES([GLIB], [glib-2.0])
450# check for pbc library
451pbc=0
452AC_CHECK_HEADER([pbc/pbc.h],pbc=1)
453AC_CHECK_HEADER([gabe.h],abe=1)
454AM_CONDITIONAL(HAVE_PBC, [test "$pbc" = 1])
455AM_CONDITIONAL(HAVE_ABE, [test "$abe" = 1])
456if test "x$pbc" = x1
457then
458 AC_DEFINE([HAVE_PBC],[1],[Have pbc library])
459else
460 AC_DEFINE([HAVE_PBC],[0],[Lacking pbc library])
461fi
462if test "x$abe" = x1
463then
464 AC_DEFINE([HAVE_ABE],[1],[Have ABE library])
465else
466 AC_DEFINE([HAVE_ABE],[0],[Lacking ABE library])
467fi
468
469
449 470
450gst=0 471gst=0
451PKG_CHECK_MODULES( 472PKG_CHECK_MODULES(
@@ -1572,6 +1593,8 @@ src/gnsrecord/Makefile
1572src/hello/Makefile 1593src/hello/Makefile
1573src/identity/Makefile 1594src/identity/Makefile
1574src/identity/identity.conf 1595src/identity/identity.conf
1596src/credential/Makefile
1597src/credential/credential.conf
1575src/include/Makefile 1598src/include/Makefile
1576src/integration-tests/Makefile 1599src/integration-tests/Makefile
1577src/json/Makefile 1600src/json/Makefile
@@ -1637,6 +1660,7 @@ src/vpn/vpn.conf
1637src/zonemaster/Makefile 1660src/zonemaster/Makefile
1638src/zonemaster/zonemaster.conf 1661src/zonemaster/zonemaster.conf
1639src/rest/Makefile 1662src/rest/Makefile
1663src/identity-attribute/Makefile
1640src/identity-provider/Makefile 1664src/identity-provider/Makefile
1641pkgconfig/Makefile 1665pkgconfig/Makefile
1642pkgconfig/gnunetarm.pc 1666pkgconfig/gnunetarm.pc
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
new file mode 100644
index 000000000..807d86d6f
--- /dev/null
+++ b/docker-entrypoint.sh
@@ -0,0 +1,3 @@
1#!/bin/bash
2gnunet-arm -s > $HOME/gnunet.log 2>&1
3exec bash \ No newline at end of file
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 43a5dcb08..b06eb3a9f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,13 +3,21 @@ src/arm/arm_monitor_api.c
3src/arm/gnunet-arm.c 3src/arm/gnunet-arm.c
4src/arm/gnunet-service-arm.c 4src/arm/gnunet-service-arm.c
5src/arm/mockup-service.c 5src/arm/mockup-service.c
6src/ats-tests/ats-testing-experiment.c
7src/ats-tests/ats-testing-log.c
8src/ats-tests/ats-testing-preferences.c
9src/ats-tests/ats-testing-traffic.c
10src/ats-tests/ats-testing.c
11src/ats-tests/gnunet-ats-sim.c
12src/ats-tests/gnunet-solver-eval.c
13src/ats-tool/gnunet-ats.c
6src/ats/ats_api_connectivity.c 14src/ats/ats_api_connectivity.c
7src/ats/ats_api_performance.c 15src/ats/ats_api_performance.c
8src/ats/ats_api_scanner.c 16src/ats/ats_api_scanner.c
9src/ats/ats_api_scheduling.c 17src/ats/ats_api_scheduling.c
10src/ats/gnunet-ats-solver-eval.c 18src/ats/gnunet-ats-solver-eval.c
11src/ats/gnunet-service-ats_addresses.c
12src/ats/gnunet-service-ats.c 19src/ats/gnunet-service-ats.c
20src/ats/gnunet-service-ats_addresses.c
13src/ats/gnunet-service-ats_connectivity.c 21src/ats/gnunet-service-ats_connectivity.c
14src/ats/gnunet-service-ats_normalization.c 22src/ats/gnunet-service-ats_normalization.c
15src/ats/gnunet-service-ats_performance.c 23src/ats/gnunet-service-ats_performance.c
@@ -20,14 +28,6 @@ src/ats/gnunet-service-ats_scheduling.c
20src/ats/plugin_ats_mlp.c 28src/ats/plugin_ats_mlp.c
21src/ats/plugin_ats_proportional.c 29src/ats/plugin_ats_proportional.c
22src/ats/plugin_ats_ril.c 30src/ats/plugin_ats_ril.c
23src/ats-tests/ats-testing.c
24src/ats-tests/ats-testing-experiment.c
25src/ats-tests/ats-testing-log.c
26src/ats-tests/ats-testing-preferences.c
27src/ats-tests/ats-testing-traffic.c
28src/ats-tests/gnunet-ats-sim.c
29src/ats-tests/gnunet-solver-eval.c
30src/ats-tool/gnunet-ats.c
31src/auction/gnunet-auction-create.c 31src/auction/gnunet-auction-create.c
32src/auction/gnunet-auction-info.c 32src/auction/gnunet-auction-info.c
33src/auction/gnunet-auction-join.c 33src/auction/gnunet-auction-join.c
@@ -39,8 +39,8 @@ src/block/plugin_block_test.c
39src/cadet/cadet_api.c 39src/cadet/cadet_api.c
40src/cadet/cadet_test_lib.c 40src/cadet/cadet_test_lib.c
41src/cadet/desirability_table.c 41src/cadet/desirability_table.c
42src/cadet/gnunet-cadet.c
43src/cadet/gnunet-cadet-profiler.c 42src/cadet/gnunet-cadet-profiler.c
43src/cadet/gnunet-cadet.c
44src/cadet/gnunet-service-cadet.c 44src/cadet/gnunet-service-cadet.c
45src/cadet/gnunet-service-cadet_channel.c 45src/cadet/gnunet-service-cadet_channel.c
46src/cadet/gnunet-service-cadet_connection.c 46src/cadet/gnunet-service-cadet_connection.c
@@ -56,15 +56,15 @@ src/consensus/gnunet-service-consensus.c
56src/consensus/plugin_block_consensus.c 56src/consensus/plugin_block_consensus.c
57src/conversation/conversation_api.c 57src/conversation/conversation_api.c
58src/conversation/conversation_api_call.c 58src/conversation/conversation_api_call.c
59src/conversation/gnunet-conversation.c
60src/conversation/gnunet-conversation-test.c 59src/conversation/gnunet-conversation-test.c
61src/conversation/gnunet_gst.c 60src/conversation/gnunet-conversation.c
62src/conversation/gnunet_gst_test.c
63src/conversation/gnunet-helper-audio-playback.c
64src/conversation/gnunet-helper-audio-playback-gst.c 61src/conversation/gnunet-helper-audio-playback-gst.c
65src/conversation/gnunet-helper-audio-record.c 62src/conversation/gnunet-helper-audio-playback.c
66src/conversation/gnunet-helper-audio-record-gst.c 63src/conversation/gnunet-helper-audio-record-gst.c
64src/conversation/gnunet-helper-audio-record.c
67src/conversation/gnunet-service-conversation.c 65src/conversation/gnunet-service-conversation.c
66src/conversation/gnunet_gst.c
67src/conversation/gnunet_gst_test.c
68src/conversation/microphone.c 68src/conversation/microphone.c
69src/conversation/plugin_gnsrecord_conversation.c 69src/conversation/plugin_gnsrecord_conversation.c
70src/conversation/speaker.c 70src/conversation/speaker.c
@@ -75,6 +75,13 @@ src/core/gnunet-service-core.c
75src/core/gnunet-service-core_kx.c 75src/core/gnunet-service-core_kx.c
76src/core/gnunet-service-core_sessions.c 76src/core/gnunet-service-core_sessions.c
77src/core/gnunet-service-core_typemap.c 77src/core/gnunet-service-core_typemap.c
78src/credential/credential_api.c
79src/credential/credential_misc.c
80src/credential/credential_serialization.c
81src/credential/gnunet-credential.c
82src/credential/gnunet-service-credential.c
83src/credential/plugin_gnsrecord_credential.c
84src/credential/plugin_rest_credential.c
78src/curl/curl.c 85src/curl/curl.c
79src/curl/curl_reschedule.c 86src/curl/curl_reschedule.c
80src/datacache/datacache.c 87src/datacache/datacache.c
@@ -94,7 +101,6 @@ src/dht/dht_api.c
94src/dht/dht_test_lib.c 101src/dht/dht_test_lib.c
95src/dht/gnunet-dht-get.c 102src/dht/gnunet-dht-get.c
96src/dht/gnunet-dht-monitor.c 103src/dht/gnunet-dht-monitor.c
97src/dht/gnunet_dht_profiler.c
98src/dht/gnunet-dht-put.c 104src/dht/gnunet-dht-put.c
99src/dht/gnunet-service-dht.c 105src/dht/gnunet-service-dht.c
100src/dht/gnunet-service-dht_clients.c 106src/dht/gnunet-service-dht_clients.c
@@ -103,6 +109,7 @@ src/dht/gnunet-service-dht_hello.c
103src/dht/gnunet-service-dht_neighbours.c 109src/dht/gnunet-service-dht_neighbours.c
104src/dht/gnunet-service-dht_nse.c 110src/dht/gnunet-service-dht_nse.c
105src/dht/gnunet-service-dht_routing.c 111src/dht/gnunet-service-dht_routing.c
112src/dht/gnunet_dht_profiler.c
106src/dht/plugin_block_dht.c 113src/dht/plugin_block_dht.c
107src/dns/dns_api.c 114src/dns/dns_api.c
108src/dns/dnsparser.c 115src/dns/dnsparser.c
@@ -117,8 +124,8 @@ src/dv/gnunet-dv.c
117src/dv/gnunet-service-dv.c 124src/dv/gnunet-service-dv.c
118src/dv/plugin_transport_dv.c 125src/dv/plugin_transport_dv.c
119src/exit/gnunet-daemon-exit.c 126src/exit/gnunet-daemon-exit.c
120src/exit/gnunet-helper-exit.c
121src/exit/gnunet-helper-exit-windows.c 127src/exit/gnunet-helper-exit-windows.c
128src/exit/gnunet-helper-exit.c
122src/fragmentation/defragmentation.c 129src/fragmentation/defragmentation.c
123src/fragmentation/fragmentation.c 130src/fragmentation/fragmentation.c
124src/fs/fs_api.c 131src/fs/fs_api.c
@@ -143,8 +150,8 @@ src/fs/gnunet-auto-share.c
143src/fs/gnunet-daemon-fsprofiler.c 150src/fs/gnunet-daemon-fsprofiler.c
144src/fs/gnunet-directory.c 151src/fs/gnunet-directory.c
145src/fs/gnunet-download.c 152src/fs/gnunet-download.c
146src/fs/gnunet-fs.c
147src/fs/gnunet-fs-profiler.c 153src/fs/gnunet-fs-profiler.c
154src/fs/gnunet-fs.c
148src/fs/gnunet-helper-fs-publish.c 155src/fs/gnunet-helper-fs-publish.c
149src/fs/gnunet-publish.c 156src/fs/gnunet-publish.c
150src/fs/gnunet-search.c 157src/fs/gnunet-search.c
@@ -162,10 +169,10 @@ src/fs/plugin_block_fs.c
162src/gns/gns_api.c 169src/gns/gns_api.c
163src/gns/gnunet-bcd.c 170src/gns/gnunet-bcd.c
164src/gns/gnunet-dns2gns.c 171src/gns/gnunet-dns2gns.c
165src/gns/gnunet-gns.c
166src/gns/gnunet-gns-helper-service-w32.c 172src/gns/gnunet-gns-helper-service-w32.c
167src/gns/gnunet-gns-import.c 173src/gns/gnunet-gns-import.c
168src/gns/gnunet-gns-proxy.c 174src/gns/gnunet-gns-proxy.c
175src/gns/gnunet-gns.c
169src/gns/gnunet-service-gns.c 176src/gns/gnunet-service-gns.c
170src/gns/gnunet-service-gns_interceptor.c 177src/gns/gnunet-service-gns_interceptor.c
171src/gns/gnunet-service-gns_resolver.c 178src/gns/gnunet-service-gns_resolver.c
@@ -174,41 +181,44 @@ src/gns/nss/nss_gns_query.c
174src/gns/plugin_block_gns.c 181src/gns/plugin_block_gns.c
175src/gns/plugin_gnsrecord_gns.c 182src/gns/plugin_gnsrecord_gns.c
176src/gns/plugin_rest_gns.c 183src/gns/plugin_rest_gns.c
184src/gns/w32nsp-install.c
185src/gns/w32nsp-resolve.c
186src/gns/w32nsp-uninstall.c
187src/gns/w32nsp.c
177src/gnsrecord/gnsrecord.c 188src/gnsrecord/gnsrecord.c
178src/gnsrecord/gnsrecord_crypto.c 189src/gnsrecord/gnsrecord_crypto.c
179src/gnsrecord/gnsrecord_misc.c 190src/gnsrecord/gnsrecord_misc.c
180src/gnsrecord/gnsrecord_serialization.c 191src/gnsrecord/gnsrecord_serialization.c
181src/gnsrecord/plugin_gnsrecord_dns.c 192src/gnsrecord/plugin_gnsrecord_dns.c
182src/gns/w32nsp.c
183src/gns/w32nsp-install.c
184src/gns/w32nsp-resolve.c
185src/gns/w32nsp-uninstall.c
186src/hello/address.c 193src/hello/address.c
187src/hello/gnunet-hello.c 194src/hello/gnunet-hello.c
188src/hello/hello.c 195src/hello/hello.c
189src/hostlist/gnunet-daemon-hostlist.c 196src/hostlist/gnunet-daemon-hostlist.c
190src/hostlist/gnunet-daemon-hostlist_client.c 197src/hostlist/gnunet-daemon-hostlist_client.c
191src/hostlist/gnunet-daemon-hostlist_server.c 198src/hostlist/gnunet-daemon-hostlist_server.c
199src/identity-attribute/identity_attribute.c
200src/identity-attribute/plugin_identity_attribute_type_gnuid.c
201src/identity-provider/gnunet-idp.c
202src/identity-provider/gnunet-service-identity-provider.c
203src/identity-provider/identity_provider_api.c
204src/identity-provider/jwt.c
205src/identity-provider/plugin_gnsrecord_identity_provider.c
206src/identity-provider/plugin_identity_provider_sqlite.c
207src/identity-provider/plugin_rest_identity_provider.c
192src/identity/gnunet-identity.c 208src/identity/gnunet-identity.c
193src/identity/gnunet-service-identity.c 209src/identity/gnunet-service-identity.c
194src/identity/identity_api.c 210src/identity/identity_api.c
195src/identity/identity_api_lookup.c 211src/identity/identity_api_lookup.c
196src/identity/plugin_gnsrecord_identity.c
197src/identity/plugin_rest_identity.c 212src/identity/plugin_rest_identity.c
198src/identity-provider/gnunet-identity-token.c 213src/json/json.c
199src/identity-provider/gnunet-service-identity-provider.c 214src/json/json_generator.c
200src/identity-provider/identity_provider_api.c 215src/json/json_helper.c
201src/identity-provider/identity_token.c 216src/json/json_mhd.c
202src/identity-provider/plugin_rest_identity_provider.c
203src/jsonapi/jsonapi.c 217src/jsonapi/jsonapi.c
204src/jsonapi/jsonapi_document.c 218src/jsonapi/jsonapi_document.c
205src/jsonapi/jsonapi_error.c 219src/jsonapi/jsonapi_error.c
206src/jsonapi/jsonapi_relationship.c 220src/jsonapi/jsonapi_relationship.c
207src/jsonapi/jsonapi_resource.c 221src/jsonapi/jsonapi_resource.c
208src/json/json.c
209src/json/json_generator.c
210src/json/json_helper.c
211src/json/json_mhd.c
212src/multicast/gnunet-multicast.c 222src/multicast/gnunet-multicast.c
213src/multicast/gnunet-service-multicast.c 223src/multicast/gnunet-service-multicast.c
214src/multicast/multicast_api.c 224src/multicast/multicast_api.c
@@ -222,8 +232,8 @@ src/namecache/namecache_api.c
222src/namecache/plugin_namecache_flat.c 232src/namecache/plugin_namecache_flat.c
223src/namecache/plugin_namecache_postgres.c 233src/namecache/plugin_namecache_postgres.c
224src/namecache/plugin_namecache_sqlite.c 234src/namecache/plugin_namecache_sqlite.c
225src/namestore/gnunet-namestore.c
226src/namestore/gnunet-namestore-fcfsd.c 235src/namestore/gnunet-namestore-fcfsd.c
236src/namestore/gnunet-namestore.c
227src/namestore/gnunet-service-namestore.c 237src/namestore/gnunet-service-namestore.c
228src/namestore/namestore_api.c 238src/namestore/namestore_api.c
229src/namestore/namestore_api_monitor.c 239src/namestore/namestore_api_monitor.c
@@ -238,10 +248,10 @@ src/nat-auto/gnunet-service-nat-auto.c
238src/nat-auto/gnunet-service-nat-auto_legacy.c 248src/nat-auto/gnunet-service-nat-auto_legacy.c
239src/nat-auto/nat_auto_api.c 249src/nat-auto/nat_auto_api.c
240src/nat-auto/nat_auto_api_test.c 250src/nat-auto/nat_auto_api_test.c
241src/nat/gnunet-helper-nat-client.c
242src/nat/gnunet-helper-nat-client-windows.c 251src/nat/gnunet-helper-nat-client-windows.c
243src/nat/gnunet-helper-nat-server.c 252src/nat/gnunet-helper-nat-client.c
244src/nat/gnunet-helper-nat-server-windows.c 253src/nat/gnunet-helper-nat-server-windows.c
254src/nat/gnunet-helper-nat-server.c
245src/nat/gnunet-nat.c 255src/nat/gnunet-nat.c
246src/nat/gnunet-service-nat.c 256src/nat/gnunet-service-nat.c
247src/nat/gnunet-service-nat_externalip.c 257src/nat/gnunet-service-nat_externalip.c
@@ -250,15 +260,15 @@ src/nat/gnunet-service-nat_mini.c
250src/nat/gnunet-service-nat_stun.c 260src/nat/gnunet-service-nat_stun.c
251src/nat/nat_api.c 261src/nat/nat_api.c
252src/nat/nat_api_stun.c 262src/nat/nat_api_stun.c
253src/nse/gnunet-nse.c
254src/nse/gnunet-nse-profiler.c 263src/nse/gnunet-nse-profiler.c
264src/nse/gnunet-nse.c
255src/nse/gnunet-service-nse.c 265src/nse/gnunet-service-nse.c
256src/nse/nse_api.c 266src/nse/nse_api.c
267src/peerinfo-tool/gnunet-peerinfo.c
268src/peerinfo-tool/gnunet-peerinfo_plugins.c
257src/peerinfo/gnunet-service-peerinfo.c 269src/peerinfo/gnunet-service-peerinfo.c
258src/peerinfo/peerinfo_api.c 270src/peerinfo/peerinfo_api.c
259src/peerinfo/peerinfo_api_notify.c 271src/peerinfo/peerinfo_api_notify.c
260src/peerinfo-tool/gnunet-peerinfo.c
261src/peerinfo-tool/gnunet-peerinfo_plugins.c
262src/peerstore/gnunet-peerstore.c 272src/peerstore/gnunet-peerstore.c
263src/peerstore/gnunet-service-peerstore.c 273src/peerstore/gnunet-service-peerstore.c
264src/peerstore/peerstore_api.c 274src/peerstore/peerstore_api.c
@@ -310,13 +320,13 @@ src/rps/gnunet-service-rps_peers.c
310src/rps/gnunet-service-rps_sampler.c 320src/rps/gnunet-service-rps_sampler.c
311src/rps/gnunet-service-rps_sampler_elem.c 321src/rps/gnunet-service-rps_sampler_elem.c
312src/rps/gnunet-service-rps_view.c 322src/rps/gnunet-service-rps_view.c
313src/rps/rps_api.c
314src/rps/rps-test_util.c 323src/rps/rps-test_util.c
324src/rps/rps_api.c
315src/scalarproduct/gnunet-scalarproduct.c 325src/scalarproduct/gnunet-scalarproduct.c
316src/scalarproduct/gnunet-service-scalarproduct_alice.c
317src/scalarproduct/gnunet-service-scalarproduct_bob.c
318src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c 326src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c
319src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c 327src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c
328src/scalarproduct/gnunet-service-scalarproduct_alice.c
329src/scalarproduct/gnunet-service-scalarproduct_bob.c
320src/scalarproduct/scalarproduct_api.c 330src/scalarproduct/scalarproduct_api.c
321src/secretsharing/gnunet-secretsharing-profiler.c 331src/secretsharing/gnunet-secretsharing-profiler.c
322src/secretsharing/gnunet-service-secretsharing.c 332src/secretsharing/gnunet-service-secretsharing.c
@@ -343,15 +353,16 @@ src/statistics/gnunet-statistics.c
343src/statistics/statistics_api.c 353src/statistics/statistics_api.c
344src/template/gnunet-service-template.c 354src/template/gnunet-service-template.c
345src/template/gnunet-template.c 355src/template/gnunet-template.c
356src/testbed-logger/gnunet-service-testbed-logger.c
357src/testbed-logger/testbed_logger_api.c
346src/testbed/generate-underlay-topology.c 358src/testbed/generate-underlay-topology.c
347src/testbed/gnunet-daemon-latency-logger.c 359src/testbed/gnunet-daemon-latency-logger.c
348src/testbed/gnunet-daemon-testbed-blacklist.c 360src/testbed/gnunet-daemon-testbed-blacklist.c
349src/testbed/gnunet-daemon-testbed-underlay.c 361src/testbed/gnunet-daemon-testbed-underlay.c
350src/testbed/gnunet-helper-testbed.c 362src/testbed/gnunet-helper-testbed.c
351src/testbed/gnunet_mpi_test.c
352src/testbed/gnunet-service-test-barriers.c 363src/testbed/gnunet-service-test-barriers.c
353src/testbed/gnunet-service-testbed_barriers.c
354src/testbed/gnunet-service-testbed.c 364src/testbed/gnunet-service-testbed.c
365src/testbed/gnunet-service-testbed_barriers.c
355src/testbed/gnunet-service-testbed_cache.c 366src/testbed/gnunet-service-testbed_cache.c
356src/testbed/gnunet-service-testbed_connectionpool.c 367src/testbed/gnunet-service-testbed_connectionpool.c
357src/testbed/gnunet-service-testbed_cpustatus.c 368src/testbed/gnunet-service-testbed_cpustatus.c
@@ -359,20 +370,19 @@ src/testbed/gnunet-service-testbed_links.c
359src/testbed/gnunet-service-testbed_meminfo.c 370src/testbed/gnunet-service-testbed_meminfo.c
360src/testbed/gnunet-service-testbed_oc.c 371src/testbed/gnunet-service-testbed_oc.c
361src/testbed/gnunet-service-testbed_peers.c 372src/testbed/gnunet-service-testbed_peers.c
362src/testbed/gnunet_testbed_mpi_spawn.c
363src/testbed/gnunet-testbed-profiler.c 373src/testbed/gnunet-testbed-profiler.c
364src/testbed-logger/gnunet-service-testbed-logger.c 374src/testbed/gnunet_mpi_test.c
365src/testbed-logger/testbed_logger_api.c 375src/testbed/gnunet_testbed_mpi_spawn.c
366src/testbed/testbed_api_barriers.c
367src/testbed/testbed_api.c 376src/testbed/testbed_api.c
377src/testbed/testbed_api_barriers.c
368src/testbed/testbed_api_hosts.c 378src/testbed/testbed_api_hosts.c
369src/testbed/testbed_api_operations.c 379src/testbed/testbed_api_operations.c
370src/testbed/testbed_api_peers.c 380src/testbed/testbed_api_peers.c
371src/testbed/testbed_api_sd.c 381src/testbed/testbed_api_sd.c
372src/testbed/testbed_api_services.c 382src/testbed/testbed_api_services.c
373src/testbed/testbed_api_statistics.c 383src/testbed/testbed_api_statistics.c
374src/testbed/testbed_api_testbed.c
375src/testbed/testbed_api_test.c 384src/testbed/testbed_api_test.c
385src/testbed/testbed_api_testbed.c
376src/testbed/testbed_api_topology.c 386src/testbed/testbed_api_topology.c
377src/testbed/testbed_api_underlay.c 387src/testbed/testbed_api_underlay.c
378src/testing/gnunet-testing.c 388src/testing/gnunet-testing.c
@@ -381,34 +391,39 @@ src/testing/testing.c
381src/topology/friends.c 391src/topology/friends.c
382src/topology/gnunet-daemon-topology.c 392src/topology/gnunet-daemon-topology.c
383src/transport/gnunet-helper-transport-bluetooth.c 393src/transport/gnunet-helper-transport-bluetooth.c
384src/transport/gnunet-helper-transport-wlan.c
385src/transport/gnunet-helper-transport-wlan-dummy.c 394src/transport/gnunet-helper-transport-wlan-dummy.c
386src/transport/gnunet-service-transport_ats.c 395src/transport/gnunet-helper-transport-wlan.c
387src/transport/gnunet-service-transport.c 396src/transport/gnunet-service-transport.c
397src/transport/gnunet-service-transport_ats.c
388src/transport/gnunet-service-transport_hello.c 398src/transport/gnunet-service-transport_hello.c
389src/transport/gnunet-service-transport_manipulation.c 399src/transport/gnunet-service-transport_manipulation.c
390src/transport/gnunet-service-transport_neighbours.c 400src/transport/gnunet-service-transport_neighbours.c
391src/transport/gnunet-service-transport_plugins.c 401src/transport/gnunet-service-transport_plugins.c
392src/transport/gnunet-service-transport_validation.c 402src/transport/gnunet-service-transport_validation.c
393src/transport/gnunet-transport.c
394src/transport/gnunet-transport-certificate-creation.c 403src/transport/gnunet-transport-certificate-creation.c
395src/transport/gnunet-transport-profiler.c 404src/transport/gnunet-transport-profiler.c
396src/transport/gnunet-transport-wlan-receiver.c 405src/transport/gnunet-transport-wlan-receiver.c
397src/transport/gnunet-transport-wlan-sender.c 406src/transport/gnunet-transport-wlan-sender.c
407src/transport/gnunet-transport.c
398src/transport/plugin_transport_http_client.c 408src/transport/plugin_transport_http_client.c
399src/transport/plugin_transport_http_common.c 409src/transport/plugin_transport_http_common.c
400src/transport/plugin_transport_http_server.c 410src/transport/plugin_transport_http_server.c
401src/transport/plugin_transport_smtp.c 411src/transport/plugin_transport_smtp.c
402src/transport/plugin_transport_tcp.c 412src/transport/plugin_transport_tcp.c
403src/transport/plugin_transport_template.c 413src/transport/plugin_transport_template.c
404src/transport/plugin_transport_udp_broadcasting.c
405src/transport/plugin_transport_udp.c 414src/transport/plugin_transport_udp.c
415src/transport/plugin_transport_udp_broadcasting.c
406src/transport/plugin_transport_unix.c 416src/transport/plugin_transport_unix.c
407src/transport/plugin_transport_wlan.c 417src/transport/plugin_transport_wlan.c
408src/transport/tcp_connection_legacy.c 418src/transport/tcp_connection_legacy.c
409src/transport/tcp_server_legacy.c 419src/transport/tcp_server_legacy.c
410src/transport/tcp_server_mst_legacy.c 420src/transport/tcp_server_mst_legacy.c
411src/transport/tcp_service_legacy.c 421src/transport/tcp_service_legacy.c
422src/transport/transport-testing-filenames.c
423src/transport/transport-testing-loggers.c
424src/transport/transport-testing-main.c
425src/transport/transport-testing-send.c
426src/transport/transport-testing.c
412src/transport/transport_api_address_to_string.c 427src/transport/transport_api_address_to_string.c
413src/transport/transport_api_blacklist.c 428src/transport/transport_api_blacklist.c
414src/transport/transport_api_core.c 429src/transport/transport_api_core.c
@@ -417,11 +432,6 @@ src/transport/transport_api_manipulation.c
417src/transport/transport_api_monitor_peers.c 432src/transport/transport_api_monitor_peers.c
418src/transport/transport_api_monitor_plugins.c 433src/transport/transport_api_monitor_plugins.c
419src/transport/transport_api_offer_hello.c 434src/transport/transport_api_offer_hello.c
420src/transport/transport-testing.c
421src/transport/transport-testing-filenames.c
422src/transport/transport-testing-loggers.c
423src/transport/transport-testing-main.c
424src/transport/transport-testing-send.c
425src/tun/regex.c 435src/tun/regex.c
426src/tun/tun.c 436src/tun/tun.c
427src/util/bandwidth.c 437src/util/bandwidth.c
@@ -435,10 +445,11 @@ src/util/configuration_loader.c
435src/util/container_bloomfilter.c 445src/util/container_bloomfilter.c
436src/util/container_heap.c 446src/util/container_heap.c
437src/util/container_meta_data.c 447src/util/container_meta_data.c
438src/util/container_multihashmap32.c
439src/util/container_multihashmap.c 448src/util/container_multihashmap.c
449src/util/container_multihashmap32.c
440src/util/container_multipeermap.c 450src/util/container_multipeermap.c
441src/util/container_multishortmap.c 451src/util/container_multishortmap.c
452src/util/crypto_abe.c
442src/util/crypto_crc.c 453src/util/crypto_crc.c
443src/util/crypto_ecc.c 454src/util/crypto_ecc.c
444src/util/crypto_ecc_dlog.c 455src/util/crypto_ecc_dlog.c
@@ -455,8 +466,8 @@ src/util/crypto_symmetric.c
455src/util/disk.c 466src/util/disk.c
456src/util/getopt.c 467src/util/getopt.c
457src/util/getopt_helpers.c 468src/util/getopt_helpers.c
458src/util/gnunet-config.c
459src/util/gnunet-config-diff.c 469src/util/gnunet-config-diff.c
470src/util/gnunet-config.c
460src/util/gnunet-ecc.c 471src/util/gnunet-ecc.c
461src/util/gnunet-helper-w32-console.c 472src/util/gnunet-helper-w32-console.c
462src/util/gnunet-resolver.c 473src/util/gnunet-resolver.c
@@ -487,8 +498,8 @@ src/util/time.c
487src/util/w32cat.c 498src/util/w32cat.c
488src/util/win.c 499src/util/win.c
489src/util/winproc.c 500src/util/winproc.c
490src/vpn/gnunet-helper-vpn.c
491src/vpn/gnunet-helper-vpn-windows.c 501src/vpn/gnunet-helper-vpn-windows.c
502src/vpn/gnunet-helper-vpn.c
492src/vpn/gnunet-service-vpn.c 503src/vpn/gnunet-service-vpn.c
493src/vpn/gnunet-vpn.c 504src/vpn/gnunet-vpn.c
494src/vpn/vpn_api.c 505src/vpn/vpn_api.c
diff --git a/po/de.po b/po/de.po
index fde327308..f6be3a735 100644
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
10msgstr "" 10msgstr ""
11"Project-Id-Version: gnunet 0.10.1\n" 11"Project-Id-Version: gnunet 0.10.1\n"
12"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 12"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
13"POT-Creation-Date: 2017-03-31 19:22-0500\n" 13"POT-Creation-Date: 2017-10-20 15:14+0000\n"
14"PO-Revision-Date: 2015-03-08 16:16+0100\n" 14"PO-Revision-Date: 2015-03-08 16:16+0100\n"
15"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n" 15"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
16"Language-Team: German <translation-team-de@lists.sourceforge.net>\n" 16"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -272,7 +272,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
272msgstr "" 272msgstr ""
273 273
274#: src/arm/gnunet-service-arm.c:513 274#: src/arm/gnunet-service-arm.c:513
275#: src/transport/plugin_transport_http_server.c:2621 275#: src/transport/plugin_transport_http_server.c:2684
276#: src/transport/plugin_transport_tcp.c:1259 276#: src/transport/plugin_transport_tcp.c:1259
277#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 277#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
278#, c-format 278#, c-format
@@ -280,7 +280,7 @@ msgid "Failed to resolve `%s': %s\n"
280msgstr "»%s« konnte nicht aufgelöst werden: %s\n" 280msgstr "»%s« konnte nicht aufgelöst werden: %s\n"
281 281
282#: src/arm/gnunet-service-arm.c:532 282#: src/arm/gnunet-service-arm.c:532
283#: src/transport/plugin_transport_http_server.c:2639 283#: src/transport/plugin_transport_http_server.c:2702
284#: src/transport/plugin_transport_tcp.c:1278 284#: src/transport/plugin_transport_tcp.c:1278
285#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 285#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
286#, fuzzy, c-format 286#, fuzzy, c-format
@@ -353,133 +353,14 @@ msgstr ""
353msgid "Initiating shutdown as requested by client.\n" 353msgid "Initiating shutdown as requested by client.\n"
354msgstr "" 354msgstr ""
355 355
356#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 356#: src/ats-tests/ats-testing-log.c:837
357#, c-format 357msgid "Stop logging\n"
358msgid "" 358msgstr "Protokollierung stoppen\n"
359"Could not load quota for network `%s': `%s', assigning default bandwidth "
360"%llu\n"
361msgstr ""
362
363#: src/ats/gnunet-ats-solver-eval.c:2799
364#, c-format
365msgid ""
366"No outbound quota configured for network `%s', assigning default bandwidth "
367"%llu\n"
368msgstr ""
369
370#: src/ats/gnunet-ats-solver-eval.c:2840
371#, c-format
372msgid ""
373"No outbound quota configure for network `%s', assigning default bandwidth "
374"%llu\n"
375msgstr ""
376
377#: src/ats/gnunet-ats-solver-eval.c:3294
378#: src/ats-tests/gnunet-solver-eval.c:939
379msgid "solver to use"
380msgstr ""
381
382#: src/ats/gnunet-ats-solver-eval.c:3299
383#: src/ats-tests/gnunet-solver-eval.c:945
384#: src/ats-tests/gnunet-solver-eval.c:950
385msgid "experiment to use"
386msgstr ""
387
388#: src/ats/gnunet-ats-solver-eval.c:3306
389msgid "print logging"
390msgstr ""
391
392#: src/ats/gnunet-ats-solver-eval.c:3311
393msgid "save logging to disk"
394msgstr ""
395
396#: src/ats/gnunet-ats-solver-eval.c:3316
397msgid "disable normalization"
398msgstr ""
399
400#: src/ats/gnunet-service-ats_plugins.c:304
401#, c-format
402msgid ""
403"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
404"%llu\n"
405msgstr ""
406
407#: src/ats/gnunet-service-ats_plugins.c:314
408#, c-format
409msgid "%s quota configured for network `%s' is %llu\n"
410msgstr ""
411
412#: src/ats/gnunet-service-ats_plugins.c:359
413#, c-format
414msgid ""
415"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
416msgstr ""
417
418#: src/ats/gnunet-service-ats_plugins.c:451
419#, fuzzy, c-format
420msgid "Failed to initialize solver `%s'!\n"
421msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
422
423#: src/ats/plugin_ats_mlp.c:1274
424msgid "Problem size too large, cannot allocate memory!\n"
425msgstr ""
426
427#: src/ats/plugin_ats_mlp.c:1869
428#, fuzzy, c-format
429msgid "Adding address for peer `%s' multiple times\n"
430msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
431
432#: src/ats/plugin_ats_mlp.c:1913
433#, fuzzy, c-format
434msgid "Updating address property for peer `%s' %p not added before\n"
435msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
436
437#: src/ats/plugin_ats_mlp.c:2475
438msgid ""
439"MLP solver is not optimizing for anything, changing to feasibility check\n"
440msgstr ""
441
442#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
443#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
444#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
445#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
446#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
447#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
448#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
449#, fuzzy, c-format
450msgid "Invalid %s configuration %f \n"
451msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
452
453#: src/ats/plugin_ats_mlp.c:2670
454#, c-format
455msgid ""
456"Adjusting inconsistent outbound quota configuration for network `%s', is "
457"%llu must be at least %llu\n"
458msgstr ""
459
460#: src/ats/plugin_ats_mlp.c:2679
461#, c-format
462msgid ""
463"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
464"must be at least %llu\n"
465msgstr ""
466
467#: src/ats/plugin_ats_mlp.c:2689
468#, c-format
469msgid ""
470"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
471msgstr ""
472
473#: src/ats/plugin_ats_mlp.c:2698
474#, c-format
475msgid ""
476"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
477msgstr ""
478 359
479#: src/ats/plugin_ats_proportional.c:1164 360#: src/ats-tests/ats-testing-log.c:892
480#, fuzzy, c-format 361#, fuzzy, c-format
481msgid "Invalid %s configuration %f\n" 362msgid "Start logging `%s'\n"
482msgstr " gconfig\tGTK Konfiguration\n" 363msgstr "Collection `%s' begonnen.\n"
483 364
484#: src/ats-tests/ats-testing.c:422 365#: src/ats-tests/ats-testing.c:422
485#, c-format 366#, c-format
@@ -491,15 +372,6 @@ msgstr ""
491msgid "Failed to connect master peer [%u] with slave [%u]\n" 372msgid "Failed to connect master peer [%u] with slave [%u]\n"
492msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" 373msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
493 374
494#: src/ats-tests/ats-testing-log.c:837
495msgid "Stop logging\n"
496msgstr "Protokollierung stoppen\n"
497
498#: src/ats-tests/ats-testing-log.c:892
499#, fuzzy, c-format
500msgid "Start logging `%s'\n"
501msgstr "Collection `%s' begonnen.\n"
502
503#: src/ats-tests/gnunet-ats-sim.c:90 375#: src/ats-tests/gnunet-ats-sim.c:90
504#, c-format 376#, c-format
505msgid "" 377msgid ""
@@ -507,6 +379,15 @@ msgid ""
507"= %u KiB/s\n" 379"= %u KiB/s\n"
508msgstr "" 380msgstr ""
509 381
382#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
383msgid "solver to use"
384msgstr ""
385
386#: src/ats-tests/gnunet-solver-eval.c:945
387#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
388msgid "experiment to use"
389msgstr ""
390
510#: src/ats-tool/gnunet-ats.c:307 391#: src/ats-tool/gnunet-ats.c:307
511#, c-format 392#, c-format
512msgid "%u address resolutions had a timeout\n" 393msgid "%u address resolutions had a timeout\n"
@@ -624,6 +505,123 @@ msgstr ""
624msgid "Print information about ATS state" 505msgid "Print information about ATS state"
625msgstr "Informationen über andere GNUnet Knoten ausgeben." 506msgstr "Informationen über andere GNUnet Knoten ausgeben."
626 507
508#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
509#, c-format
510msgid ""
511"Could not load quota for network `%s': `%s', assigning default bandwidth "
512"%llu\n"
513msgstr ""
514
515#: src/ats/gnunet-ats-solver-eval.c:2799
516#, c-format
517msgid ""
518"No outbound quota configured for network `%s', assigning default bandwidth "
519"%llu\n"
520msgstr ""
521
522#: src/ats/gnunet-ats-solver-eval.c:2840
523#, c-format
524msgid ""
525"No outbound quota configure for network `%s', assigning default bandwidth "
526"%llu\n"
527msgstr ""
528
529#: src/ats/gnunet-ats-solver-eval.c:3306
530msgid "print logging"
531msgstr ""
532
533#: src/ats/gnunet-ats-solver-eval.c:3311
534msgid "save logging to disk"
535msgstr ""
536
537#: src/ats/gnunet-ats-solver-eval.c:3316
538msgid "disable normalization"
539msgstr ""
540
541#: src/ats/gnunet-service-ats_plugins.c:304
542#, c-format
543msgid ""
544"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
545"%llu\n"
546msgstr ""
547
548#: src/ats/gnunet-service-ats_plugins.c:314
549#, c-format
550msgid "%s quota configured for network `%s' is %llu\n"
551msgstr ""
552
553#: src/ats/gnunet-service-ats_plugins.c:359
554#, c-format
555msgid ""
556"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
557msgstr ""
558
559#: src/ats/gnunet-service-ats_plugins.c:451
560#, fuzzy, c-format
561msgid "Failed to initialize solver `%s'!\n"
562msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
563
564#: src/ats/plugin_ats_mlp.c:1274
565msgid "Problem size too large, cannot allocate memory!\n"
566msgstr ""
567
568#: src/ats/plugin_ats_mlp.c:1869
569#, fuzzy, c-format
570msgid "Adding address for peer `%s' multiple times\n"
571msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
572
573#: src/ats/plugin_ats_mlp.c:1913
574#, fuzzy, c-format
575msgid "Updating address property for peer `%s' %p not added before\n"
576msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
577
578#: src/ats/plugin_ats_mlp.c:2475
579msgid ""
580"MLP solver is not optimizing for anything, changing to feasibility check\n"
581msgstr ""
582
583#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
584#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
585#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
586#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
587#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
588#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
589#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
590#, fuzzy, c-format
591msgid "Invalid %s configuration %f \n"
592msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
593
594#: src/ats/plugin_ats_mlp.c:2670
595#, c-format
596msgid ""
597"Adjusting inconsistent outbound quota configuration for network `%s', is "
598"%llu must be at least %llu\n"
599msgstr ""
600
601#: src/ats/plugin_ats_mlp.c:2679
602#, c-format
603msgid ""
604"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
605"must be at least %llu\n"
606msgstr ""
607
608#: src/ats/plugin_ats_mlp.c:2689
609#, c-format
610msgid ""
611"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
612msgstr ""
613
614#: src/ats/plugin_ats_mlp.c:2698
615#, c-format
616msgid ""
617"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
618msgstr ""
619
620#: src/ats/plugin_ats_proportional.c:1164
621#, fuzzy, c-format
622msgid "Invalid %s configuration %f\n"
623msgstr " gconfig\tGTK Konfiguration\n"
624
627#: src/auction/gnunet-auction-create.c:163 625#: src/auction/gnunet-auction-create.c:163
628msgid "description of the item to be sold" 626msgid "description of the item to be sold"
629msgstr "" 627msgstr ""
@@ -769,6 +767,28 @@ msgstr "Ausführlicherer Modus (empfangene Werte ausgeben)"
769msgid "Connection to conversation service lost, trying to reconnect\n" 767msgid "Connection to conversation service lost, trying to reconnect\n"
770msgstr "" 768msgstr ""
771 769
770#: src/conversation/gnunet-conversation-test.c:119
771#, c-format
772msgid ""
773"\n"
774"End of transmission. Have a GNU day.\n"
775msgstr ""
776
777#: src/conversation/gnunet-conversation-test.c:145
778#, c-format
779msgid ""
780"\n"
781"We are now playing your recording back. If you can hear it, your audio "
782"settings are working..."
783msgstr ""
784
785#: src/conversation/gnunet-conversation-test.c:210
786#, c-format
787msgid ""
788"We will now be recording you for %s. After that time, the recording will be "
789"played back to you..."
790msgstr ""
791
772#: src/conversation/gnunet-conversation.c:269 792#: src/conversation/gnunet-conversation.c:269
773#, c-format 793#, c-format
774msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" 794msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1026,30 +1046,8 @@ msgstr ""
1026msgid "Enables having a conversation with other GNUnet users." 1046msgid "Enables having a conversation with other GNUnet users."
1027msgstr "" 1047msgstr ""
1028 1048
1029#: src/conversation/gnunet-conversation-test.c:119
1030#, c-format
1031msgid ""
1032"\n"
1033"End of transmission. Have a GNU day.\n"
1034msgstr ""
1035
1036#: src/conversation/gnunet-conversation-test.c:145
1037#, c-format
1038msgid ""
1039"\n"
1040"We are now playing your recording back. If you can hear it, your audio "
1041"settings are working..."
1042msgstr ""
1043
1044#: src/conversation/gnunet-conversation-test.c:210
1045#, c-format
1046msgid ""
1047"We will now be recording you for %s. After that time, the recording will be "
1048"played back to you..."
1049msgstr ""
1050
1051#: src/conversation/gnunet_gst.c:622
1052#: src/conversation/gnunet-helper-audio-playback-gst.c:356 1049#: src/conversation/gnunet-helper-audio-playback-gst.c:356
1050#: src/conversation/gnunet_gst.c:622
1053#, c-format 1051#, c-format
1054msgid "Read error from STDIN: %d %s\n" 1052msgid "Read error from STDIN: %d %s\n"
1055msgstr "Fehler beim Lesen aus STDIN: %d %s\n" 1053msgstr "Fehler beim Lesen aus STDIN: %d %s\n"
@@ -1174,6 +1172,11 @@ msgstr "ogg_stream_init() fehlgeschlagen.\n"
1174msgid "Failed to allocate %u bytes for second packet\n" 1172msgid "Failed to allocate %u bytes for second packet\n"
1175msgstr "UDP-Sockets können nicht geöffnet werden\n" 1173msgstr "UDP-Sockets können nicht geöffnet werden\n"
1176 1174
1175#: src/conversation/gnunet-service-conversation.c:1276
1176#, fuzzy, c-format
1177msgid "Could not open line, port %s already in use!\n"
1178msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n"
1179
1177#: src/conversation/microphone.c:119 1180#: src/conversation/microphone.c:119
1178msgid "Could not start record audio helper\n" 1181msgid "Could not start record audio helper\n"
1179msgstr "" 1182msgstr ""
@@ -1463,8 +1466,138 @@ msgstr "# Bytes empfangen über TCP"
1463msgid "# updates to my type map" 1466msgid "# updates to my type map"
1464msgstr "" 1467msgstr ""
1465 1468
1469#: src/credential/credential_misc.c:88
1470#, fuzzy, c-format
1471msgid "Unable to parse CRED record string `%s'\n"
1472msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
1473
1474#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
1475#: src/namestore/plugin_rest_namestore.c:1009
1476#, fuzzy, c-format
1477msgid "Ego `%s' not known to identity service\n"
1478msgstr "`%s': unbekannter Dienst: %s\n"
1479
1480#: src/credential/gnunet-credential.c:294
1481#: src/credential/gnunet-credential.c:446
1482#, c-format
1483msgid "Issuer public key `%s' is not well-formed\n"
1484msgstr ""
1485
1486#: src/credential/gnunet-credential.c:375
1487#: src/credential/gnunet-credential.c:435
1488#, fuzzy, c-format
1489msgid "Issuer public key not well-formed\n"
1490msgstr "Ungültiger Parameter: `%s'\n"
1491
1492#: src/credential/gnunet-credential.c:386
1493#: src/credential/gnunet-credential.c:455
1494#, fuzzy, c-format
1495msgid "Failed to connect to CREDENTIAL\n"
1496msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
1497
1498#: src/credential/gnunet-credential.c:392
1499#, c-format
1500msgid "You must provide issuer the attribute\n"
1501msgstr ""
1502
1503#: src/credential/gnunet-credential.c:399
1504#, fuzzy, c-format
1505msgid "ego required\n"
1506msgstr "Gültiger Typ ist erforderlich\n"
1507
1508#: src/credential/gnunet-credential.c:415
1509#, c-format
1510msgid "Subject public key needed\n"
1511msgstr ""
1512
1513#: src/credential/gnunet-credential.c:426
1514#, c-format
1515msgid "Subject public key `%s' is not well-formed\n"
1516msgstr ""
1517
1518#: src/credential/gnunet-credential.c:461
1519#, c-format
1520msgid "You must provide issuer and subject attributes\n"
1521msgstr ""
1522
1523#: src/credential/gnunet-credential.c:511
1524#, fuzzy, c-format
1525msgid "Issuer ego required\n"
1526msgstr "Gültiger Typ ist erforderlich\n"
1527
1528#: src/credential/gnunet-credential.c:523
1529#, c-format
1530msgid "Please specify name to lookup, subject key and issuer key!\n"
1531msgstr ""
1532
1533#: src/credential/gnunet-credential.c:543
1534msgid "create credential"
1535msgstr ""
1536
1537#: src/credential/gnunet-credential.c:547
1538msgid "verify credential against attribute"
1539msgstr ""
1540
1541#: src/credential/gnunet-credential.c:552
1542#, fuzzy
1543msgid "The public key of the subject to lookup the credential for"
1544msgstr "Die Priorität des Inhalts angeben"
1545
1546#: src/credential/gnunet-credential.c:557
1547msgid "The name of the credential presented by the subject"
1548msgstr ""
1549
1550#: src/credential/gnunet-credential.c:562
1551msgid "The public key of the authority to verify the credential against"
1552msgstr ""
1553
1554#: src/credential/gnunet-credential.c:567
1555msgid "The ego to use"
1556msgstr ""
1557
1558#: src/credential/gnunet-credential.c:572
1559msgid "The issuer attribute to verify against or to issue"
1560msgstr ""
1561
1562#: src/credential/gnunet-credential.c:577
1563msgid "The time to live for the credential"
1564msgstr ""
1565
1566#: src/credential/gnunet-credential.c:581
1567msgid "collect credentials"
1568msgstr ""
1569
1570#: src/credential/gnunet-credential.c:595
1571#, fuzzy
1572msgid "GNUnet credential resolver tool"
1573msgstr "GNUnet Netzwerk Topologie tracen."
1574
1575#: src/credential/gnunet-service-credential.c:1204
1576#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
1577#, fuzzy, c-format
1578msgid "Failed to connect to GNS\n"
1579msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
1580
1581#: src/credential/gnunet-service-credential.c:1210
1582#: src/namestore/gnunet-namestore-fcfsd.c:1034
1583#: src/namestore/gnunet-namestore.c:802
1584#: src/namestore/plugin_rest_namestore.c:1022
1585#, fuzzy, c-format
1586msgid "Failed to connect to namestore\n"
1587msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
1588
1589#: src/credential/plugin_gnsrecord_credential.c:186
1590#, fuzzy, c-format
1591msgid "Unable to parse ATTR record string `%s'\n"
1592msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
1593
1594#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
1595#, fuzzy
1596msgid "GNS REST API initialized\n"
1597msgstr " Verbindung fehlgeschlagen\n"
1598
1466#: src/datacache/datacache.c:119 src/datacache/datacache.c:294 1599#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
1467#: src/datastore/gnunet-service-datastore.c:775 1600#: src/datastore/gnunet-service-datastore.c:757
1468msgid "# bytes stored" 1601msgid "# bytes stored"
1469msgstr "# gespeicherte Bytes" 1602msgstr "# gespeicherte Bytes"
1470 1603
@@ -1506,13 +1639,12 @@ msgstr ""
1506 1639
1507#: src/datacache/plugin_datacache_sqlite.c:113 1640#: src/datacache/plugin_datacache_sqlite.c:113
1508#: src/datacache/plugin_datacache_sqlite.c:122 1641#: src/datacache/plugin_datacache_sqlite.c:122
1509#: src/datastore/plugin_datastore_mysql.c:980 1642#: src/datastore/plugin_datastore_mysql.c:892
1510#: src/datastore/plugin_datastore_sqlite.c:58 1643#: src/datastore/plugin_datastore_sqlite.c:58
1511#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 1644#: src/datastore/plugin_datastore_sqlite.c:66
1512#: src/mysql/mysql.c:42 src/mysql/mysql.c:49 1645#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
1513#: src/namecache/plugin_namecache_postgres.c:53 1646#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
1514#: src/namecache/plugin_namecache_sqlite.c:53 1647#: src/namecache/plugin_namecache_sqlite.c:53
1515#: src/namestore/plugin_namestore_postgres.c:53
1516#: src/namestore/plugin_namestore_sqlite.c:53 1648#: src/namestore/plugin_namestore_sqlite.c:53
1517#: src/peerstore/plugin_peerstore_sqlite.c:52 1649#: src/peerstore/plugin_peerstore_sqlite.c:52
1518#: src/psycstore/plugin_psycstore_mysql.c:62 1650#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1521,14 +1653,15 @@ msgstr ""
1521#: src/testbed/gnunet-daemon-testbed-underlay.c:56 1653#: src/testbed/gnunet-daemon-testbed-underlay.c:56
1522#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 1654#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
1523#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 1655#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
1524#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 1656#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
1525#: src/scalarproduct/scalarproduct.h:35 1657#: src/scalarproduct/scalarproduct.h:35
1526#, c-format 1658#, c-format
1527msgid "`%s' failed at %s:%d with error: %s\n" 1659msgid "`%s' failed at %s:%d with error: %s\n"
1528msgstr "»%s« schlug bei %s:%d mit dem Fehler %s fehl\n" 1660msgstr "»%s« schlug bei %s:%d mit dem Fehler %s fehl\n"
1529 1661
1530#: src/datacache/plugin_datacache_sqlite.c:817 1662#: src/datacache/plugin_datacache_sqlite.c:817
1531#: src/datastore/plugin_datastore_sqlite.c:475 1663#: src/datastore/plugin_datastore_sqlite.c:456
1664#: src/identity-provider/plugin_identity_provider_sqlite.c:336
1532#: src/namecache/plugin_namecache_sqlite.c:296 1665#: src/namecache/plugin_namecache_sqlite.c:296
1533#: src/namestore/plugin_namestore_sqlite.c:355 1666#: src/namestore/plugin_namestore_sqlite.c:355
1534msgid "Tried to close sqlite without finalizing all prepared statements.\n" 1667msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1596,23 +1729,74 @@ msgstr ""
1596msgid "# GET requests executed" 1729msgid "# GET requests executed"
1597msgstr "# ausgeführte GET-Anfragen" 1730msgstr "# ausgeführte GET-Anfragen"
1598 1731
1599#: src/datastore/gnunet-datastore.c:113 1732#: src/datastore/gnunet-datastore.c:189
1733#, c-format
1734msgid "Dumped %<PRIu64> records\n"
1735msgstr ""
1736
1737#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
1738#, c-format
1739msgid "Short write to file: %zd bytes expecting %zd\n"
1740msgstr ""
1741
1742#: src/datastore/gnunet-datastore.c:261
1743#, fuzzy
1744msgid "Error queueing datastore GET operation\n"
1745msgstr "Fehler beim Anlegen des Benutzers"
1746
1747#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
1748#, fuzzy, c-format
1749msgid "Unable to open dump file: %s\n"
1750msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
1751
1752#: src/datastore/gnunet-datastore.c:326
1600#, c-format 1753#, c-format
1601msgid "Failed to store item: %s, aborting\n" 1754msgid "Failed to store item: %s, aborting\n"
1602msgstr "Objekt konnte nicht gespeichert werden: %s, Abbruch\n" 1755msgstr "Objekt konnte nicht gespeichert werden: %s, Abbruch\n"
1603 1756
1604#: src/datastore/gnunet-datastore.c:209 1757#: src/datastore/gnunet-datastore.c:340
1605#, c-format 1758#, c-format
1606msgid "Cannot use the same configuration for source and destination\n" 1759msgid "Inserted %<PRIu64> records\n"
1607msgstr "" 1760msgstr ""
1608 1761
1609#: src/datastore/gnunet-datastore.c:256 1762#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
1610msgid "" 1763#, c-format
1611"specifies the configuration to use to access an alternative datastore; will " 1764msgid "Short read from file: %zd bytes expecting %zd\n"
1612"merge that datastore into our current datastore"
1613msgstr "" 1765msgstr ""
1614 1766
1615#: src/datastore/gnunet-datastore.c:265 1767#: src/datastore/gnunet-datastore.c:389
1768#, fuzzy
1769msgid "Error queueing datastore PUT operation\n"
1770msgstr "Fehler beim Anlegen des Benutzers"
1771
1772#: src/datastore/gnunet-datastore.c:432
1773msgid "Input file is not of a supported format\n"
1774msgstr ""
1775
1776#: src/datastore/gnunet-datastore.c:458
1777#, fuzzy
1778msgid "Failed connecting to the datastore.\n"
1779msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
1780
1781#: src/datastore/gnunet-datastore.c:470
1782#, c-format
1783msgid "Please choose at least one operation: %s, %s\n"
1784msgstr ""
1785
1786#: src/datastore/gnunet-datastore.c:493
1787msgid "Dump all records from the datastore"
1788msgstr ""
1789
1790#: src/datastore/gnunet-datastore.c:497
1791#, fuzzy
1792msgid "Insert records into the datastore"
1793msgstr "# bytes in der Datenbank"
1794
1795#: src/datastore/gnunet-datastore.c:502
1796msgid "File to dump or insert"
1797msgstr ""
1798
1799#: src/datastore/gnunet-datastore.c:511
1616#, fuzzy 1800#, fuzzy
1617msgid "Manipulate GNUnet datastore" 1801msgid "Manipulate GNUnet datastore"
1618msgstr "sqlite Datenspeicher" 1802msgstr "sqlite Datenspeicher"
@@ -1655,8 +1839,8 @@ msgstr ""
1655 1839
1656#: src/datastore/gnunet-service-datastore.c:634 1840#: src/datastore/gnunet-service-datastore.c:634
1657#: src/datastore/gnunet-service-datastore.c:689 1841#: src/datastore/gnunet-service-datastore.c:689
1658#: src/datastore/gnunet-service-datastore.c:977 1842#: src/datastore/gnunet-service-datastore.c:837
1659#: src/datastore/gnunet-service-datastore.c:1633 1843#: src/datastore/gnunet-service-datastore.c:1469
1660msgid "# reserved" 1844msgid "# reserved"
1661msgstr "" 1845msgstr ""
1662 1846
@@ -1664,147 +1848,148 @@ msgstr ""
1664msgid "Could not find matching reservation" 1848msgid "Could not find matching reservation"
1665msgstr "" 1849msgstr ""
1666 1850
1667#: src/datastore/gnunet-service-datastore.c:792 1851#: src/datastore/gnunet-service-datastore.c:773
1668#, c-format 1852#, c-format
1669msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" 1853msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
1670msgstr "" 1854msgstr ""
1671 1855
1672#: src/datastore/gnunet-service-datastore.c:1026 1856#: src/datastore/gnunet-service-datastore.c:876
1673#, fuzzy 1857#, fuzzy
1674msgid "# GET requests received" 1858msgid "# GET requests received"
1675msgstr "# Client Trace-Anfragen empfangen" 1859msgstr "# Client Trace-Anfragen empfangen"
1676 1860
1677#: src/datastore/gnunet-service-datastore.c:1058 1861#: src/datastore/gnunet-service-datastore.c:907
1678#, fuzzy 1862#, fuzzy
1679msgid "# GET KEY requests received" 1863msgid "# GET KEY requests received"
1680msgstr "# Client Trace-Anfragen empfangen" 1864msgstr "# Client Trace-Anfragen empfangen"
1681 1865
1682#: src/datastore/gnunet-service-datastore.c:1071 1866#: src/datastore/gnunet-service-datastore.c:920
1683msgid "# requests filtered by bloomfilter" 1867msgid "# requests filtered by bloomfilter"
1684msgstr "" 1868msgstr ""
1685 1869
1686#: src/datastore/gnunet-service-datastore.c:1108 1870#: src/datastore/gnunet-service-datastore.c:956
1687#, fuzzy 1871#, fuzzy
1688msgid "# GET REPLICATION requests received" 1872msgid "# GET REPLICATION requests received"
1689msgstr "# Client Trace-Anfragen empfangen" 1873msgstr "# Client Trace-Anfragen empfangen"
1690 1874
1691#: src/datastore/gnunet-service-datastore.c:1141 1875#: src/datastore/gnunet-service-datastore.c:989
1692#, fuzzy 1876#, fuzzy
1693msgid "# GET ZERO ANONYMITY requests received" 1877msgid "# GET ZERO ANONYMITY requests received"
1694msgstr "# Client Trace-Anfragen empfangen" 1878msgstr "# Client Trace-Anfragen empfangen"
1695 1879
1696#: src/datastore/gnunet-service-datastore.c:1190 1880#: src/datastore/gnunet-service-datastore.c:1036
1697msgid "Content not found" 1881msgid "Content not found"
1698msgstr "Kein Inhalt gefunden" 1882msgstr "Kein Inhalt gefunden"
1699 1883
1700#: src/datastore/gnunet-service-datastore.c:1199 1884#: src/datastore/gnunet-service-datastore.c:1043
1701msgid "# bytes removed (explicit request)" 1885msgid "# bytes removed (explicit request)"
1702msgstr "" 1886msgstr ""
1703 1887
1704#: src/datastore/gnunet-service-datastore.c:1246 1888#: src/datastore/gnunet-service-datastore.c:1088
1705#, fuzzy 1889#, fuzzy
1706msgid "# REMOVE requests received" 1890msgid "# REMOVE requests received"
1707msgstr "# Client Trace-Anfragen empfangen" 1891msgstr "# Client Trace-Anfragen empfangen"
1708 1892
1709#: src/datastore/gnunet-service-datastore.c:1301 1893#: src/datastore/gnunet-service-datastore.c:1137
1710#, c-format 1894#, c-format
1711msgid "" 1895msgid ""
1712"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" 1896"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
1713msgstr "" 1897msgstr ""
1714 1898
1715#: src/datastore/gnunet-service-datastore.c:1307 1899#: src/datastore/gnunet-service-datastore.c:1143
1716#: src/datastore/gnunet-service-datastore.c:1482 1900#: src/datastore/gnunet-service-datastore.c:1318
1717#, c-format 1901#, c-format
1718msgid "New payload: %lld\n" 1902msgid "New payload: %lld\n"
1719msgstr "" 1903msgstr ""
1720 1904
1721#: src/datastore/gnunet-service-datastore.c:1361 1905#: src/datastore/gnunet-service-datastore.c:1197
1722#, c-format 1906#, c-format
1723msgid "Loading `%s' datastore plugin\n" 1907msgid "Loading `%s' datastore plugin\n"
1724msgstr "" 1908msgstr ""
1725 1909
1726#: src/datastore/gnunet-service-datastore.c:1373 1910#: src/datastore/gnunet-service-datastore.c:1209
1727#, fuzzy, c-format 1911#, fuzzy, c-format
1728msgid "Failed to load datastore plugin for `%s'\n" 1912msgid "Failed to load datastore plugin for `%s'\n"
1729msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" 1913msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
1730 1914
1731#: src/datastore/gnunet-service-datastore.c:1433 1915#: src/datastore/gnunet-service-datastore.c:1269
1732msgid "Bloomfilter construction complete.\n" 1916msgid "Bloomfilter construction complete.\n"
1733msgstr "" 1917msgstr ""
1734 1918
1735#: src/datastore/gnunet-service-datastore.c:1489 1919#: src/datastore/gnunet-service-datastore.c:1325
1736msgid "Rebuilding bloomfilter. Please be patient.\n" 1920msgid "Rebuilding bloomfilter. Please be patient.\n"
1737msgstr "" 1921msgstr ""
1738 1922
1739#: src/datastore/gnunet-service-datastore.c:1500 1923#: src/datastore/gnunet-service-datastore.c:1336
1740msgid "Plugin does not support get_keys function. Please fix!\n" 1924msgid "Plugin does not support get_keys function. Please fix!\n"
1741msgstr "" 1925msgstr ""
1742 1926
1743#: src/datastore/gnunet-service-datastore.c:1670 1927#: src/datastore/gnunet-service-datastore.c:1506
1744#, fuzzy, c-format 1928#, fuzzy, c-format
1745msgid "# bytes used in file-sharing datastore `%s'" 1929msgid "# bytes used in file-sharing datastore `%s'"
1746msgstr "# bytes erlaubt in der Datenbank" 1930msgstr "# bytes erlaubt in der Datenbank"
1747 1931
1748#: src/datastore/gnunet-service-datastore.c:1686 1932#: src/datastore/gnunet-service-datastore.c:1522
1749msgid "# quota" 1933msgid "# quota"
1750msgstr "# Kontingent" 1934msgstr "# Kontingent"
1751 1935
1752#: src/datastore/gnunet-service-datastore.c:1691 1936#: src/datastore/gnunet-service-datastore.c:1527
1753msgid "# cache size" 1937msgid "# cache size"
1754msgstr "# Zwischenspeichergröße" 1938msgstr "# Zwischenspeichergröße"
1755 1939
1756#: src/datastore/gnunet-service-datastore.c:1707 1940#: src/datastore/gnunet-service-datastore.c:1543
1757#, c-format 1941#, c-format
1758msgid "Could not use specified filename `%s' for bloomfilter.\n" 1942msgid "Could not use specified filename `%s' for bloomfilter.\n"
1759msgstr "" 1943msgstr ""
1760 1944
1761#: src/datastore/gnunet-service-datastore.c:1725 1945#: src/datastore/gnunet-service-datastore.c:1561
1762#: src/datastore/gnunet-service-datastore.c:1741 1946#: src/datastore/gnunet-service-datastore.c:1577
1763#, fuzzy, c-format 1947#, fuzzy, c-format
1764msgid "Failed to remove bogus bloomfilter file `%s'\n" 1948msgid "Failed to remove bogus bloomfilter file `%s'\n"
1765msgstr "Datei wurde als `%s' gespeichert.\n" 1949msgstr "Datei wurde als `%s' gespeichert.\n"
1766 1950
1767#: src/datastore/gnunet-service-datastore.c:1773 1951#: src/datastore/gnunet-service-datastore.c:1609
1768msgid "Failed to initialize bloomfilter.\n" 1952msgid "Failed to initialize bloomfilter.\n"
1769msgstr "Bloomfilter konnte nicht initialisiert werden.\n" 1953msgstr "Bloomfilter konnte nicht initialisiert werden.\n"
1770 1954
1771#: src/datastore/plugin_datastore_heap.c:769 1955#: src/datastore/plugin_datastore_heap.c:893
1772msgid "Heap database running\n" 1956msgid "Heap database running\n"
1773msgstr "Heap-Datenbank läuft\n" 1957msgstr "Heap-Datenbank läuft\n"
1774 1958
1775#: src/datastore/plugin_datastore_mysql.c:377 1959#: src/datastore/plugin_datastore_mysql.c:371
1776#: src/datastore/plugin_datastore_sqlite.c:590 1960#: src/datastore/plugin_datastore_mysql.c:423
1961#: src/datastore/plugin_datastore_mysql.c:1075
1962msgid "MySQL statement run failure"
1963msgstr ""
1964
1965#: src/datastore/plugin_datastore_mysql.c:410
1966#: src/datastore/plugin_datastore_sqlite.c:626
1777#, fuzzy 1967#, fuzzy
1778msgid "Data too large" 1968msgid "Data too large"
1779msgstr "Anzahl der Werte" 1969msgstr "Anzahl der Werte"
1780 1970
1781#: src/datastore/plugin_datastore_mysql.c:393 1971#: src/datastore/plugin_datastore_mysql.c:848
1782msgid "MySQL statement run failure"
1783msgstr ""
1784
1785#: src/datastore/plugin_datastore_mysql.c:936
1786#, fuzzy, c-format 1972#, fuzzy, c-format
1787msgid "`%s' for `%s' failed at %s:%d with error: %s\n" 1973msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
1788msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n" 1974msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n"
1789 1975
1790#: src/datastore/plugin_datastore_mysql.c:1208 1976#: src/datastore/plugin_datastore_mysql.c:1180
1791#: src/psycstore/plugin_psycstore_mysql.c:1936 1977#: src/psycstore/plugin_psycstore_mysql.c:1936
1792msgid "Mysql database running\n" 1978msgid "Mysql database running\n"
1793msgstr "MySQL-Datenbank läuft\n" 1979msgstr "MySQL-Datenbank läuft\n"
1794 1980
1795#: src/datastore/plugin_datastore_postgres.c:345 1981#: src/datastore/plugin_datastore_postgres.c:274
1982#: src/datastore/plugin_datastore_postgres.c:891
1796msgid "Postgress exec failure" 1983msgid "Postgress exec failure"
1797msgstr "" 1984msgstr ""
1798 1985
1799#: src/datastore/plugin_datastore_postgres.c:866 1986#: src/datastore/plugin_datastore_postgres.c:852
1800#, fuzzy 1987#, fuzzy
1801msgid "Failed to drop table from database.\n" 1988msgid "Failed to drop table from database.\n"
1802msgstr "Fehler beim Binden an UDP Port %d.\n" 1989msgstr "Fehler beim Binden an UDP Port %d.\n"
1803 1990
1804#: src/datastore/plugin_datastore_postgres.c:903 1991#: src/datastore/plugin_datastore_postgres.c:950
1805#: src/namecache/plugin_namecache_postgres.c:398 1992#: src/psycstore/plugin_psycstore_postgres.c:1506
1806#: src/namestore/plugin_namestore_postgres.c:571
1807#: src/psycstore/plugin_psycstore_postgres.c:1721
1808msgid "Postgres database running\n" 1993msgid "Postgres database running\n"
1809msgstr "PostgreSQL-Datenbank läuft\n" 1994msgstr "PostgreSQL-Datenbank läuft\n"
1810 1995
@@ -1816,7 +2001,8 @@ msgstr "PostgreSQL-Datenbank läuft\n"
1816msgid "`%s' failed at %s:%u with error: %s" 2001msgid "`%s' failed at %s:%u with error: %s"
1817msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" 2002msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
1818 2003
1819#: src/datastore/plugin_datastore_sqlite.c:281 2004#: src/datastore/plugin_datastore_sqlite.c:271
2005#: src/identity-provider/plugin_identity_provider_sqlite.c:212
1820#: src/namecache/plugin_namecache_sqlite.c:194 2006#: src/namecache/plugin_namecache_sqlite.c:194
1821#: src/namestore/plugin_namestore_sqlite.c:222 2007#: src/namestore/plugin_namestore_sqlite.c:222
1822#: src/peerstore/plugin_peerstore_sqlite.c:535 2008#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1825,24 +2011,29 @@ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
1825msgid "Unable to initialize SQLite: %s.\n" 2011msgid "Unable to initialize SQLite: %s.\n"
1826msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n" 2012msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n"
1827 2013
1828#: src/datastore/plugin_datastore_sqlite.c:1234 2014#: src/datastore/plugin_datastore_sqlite.c:577
2015msgid "sqlite bind failure"
2016msgstr ""
2017
2018#: src/datastore/plugin_datastore_sqlite.c:1259
1829msgid "sqlite version to old to determine size, assuming zero\n" 2019msgid "sqlite version to old to determine size, assuming zero\n"
1830msgstr "" 2020msgstr ""
1831 2021
1832#: src/datastore/plugin_datastore_sqlite.c:1268 2022#: src/datastore/plugin_datastore_sqlite.c:1293
1833#, c-format 2023#, c-format
1834msgid "" 2024msgid ""
1835"Using sqlite page utilization to estimate payload (%llu pages of size %llu " 2025"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
1836"bytes)\n" 2026"bytes)\n"
1837msgstr "" 2027msgstr ""
1838 2028
1839#: src/datastore/plugin_datastore_sqlite.c:1312 2029#: src/datastore/plugin_datastore_sqlite.c:1337
2030#: src/identity-provider/plugin_identity_provider_sqlite.c:711
1840#: src/namecache/plugin_namecache_sqlite.c:603 2031#: src/namecache/plugin_namecache_sqlite.c:603
1841#: src/namestore/plugin_namestore_sqlite.c:802 2032#: src/namestore/plugin_namestore_sqlite.c:802
1842msgid "Sqlite database running\n" 2033msgid "Sqlite database running\n"
1843msgstr "Sqlite-Datenbank läuft\n" 2034msgstr "Sqlite-Datenbank läuft\n"
1844 2035
1845#: src/datastore/plugin_datastore_template.c:259 2036#: src/datastore/plugin_datastore_template.c:253
1846msgid "Template database running\n" 2037msgid "Template database running\n"
1847msgstr "" 2038msgstr ""
1848 2039
@@ -1903,52 +2094,6 @@ msgstr ""
1903msgid "Prints all packets that go through the DHT." 2094msgid "Prints all packets that go through the DHT."
1904msgstr "" 2095msgstr ""
1905 2096
1906#: src/dht/gnunet_dht_profiler.c:1161
1907#: src/testbed/gnunet-testbed-profiler.c:255
1908#, c-format
1909msgid "Exiting as the number of peers is %u\n"
1910msgstr ""
1911
1912#: src/dht/gnunet_dht_profiler.c:1188
1913#, fuzzy
1914msgid "number of peers to start"
1915msgstr "Anzahl an Durchläufen"
1916
1917#: src/dht/gnunet_dht_profiler.c:1194
1918msgid ""
1919"maximum number of times we try to search for successor circle formation (0 "
1920"for R5N)"
1921msgstr ""
1922
1923#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
1924#: src/testbed/gnunet-testbed-profiler.c:305
1925msgid "name of the file with the login information for the testbed"
1926msgstr ""
1927
1928#: src/dht/gnunet_dht_profiler.c:1206
1929msgid "delay between rounds for collecting statistics (default: 30 sec)"
1930msgstr ""
1931
1932#: src/dht/gnunet_dht_profiler.c:1212
1933msgid "delay to start doing PUTs (default: 1 sec)"
1934msgstr ""
1935
1936#: src/dht/gnunet_dht_profiler.c:1218
1937msgid "delay to start doing GETs (default: 5 min)"
1938msgstr ""
1939
1940#: src/dht/gnunet_dht_profiler.c:1223
1941msgid "replication degree for DHT PUTs"
1942msgstr ""
1943
1944#: src/dht/gnunet_dht_profiler.c:1230
1945msgid "timeout for DHT PUT and GET requests (default: 1 min)"
1946msgstr ""
1947
1948#: src/dht/gnunet_dht_profiler.c:1248
1949msgid "Measure quality and performance of the DHT service."
1950msgstr ""
1951
1952#: src/dht/gnunet-dht-put.c:120 2097#: src/dht/gnunet-dht-put.c:120
1953msgid "PUT request sent with key" 2098msgid "PUT request sent with key"
1954msgstr "" 2099msgstr ""
@@ -2215,6 +2360,51 @@ msgstr ""
2215msgid "# DHT requests combined" 2360msgid "# DHT requests combined"
2216msgstr "# dht Anfragen weitergeleitet" 2361msgstr "# dht Anfragen weitergeleitet"
2217 2362
2363#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
2364#, c-format
2365msgid "Exiting as the number of peers is %u\n"
2366msgstr ""
2367
2368#: src/dht/gnunet_dht_profiler.c:1188
2369#, fuzzy
2370msgid "number of peers to start"
2371msgstr "Anzahl an Durchläufen"
2372
2373#: src/dht/gnunet_dht_profiler.c:1194
2374msgid ""
2375"maximum number of times we try to search for successor circle formation (0 "
2376"for R5N)"
2377msgstr ""
2378
2379#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2380#: src/testbed/gnunet-testbed-profiler.c:305
2381msgid "name of the file with the login information for the testbed"
2382msgstr ""
2383
2384#: src/dht/gnunet_dht_profiler.c:1206
2385msgid "delay between rounds for collecting statistics (default: 30 sec)"
2386msgstr ""
2387
2388#: src/dht/gnunet_dht_profiler.c:1212
2389msgid "delay to start doing PUTs (default: 1 sec)"
2390msgstr ""
2391
2392#: src/dht/gnunet_dht_profiler.c:1218
2393msgid "delay to start doing GETs (default: 5 min)"
2394msgstr ""
2395
2396#: src/dht/gnunet_dht_profiler.c:1223
2397msgid "replication degree for DHT PUTs"
2398msgstr ""
2399
2400#: src/dht/gnunet_dht_profiler.c:1230
2401msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2402msgstr ""
2403
2404#: src/dht/gnunet_dht_profiler.c:1248
2405msgid "Measure quality and performance of the DHT service."
2406msgstr ""
2407
2218#: src/dht/plugin_block_dht.c:187 2408#: src/dht/plugin_block_dht.c:187
2219#, fuzzy, c-format 2409#, fuzzy, c-format
2220msgid "Block not of type %u\n" 2410msgid "Block not of type %u\n"
@@ -2546,7 +2736,7 @@ msgstr ""
2546msgid "No useful service enabled. Exiting.\n" 2736msgid "No useful service enabled. Exiting.\n"
2547msgstr "" 2737msgstr ""
2548 2738
2549#: src/exit/gnunet-daemon-exit.c:3969 2739#: src/exit/gnunet-daemon-exit.c:3970
2550msgid "Daemon to run to provide an IP exit node for the VPN" 2740msgid "Daemon to run to provide an IP exit node for the VPN"
2551msgstr "" 2741msgstr ""
2552 2742
@@ -3199,15 +3389,6 @@ msgid ""
3199"chk/...)" 3389"chk/...)"
3200msgstr "" 3390msgstr ""
3201 3391
3202#: src/fs/gnunet-fs.c:119
3203msgid "print a list of all indexed files"
3204msgstr ""
3205
3206#: src/fs/gnunet-fs.c:130
3207#, fuzzy
3208msgid "Special file-sharing operations"
3209msgstr "Alle Optionen anzeigen"
3210
3211#: src/fs/gnunet-fs-profiler.c:211 3392#: src/fs/gnunet-fs-profiler.c:211
3212msgid "run the experiment with COUNT peers" 3393msgid "run the experiment with COUNT peers"
3213msgstr "" 3394msgstr ""
@@ -3224,6 +3405,15 @@ msgstr ""
3224msgid "run a testbed to measure file-sharing performance" 3405msgid "run a testbed to measure file-sharing performance"
3225msgstr "" 3406msgstr ""
3226 3407
3408#: src/fs/gnunet-fs.c:119
3409msgid "print a list of all indexed files"
3410msgstr ""
3411
3412#: src/fs/gnunet-fs.c:130
3413#, fuzzy
3414msgid "Special file-sharing operations"
3415msgstr "Alle Optionen anzeigen"
3416
3227#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231 3417#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
3228#, c-format 3418#, c-format
3229msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" 3419msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3923,22 +4113,11 @@ msgstr ""
3923msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4113msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3924msgstr "" 4114msgstr ""
3925 4115
3926#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 4116#: src/gns/gnunet-gns-helper-service-w32.c:602
3927#, c-format 4117msgid "Not ready to process requests, lacking ego data\n"
3928msgid "Invalid typename specified, assuming `ANY'\n"
3929msgstr ""
3930
3931#: src/gns/gnunet-gns.c:252
3932#, c-format
3933msgid "Please specify name to lookup!\n"
3934msgstr ""
3935
3936#: src/gns/gnunet-gns.c:276
3937#, c-format
3938msgid "Ego for `%s' not found, cannot perform lookup.\n"
3939msgstr "" 4118msgstr ""
3940 4119
3941#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701 4120#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
3942#: src/gns/plugin_rest_gns.c:422 4121#: src/gns/plugin_rest_gns.c:422
3943#, c-format 4122#, c-format
3944msgid "" 4123msgid ""
@@ -3946,56 +4125,12 @@ msgid ""
3946"gns-import.sh?\n" 4125"gns-import.sh?\n"
3947msgstr "" 4126msgstr ""
3948 4127
3949#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
3950#, fuzzy, c-format
3951msgid "Failed to connect to GNS\n"
3952msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
3953
3954#: src/gns/gnunet-gns.c:374
3955#, c-format
3956msgid "Public key `%s' is not well-formed\n"
3957msgstr ""
3958
3959#: src/gns/gnunet-gns.c:428
3960msgid "Lookup a record for the given name"
3961msgstr ""
3962
3963#: src/gns/gnunet-gns.c:434
3964#, fuzzy
3965msgid "Specify the type of the record to lookup"
3966msgstr "Die Priorität des Inhalts angeben"
3967
3968#: src/gns/gnunet-gns.c:440
3969msgid "Specify timeout for the lookup"
3970msgstr ""
3971
3972#: src/gns/gnunet-gns.c:445
3973msgid "No unneeded output"
3974msgstr ""
3975
3976#: src/gns/gnunet-gns.c:451
3977msgid "Specify the public key of the zone to lookup the record in"
3978msgstr ""
3979
3980#: src/gns/gnunet-gns.c:457
3981msgid "Specify the name of the ego of the zone to lookup the record in"
3982msgstr ""
3983
3984#: src/gns/gnunet-gns.c:476
3985#, fuzzy
3986msgid "GNUnet GNS resolver tool"
3987msgstr "GNUnet Netzwerk Topologie tracen."
3988
3989#: src/gns/gnunet-gns-helper-service-w32.c:602
3990msgid "Not ready to process requests, lacking ego data\n"
3991msgstr ""
3992
3993#: src/gns/gnunet-gns-helper-service-w32.c:739 4128#: src/gns/gnunet-gns-helper-service-w32.c:739
3994#, fuzzy, c-format 4129#, fuzzy, c-format
3995msgid "Failed to connect to identity service\n" 4130msgid "Failed to connect to identity service\n"
3996msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" 4131msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
3997 4132
3998#: src/gns/gnunet-gns-import.c:489 4133#: src/gns/gnunet-gns-import.c:452
3999msgid "This program will import some GNS authorities into your GNS namestore." 4134msgid "This program will import some GNS authorities into your GNS namestore."
4000msgstr "" 4135msgstr ""
4001 4136
@@ -4120,13 +4255,63 @@ msgstr ""
4120msgid "GNUnet GNS proxy" 4255msgid "GNUnet GNS proxy"
4121msgstr "" 4256msgstr ""
4122 4257
4258#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
4259#, c-format
4260msgid "Invalid typename specified, assuming `ANY'\n"
4261msgstr ""
4262
4263#: src/gns/gnunet-gns.c:252
4264#, c-format
4265msgid "Please specify name to lookup!\n"
4266msgstr ""
4267
4268#: src/gns/gnunet-gns.c:276
4269#, c-format
4270msgid "Ego for `%s' not found, cannot perform lookup.\n"
4271msgstr ""
4272
4273#: src/gns/gnunet-gns.c:374
4274#, c-format
4275msgid "Public key `%s' is not well-formed\n"
4276msgstr ""
4277
4278#: src/gns/gnunet-gns.c:428
4279msgid "Lookup a record for the given name"
4280msgstr ""
4281
4282#: src/gns/gnunet-gns.c:434
4283#, fuzzy
4284msgid "Specify the type of the record to lookup"
4285msgstr "Die Priorität des Inhalts angeben"
4286
4287#: src/gns/gnunet-gns.c:440
4288msgid "Specify timeout for the lookup"
4289msgstr ""
4290
4291#: src/gns/gnunet-gns.c:445
4292msgid "No unneeded output"
4293msgstr ""
4294
4295#: src/gns/gnunet-gns.c:451
4296msgid "Specify the public key of the zone to lookup the record in"
4297msgstr ""
4298
4299#: src/gns/gnunet-gns.c:457
4300msgid "Specify the name of the ego of the zone to lookup the record in"
4301msgstr ""
4302
4303#: src/gns/gnunet-gns.c:476
4304#, fuzzy
4305msgid "GNUnet GNS resolver tool"
4306msgstr "GNUnet Netzwerk Topologie tracen."
4307
4123#: src/gns/gnunet-service-gns.c:442 4308#: src/gns/gnunet-service-gns.c:442
4124#, fuzzy 4309#, fuzzy
4125msgid "Failed to connect to the namecache!\n" 4310msgid "Failed to connect to the namecache!\n"
4126msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" 4311msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
4127 4312
4128#: src/gns/gnunet-service-gns.c:461 4313#: src/gns/gnunet-service-gns.c:461
4129#: src/zonemaster/gnunet-service-zonemaster.c:741 4314#: src/zonemaster/gnunet-service-zonemaster.c:742
4130#, fuzzy 4315#, fuzzy
4131msgid "Could not connect to DHT!\n" 4316msgid "Could not connect to DHT!\n"
4132msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n" 4317msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n"
@@ -4185,45 +4370,35 @@ msgstr ""
4185msgid "Hostname `%s' is not well-formed, resolution fails\n" 4370msgid "Hostname `%s' is not well-formed, resolution fails\n"
4186msgstr "" 4371msgstr ""
4187 4372
4188#: src/gns/plugin_gnsrecord_gns.c:203 4373#: src/gns/plugin_gnsrecord_gns.c:179
4189#, c-format 4374#, c-format
4190msgid "Unable to parse PKEY record `%s'\n" 4375msgid "Unable to parse PKEY record `%s'\n"
4191msgstr "" 4376msgstr ""
4192 4377
4193#: src/gns/plugin_gnsrecord_gns.c:232 4378#: src/gns/plugin_gnsrecord_gns.c:208
4194#, fuzzy, c-format 4379#, fuzzy, c-format
4195msgid "Unable to parse GNS2DNS record `%s'\n" 4380msgid "Unable to parse GNS2DNS record `%s'\n"
4196msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" 4381msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
4197 4382
4198#: src/gns/plugin_gnsrecord_gns.c:253 4383#: src/gns/plugin_gnsrecord_gns.c:229
4199#, c-format 4384#, c-format
4200msgid "Failed to serialize GNS2DNS record with value `%s'\n" 4385msgid "Failed to serialize GNS2DNS record with value `%s'\n"
4201msgstr "" 4386msgstr ""
4202 4387
4203#: src/gns/plugin_gnsrecord_gns.c:276 4388#: src/gns/plugin_gnsrecord_gns.c:252
4204#, fuzzy, c-format 4389#, fuzzy, c-format
4205msgid "Unable to parse VPN record string `%s'\n" 4390msgid "Unable to parse VPN record string `%s'\n"
4206msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" 4391msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4207 4392
4208#: src/gns/plugin_gnsrecord_gns.c:312 4393#: src/gns/plugin_gnsrecord_gns.c:288
4209#, fuzzy, c-format 4394#, fuzzy, c-format
4210msgid "Unable to parse BOX record string `%s'\n" 4395msgid "Unable to parse BOX record string `%s'\n"
4211msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" 4396msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4212 4397
4213#: src/gns/plugin_gnsrecord_gns.c:360
4214#, fuzzy, c-format
4215msgid "Unable to parse REVERSE record string `%s'\n"
4216msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4217
4218#: src/gns/plugin_rest_gns.c:384 4398#: src/gns/plugin_rest_gns.c:384
4219msgid "Ego for not found, cannot perform lookup.\n" 4399msgid "Ego for not found, cannot perform lookup.\n"
4220msgstr "" 4400msgstr ""
4221 4401
4222#: src/gns/plugin_rest_gns.c:668
4223#, fuzzy
4224msgid "GNS REST API initialized\n"
4225msgstr " Verbindung fehlgeschlagen\n"
4226
4227#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4402#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4228#, c-format 4403#, c-format
4229msgid "Unable to parse IPv4 address `%s'\n" 4404msgid "Unable to parse IPv4 address `%s'\n"
@@ -4655,6 +4830,53 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n"
4655msgid "Could not start hostlist HTTP server on port %u\n" 4830msgid "Could not start hostlist HTTP server on port %u\n"
4656msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n" 4831msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
4657 4832
4833#: src/identity-provider/gnunet-idp.c:348
4834#, fuzzy
4835msgid "Ego is required\n"
4836msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
4837
4838#: src/identity-provider/gnunet-idp.c:370
4839msgid "Add attribute"
4840msgstr ""
4841
4842#: src/identity-provider/gnunet-idp.c:376
4843msgid "Attribute value"
4844msgstr ""
4845
4846#: src/identity-provider/gnunet-idp.c:381
4847msgid "Ego"
4848msgstr ""
4849
4850#: src/identity-provider/gnunet-idp.c:386
4851msgid "Audience (relying party)"
4852msgstr ""
4853
4854#: src/identity-provider/gnunet-idp.c:390
4855msgid "List attributes for Ego"
4856msgstr ""
4857
4858#: src/identity-provider/gnunet-idp.c:395
4859msgid "Issue a ticket"
4860msgstr ""
4861
4862#: src/identity-provider/gnunet-idp.c:400
4863msgid "Consume a ticket"
4864msgstr ""
4865
4866#: src/identity-provider/gnunet-idp.c:405
4867msgid "Revoke a ticket"
4868msgstr ""
4869
4870#: src/identity-provider/identity_provider_api.c:429
4871#, fuzzy
4872msgid "failed to store record\n"
4873msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
4874
4875#: src/identity-provider/plugin_rest_identity_provider.c:1175
4876#, fuzzy
4877msgid "Identity Provider REST API initialized\n"
4878msgstr " Verbindung fehlgeschlagen\n"
4879
4658#: src/identity/gnunet-identity.c:179 4880#: src/identity/gnunet-identity.c:179
4659#, fuzzy, c-format 4881#, fuzzy, c-format
4660msgid "Failed to create ego: %s\n" 4882msgid "Failed to create ego: %s\n"
@@ -4742,33 +4964,10 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4742msgid "Failed to create directory `%s' for storing egos\n" 4964msgid "Failed to create directory `%s' for storing egos\n"
4743msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" 4965msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
4744 4966
4745#: src/identity/plugin_rest_identity.c:967 4967#: src/identity/plugin_rest_identity.c:964
4746msgid "Identity REST API initialized\n" 4968msgid "Identity REST API initialized\n"
4747msgstr "" 4969msgstr ""
4748 4970
4749#: src/identity-provider/gnunet-identity-token.c:66
4750#, fuzzy
4751msgid "Option `-t' is required\n"
4752msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
4753
4754#: src/identity-provider/gnunet-identity-token.c:77
4755#, fuzzy, c-format
4756msgid "Token `%s' is malformed\n"
4757msgstr "Schlüssel »%s« ist gültig\n"
4758
4759#: src/identity-provider/gnunet-identity-token.c:166
4760msgid "GNUid token"
4761msgstr ""
4762
4763#: src/identity-provider/gnunet-identity-token.c:171
4764msgid "Print token contents"
4765msgstr ""
4766
4767#: src/identity-provider/plugin_rest_identity_provider.c:1166
4768#, fuzzy
4769msgid "Identity Token REST API initialized\n"
4770msgstr " Verbindung fehlgeschlagen\n"
4771
4772#: src/json/json.c:119 4971#: src/json/json.c:119
4773#, fuzzy, c-format 4972#, fuzzy, c-format
4774msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4973msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4870,11 +5069,65 @@ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
4870msgid "flat plugin running\n" 5069msgid "flat plugin running\n"
4871msgstr "Sqlite-Datenbank läuft\n" 5070msgstr "Sqlite-Datenbank läuft\n"
4872 5071
4873#: src/namecache/plugin_namecache_postgres.c:90 5072#: src/namestore/gnunet-namestore-fcfsd.c:508
4874#: src/namestore/plugin_namestore_postgres.c:97 5073#, fuzzy, c-format
5074msgid "Unsupported form value `%s'\n"
5075msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
5076
5077#: src/namestore/gnunet-namestore-fcfsd.c:535
5078#, fuzzy, c-format
5079msgid "Failed to create record for domain `%s': %s\n"
5080msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
5081
5082#: src/namestore/gnunet-namestore-fcfsd.c:555
5083msgid "Error when mapping zone to name\n"
5084msgstr ""
5085
5086#: src/namestore/gnunet-namestore-fcfsd.c:585
5087#, c-format
5088msgid "Found existing name `%s' for the given key\n"
5089msgstr ""
5090
5091#: src/namestore/gnunet-namestore-fcfsd.c:662
5092#, c-format
5093msgid "Found %u existing records for domain `%s'\n"
5094msgstr ""
5095
5096#: src/namestore/gnunet-namestore-fcfsd.c:718
5097#, fuzzy, c-format
5098msgid "Failed to create page for `%s'\n"
5099msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
5100
5101#: src/namestore/gnunet-namestore-fcfsd.c:734
5102#, fuzzy, c-format
5103msgid "Failed to setup post processor for `%s'\n"
5104msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
5105
5106#: src/namestore/gnunet-namestore-fcfsd.c:770
5107msgid "Domain name must not contain `.'\n"
5108msgstr ""
5109
5110#: src/namestore/gnunet-namestore-fcfsd.c:778
5111msgid "Domain name must not contain `+'\n"
5112msgstr ""
5113
5114#: src/namestore/gnunet-namestore-fcfsd.c:974
5115msgid "No ego configured for `fcfsd` subsystem\n"
5116msgstr ""
5117
5118#: src/namestore/gnunet-namestore-fcfsd.c:1000
4875#, fuzzy 5119#, fuzzy
4876msgid "Failed to create indices\n" 5120msgid "Failed to start HTTP server\n"
4877msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" 5121msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
5122
5123#: src/namestore/gnunet-namestore-fcfsd.c:1042
5124#, fuzzy
5125msgid "Failed to connect to identity\n"
5126msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
5127
5128#: src/namestore/gnunet-namestore-fcfsd.c:1074
5129msgid "GNU Name System First Come First Serve name registration service"
5130msgstr ""
4878 5131
4879#: src/namestore/gnunet-namestore.c:301 5132#: src/namestore/gnunet-namestore.c:301
4880#, c-format 5133#, c-format
@@ -4882,13 +5135,13 @@ msgid "Adding record failed: %s\n"
4882msgstr "" 5135msgstr ""
4883 5136
4884#: src/namestore/gnunet-namestore.c:330 5137#: src/namestore/gnunet-namestore.c:330
4885#: src/namestore/plugin_rest_namestore.c:562 5138#: src/namestore/plugin_rest_namestore.c:567
4886#, c-format 5139#, c-format
4887msgid "Deleting record failed, record does not exist%s%s\n" 5140msgid "Deleting record failed, record does not exist%s%s\n"
4888msgstr "" 5141msgstr ""
4889 5142
4890#: src/namestore/gnunet-namestore.c:337 5143#: src/namestore/gnunet-namestore.c:337
4891#: src/namestore/plugin_rest_namestore.c:571 5144#: src/namestore/plugin_rest_namestore.c:576
4892#, c-format 5145#, c-format
4893msgid "Deleting record failed%s%s\n" 5146msgid "Deleting record failed%s%s\n"
4894msgstr "" 5147msgstr ""
@@ -4906,7 +5159,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
4906msgstr "" 5159msgstr ""
4907 5160
4908#: src/namestore/gnunet-namestore.c:698 5161#: src/namestore/gnunet-namestore.c:698
4909#: src/namestore/plugin_rest_namestore.c:597 5162#: src/namestore/plugin_rest_namestore.c:602
4910#, c-format 5163#, c-format
4911msgid "There are no records under label `%s' that could be deleted.\n" 5164msgid "There are no records under label `%s' that could be deleted.\n"
4912msgstr "" 5165msgstr ""
@@ -4917,24 +5170,11 @@ msgid ""
4917"There are no records under label `%s' that match the request for deletion.\n" 5170"There are no records under label `%s' that match the request for deletion.\n"
4918msgstr "" 5171msgstr ""
4919 5172
4920#: src/namestore/gnunet-namestore.c:776
4921#: src/namestore/plugin_rest_namestore.c:1004
4922#, fuzzy, c-format
4923msgid "Ego `%s' not known to identity service\n"
4924msgstr "`%s': unbekannter Dienst: %s\n"
4925
4926#: src/namestore/gnunet-namestore.c:791 5173#: src/namestore/gnunet-namestore.c:791
4927#, c-format 5174#, c-format
4928msgid "No options given\n" 5175msgid "No options given\n"
4929msgstr "" 5176msgstr ""
4930 5177
4931#: src/namestore/gnunet-namestore.c:802
4932#: src/namestore/gnunet-namestore-fcfsd.c:1034
4933#: src/namestore/plugin_rest_namestore.c:1017
4934#, fuzzy
4935msgid "Failed to connect to namestore\n"
4936msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
4937
4938#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819 5178#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
4939#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861 5179#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
4940#: src/namestore/gnunet-namestore.c:915 5180#: src/namestore/gnunet-namestore.c:915
@@ -4948,14 +5188,14 @@ msgid "add"
4948msgstr "" 5188msgstr ""
4949 5189
4950#: src/namestore/gnunet-namestore.c:829 5190#: src/namestore/gnunet-namestore.c:829
4951#: src/namestore/plugin_rest_namestore.c:671 5191#: src/namestore/plugin_rest_namestore.c:676
4952#, fuzzy, c-format 5192#, fuzzy, c-format
4953msgid "Unsupported type `%s'\n" 5193msgid "Unsupported type `%s'\n"
4954msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" 5194msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
4955 5195
4956#: src/namestore/gnunet-namestore.c:851 5196#: src/namestore/gnunet-namestore.c:851
4957#: src/namestore/plugin_rest_namestore.c:689 5197#: src/namestore/plugin_rest_namestore.c:694
4958#: src/namestore/plugin_rest_namestore.c:729 5198#: src/namestore/plugin_rest_namestore.c:734
4959#, fuzzy, c-format 5199#, fuzzy, c-format
4960msgid "Value `%s' invalid for record type `%s'\n" 5200msgid "Value `%s' invalid for record type `%s'\n"
4961msgstr "%s: Symbolwert `%s' ist ungültig für %s\n" 5201msgstr "%s: Symbolwert `%s' ist ungültig für %s\n"
@@ -4974,8 +5214,7 @@ msgstr ""
4974msgid "Invalid public key for reverse lookup `%s'\n" 5214msgid "Invalid public key for reverse lookup `%s'\n"
4975msgstr "" 5215msgstr ""
4976 5216
4977#: src/namestore/gnunet-namestore.c:979 5217#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
4978#: src/peerinfo-tool/gnunet-peerinfo.c:775
4979#, fuzzy, c-format 5218#, fuzzy, c-format
4980msgid "Invalid URI `%s'\n" 5219msgid "Invalid URI `%s'\n"
4981msgstr "Ungültiger Parameter: `%s'\n" 5220msgstr "Ungültiger Parameter: `%s'\n"
@@ -4986,13 +5225,13 @@ msgid "Invalid nick `%s'\n"
4986msgstr "Ungültiger Parameter: `%s'\n" 5225msgstr "Ungültiger Parameter: `%s'\n"
4987 5226
4988#: src/namestore/gnunet-namestore.c:1051 5227#: src/namestore/gnunet-namestore.c:1051
4989#: src/namestore/plugin_rest_namestore.c:1047 5228#: src/namestore/plugin_rest_namestore.c:1052
4990#, c-format 5229#, c-format
4991msgid "No default ego configured in identity service\n" 5230msgid "No default ego configured in identity service\n"
4992msgstr "" 5231msgstr ""
4993 5232
4994#: src/namestore/gnunet-namestore.c:1108 5233#: src/namestore/gnunet-namestore.c:1108
4995#: src/namestore/plugin_rest_namestore.c:1143 5234#: src/namestore/plugin_rest_namestore.c:1148
4996#, fuzzy, c-format 5235#, fuzzy, c-format
4997msgid "Cannot connect to identity service\n" 5236msgid "Cannot connect to identity service\n"
4998msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n" 5237msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
@@ -5052,67 +5291,7 @@ msgstr ""
5052msgid "name of the ego controlling the zone" 5291msgid "name of the ego controlling the zone"
5053msgstr "" 5292msgstr ""
5054 5293
5055#: src/namestore/gnunet-namestore-fcfsd.c:508 5294#: src/namestore/gnunet-service-namestore.c:615
5056#, fuzzy, c-format
5057msgid "Unsupported form value `%s'\n"
5058msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
5059
5060#: src/namestore/gnunet-namestore-fcfsd.c:535
5061#, fuzzy, c-format
5062msgid "Failed to create record for domain `%s': %s\n"
5063msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
5064
5065#: src/namestore/gnunet-namestore-fcfsd.c:555
5066msgid "Error when mapping zone to name\n"
5067msgstr ""
5068
5069#: src/namestore/gnunet-namestore-fcfsd.c:585
5070#, c-format
5071msgid "Found existing name `%s' for the given key\n"
5072msgstr ""
5073
5074#: src/namestore/gnunet-namestore-fcfsd.c:662
5075#, c-format
5076msgid "Found %u existing records for domain `%s'\n"
5077msgstr ""
5078
5079#: src/namestore/gnunet-namestore-fcfsd.c:718
5080#, fuzzy, c-format
5081msgid "Failed to create page for `%s'\n"
5082msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
5083
5084#: src/namestore/gnunet-namestore-fcfsd.c:734
5085#, fuzzy, c-format
5086msgid "Failed to setup post processor for `%s'\n"
5087msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
5088
5089#: src/namestore/gnunet-namestore-fcfsd.c:770
5090msgid "Domain name must not contain `.'\n"
5091msgstr ""
5092
5093#: src/namestore/gnunet-namestore-fcfsd.c:778
5094msgid "Domain name must not contain `+'\n"
5095msgstr ""
5096
5097#: src/namestore/gnunet-namestore-fcfsd.c:974
5098msgid "No ego configured for `fcfsd` subsystem\n"
5099msgstr ""
5100
5101#: src/namestore/gnunet-namestore-fcfsd.c:1000
5102#, fuzzy
5103msgid "Failed to start HTTP server\n"
5104msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
5105
5106#: src/namestore/gnunet-namestore-fcfsd.c:1042
5107#, fuzzy
5108msgid "Failed to connect to identity\n"
5109msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
5110
5111#: src/namestore/gnunet-namestore-fcfsd.c:1074
5112msgid "GNU Name System First Come First Serve name registration service"
5113msgstr ""
5114
5115#: src/namestore/gnunet-service-namestore.c:612
5116#, c-format 5295#, c-format
5117msgid "Failed to replicate block in namecache: %s\n" 5296msgid "Failed to replicate block in namecache: %s\n"
5118msgstr "" 5297msgstr ""
@@ -5126,7 +5305,7 @@ msgstr ""
5126msgid "flat file database running\n" 5305msgid "flat file database running\n"
5127msgstr "Sqlite-Datenbank läuft\n" 5306msgstr "Sqlite-Datenbank läuft\n"
5128 5307
5129#: src/namestore/plugin_rest_namestore.c:1188 5308#: src/namestore/plugin_rest_namestore.c:1193
5130#, fuzzy 5309#, fuzzy
5131msgid "Namestore REST API initialized\n" 5310msgid "Namestore REST API initialized\n"
5132msgstr " Verbindung fehlgeschlagen\n" 5311msgstr " Verbindung fehlgeschlagen\n"
@@ -5416,10 +5595,6 @@ msgstr "Kommando `%s' wurde nicht gefunden!\n"
5416msgid "`upnpc' command not found\n" 5595msgid "`upnpc' command not found\n"
5417msgstr "Kommando `%s' wurde nicht gefunden!\n" 5596msgstr "Kommando `%s' wurde nicht gefunden!\n"
5418 5597
5419#: src/nse/gnunet-nse.c:122
5420msgid "Show network size estimates from NSE service."
5421msgstr ""
5422
5423#: src/nse/gnunet-nse-profiler.c:842 5598#: src/nse/gnunet-nse-profiler.c:842
5424msgid "limit to the number of connections to NSE services, 0 for none" 5599msgid "limit to the number of connections to NSE services, 0 for none"
5425msgstr "" 5600msgstr ""
@@ -5444,68 +5619,15 @@ msgstr ""
5444msgid "Measure quality and performance of the NSE service." 5619msgid "Measure quality and performance of the NSE service."
5445msgstr "" 5620msgstr ""
5446 5621
5622#: src/nse/gnunet-nse.c:122
5623msgid "Show network size estimates from NSE service."
5624msgstr ""
5625
5447#: src/nse/gnunet-service-nse.c:1534 5626#: src/nse/gnunet-service-nse.c:1534
5448#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 5627#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
5449msgid "Value is too large.\n" 5628msgid "Value is too large.\n"
5450msgstr "" 5629msgstr ""
5451 5630
5452#: src/peerinfo/gnunet-service-peerinfo.c:178
5453#, fuzzy, c-format
5454msgid "Removing expired address of transport `%s'\n"
5455msgstr "Verfügbare(r) Transport(e): %s\n"
5456
5457#: src/peerinfo/gnunet-service-peerinfo.c:310
5458#, fuzzy, c-format
5459msgid "Failed to parse HELLO in file `%s': %s\n"
5460msgstr "Datei wurde als `%s' gespeichert.\n"
5461
5462#: src/peerinfo/gnunet-service-peerinfo.c:331
5463#: src/peerinfo/gnunet-service-peerinfo.c:362
5464#, fuzzy, c-format
5465msgid "Failed to parse HELLO in file `%s'\n"
5466msgstr "Datei wurde als `%s' gespeichert.\n"
5467
5468#: src/peerinfo/gnunet-service-peerinfo.c:446
5469msgid "# peers known"
5470msgstr ""
5471
5472#: src/peerinfo/gnunet-service-peerinfo.c:489
5473#, c-format
5474msgid ""
5475"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5476msgstr ""
5477"Die Datei »%s« im Verzeichnis »%s« entspricht nicht der Namenskonvention. "
5478"Die Datei wurde entfernt.\n"
5479
5480#: src/peerinfo/gnunet-service-peerinfo.c:655
5481#, fuzzy, c-format
5482msgid "Scanning directory `%s'\n"
5483msgstr "==> Verzeichnis `%s':\n"
5484
5485#: src/peerinfo/gnunet-service-peerinfo.c:663
5486#, fuzzy, c-format
5487msgid "Still no peers found in `%s'!\n"
5488msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n"
5489
5490#: src/peerinfo/gnunet-service-peerinfo.c:1076
5491#, fuzzy, c-format
5492msgid "Cleaning up directory `%s'\n"
5493msgstr "==> Verzeichnis `%s':\n"
5494
5495#: src/peerinfo/gnunet-service-peerinfo.c:1405
5496#, c-format
5497msgid "Importing HELLOs from `%s'\n"
5498msgstr ""
5499
5500#: src/peerinfo/gnunet-service-peerinfo.c:1418
5501msgid "Skipping import of included HELLOs\n"
5502msgstr ""
5503
5504#: src/peerinfo/peerinfo_api.c:220
5505#, fuzzy
5506msgid "Failed to receive response from `PEERINFO' service."
5507msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n"
5508
5509#: src/peerinfo-tool/gnunet-peerinfo.c:239 5631#: src/peerinfo-tool/gnunet-peerinfo.c:239
5510#, fuzzy, c-format 5632#, fuzzy, c-format
5511msgid "%sPeer `%s'\n" 5633msgid "%sPeer `%s'\n"
@@ -5596,6 +5718,63 @@ msgstr "Teste Transport(e) %s\n"
5596msgid "Failed to load transport plugin for `%s'\n" 5718msgid "Failed to load transport plugin for `%s'\n"
5597msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" 5719msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
5598 5720
5721#: src/peerinfo/gnunet-service-peerinfo.c:178
5722#, fuzzy, c-format
5723msgid "Removing expired address of transport `%s'\n"
5724msgstr "Verfügbare(r) Transport(e): %s\n"
5725
5726#: src/peerinfo/gnunet-service-peerinfo.c:310
5727#, fuzzy, c-format
5728msgid "Failed to parse HELLO in file `%s': %s\n"
5729msgstr "Datei wurde als `%s' gespeichert.\n"
5730
5731#: src/peerinfo/gnunet-service-peerinfo.c:331
5732#: src/peerinfo/gnunet-service-peerinfo.c:362
5733#, fuzzy, c-format
5734msgid "Failed to parse HELLO in file `%s'\n"
5735msgstr "Datei wurde als `%s' gespeichert.\n"
5736
5737#: src/peerinfo/gnunet-service-peerinfo.c:446
5738msgid "# peers known"
5739msgstr ""
5740
5741#: src/peerinfo/gnunet-service-peerinfo.c:489
5742#, c-format
5743msgid ""
5744"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5745msgstr ""
5746"Die Datei »%s« im Verzeichnis »%s« entspricht nicht der Namenskonvention. "
5747"Die Datei wurde entfernt.\n"
5748
5749#: src/peerinfo/gnunet-service-peerinfo.c:655
5750#, fuzzy, c-format
5751msgid "Scanning directory `%s'\n"
5752msgstr "==> Verzeichnis `%s':\n"
5753
5754#: src/peerinfo/gnunet-service-peerinfo.c:663
5755#, fuzzy, c-format
5756msgid "Still no peers found in `%s'!\n"
5757msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n"
5758
5759#: src/peerinfo/gnunet-service-peerinfo.c:1076
5760#, fuzzy, c-format
5761msgid "Cleaning up directory `%s'\n"
5762msgstr "==> Verzeichnis `%s':\n"
5763
5764#: src/peerinfo/gnunet-service-peerinfo.c:1405
5765#, c-format
5766msgid "Importing HELLOs from `%s'\n"
5767msgstr ""
5768
5769#: src/peerinfo/gnunet-service-peerinfo.c:1418
5770msgid "Skipping import of included HELLOs\n"
5771msgstr ""
5772
5773#: src/peerinfo/peerinfo_api.c:220
5774#, fuzzy
5775msgid "Failed to receive response from `PEERINFO' service."
5776msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n"
5777
5599#: src/peerstore/gnunet-peerstore.c:91 5778#: src/peerstore/gnunet-peerstore.c:91
5600msgid "peerstore" 5779msgid "peerstore"
5601msgstr "" 5780msgstr ""
@@ -5644,15 +5823,10 @@ msgstr ""
5644msgid "Unable to create indices: %s.\n" 5823msgid "Unable to create indices: %s.\n"
5645msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" 5824msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
5646 5825
5647#: src/postgres/postgres.c:67 5826#: src/pq/pq_prepare.c:80
5648#, fuzzy, c-format 5827#, fuzzy, c-format
5649msgid "`%s:%s' failed at %s:%d with error: %s\n" 5828msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
5650msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" 5829msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n"
5651
5652#: src/postgres/postgres.c:192
5653#, fuzzy, c-format
5654msgid "Unable to connect to Postgres database '%s': %s\n"
5655msgstr "Fehler beim Anlegen des Benutzerkontos:"
5656 5830
5657#: src/psycstore/gnunet-service-psycstore.c:249 5831#: src/psycstore/gnunet-service-psycstore.c:249
5658#, fuzzy 5832#, fuzzy
@@ -5832,56 +6006,56 @@ msgstr ""
5832msgid "Daemon to announce regular expressions for the peer using cadet." 6006msgid "Daemon to announce regular expressions for the peer using cadet."
5833msgstr "" 6007msgstr ""
5834 6008
5835#: src/regex/gnunet-regex-profiler.c:1314 6009#: src/regex/gnunet-regex-profiler.c:1386
5836msgid "No configuration file given. Exiting\n" 6010msgid "No configuration file given. Exiting\n"
5837msgstr "Keine Konfigurationsdatei angegeben. Abbruch\n" 6011msgstr "Keine Konfigurationsdatei angegeben. Abbruch\n"
5838 6012
5839#: src/regex/gnunet-regex-profiler.c:1355 6013#: src/regex/gnunet-regex-profiler.c:1427
5840#: src/regex/gnunet-regex-simulation-profiler.c:630 6014#: src/regex/gnunet-regex-simulation-profiler.c:630
5841#, c-format 6015#, c-format
5842msgid "No policy directory specified on command line. Exiting.\n" 6016msgid "No policy directory specified on command line. Exiting.\n"
5843msgstr "" 6017msgstr ""
5844 6018
5845#: src/regex/gnunet-regex-profiler.c:1361 6019#: src/regex/gnunet-regex-profiler.c:1433
5846#: src/regex/gnunet-regex-simulation-profiler.c:638 6020#: src/regex/gnunet-regex-simulation-profiler.c:638
5847#, c-format 6021#, c-format
5848msgid "Specified policies directory does not exist. Exiting.\n" 6022msgid "Specified policies directory does not exist. Exiting.\n"
5849msgstr "" 6023msgstr ""
5850 6024
5851#: src/regex/gnunet-regex-profiler.c:1368 6025#: src/regex/gnunet-regex-profiler.c:1440
5852#, c-format 6026#, c-format
5853msgid "No files found in `%s'\n" 6027msgid "No files found in `%s'\n"
5854msgstr "Keine Dateien in »%s« gefunden\n" 6028msgstr "Keine Dateien in »%s« gefunden\n"
5855 6029
5856#: src/regex/gnunet-regex-profiler.c:1377 6030#: src/regex/gnunet-regex-profiler.c:1449
5857msgid "No search strings file given. Exiting.\n" 6031msgid "No search strings file given. Exiting.\n"
5858msgstr "" 6032msgstr ""
5859 6033
5860#: src/regex/gnunet-regex-profiler.c:1397 6034#: src/regex/gnunet-regex-profiler.c:1469
5861msgid "Error loading search strings. Exiting.\n" 6035msgid "Error loading search strings. Exiting.\n"
5862msgstr "" 6036msgstr ""
5863 6037
5864#: src/regex/gnunet-regex-profiler.c:1485 6038#: src/regex/gnunet-regex-profiler.c:1557
5865msgid "name of the file for writing statistics" 6039msgid "name of the file for writing statistics"
5866msgstr "" 6040msgstr ""
5867 6041
5868#: src/regex/gnunet-regex-profiler.c:1491 6042#: src/regex/gnunet-regex-profiler.c:1563
5869msgid "wait TIMEOUT before ending the experiment" 6043msgid "wait TIMEOUT before ending the experiment"
5870msgstr "" 6044msgstr ""
5871 6045
5872#: src/regex/gnunet-regex-profiler.c:1497 6046#: src/regex/gnunet-regex-profiler.c:1569
5873msgid "directory with policy files" 6047msgid "directory with policy files"
5874msgstr "" 6048msgstr ""
5875 6049
5876#: src/regex/gnunet-regex-profiler.c:1504 6050#: src/regex/gnunet-regex-profiler.c:1576
5877msgid "name of file with input strings" 6051msgid "name of file with input strings"
5878msgstr "" 6052msgstr ""
5879 6053
5880#: src/regex/gnunet-regex-profiler.c:1510 6054#: src/regex/gnunet-regex-profiler.c:1582
5881msgid "name of file with hosts' names" 6055msgid "name of file with hosts' names"
5882msgstr "" 6056msgstr ""
5883 6057
5884#: src/regex/gnunet-regex-profiler.c:1523 6058#: src/regex/gnunet-regex-profiler.c:1595
5885msgid "Profiler for regex" 6059msgid "Profiler for regex"
5886msgstr "" 6060msgstr ""
5887 6061
@@ -6110,10 +6284,10 @@ msgstr ""
6110msgid "Calculate the Vectorproduct with a GNUnet peer." 6284msgid "Calculate the Vectorproduct with a GNUnet peer."
6111msgstr "" 6285msgstr ""
6112 6286
6113#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 6287#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
6114#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6115#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
6116#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 6288#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
6289#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
6290#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6117#, fuzzy 6291#, fuzzy
6118msgid "Connect to CADET failed\n" 6292msgid "Connect to CADET failed\n"
6119msgstr " Verbindung fehlgeschlagen\n" 6293msgstr " Verbindung fehlgeschlagen\n"
@@ -6138,7 +6312,7 @@ msgstr ""
6138msgid "also profile decryption" 6312msgid "also profile decryption"
6139msgstr "" 6313msgstr ""
6140 6314
6141#: src/set/gnunet-service-set.c:1948 6315#: src/set/gnunet-service-set.c:1989
6142#, fuzzy 6316#, fuzzy
6143msgid "Could not connect to CADET service\n" 6317msgid "Could not connect to CADET service\n"
6144msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n" 6318msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n"
@@ -6198,113 +6372,113 @@ msgstr ""
6198msgid "say good-bye and leave somebody else's place" 6372msgid "say good-bye and leave somebody else's place"
6199msgstr "" 6373msgstr ""
6200 6374
6201#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 6375#: src/social/gnunet-social.c:1227
6202msgid "create a place" 6376msgid "create a place"
6203msgstr "" 6377msgstr ""
6204 6378
6205#: src/social/gnunet-social.c:1237 6379#: src/social/gnunet-social.c:1232
6206msgid "destroy a place we were hosting" 6380msgid "destroy a place we were hosting"
6207msgstr "" 6381msgstr ""
6208 6382
6209#: src/social/gnunet-social.c:1242 6383#: src/social/gnunet-social.c:1237
6210msgid "enter somebody else's place" 6384msgid "enter somebody else's place"
6211msgstr "" 6385msgstr ""
6212 6386
6213#: src/social/gnunet-social.c:1248 6387#: src/social/gnunet-social.c:1243
6214msgid "find state matching name prefix" 6388msgid "find state matching name prefix"
6215msgstr "" 6389msgstr ""
6216 6390
6217#: src/social/gnunet-social.c:1253 6391#: src/social/gnunet-social.c:1248
6218msgid "replay history of messages up to the given --limit" 6392msgid "replay history of messages up to the given --limit"
6219msgstr "" 6393msgstr ""
6220 6394
6221#: src/social/gnunet-social.c:1258 6395#: src/social/gnunet-social.c:1253
6222msgid "reconnect to a previously created place" 6396msgid "reconnect to a previously created place"
6223msgstr "" 6397msgstr ""
6224 6398
6225#: src/social/gnunet-social.c:1263 6399#: src/social/gnunet-social.c:1258
6226msgid "publish something to a place we are hosting" 6400msgid "publish something to a place we are hosting"
6227msgstr "" 6401msgstr ""
6228 6402
6229#: src/social/gnunet-social.c:1268 6403#: src/social/gnunet-social.c:1263
6230msgid "reconnect to a previously entered place" 6404msgid "reconnect to a previously entered place"
6231msgstr "" 6405msgstr ""
6232 6406
6233#: src/social/gnunet-social.c:1273 6407#: src/social/gnunet-social.c:1268
6234msgid "search for state matching exact name" 6408msgid "search for state matching exact name"
6235msgstr "" 6409msgstr ""
6236 6410
6237#: src/social/gnunet-social.c:1278 6411#: src/social/gnunet-social.c:1273
6238msgid "submit something to somebody's place" 6412msgid "submit something to somebody's place"
6239msgstr "" 6413msgstr ""
6240 6414
6241#: src/social/gnunet-social.c:1283 6415#: src/social/gnunet-social.c:1278
6242msgid "list of egos and subscribed places" 6416msgid "list of egos and subscribed places"
6243msgstr "" 6417msgstr ""
6244 6418
6245#: src/social/gnunet-social.c:1288 6419#: src/social/gnunet-social.c:1283
6246msgid "extract and replay history between message IDs --start and --until" 6420msgid "extract and replay history between message IDs --start and --until"
6247msgstr "" 6421msgstr ""
6248 6422
6249#: src/social/gnunet-social.c:1297 6423#: src/social/gnunet-social.c:1292
6250msgid "application ID to use when connecting" 6424msgid "application ID to use when connecting"
6251msgstr "" 6425msgstr ""
6252 6426
6253#: src/social/gnunet-social.c:1303 6427#: src/social/gnunet-social.c:1298
6254msgid "message body or state value" 6428msgid "message body or state value"
6255msgstr "" 6429msgstr ""
6256 6430
6257#: src/social/gnunet-social.c:1309 6431#: src/social/gnunet-social.c:1304
6258#, fuzzy 6432#, fuzzy
6259msgid "name or public key of ego" 6433msgid "name or public key of ego"
6260msgstr "Ungültiger Parameter: `%s'\n" 6434msgstr "Ungültiger Parameter: `%s'\n"
6261 6435
6262#: src/social/gnunet-social.c:1314 6436#: src/social/gnunet-social.c:1309
6263msgid "wait for incoming messages" 6437msgid "wait for incoming messages"
6264msgstr "" 6438msgstr ""
6265 6439
6266#: src/social/gnunet-social.c:1320 6440#: src/social/gnunet-social.c:1315
6267msgid "GNS name" 6441msgid "GNS name"
6268msgstr "" 6442msgstr ""
6269 6443
6270#: src/social/gnunet-social.c:1326 6444#: src/social/gnunet-social.c:1321
6271msgid "peer ID for --guest-enter" 6445msgid "peer ID for --guest-enter"
6272msgstr "" 6446msgstr ""
6273 6447
6274#: src/social/gnunet-social.c:1332 6448#: src/social/gnunet-social.c:1327
6275msgid "name (key) to query from state" 6449msgid "name (key) to query from state"
6276msgstr "" 6450msgstr ""
6277 6451
6278#: src/social/gnunet-social.c:1338 6452#: src/social/gnunet-social.c:1333
6279msgid "method name" 6453msgid "method name"
6280msgstr "" 6454msgstr ""
6281 6455
6282#: src/social/gnunet-social.c:1344 6456#: src/social/gnunet-social.c:1339
6283#, fuzzy 6457#, fuzzy
6284msgid "number of messages to replay from history" 6458msgid "number of messages to replay from history"
6285msgstr "Anzahl an Durchläufen" 6459msgstr "Anzahl an Durchläufen"
6286 6460
6287#: src/social/gnunet-social.c:1350 6461#: src/social/gnunet-social.c:1345
6288msgid "key address of place" 6462msgid "key address of place"
6289msgstr "" 6463msgstr ""
6290 6464
6291#: src/social/gnunet-social.c:1356 6465#: src/social/gnunet-social.c:1351
6292msgid "start message ID for history replay" 6466msgid "start message ID for history replay"
6293msgstr "" 6467msgstr ""
6294 6468
6295#: src/social/gnunet-social.c:1361 6469#: src/social/gnunet-social.c:1356
6296msgid "respond to entry requests by admitting all guests" 6470msgid "respond to entry requests by admitting all guests"
6297msgstr "" 6471msgstr ""
6298 6472
6299#: src/social/gnunet-social.c:1367 6473#: src/social/gnunet-social.c:1362
6300msgid "end message ID for history replay" 6474msgid "end message ID for history replay"
6301msgstr "" 6475msgstr ""
6302 6476
6303#: src/social/gnunet-social.c:1372 6477#: src/social/gnunet-social.c:1367
6304msgid "respond to entry requests by refusing all guests" 6478msgid "respond to entry requests by refusing all guests"
6305msgstr "" 6479msgstr ""
6306 6480
6307#: src/social/gnunet-social.c:1382 6481#: src/social/gnunet-social.c:1377
6308msgid "" 6482msgid ""
6309"gnunet-social - Interact with the social service: enter/leave, send/receive " 6483"gnunet-social - Interact with the social service: enter/leave, send/receive "
6310"messages, access history and state.\n" 6484"messages, access history and state.\n"
@@ -6497,7 +6671,7 @@ msgid ""
6497msgstr "" 6671msgstr ""
6498 6672
6499#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 6673#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
6500#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 6674#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
6501#, c-format 6675#, c-format
6502msgid "Incorrect hostkey file format: %s\n" 6676msgid "Incorrect hostkey file format: %s\n"
6503msgstr "" 6677msgstr ""
@@ -6567,6 +6741,17 @@ msgstr ""
6567msgid "%.s Unknown result code." 6741msgid "%.s Unknown result code."
6568msgstr "" 6742msgstr ""
6569 6743
6744#: src/testbed/gnunet-testbed-profiler.c:290
6745msgid "tolerate COUNT number of continious timeout failures"
6746msgstr ""
6747
6748#: src/testbed/gnunet-testbed-profiler.c:295
6749msgid ""
6750"run profiler in non-interactive mode where upon testbed setup the profiler "
6751"does not wait for a keystroke but continues to run until a termination "
6752"signal is received"
6753msgstr ""
6754
6570#: src/testbed/gnunet_testbed_mpi_spawn.c:118 6755#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6571#, fuzzy 6756#, fuzzy
6572msgid "Waiting for child to exit.\n" 6757msgid "Waiting for child to exit.\n"
@@ -6579,17 +6764,6 @@ msgstr ""
6579msgid "Spawning process `%s'\n" 6764msgid "Spawning process `%s'\n"
6580msgstr "Ungültige Antwort auf `%s'.\n" 6765msgstr "Ungültige Antwort auf `%s'.\n"
6581 6766
6582#: src/testbed/gnunet-testbed-profiler.c:290
6583msgid "tolerate COUNT number of continious timeout failures"
6584msgstr ""
6585
6586#: src/testbed/gnunet-testbed-profiler.c:295
6587msgid ""
6588"run profiler in non-interactive mode where upon testbed setup the profiler "
6589"does not wait for a keystroke but continues to run until a termination "
6590"signal is received"
6591msgstr ""
6592
6593#: src/testbed/testbed_api.c:410 6767#: src/testbed/testbed_api.c:410
6594#, fuzzy, c-format 6768#, fuzzy, c-format
6595msgid "Adding host %u failed with error: %s\n" 6769msgid "Adding host %u failed with error: %s\n"
@@ -6882,10 +7056,6 @@ msgstr "# HELLO-Meldungen empfangen"
6882msgid "GNUnet topology control" 7056msgid "GNUnet topology control"
6883msgstr "" 7057msgstr ""
6884 7058
6885#: src/transport/gnunet-service-transport_ats.c:141
6886msgid "# Addresses given to ATS"
6887msgstr ""
6888
6889#: src/transport/gnunet-service-transport.c:448 7059#: src/transport/gnunet-service-transport.c:448
6890msgid "# messages dropped due to slow client" 7060msgid "# messages dropped due to slow client"
6891msgstr "" 7061msgstr ""
@@ -6930,6 +7100,10 @@ msgstr ""
6930msgid "Transport service is lacking key configuration settings. Exiting.\n" 7100msgid "Transport service is lacking key configuration settings. Exiting.\n"
6931msgstr "" 7101msgstr ""
6932 7102
7103#: src/transport/gnunet-service-transport_ats.c:141
7104msgid "# Addresses given to ATS"
7105msgstr ""
7106
6933#: src/transport/gnunet-service-transport_hello.c:195 7107#: src/transport/gnunet-service-transport_hello.c:195
6934msgid "# refreshed my HELLO" 7108msgid "# refreshed my HELLO"
6935msgstr "" 7109msgstr ""
@@ -7251,6 +7425,43 @@ msgstr ""
7251msgid "# validations succeeded" 7425msgid "# validations succeeded"
7252msgstr "" 7426msgstr ""
7253 7427
7428#: src/transport/gnunet-transport-profiler.c:219
7429#, c-format
7430msgid "%llu B in %llu ms == %.2f KB/s!\n"
7431msgstr ""
7432
7433#: src/transport/gnunet-transport-profiler.c:617
7434msgid "send data to peer"
7435msgstr ""
7436
7437#: src/transport/gnunet-transport-profiler.c:621
7438#, fuzzy
7439msgid "receive data from peer"
7440msgstr "# Bytes des Typs %d empfangen"
7441
7442#: src/transport/gnunet-transport-profiler.c:626
7443msgid "iterations"
7444msgstr ""
7445
7446#: src/transport/gnunet-transport-profiler.c:631
7447#, fuzzy
7448msgid "number of messages to send"
7449msgstr "Anzahl an Durchläufen"
7450
7451#: src/transport/gnunet-transport-profiler.c:636
7452msgid "message size to use"
7453msgstr ""
7454
7455#: src/transport/gnunet-transport-profiler.c:641
7456#: src/transport/gnunet-transport.c:1462
7457msgid "peer identity"
7458msgstr ""
7459
7460#: src/transport/gnunet-transport-profiler.c:652
7461#: src/transport/gnunet-transport.c:1482
7462msgid "Direct access to transport service."
7463msgstr "Direkter Zugriff auf den Transportdienst"
7464
7254#: src/transport/gnunet-transport.c:413 7465#: src/transport/gnunet-transport.c:413
7255#, c-format 7466#, c-format
7256msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" 7467msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7383,11 +7594,6 @@ msgstr ""
7383msgid "do not resolve hostnames" 7594msgid "do not resolve hostnames"
7384msgstr "Keine Rechnernamen auflösen" 7595msgstr "Keine Rechnernamen auflösen"
7385 7596
7386#: src/transport/gnunet-transport.c:1462
7387#: src/transport/gnunet-transport-profiler.c:641
7388msgid "peer identity"
7389msgstr ""
7390
7391#: src/transport/gnunet-transport.c:1466 7597#: src/transport/gnunet-transport.c:1466
7392msgid "monitor plugin sessions" 7598msgid "monitor plugin sessions"
7393msgstr "" 7599msgstr ""
@@ -7396,41 +7602,9 @@ msgstr ""
7396msgid "send data for benchmarking to the other peer (until CTRL-C)" 7602msgid "send data for benchmarking to the other peer (until CTRL-C)"
7397msgstr "" 7603msgstr ""
7398 7604
7399#: src/transport/gnunet-transport.c:1482
7400#: src/transport/gnunet-transport-profiler.c:652
7401msgid "Direct access to transport service."
7402msgstr "Direkter Zugriff auf den Transportdienst"
7403
7404#: src/transport/gnunet-transport-profiler.c:219
7405#, c-format
7406msgid "%llu B in %llu ms == %.2f KB/s!\n"
7407msgstr ""
7408
7409#: src/transport/gnunet-transport-profiler.c:617
7410msgid "send data to peer"
7411msgstr ""
7412
7413#: src/transport/gnunet-transport-profiler.c:621
7414#, fuzzy
7415msgid "receive data from peer"
7416msgstr "# Bytes des Typs %d empfangen"
7417
7418#: src/transport/gnunet-transport-profiler.c:626
7419msgid "iterations"
7420msgstr ""
7421
7422#: src/transport/gnunet-transport-profiler.c:631
7423#, fuzzy
7424msgid "number of messages to send"
7425msgstr "Anzahl an Durchläufen"
7426
7427#: src/transport/gnunet-transport-profiler.c:636
7428msgid "message size to use"
7429msgstr ""
7430
7431#: src/transport/plugin_transport_http_client.c:1474 7605#: src/transport/plugin_transport_http_client.c:1474
7432#: src/transport/plugin_transport_http_server.c:2249 7606#: src/transport/plugin_transport_http_server.c:2312
7433#: src/transport/plugin_transport_http_server.c:3463 7607#: src/transport/plugin_transport_http_server.c:3526
7434#: src/transport/plugin_transport_tcp.c:3890 7608#: src/transport/plugin_transport_tcp.c:3890
7435#: src/transport/plugin_transport_tcp.c:3897 7609#: src/transport/plugin_transport_tcp.c:3897
7436msgid "TCP_STEALTH not supported on this platform.\n" 7610msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7442,13 +7616,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
7442msgstr "" 7616msgstr ""
7443 7617
7444#: src/transport/plugin_transport_http_client.c:2164 7618#: src/transport/plugin_transport_http_client.c:2164
7445#: src/transport/plugin_transport_http_server.c:3178 7619#: src/transport/plugin_transport_http_server.c:3241
7446#, fuzzy, c-format 7620#, fuzzy, c-format
7447msgid "Shutting down plugin `%s'\n" 7621msgid "Shutting down plugin `%s'\n"
7448msgstr "Collection `%s' begonnen.\n" 7622msgstr "Collection `%s' begonnen.\n"
7449 7623
7450#: src/transport/plugin_transport_http_client.c:2181 7624#: src/transport/plugin_transport_http_client.c:2181
7451#: src/transport/plugin_transport_http_server.c:3248 7625#: src/transport/plugin_transport_http_server.c:3311
7452#, fuzzy, c-format 7626#, fuzzy, c-format
7453msgid "Shutdown for plugin `%s' complete\n" 7627msgid "Shutdown for plugin `%s' complete\n"
7454msgstr "GNUnet wurde erfolgreich heruntergefahren.\n" 7628msgstr "GNUnet wurde erfolgreich heruntergefahren.\n"
@@ -7458,103 +7632,103 @@ msgstr "GNUnet wurde erfolgreich heruntergefahren.\n"
7458msgid "Maximum number of requests is %u\n" 7632msgid "Maximum number of requests is %u\n"
7459msgstr "Maximale Anzahl der Verbindungen ist %u\n" 7633msgstr "Maximale Anzahl der Verbindungen ist %u\n"
7460 7634
7461#: src/transport/plugin_transport_http_server.c:1727 7635#: src/transport/plugin_transport_http_server.c:1756
7462#, c-format 7636#, c-format
7463msgid "" 7637msgid ""
7464"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " 7638"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
7465"size %u\n" 7639"size %u\n"
7466msgstr "" 7640msgstr ""
7467 7641
7468#: src/transport/plugin_transport_http_server.c:1967 7642#: src/transport/plugin_transport_http_server.c:2028
7469#, c-format 7643#, c-format
7470msgid "Accepting connection (%u of %u) from `%s'\n" 7644msgid "Accepting connection (%u of %u) from `%s'\n"
7471msgstr "" 7645msgstr ""
7472 7646
7473#: src/transport/plugin_transport_http_server.c:1975 7647#: src/transport/plugin_transport_http_server.c:2036
7474#, c-format 7648#, c-format
7475msgid "" 7649msgid ""
7476"Server reached maximum number connections (%u), rejecting new connection\n" 7650"Server reached maximum number connections (%u), rejecting new connection\n"
7477msgstr "" 7651msgstr ""
7478 7652
7479#: src/transport/plugin_transport_http_server.c:2125 7653#: src/transport/plugin_transport_http_server.c:2186
7480msgid "" 7654msgid ""
7481"Could not create a new TLS certificate, program `gnunet-transport-" 7655"Could not create a new TLS certificate, program `gnunet-transport-"
7482"certificate-creation' could not be started!\n" 7656"certificate-creation' could not be started!\n"
7483msgstr "" 7657msgstr ""
7484 7658
7485#: src/transport/plugin_transport_http_server.c:2148 7659#: src/transport/plugin_transport_http_server.c:2209
7486#, c-format 7660#, c-format
7487msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" 7661msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
7488msgstr "" 7662msgstr ""
7489 7663
7490#: src/transport/plugin_transport_http_server.c:2275 7664#: src/transport/plugin_transport_http_server.c:2338
7491msgid "Could not load or create server certificate! Loading plugin failed!\n" 7665msgid "Could not load or create server certificate! Loading plugin failed!\n"
7492msgstr "" 7666msgstr ""
7493 7667
7494#: src/transport/plugin_transport_http_server.c:2587 7668#: src/transport/plugin_transport_http_server.c:2650
7495msgid "Require valid port number for service in configuration!\n" 7669msgid "Require valid port number for service in configuration!\n"
7496msgstr "" 7670msgstr ""
7497 7671
7498#: src/transport/plugin_transport_http_server.c:2752 7672#: src/transport/plugin_transport_http_server.c:2815
7499#, c-format 7673#, c-format
7500msgid "Found %u addresses to report to NAT service\n" 7674msgid "Found %u addresses to report to NAT service\n"
7501msgstr "" 7675msgstr ""
7502 7676
7503#: src/transport/plugin_transport_http_server.c:2838 7677#: src/transport/plugin_transport_http_server.c:2901
7504#: src/transport/plugin_transport_udp.c:3622 7678#: src/transport/plugin_transport_udp.c:3622
7505msgid "Disabling IPv6 since it is not supported on this system!\n" 7679msgid "Disabling IPv6 since it is not supported on this system!\n"
7506msgstr "" 7680msgstr ""
7507 7681
7508#: src/transport/plugin_transport_http_server.c:2944 7682#: src/transport/plugin_transport_http_server.c:3007
7509#, c-format 7683#, c-format
7510msgid "IPv4 support is %s\n" 7684msgid "IPv4 support is %s\n"
7511msgstr "" 7685msgstr ""
7512 7686
7513#: src/transport/plugin_transport_http_server.c:2959 7687#: src/transport/plugin_transport_http_server.c:3022
7514#, c-format 7688#, c-format
7515msgid "IPv6 support is %s\n" 7689msgid "IPv6 support is %s\n"
7516msgstr "" 7690msgstr ""
7517 7691
7518#: src/transport/plugin_transport_http_server.c:2965 7692#: src/transport/plugin_transport_http_server.c:3028
7519msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" 7693msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
7520msgstr "" 7694msgstr ""
7521"Weder IPv4 noch IPv6 sind aktiviert! Bearbeiten Sie die Konfiguration\n" 7695"Weder IPv4 noch IPv6 sind aktiviert! Bearbeiten Sie die Konfiguration\n"
7522 7696
7523#: src/transport/plugin_transport_http_server.c:2976 7697#: src/transport/plugin_transport_http_server.c:3039
7524msgid "Port is required! Fix in configuration\n" 7698msgid "Port is required! Fix in configuration\n"
7525msgstr "Port ist erforderlich! Bearbeiten Sie die Konfiguration\n" 7699msgstr "Port ist erforderlich! Bearbeiten Sie die Konfiguration\n"
7526 7700
7527#: src/transport/plugin_transport_http_server.c:2982 7701#: src/transport/plugin_transport_http_server.c:3045
7528#, c-format 7702#, c-format
7529msgid "Using port %u\n" 7703msgid "Using port %u\n"
7530msgstr "Port %u wird verwendet\n" 7704msgstr "Port %u wird verwendet\n"
7531 7705
7532#: src/transport/plugin_transport_http_server.c:3001 7706#: src/transport/plugin_transport_http_server.c:3064
7533#, c-format 7707#, c-format
7534msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" 7708msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
7535msgstr "" 7709msgstr ""
7536 7710
7537#: src/transport/plugin_transport_http_server.c:3036 7711#: src/transport/plugin_transport_http_server.c:3099
7538#, c-format 7712#, c-format
7539msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" 7713msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
7540msgstr "" 7714msgstr ""
7541 7715
7542#: src/transport/plugin_transport_http_server.c:3111 7716#: src/transport/plugin_transport_http_server.c:3174
7543#, c-format 7717#, c-format
7544msgid "Using external hostname `%s'\n" 7718msgid "Using external hostname `%s'\n"
7545msgstr "" 7719msgstr ""
7546 7720
7547#: src/transport/plugin_transport_http_server.c:3132 7721#: src/transport/plugin_transport_http_server.c:3195
7548#, fuzzy, c-format 7722#, fuzzy, c-format
7549msgid "Notifying transport only about hostname `%s'\n" 7723msgid "Notifying transport only about hostname `%s'\n"
7550msgstr "Teste Transport(e) %s\n" 7724msgstr "Teste Transport(e) %s\n"
7551 7725
7552#: src/transport/plugin_transport_http_server.c:3149 7726#: src/transport/plugin_transport_http_server.c:3212
7553#, c-format 7727#, c-format
7554msgid "Maximum number of connections is %u\n" 7728msgid "Maximum number of connections is %u\n"
7555msgstr "Maximale Anzahl der Verbindungen ist %u\n" 7729msgstr "Maximale Anzahl der Verbindungen ist %u\n"
7556 7730
7557#: src/transport/plugin_transport_http_server.c:3475 7731#: src/transport/plugin_transport_http_server.c:3538
7558msgid "Unable to compile URL regex\n" 7732msgid "Unable to compile URL regex\n"
7559msgstr "" 7733msgstr ""
7560 7734
@@ -7700,21 +7874,6 @@ msgstr ""
7700msgid "TCP transport advertises itself as being on port %llu\n" 7874msgid "TCP transport advertises itself as being on port %llu\n"
7701msgstr "" 7875msgstr ""
7702 7876
7703#: src/transport/plugin_transport_udp_broadcasting.c:168
7704#, fuzzy
7705msgid "# Multicast HELLO beacons received via UDP"
7706msgstr "# Bytes empfangen über TCP"
7707
7708#: src/transport/plugin_transport_udp_broadcasting.c:548
7709msgid ""
7710"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7711msgstr ""
7712
7713#: src/transport/plugin_transport_udp_broadcasting.c:565
7714#, fuzzy, c-format
7715msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7716msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
7717
7718#: src/transport/plugin_transport_udp.c:3366 7877#: src/transport/plugin_transport_udp.c:3366
7719#, c-format 7878#, c-format
7720msgid "" 7879msgid ""
@@ -7762,6 +7921,21 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n"
7762msgid "Failed to create UDP network sockets\n" 7921msgid "Failed to create UDP network sockets\n"
7763msgstr "UDP-Sockets können nicht geöffnet werden\n" 7922msgstr "UDP-Sockets können nicht geöffnet werden\n"
7764 7923
7924#: src/transport/plugin_transport_udp_broadcasting.c:168
7925#, fuzzy
7926msgid "# Multicast HELLO beacons received via UDP"
7927msgstr "# Bytes empfangen über TCP"
7928
7929#: src/transport/plugin_transport_udp_broadcasting.c:548
7930msgid ""
7931"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7932msgstr ""
7933
7934#: src/transport/plugin_transport_udp_broadcasting.c:565
7935#, fuzzy, c-format
7936msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7937msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
7938
7765#: src/transport/plugin_transport_unix.c:1403 7939#: src/transport/plugin_transport_unix.c:1403
7766#, c-format 7940#, c-format
7767msgid "Cannot create path to `%s'\n" 7941msgid "Cannot create path to `%s'\n"
@@ -7875,7 +8049,7 @@ msgid ""
7875"`GNUNET_SERVER_receive_done' after %s\n" 8049"`GNUNET_SERVER_receive_done' after %s\n"
7876msgstr "" 8050msgstr ""
7877 8051
7878#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 8052#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
7879#, c-format 8053#, c-format
7880msgid "Unknown address family %d\n" 8054msgid "Unknown address family %d\n"
7881msgstr "" 8055msgstr ""
@@ -7920,51 +8094,51 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
7920msgid "Service `%s' runs at %s\n" 8094msgid "Service `%s' runs at %s\n"
7921msgstr "Dienst »%s« läuft auf %s\n" 8095msgstr "Dienst »%s« läuft auf %s\n"
7922 8096
7923#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 8097#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
7924msgid "Service process failed to initialize\n" 8098msgid "Service process failed to initialize\n"
7925msgstr "" 8099msgstr ""
7926 8100
7927#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 8101#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
7928msgid "Service process could not initialize server function\n" 8102msgid "Service process could not initialize server function\n"
7929msgstr "" 8103msgstr ""
7930 8104
7931#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 8105#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
7932msgid "Service process failed to report status\n" 8106msgid "Service process failed to report status\n"
7933msgstr "" 8107msgstr ""
7934 8108
7935#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 8109#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
7936#: src/util/service.c:1379 8110#: src/util/service.c:1378
7937#, fuzzy, c-format 8111#, fuzzy, c-format
7938msgid "Cannot obtain information about user `%s': %s\n" 8112msgid "Cannot obtain information about user `%s': %s\n"
7939msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n" 8113msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n"
7940 8114
7941#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 8115#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
7942msgid "No such user" 8116msgid "No such user"
7943msgstr "" 8117msgstr ""
7944 8118
7945#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 8119#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
7946#, c-format 8120#, c-format
7947msgid "Cannot change user/group to `%s': %s\n" 8121msgid "Cannot change user/group to `%s': %s\n"
7948msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n" 8122msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n"
7949 8123
7950#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 8124#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
7951msgid "do daemonize (detach from terminal)" 8125msgid "do daemonize (detach from terminal)"
7952msgstr "" 8126msgstr ""
7953 8127
7954#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 8128#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
7955#: src/util/service.c:1791 8129#: src/util/service.c:1790
7956#, fuzzy, c-format 8130#, fuzzy, c-format
7957msgid "Malformed configuration file `%s', exit ...\n" 8131msgid "Malformed configuration file `%s', exit ...\n"
7958msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n" 8132msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n"
7959 8133
7960#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 8134#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
7961#: src/util/service.c:1802 8135#: src/util/service.c:1801
7962#, fuzzy 8136#, fuzzy
7963msgid "Malformed configuration, exit ...\n" 8137msgid "Malformed configuration, exit ...\n"
7964msgstr "GNUnet Konfiguration" 8138msgstr "GNUnet Konfiguration"
7965 8139
7966#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 8140#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
7967#: src/util/service.c:1808 8141#: src/util/service.c:1807
7968#, fuzzy, c-format 8142#, fuzzy, c-format
7969msgid "Could not access configuration file `%s'\n" 8143msgid "Could not access configuration file `%s'\n"
7970msgstr "Konfigurationsdatei `%s' konnte nicht geparst werden.\n" 8144msgstr "Konfigurationsdatei `%s' konnte nicht geparst werden.\n"
@@ -8008,55 +8182,55 @@ msgstr ""
8008msgid "Need a non-empty hostname for service `%s'.\n" 8182msgid "Need a non-empty hostname for service `%s'.\n"
8009msgstr "" 8183msgstr ""
8010 8184
8011#: src/util/common_logging.c:256 src/util/common_logging.c:1129 8185#: src/util/common_logging.c:259 src/util/common_logging.c:1132
8012msgid "DEBUG" 8186msgid "DEBUG"
8013msgstr "DEBUG" 8187msgstr "DEBUG"
8014 8188
8015#: src/util/common_logging.c:258 src/util/common_logging.c:1127 8189#: src/util/common_logging.c:261 src/util/common_logging.c:1130
8016msgid "INFO" 8190msgid "INFO"
8017msgstr "INFO" 8191msgstr "INFO"
8018 8192
8019#: src/util/common_logging.c:260 src/util/common_logging.c:1125 8193#: src/util/common_logging.c:263 src/util/common_logging.c:1128
8020msgid "MESSAGE" 8194msgid "MESSAGE"
8021msgstr "" 8195msgstr ""
8022 8196
8023#: src/util/common_logging.c:262 src/util/common_logging.c:1123 8197#: src/util/common_logging.c:265 src/util/common_logging.c:1126
8024msgid "WARNING" 8198msgid "WARNING"
8025msgstr "WARNUNG" 8199msgstr "WARNUNG"
8026 8200
8027#: src/util/common_logging.c:264 src/util/common_logging.c:1121 8201#: src/util/common_logging.c:267 src/util/common_logging.c:1124
8028msgid "ERROR" 8202msgid "ERROR"
8029msgstr "FEHLER" 8203msgstr "FEHLER"
8030 8204
8031#: src/util/common_logging.c:266 src/util/common_logging.c:1131 8205#: src/util/common_logging.c:269 src/util/common_logging.c:1134
8032msgid "NONE" 8206msgid "NONE"
8033msgstr "" 8207msgstr ""
8034 8208
8035#: src/util/common_logging.c:879 8209#: src/util/common_logging.c:882
8036#, c-format 8210#, c-format
8037msgid "Message `%.*s' repeated %u times in the last %s\n" 8211msgid "Message `%.*s' repeated %u times in the last %s\n"
8038msgstr "" 8212msgstr ""
8039 8213
8040#: src/util/common_logging.c:1132 8214#: src/util/common_logging.c:1135
8041msgid "INVALID" 8215msgid "INVALID"
8042msgstr "" 8216msgstr ""
8043 8217
8044#: src/util/common_logging.c:1302 8218#: src/util/common_logging.c:1326
8045msgid "unknown address" 8219msgid "unknown address"
8046msgstr "Unbekannte Adresse" 8220msgstr "Unbekannte Adresse"
8047 8221
8048#: src/util/common_logging.c:1344 8222#: src/util/common_logging.c:1368
8049msgid "invalid address" 8223msgid "invalid address"
8050msgstr "Ungültige Adresse" 8224msgstr "Ungültige Adresse"
8051 8225
8052#: src/util/common_logging.c:1362 8226#: src/util/common_logging.c:1386
8053#, fuzzy, c-format 8227#, fuzzy, c-format
8054msgid "Configuration fails to specify option `%s' in section `%s'!\n" 8228msgid "Configuration fails to specify option `%s' in section `%s'!\n"
8055msgstr "" 8229msgstr ""
8056"Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis " 8230"Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis "
8057"angeben, in dem FS Daten gespeichert werden.\n" 8231"angeben, in dem FS Daten gespeichert werden.\n"
8058 8232
8059#: src/util/common_logging.c:1383 8233#: src/util/common_logging.c:1407
8060#, fuzzy, c-format 8234#, fuzzy, c-format
8061msgid "" 8235msgid ""
8062"Configuration specifies invalid value for option `%s' in section `%s': %s\n" 8236"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
@@ -8064,34 +8238,34 @@ msgstr ""
8064"Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis " 8238"Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis "
8065"angeben, in dem FS Daten gespeichert werden.\n" 8239"angeben, in dem FS Daten gespeichert werden.\n"
8066 8240
8067#: src/util/configuration.c:286 8241#: src/util/configuration.c:296
8068#, fuzzy, c-format 8242#, fuzzy, c-format
8069msgid "Syntax error while deserializing in line %u\n" 8243msgid "Syntax error while deserializing in line %u\n"
8070msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n" 8244msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n"
8071 8245
8072#: src/util/configuration.c:344 8246#: src/util/configuration.c:355
8073#, fuzzy, c-format 8247#, fuzzy, c-format
8074msgid "Error while reading file `%s'\n" 8248msgid "Error while reading file `%s'\n"
8075msgstr "Konfigurationsdatei `%s' konnte nicht geöffnet werden.\n" 8249msgstr "Konfigurationsdatei `%s' konnte nicht geöffnet werden.\n"
8076 8250
8077#: src/util/configuration.c:1017 8251#: src/util/configuration.c:1034
8078#, c-format 8252#, c-format
8079msgid "" 8253msgid ""
8080"Configuration value '%s' for '%s' in section '%s' is not in set of legal " 8254"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
8081"choices\n" 8255"choices\n"
8082msgstr "" 8256msgstr ""
8083 8257
8084#: src/util/configuration.c:1136 8258#: src/util/configuration.c:1153
8085#, c-format 8259#, c-format
8086msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" 8260msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
8087msgstr "" 8261msgstr ""
8088 8262
8089#: src/util/configuration.c:1169 8263#: src/util/configuration.c:1186
8090#, c-format 8264#, c-format
8091msgid "Missing closing `%s' in option `%s'\n" 8265msgid "Missing closing `%s' in option `%s'\n"
8092msgstr "" 8266msgstr ""
8093 8267
8094#: src/util/configuration.c:1237 8268#: src/util/configuration.c:1254
8095#, c-format 8269#, c-format
8096msgid "" 8270msgid ""
8097"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " 8271"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8125,32 +8299,32 @@ msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
8125msgid "EdDSA signature verification failed at %s:%d: %s\n" 8299msgid "EdDSA signature verification failed at %s:%d: %s\n"
8126msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n" 8300msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
8127 8301
8128#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 8302#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
8129#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 8303#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
8130#, fuzzy, c-format 8304#, fuzzy, c-format
8131msgid "Could not acquire lock on file `%s': %s...\n" 8305msgid "Could not acquire lock on file `%s': %s...\n"
8132msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" 8306msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
8133 8307
8134#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 8308#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
8135#, fuzzy 8309#, fuzzy
8136msgid "Creating a new private key. This may take a while.\n" 8310msgid "Creating a new private key. This may take a while.\n"
8137msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n" 8311msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n"
8138 8312
8139#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 8313#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
8140msgid "This may be ok if someone is currently generating a private key.\n" 8314msgid "This may be ok if someone is currently generating a private key.\n"
8141msgstr "" 8315msgstr ""
8142 8316
8143#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 8317#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
8144#, c-format 8318#, c-format
8145msgid "" 8319msgid ""
8146"When trying to read key file `%s' I found %u bytes but I need at least %u.\n" 8320"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
8147msgstr "" 8321msgstr ""
8148 8322
8149#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 8323#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
8150msgid "This may be ok if someone is currently generating a key.\n" 8324msgid "This may be ok if someone is currently generating a key.\n"
8151msgstr "" 8325msgstr ""
8152 8326
8153#: src/util/crypto_ecc_setup.c:413 8327#: src/util/crypto_ecc_setup.c:415
8154#, fuzzy 8328#, fuzzy
8155msgid "Could not load peer's private key\n" 8329msgid "Could not load peer's private key\n"
8156msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" 8330msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
@@ -8344,22 +8518,22 @@ msgstr ""
8344msgid "Manipulate GNUnet configuration files" 8518msgid "Manipulate GNUnet configuration files"
8345msgstr "GNUnet-Konfigurationsdateien bearbeiten" 8519msgstr "GNUnet-Konfigurationsdateien bearbeiten"
8346 8520
8347#: src/util/gnunet-ecc.c:84 8521#: src/util/gnunet-ecc.c:89
8348#, c-format 8522#, c-format
8349msgid "Failed to open `%s': %s\n" 8523msgid "Failed to open `%s': %s\n"
8350msgstr "»%s« kann nicht geöffnet werden: %s\n" 8524msgstr "»%s« kann nicht geöffnet werden: %s\n"
8351 8525
8352#: src/util/gnunet-ecc.c:120 8526#: src/util/gnunet-ecc.c:125
8353#, c-format 8527#, c-format
8354msgid "Generating %u keys like %s, please wait" 8528msgid "Generating %u keys like %s, please wait"
8355msgstr "" 8529msgstr ""
8356 8530
8357#: src/util/gnunet-ecc.c:133 8531#: src/util/gnunet-ecc.c:138
8358#, c-format 8532#, c-format
8359msgid "Generating %u keys, please wait" 8533msgid "Generating %u keys, please wait"
8360msgstr "" 8534msgstr ""
8361 8535
8362#: src/util/gnunet-ecc.c:174 8536#: src/util/gnunet-ecc.c:179
8363#, c-format 8537#, c-format
8364msgid "" 8538msgid ""
8365"\n" 8539"\n"
@@ -8368,7 +8542,7 @@ msgstr ""
8368"\n" 8542"\n"
8369"Schreiben in »%s« nicht möglich: %s\n" 8543"Schreiben in »%s« nicht möglich: %s\n"
8370 8544
8371#: src/util/gnunet-ecc.c:184 8545#: src/util/gnunet-ecc.c:189
8372#, c-format 8546#, c-format
8373msgid "" 8547msgid ""
8374"\n" 8548"\n"
@@ -8377,53 +8551,57 @@ msgstr ""
8377"\n" 8551"\n"
8378"Abgeschlossen!\n" 8552"Abgeschlossen!\n"
8379 8553
8380#: src/util/gnunet-ecc.c:187 8554#: src/util/gnunet-ecc.c:192
8381#, c-format 8555#, c-format
8382msgid "" 8556msgid ""
8383"\n" 8557"\n"
8384"Error, %u keys not generated\n" 8558"Error, %u keys not generated\n"
8385msgstr "" 8559msgstr ""
8386 8560
8387#: src/util/gnunet-ecc.c:280 8561#: src/util/gnunet-ecc.c:283
8388#, fuzzy, c-format 8562#, fuzzy, c-format
8389msgid "Hostkeys file `%s' not found\n" 8563msgid "Hostkeys file `%s' not found\n"
8390msgstr "Kommando `%s' wurde nicht gefunden!\n" 8564msgstr "Kommando `%s' wurde nicht gefunden!\n"
8391 8565
8392#: src/util/gnunet-ecc.c:291 8566#: src/util/gnunet-ecc.c:294
8393#, c-format 8567#, c-format
8394msgid "Hostkeys file `%s' is empty\n" 8568msgid "Hostkeys file `%s' is empty\n"
8395msgstr "" 8569msgstr ""
8396 8570
8397#: src/util/gnunet-ecc.c:313 8571#: src/util/gnunet-ecc.c:316
8398#, fuzzy, c-format 8572#, fuzzy, c-format
8399msgid "Could not read hostkey file: %s\n" 8573msgid "Could not read hostkey file: %s\n"
8400msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" 8574msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
8401 8575
8402#: src/util/gnunet-ecc.c:364 8576#: src/util/gnunet-ecc.c:367
8403msgid "No hostkey file specified on command line\n" 8577msgid "No hostkey file specified on command line\n"
8404msgstr "" 8578msgstr ""
8405 8579
8406#: src/util/gnunet-ecc.c:416 8580#: src/util/gnunet-ecc.c:425
8407msgid "list keys included in a file (for testing)" 8581msgid "list keys included in a file (for testing)"
8408msgstr "" 8582msgstr ""
8409 8583
8410#: src/util/gnunet-ecc.c:421 8584#: src/util/gnunet-ecc.c:430
8411msgid "number of keys to list included in a file (for testing)" 8585msgid "number of keys to list included in a file (for testing)"
8412msgstr "" 8586msgstr ""
8413 8587
8414#: src/util/gnunet-ecc.c:426 8588#: src/util/gnunet-ecc.c:435
8415msgid "create COUNT public-private key pairs (for testing)" 8589msgid "create COUNT public-private key pairs (for testing)"
8416msgstr "" 8590msgstr ""
8417 8591
8418#: src/util/gnunet-ecc.c:430 8592#: src/util/gnunet-ecc.c:439
8419msgid "print the public key in ASCII format" 8593msgid "print the public key in ASCII format"
8420msgstr "" 8594msgstr ""
8421 8595
8422#: src/util/gnunet-ecc.c:434 8596#: src/util/gnunet-ecc.c:443
8597msgid "print the public key in HEX format"
8598msgstr ""
8599
8600#: src/util/gnunet-ecc.c:447
8423msgid "print examples of ECC operations (used for compatibility testing)" 8601msgid "print examples of ECC operations (used for compatibility testing)"
8424msgstr "" 8602msgstr ""
8425 8603
8426#: src/util/gnunet-ecc.c:449 8604#: src/util/gnunet-ecc.c:463
8427msgid "Manipulate GNUnet private ECC key files" 8605msgid "Manipulate GNUnet private ECC key files"
8428msgstr "" 8606msgstr ""
8429 8607
@@ -8515,7 +8693,7 @@ msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
8515msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8693msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8516msgstr "" 8694msgstr ""
8517 8695
8518#: src/util/network.c:1793 src/util/network.c:1969 8696#: src/util/network.c:1793 src/util/network.c:1977
8519#, c-format 8697#, c-format
8520msgid "" 8698msgid ""
8521"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8699"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8569,7 +8747,7 @@ msgstr "`%s' fehlgeschlagen für die Bibliothek `%s'. Ort: %s:%d. Fehler: %s\n"
8569msgid "Could not determine plugin installation path.\n" 8747msgid "Could not determine plugin installation path.\n"
8570msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n" 8748msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n"
8571 8749
8572#: src/util/resolver_api.c:204 8750#: src/util/resolver_api.c:203
8573#, c-format 8751#, c-format
8574msgid "" 8752msgid ""
8575"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" 8753"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8584,33 +8762,33 @@ msgstr ""
8584"Sie müssen für `%s' in der Sektion `%s' der Konfigurationsdatei eine " 8762"Sie müssen für `%s' in der Sektion `%s' der Konfigurationsdatei eine "
8585"positive Zahl angeben.\n" 8763"positive Zahl angeben.\n"
8586 8764
8587#: src/util/resolver_api.c:815 8765#: src/util/resolver_api.c:826
8588#, fuzzy, c-format 8766#, fuzzy, c-format
8589msgid "Timeout trying to resolve hostname `%s'.\n" 8767msgid "Timeout trying to resolve hostname `%s'.\n"
8590msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" 8768msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
8591 8769
8592#: src/util/resolver_api.c:827 8770#: src/util/resolver_api.c:839
8593#, c-format 8771#, c-format
8594msgid "Timeout trying to resolve IP address `%s'.\n" 8772msgid "Timeout trying to resolve IP address `%s'.\n"
8595msgstr "" 8773msgstr ""
8596 8774
8597#: src/util/resolver_api.c:1004 8775#: src/util/resolver_api.c:1023
8598#, fuzzy 8776#, fuzzy
8599msgid "Resolver not configured correctly.\n" 8777msgid "Resolver not configured correctly.\n"
8600msgstr "Standarddienst »%s« ist nicht korrekt eingerichtet!\n" 8778msgstr "Standarddienst »%s« ist nicht korrekt eingerichtet!\n"
8601 8779
8602#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 8780#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
8603#: src/util/resolver_api.c:1121 8781#: src/util/resolver_api.c:1146
8604#, fuzzy, c-format 8782#, fuzzy, c-format
8605msgid "Could not resolve our FQDN: %s\n" 8783msgid "Could not resolve our FQDN: %s\n"
8606msgstr "`%s' konnte nicht aufgelöst werden: %s\n" 8784msgstr "`%s' konnte nicht aufgelöst werden: %s\n"
8607 8785
8608#: src/util/service.c:1306 8786#: src/util/service.c:1305
8609msgid "" 8787msgid ""
8610"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8788"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8611msgstr "" 8789msgstr ""
8612 8790
8613#: src/util/service.c:2082 8791#: src/util/service.c:2081
8614#, c-format 8792#, c-format
8615msgid "" 8793msgid ""
8616"Processing code for message of type %u did not call " 8794"Processing code for message of type %u did not call "
@@ -8685,63 +8863,63 @@ msgstr "Tage"
8685msgid "end of time" 8863msgid "end of time"
8686msgstr "" 8864msgstr ""
8687 8865
8688#: src/util/strings.c:1269 8866#: src/util/strings.c:1270
8689msgid "IPv6 address did not start with `['\n" 8867msgid "IPv6 address did not start with `['\n"
8690msgstr "IPv6-Adresse beginnt nicht mit »[«\n" 8868msgstr "IPv6-Adresse beginnt nicht mit »[«\n"
8691 8869
8692#: src/util/strings.c:1277 8870#: src/util/strings.c:1278
8693msgid "IPv6 address did contain ':' to separate port number\n" 8871msgid "IPv6 address did contain ':' to separate port number\n"
8694msgstr "IPv6-Adresse enthält kein »:« zur Abtrennung der Portnummer\n" 8872msgstr "IPv6-Adresse enthält kein »:« zur Abtrennung der Portnummer\n"
8695 8873
8696#: src/util/strings.c:1283 8874#: src/util/strings.c:1284
8697msgid "IPv6 address did contain ']' before ':' to separate port number\n" 8875msgid "IPv6 address did contain ']' before ':' to separate port number\n"
8698msgstr "IPv6-Adresse enthält kein »]« vor »:« zur Abtrennung der Portnummer\n" 8876msgstr "IPv6-Adresse enthält kein »]« vor »:« zur Abtrennung der Portnummer\n"
8699 8877
8700#: src/util/strings.c:1290 8878#: src/util/strings.c:1291
8701msgid "IPv6 address did contain a valid port number after the last ':'\n" 8879msgid "IPv6 address did contain a valid port number after the last ':'\n"
8702msgstr "IPv6-Adresse enthält keine gültige Portnummer nach dem letzten »:«\n" 8880msgstr "IPv6-Adresse enthält keine gültige Portnummer nach dem letzten »:«\n"
8703 8881
8704#: src/util/strings.c:1299 8882#: src/util/strings.c:1300
8705#, fuzzy, c-format 8883#, fuzzy, c-format
8706msgid "Invalid IPv6 address `%s': %s\n" 8884msgid "Invalid IPv6 address `%s': %s\n"
8707msgstr "Ungültige Antwort auf `%s' von `%s'\n" 8885msgstr "Ungültige Antwort auf `%s' von `%s'\n"
8708 8886
8709#: src/util/strings.c:1571 src/util/strings.c:1587 8887#: src/util/strings.c:1572 src/util/strings.c:1588
8710msgid "Port not in range\n" 8888msgid "Port not in range\n"
8711msgstr "Port außerhalb des Bereichs\n" 8889msgstr "Port außerhalb des Bereichs\n"
8712 8890
8713#: src/util/strings.c:1596 8891#: src/util/strings.c:1597
8714#, c-format 8892#, c-format
8715msgid "Malformed port policy `%s'\n" 8893msgid "Malformed port policy `%s'\n"
8716msgstr "" 8894msgstr ""
8717 8895
8718#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 8896#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
8719#: src/util/strings.c:1779 8897#: src/util/strings.c:1780
8720#, c-format 8898#, c-format
8721msgid "Invalid format for IP: `%s'\n" 8899msgid "Invalid format for IP: `%s'\n"
8722msgstr "Ungültiges Format für IP: »%s«\n" 8900msgstr "Ungültiges Format für IP: »%s«\n"
8723 8901
8724#: src/util/strings.c:1736 8902#: src/util/strings.c:1737
8725#, c-format 8903#, c-format
8726msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." 8904msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
8727msgstr "Ungültige Netzwerk-Notation ('/%d ist nicht gültig in IPv4 CIDR)." 8905msgstr "Ungültige Netzwerk-Notation ('/%d ist nicht gültig in IPv4 CIDR)."
8728 8906
8729#: src/util/strings.c:1788 8907#: src/util/strings.c:1789
8730#, fuzzy, c-format 8908#, fuzzy, c-format
8731msgid "Invalid format: `%s'\n" 8909msgid "Invalid format: `%s'\n"
8732msgstr "Ungültiges Format für IP: `%s'\n" 8910msgstr "Ungültiges Format für IP: `%s'\n"
8733 8911
8734#: src/util/strings.c:1840 8912#: src/util/strings.c:1841
8735#, c-format 8913#, c-format
8736msgid "Invalid network notation (does not end with ';': `%s')\n" 8914msgid "Invalid network notation (does not end with ';': `%s')\n"
8737msgstr "Ungültige Netzwerk-Notation (endet nicht mit »;«: »%s«)\n" 8915msgstr "Ungültige Netzwerk-Notation (endet nicht mit »;«: »%s«)\n"
8738 8916
8739#: src/util/strings.c:1890 8917#: src/util/strings.c:1891
8740#, fuzzy, c-format 8918#, fuzzy, c-format
8741msgid "Wrong format `%s' for netmask\n" 8919msgid "Wrong format `%s' for netmask\n"
8742msgstr "Falsches Format `%s' für Netzmaske: %s\n" 8920msgstr "Falsches Format `%s' für Netzmaske: %s\n"
8743 8921
8744#: src/util/strings.c:1921 8922#: src/util/strings.c:1922
8745#, fuzzy, c-format 8923#, fuzzy, c-format
8746msgid "Wrong format `%s' for network\n" 8924msgid "Wrong format `%s' for network\n"
8747msgstr "Falsches Format `%s' für Netzwerk: %s\n" 8925msgstr "Falsches Format `%s' für Netzwerk: %s\n"
@@ -8920,28 +9098,44 @@ msgstr "Dienst wird über UDP angeboten"
8920msgid "Setup tunnels via VPN." 9098msgid "Setup tunnels via VPN."
8921msgstr "Tunnel über VPN einrichten." 9099msgstr "Tunnel über VPN einrichten."
8922 9100
8923#: src/zonemaster/gnunet-service-zonemaster.c:705 9101#: src/zonemaster/gnunet-service-zonemaster.c:706
8924#, fuzzy 9102#, fuzzy
8925msgid "Failed to connect to the namestore!\n" 9103msgid "Failed to connect to the namestore!\n"
8926msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" 9104msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
8927 9105
8928#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 9106#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
8929#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 9107#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
8930#, fuzzy, c-format 9108#, fuzzy, c-format
8931msgid "Assertion failed at %s:%d.\n" 9109msgid "Assertion failed at %s:%d.\n"
8932msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n" 9110msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n"
8933 9111
8934#: src/include/gnunet_common.h:711 9112#: src/include/gnunet_common.h:726
8935#, fuzzy, c-format 9113#, fuzzy, c-format
8936msgid "External protocol violation detected at %s:%d.\n" 9114msgid "External protocol violation detected at %s:%d.\n"
8937msgstr "Protokollverletzung auf Socket. Kommando erwartet.\n" 9115msgstr "Protokollverletzung auf Socket. Kommando erwartet.\n"
8938 9116
8939#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 9117#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
8940#, fuzzy, c-format 9118#, fuzzy, c-format
8941msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" 9119msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
8942msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" 9120msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
8943 9121
8944#, fuzzy 9122#, fuzzy
9123#~ msgid "Token `%s' is malformed\n"
9124#~ msgstr "Schlüssel »%s« ist gültig\n"
9125
9126#, fuzzy
9127#~ msgid "Failed to create indices\n"
9128#~ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
9129
9130#, fuzzy
9131#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
9132#~ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
9133
9134#, fuzzy
9135#~ msgid "Unable to connect to Postgres database '%s': %s\n"
9136#~ msgstr "Fehler beim Anlegen des Benutzerkontos:"
9137
9138#, fuzzy
8945#~ msgid "Misconfiguration (can not connect to the ARM service)" 9139#~ msgid "Misconfiguration (can not connect to the ARM service)"
8946#~ msgstr "" 9140#~ msgstr ""
8947#~ "Konfiguration oder die GNUnet Version hat sich geändert. Sie müssen `%s' " 9141#~ "Konfiguration oder die GNUnet Version hat sich geändert. Sie müssen `%s' "
@@ -8969,10 +9163,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
8969#~ msgstr "Ausführliche Ausgabe" 9163#~ msgstr "Ausführliche Ausgabe"
8970 9164
8971#, fuzzy 9165#, fuzzy
8972#~ msgid "Specify the public key of the zone to reverse lookup a name for"
8973#~ msgstr "Die Priorität des Inhalts angeben"
8974
8975#, fuzzy
8976#~ msgid "# UPDATE requests executed" 9166#~ msgid "# UPDATE requests executed"
8977#~ msgstr "# dht Anfragen weitergeleitet" 9167#~ msgstr "# dht Anfragen weitergeleitet"
8978 9168
@@ -9054,10 +9244,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
9054#~ msgstr "# Klartext PONG Nachrichten empfangen" 9244#~ msgstr "# Klartext PONG Nachrichten empfangen"
9055 9245
9056#, fuzzy 9246#, fuzzy
9057#~ msgid "# bytes sent to datastore"
9058#~ msgstr "# bytes in der Datenbank"
9059
9060#, fuzzy
9061#~ msgid "Failed to receive status response from database." 9247#~ msgid "Failed to receive status response from database."
9062#~ msgstr "" 9248#~ msgstr ""
9063#~ "\n" 9249#~ "\n"
@@ -9282,10 +9468,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
9282#~ msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n" 9468#~ msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
9283 9469
9284#, fuzzy 9470#, fuzzy
9285#~ msgid "Error reading sensor version\n"
9286#~ msgstr "Fehler beim Anlegen des Benutzers"
9287
9288#, fuzzy
9289#~ msgid "Error reading sensor category\n" 9471#~ msgid "Error reading sensor category\n"
9290#~ msgstr "Fehler beim Anlegen des Benutzers" 9472#~ msgstr "Fehler beim Anlegen des Benutzers"
9291 9473
diff --git a/po/es.po b/po/es.po
index 090f097d2..c4ede04a3 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: gnunet 0.9.5a\n" 8"Project-Id-Version: gnunet 0.9.5a\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2017-03-31 19:22-0500\n" 10"POT-Creation-Date: 2017-10-20 15:14+0000\n"
11"PO-Revision-Date: 2013-02-23 17:50+0100\n" 11"PO-Revision-Date: 2013-02-23 17:50+0100\n"
12"Last-Translator: Miguel Ãngel Arruga Vivas <rosen644835@gmail.com>\n" 12"Last-Translator: Miguel Ãngel Arruga Vivas <rosen644835@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n" 13"Language-Team: Spanish <es@li.org>\n"
@@ -288,7 +288,7 @@ msgstr ""
288"uno es necesario\n" 288"uno es necesario\n"
289 289
290#: src/arm/gnunet-service-arm.c:513 290#: src/arm/gnunet-service-arm.c:513
291#: src/transport/plugin_transport_http_server.c:2621 291#: src/transport/plugin_transport_http_server.c:2684
292#: src/transport/plugin_transport_tcp.c:1259 292#: src/transport/plugin_transport_tcp.c:1259
293#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 293#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
294#, c-format 294#, c-format
@@ -296,7 +296,7 @@ msgid "Failed to resolve `%s': %s\n"
296msgstr "Se produjo un fallo al resolver «%s»: %s\n" 296msgstr "Se produjo un fallo al resolver «%s»: %s\n"
297 297
298#: src/arm/gnunet-service-arm.c:532 298#: src/arm/gnunet-service-arm.c:532
299#: src/transport/plugin_transport_http_server.c:2639 299#: src/transport/plugin_transport_http_server.c:2702
300#: src/transport/plugin_transport_tcp.c:1278 300#: src/transport/plugin_transport_tcp.c:1278
301#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 301#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
302#, c-format 302#, c-format
@@ -376,152 +376,14 @@ msgstr "El servicio «%s» finalizó con estado %s/%d, se reiniciará en %llu ms
376msgid "Initiating shutdown as requested by client.\n" 376msgid "Initiating shutdown as requested by client.\n"
377msgstr "Iniciando apagado bajo petición del cliente.\n" 377msgstr "Iniciando apagado bajo petición del cliente.\n"
378 378
379#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 379#: src/ats-tests/ats-testing-log.c:837
380#, c-format 380msgid "Stop logging\n"
381msgid ""
382"Could not load quota for network `%s': `%s', assigning default bandwidth "
383"%llu\n"
384msgstr ""
385"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
386"de banda predeterminado %llu\n"
387
388#: src/ats/gnunet-ats-solver-eval.c:2799
389#, c-format
390msgid ""
391"No outbound quota configured for network `%s', assigning default bandwidth "
392"%llu\n"
393msgstr ""
394"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
395"de banda predeterminado %llu\n"
396
397#: src/ats/gnunet-ats-solver-eval.c:2840
398#, c-format
399msgid ""
400"No outbound quota configure for network `%s', assigning default bandwidth "
401"%llu\n"
402msgstr ""
403"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
404"de banda predeterminado %llu\n"
405
406#: src/ats/gnunet-ats-solver-eval.c:3294
407#: src/ats-tests/gnunet-solver-eval.c:939
408#, fuzzy
409msgid "solver to use"
410msgstr "valor a establecer"
411
412#: src/ats/gnunet-ats-solver-eval.c:3299
413#: src/ats-tests/gnunet-solver-eval.c:945
414#: src/ats-tests/gnunet-solver-eval.c:950
415msgid "experiment to use"
416msgstr ""
417
418#: src/ats/gnunet-ats-solver-eval.c:3306
419#, fuzzy
420msgid "print logging"
421msgstr "Iniciando descarga «%s».\n"
422
423#: src/ats/gnunet-ats-solver-eval.c:3311
424msgid "save logging to disk"
425msgstr ""
426
427#: src/ats/gnunet-ats-solver-eval.c:3316
428msgid "disable normalization"
429msgstr ""
430
431#: src/ats/gnunet-service-ats_plugins.c:304
432#, fuzzy, c-format
433msgid ""
434"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
435"%llu\n"
436msgstr ""
437"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
438"de banda predeterminado %llu\n"
439
440# Miguel: "Inbound" lo he traducido como entrada en todo el texto.
441#: src/ats/gnunet-service-ats_plugins.c:314
442#, fuzzy, c-format
443msgid "%s quota configured for network `%s' is %llu\n"
444msgstr "La cuota de entrada configurada para la red «%s» es %llu\n"
445
446#: src/ats/gnunet-service-ats_plugins.c:359
447#, fuzzy, c-format
448msgid ""
449"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
450msgstr ""
451"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
452"de banda predeterminado %llu\n"
453
454#: src/ats/gnunet-service-ats_plugins.c:451
455#, fuzzy, c-format
456msgid "Failed to initialize solver `%s'!\n"
457msgstr "¡No se puede inicializar el resolvedor!\n"
458
459#: src/ats/plugin_ats_mlp.c:1274
460msgid "Problem size too large, cannot allocate memory!\n"
461msgstr ""
462
463#: src/ats/plugin_ats_mlp.c:1869
464#, fuzzy, c-format
465msgid "Adding address for peer `%s' multiple times\n"
466msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
467
468#: src/ats/plugin_ats_mlp.c:1913
469#, fuzzy, c-format
470msgid "Updating address property for peer `%s' %p not added before\n"
471msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
472
473#: src/ats/plugin_ats_mlp.c:2475
474msgid ""
475"MLP solver is not optimizing for anything, changing to feasibility check\n"
476msgstr ""
477
478#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
479#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
480#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
481#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
482#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
483#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
484#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
485#, fuzzy, c-format
486msgid "Invalid %s configuration %f \n"
487msgstr "Se produjo un fallo al cargar la configuración de %s\n"
488
489#: src/ats/plugin_ats_mlp.c:2670
490#, fuzzy, c-format
491msgid ""
492"Adjusting inconsistent outbound quota configuration for network `%s', is "
493"%llu must be at least %llu\n"
494msgstr ""
495"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
496"de banda predeterminado %llu\n"
497
498#: src/ats/plugin_ats_mlp.c:2679
499#, fuzzy, c-format
500msgid ""
501"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
502"must be at least %llu\n"
503msgstr "" 381msgstr ""
504"No hay configuración de cuota de entrada para la red '%s', asignando el "
505"ancho de banda predeterminado (%llu)\n"
506
507# Miguel: "Outbound" lo he traducido como salida en todo el texto.
508#: src/ats/plugin_ats_mlp.c:2689
509#, fuzzy, c-format
510msgid ""
511"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
512msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
513
514# Miguel: "Outbound" lo he traducido como salida en todo el texto.
515#: src/ats/plugin_ats_mlp.c:2698
516#, fuzzy, c-format
517msgid ""
518"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
519msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
520 382
521#: src/ats/plugin_ats_proportional.c:1164 383#: src/ats-tests/ats-testing-log.c:892
522#, fuzzy, c-format 384#, fuzzy, c-format
523msgid "Invalid %s configuration %f\n" 385msgid "Start logging `%s'\n"
524msgstr "Se produjo un fallo al cargar la configuración de %s\n" 386msgstr "Iniciando descarga «%s».\n"
525 387
526#: src/ats-tests/ats-testing.c:422 388#: src/ats-tests/ats-testing.c:422
527#, c-format 389#, c-format
@@ -533,15 +395,6 @@ msgstr ""
533msgid "Failed to connect master peer [%u] with slave [%u]\n" 395msgid "Failed to connect master peer [%u] with slave [%u]\n"
534msgstr "Fallo al conectar a gnunetd.\n" 396msgstr "Fallo al conectar a gnunetd.\n"
535 397
536#: src/ats-tests/ats-testing-log.c:837
537msgid "Stop logging\n"
538msgstr ""
539
540#: src/ats-tests/ats-testing-log.c:892
541#, fuzzy, c-format
542msgid "Start logging `%s'\n"
543msgstr "Iniciando descarga «%s».\n"
544
545#: src/ats-tests/gnunet-ats-sim.c:90 398#: src/ats-tests/gnunet-ats-sim.c:90
546#, c-format 399#, c-format
547msgid "" 400msgid ""
@@ -549,6 +402,16 @@ msgid ""
549"= %u KiB/s\n" 402"= %u KiB/s\n"
550msgstr "" 403msgstr ""
551 404
405#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
406#, fuzzy
407msgid "solver to use"
408msgstr "valor a establecer"
409
410#: src/ats-tests/gnunet-solver-eval.c:945
411#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
412msgid "experiment to use"
413msgstr ""
414
552# Miguel: ¿Como podría traducir "resolutions" y "resolve"? 415# Miguel: ¿Como podría traducir "resolutions" y "resolve"?
553# Son difíciles de no calcar, puesto que no conozco como expresar 416# Son difíciles de no calcar, puesto que no conozco como expresar
554# el concepto de obtener una dirección a partir de un nombre 417# el concepto de obtener una dirección a partir de un nombre
@@ -683,6 +546,141 @@ msgstr "salida prolija (incluye las propiedades de direcciones del ATS)"
683msgid "Print information about ATS state" 546msgid "Print information about ATS state"
684msgstr "Imprime información acerca del estado del ATS" 547msgstr "Imprime información acerca del estado del ATS"
685 548
549#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
550#, c-format
551msgid ""
552"Could not load quota for network `%s': `%s', assigning default bandwidth "
553"%llu\n"
554msgstr ""
555"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
556"de banda predeterminado %llu\n"
557
558#: src/ats/gnunet-ats-solver-eval.c:2799
559#, c-format
560msgid ""
561"No outbound quota configured for network `%s', assigning default bandwidth "
562"%llu\n"
563msgstr ""
564"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
565"de banda predeterminado %llu\n"
566
567#: src/ats/gnunet-ats-solver-eval.c:2840
568#, c-format
569msgid ""
570"No outbound quota configure for network `%s', assigning default bandwidth "
571"%llu\n"
572msgstr ""
573"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
574"de banda predeterminado %llu\n"
575
576#: src/ats/gnunet-ats-solver-eval.c:3306
577#, fuzzy
578msgid "print logging"
579msgstr "Iniciando descarga «%s».\n"
580
581#: src/ats/gnunet-ats-solver-eval.c:3311
582msgid "save logging to disk"
583msgstr ""
584
585#: src/ats/gnunet-ats-solver-eval.c:3316
586msgid "disable normalization"
587msgstr ""
588
589#: src/ats/gnunet-service-ats_plugins.c:304
590#, fuzzy, c-format
591msgid ""
592"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
593"%llu\n"
594msgstr ""
595"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
596"de banda predeterminado %llu\n"
597
598# Miguel: "Inbound" lo he traducido como entrada en todo el texto.
599#: src/ats/gnunet-service-ats_plugins.c:314
600#, fuzzy, c-format
601msgid "%s quota configured for network `%s' is %llu\n"
602msgstr "La cuota de entrada configurada para la red «%s» es %llu\n"
603
604#: src/ats/gnunet-service-ats_plugins.c:359
605#, fuzzy, c-format
606msgid ""
607"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
608msgstr ""
609"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
610"de banda predeterminado %llu\n"
611
612#: src/ats/gnunet-service-ats_plugins.c:451
613#, fuzzy, c-format
614msgid "Failed to initialize solver `%s'!\n"
615msgstr "¡No se puede inicializar el resolvedor!\n"
616
617#: src/ats/plugin_ats_mlp.c:1274
618msgid "Problem size too large, cannot allocate memory!\n"
619msgstr ""
620
621#: src/ats/plugin_ats_mlp.c:1869
622#, fuzzy, c-format
623msgid "Adding address for peer `%s' multiple times\n"
624msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
625
626#: src/ats/plugin_ats_mlp.c:1913
627#, fuzzy, c-format
628msgid "Updating address property for peer `%s' %p not added before\n"
629msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
630
631#: src/ats/plugin_ats_mlp.c:2475
632msgid ""
633"MLP solver is not optimizing for anything, changing to feasibility check\n"
634msgstr ""
635
636#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
637#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
638#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
639#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
640#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
641#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
642#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
643#, fuzzy, c-format
644msgid "Invalid %s configuration %f \n"
645msgstr "Se produjo un fallo al cargar la configuración de %s\n"
646
647#: src/ats/plugin_ats_mlp.c:2670
648#, fuzzy, c-format
649msgid ""
650"Adjusting inconsistent outbound quota configuration for network `%s', is "
651"%llu must be at least %llu\n"
652msgstr ""
653"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
654"de banda predeterminado %llu\n"
655
656#: src/ats/plugin_ats_mlp.c:2679
657#, fuzzy, c-format
658msgid ""
659"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
660"must be at least %llu\n"
661msgstr ""
662"No hay configuración de cuota de entrada para la red '%s', asignando el "
663"ancho de banda predeterminado (%llu)\n"
664
665# Miguel: "Outbound" lo he traducido como salida en todo el texto.
666#: src/ats/plugin_ats_mlp.c:2689
667#, fuzzy, c-format
668msgid ""
669"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
670msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
671
672# Miguel: "Outbound" lo he traducido como salida en todo el texto.
673#: src/ats/plugin_ats_mlp.c:2698
674#, fuzzy, c-format
675msgid ""
676"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
677msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
678
679#: src/ats/plugin_ats_proportional.c:1164
680#, fuzzy, c-format
681msgid "Invalid %s configuration %f\n"
682msgstr "Se produjo un fallo al cargar la configuración de %s\n"
683
686#: src/auction/gnunet-auction-create.c:163 684#: src/auction/gnunet-auction-create.c:163
687msgid "description of the item to be sold" 685msgid "description of the item to be sold"
688msgstr "" 686msgstr ""
@@ -834,6 +832,28 @@ msgid "Connection to conversation service lost, trying to reconnect\n"
834msgstr "" 832msgstr ""
835"El cliente se desconectó del servicio principal, tratando de reconectar.\n" 833"El cliente se desconectó del servicio principal, tratando de reconectar.\n"
836 834
835#: src/conversation/gnunet-conversation-test.c:119
836#, c-format
837msgid ""
838"\n"
839"End of transmission. Have a GNU day.\n"
840msgstr ""
841
842#: src/conversation/gnunet-conversation-test.c:145
843#, c-format
844msgid ""
845"\n"
846"We are now playing your recording back. If you can hear it, your audio "
847"settings are working..."
848msgstr ""
849
850#: src/conversation/gnunet-conversation-test.c:210
851#, c-format
852msgid ""
853"We will now be recording you for %s. After that time, the recording will be "
854"played back to you..."
855msgstr ""
856
837#: src/conversation/gnunet-conversation.c:269 857#: src/conversation/gnunet-conversation.c:269
838#, c-format 858#, c-format
839msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" 859msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1092,30 +1112,8 @@ msgstr ""
1092msgid "Enables having a conversation with other GNUnet users." 1112msgid "Enables having a conversation with other GNUnet users."
1093msgstr "" 1113msgstr ""
1094 1114
1095#: src/conversation/gnunet-conversation-test.c:119
1096#, c-format
1097msgid ""
1098"\n"
1099"End of transmission. Have a GNU day.\n"
1100msgstr ""
1101
1102#: src/conversation/gnunet-conversation-test.c:145
1103#, c-format
1104msgid ""
1105"\n"
1106"We are now playing your recording back. If you can hear it, your audio "
1107"settings are working..."
1108msgstr ""
1109
1110#: src/conversation/gnunet-conversation-test.c:210
1111#, c-format
1112msgid ""
1113"We will now be recording you for %s. After that time, the recording will be "
1114"played back to you..."
1115msgstr ""
1116
1117#: src/conversation/gnunet_gst.c:622
1118#: src/conversation/gnunet-helper-audio-playback-gst.c:356 1115#: src/conversation/gnunet-helper-audio-playback-gst.c:356
1116#: src/conversation/gnunet_gst.c:622
1119#, c-format 1117#, c-format
1120msgid "Read error from STDIN: %d %s\n" 1118msgid "Read error from STDIN: %d %s\n"
1121msgstr "" 1119msgstr ""
@@ -1247,6 +1245,11 @@ msgid "Failed to allocate %u bytes for second packet\n"
1247msgstr "" 1245msgstr ""
1248"Se produjo un fallo al alojar las direcciones IP para el nuevo destino\n" 1246"Se produjo un fallo al alojar las direcciones IP para el nuevo destino\n"
1249 1247
1248#: src/conversation/gnunet-service-conversation.c:1276
1249#, fuzzy, c-format
1250msgid "Could not open line, port %s already in use!\n"
1251msgstr "¡No se pudo conectar al servicio %s!\n"
1252
1250#: src/conversation/microphone.c:119 1253#: src/conversation/microphone.c:119
1251#, fuzzy 1254#, fuzzy
1252msgid "Could not start record audio helper\n" 1255msgid "Could not start record audio helper\n"
@@ -1534,8 +1537,140 @@ msgstr "# mapas de tipos recibidos"
1534msgid "# updates to my type map" 1537msgid "# updates to my type map"
1535msgstr "# actualizaciones de mi mapa de tipos" 1538msgstr "# actualizaciones de mi mapa de tipos"
1536 1539
1540#: src/credential/credential_misc.c:88
1541#, fuzzy, c-format
1542msgid "Unable to parse CRED record string `%s'\n"
1543msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
1544
1545#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
1546#: src/namestore/plugin_rest_namestore.c:1009
1547#, fuzzy, c-format
1548msgid "Ego `%s' not known to identity service\n"
1549msgstr "'%s': servicio desconocido: %s\n"
1550
1551#: src/credential/gnunet-credential.c:294
1552#: src/credential/gnunet-credential.c:446
1553#, fuzzy, c-format
1554msgid "Issuer public key `%s' is not well-formed\n"
1555msgstr "El bloque del tipo %u está mal formado\n"
1556
1557#: src/credential/gnunet-credential.c:375
1558#: src/credential/gnunet-credential.c:435
1559#, fuzzy, c-format
1560msgid "Issuer public key not well-formed\n"
1561msgstr "El bloque del tipo %u está mal formado\n"
1562
1563#: src/credential/gnunet-credential.c:386
1564#: src/credential/gnunet-credential.c:455
1565#, fuzzy, c-format
1566msgid "Failed to connect to CREDENTIAL\n"
1567msgstr "Se produjo un fallo al conectar con GNS\n"
1568
1569#: src/credential/gnunet-credential.c:392
1570#, c-format
1571msgid "You must provide issuer the attribute\n"
1572msgstr ""
1573
1574#: src/credential/gnunet-credential.c:399
1575#, fuzzy, c-format
1576msgid "ego required\n"
1577msgstr "Tipo requerido\n"
1578
1579#: src/credential/gnunet-credential.c:415
1580#, c-format
1581msgid "Subject public key needed\n"
1582msgstr ""
1583
1584#: src/credential/gnunet-credential.c:426
1585#, fuzzy, c-format
1586msgid "Subject public key `%s' is not well-formed\n"
1587msgstr "El bloque del tipo %u está mal formado\n"
1588
1589#: src/credential/gnunet-credential.c:461
1590#, c-format
1591msgid "You must provide issuer and subject attributes\n"
1592msgstr ""
1593
1594#: src/credential/gnunet-credential.c:511
1595#, fuzzy, c-format
1596msgid "Issuer ego required\n"
1597msgstr "Tipo requerido\n"
1598
1599#: src/credential/gnunet-credential.c:523
1600#, c-format
1601msgid "Please specify name to lookup, subject key and issuer key!\n"
1602msgstr ""
1603
1604#: src/credential/gnunet-credential.c:543
1605msgid "create credential"
1606msgstr ""
1607
1608#: src/credential/gnunet-credential.c:547
1609msgid "verify credential against attribute"
1610msgstr ""
1611
1612#: src/credential/gnunet-credential.c:552
1613#, fuzzy
1614msgid "The public key of the subject to lookup the credential for"
1615msgstr "Especificar el tipo del registro a buscar"
1616
1617#: src/credential/gnunet-credential.c:557
1618msgid "The name of the credential presented by the subject"
1619msgstr ""
1620
1621#: src/credential/gnunet-credential.c:562
1622#, fuzzy
1623msgid "The public key of the authority to verify the credential against"
1624msgstr "Especificar el tipo del registro a buscar"
1625
1626#: src/credential/gnunet-credential.c:567
1627#, fuzzy
1628msgid "The ego to use"
1629msgstr "tamaño del mensaje"
1630
1631#: src/credential/gnunet-credential.c:572
1632msgid "The issuer attribute to verify against or to issue"
1633msgstr ""
1634
1635#: src/credential/gnunet-credential.c:577
1636msgid "The time to live for the credential"
1637msgstr ""
1638
1639#: src/credential/gnunet-credential.c:581
1640msgid "collect credentials"
1641msgstr ""
1642
1643#: src/credential/gnunet-credential.c:595
1644#, fuzzy
1645msgid "GNUnet credential resolver tool"
1646msgstr "Herramienta de acceso GNUnet GNS"
1647
1648#: src/credential/gnunet-service-credential.c:1204
1649#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
1650#, c-format
1651msgid "Failed to connect to GNS\n"
1652msgstr "Se produjo un fallo al conectar con GNS\n"
1653
1654#: src/credential/gnunet-service-credential.c:1210
1655#: src/namestore/gnunet-namestore-fcfsd.c:1034
1656#: src/namestore/gnunet-namestore.c:802
1657#: src/namestore/plugin_rest_namestore.c:1022
1658#, c-format
1659msgid "Failed to connect to namestore\n"
1660msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
1661
1662#: src/credential/plugin_gnsrecord_credential.c:186
1663#, fuzzy, c-format
1664msgid "Unable to parse ATTR record string `%s'\n"
1665msgstr "No se pudo procesar la cadena de registro TLSA «%s»\n"
1666
1667#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
1668#, fuzzy
1669msgid "GNS REST API initialized\n"
1670msgstr "Conexión fallida\n"
1671
1537#: src/datacache/datacache.c:119 src/datacache/datacache.c:294 1672#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
1538#: src/datastore/gnunet-service-datastore.c:775 1673#: src/datastore/gnunet-service-datastore.c:757
1539msgid "# bytes stored" 1674msgid "# bytes stored"
1540msgstr "# bytes almacenados" 1675msgstr "# bytes almacenados"
1541 1676
@@ -1578,13 +1713,12 @@ msgstr "Caché de datos de montículo (heap) ejecutándose\n"
1578 1713
1579#: src/datacache/plugin_datacache_sqlite.c:113 1714#: src/datacache/plugin_datacache_sqlite.c:113
1580#: src/datacache/plugin_datacache_sqlite.c:122 1715#: src/datacache/plugin_datacache_sqlite.c:122
1581#: src/datastore/plugin_datastore_mysql.c:980 1716#: src/datastore/plugin_datastore_mysql.c:892
1582#: src/datastore/plugin_datastore_sqlite.c:58 1717#: src/datastore/plugin_datastore_sqlite.c:58
1583#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 1718#: src/datastore/plugin_datastore_sqlite.c:66
1584#: src/mysql/mysql.c:42 src/mysql/mysql.c:49 1719#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
1585#: src/namecache/plugin_namecache_postgres.c:53 1720#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
1586#: src/namecache/plugin_namecache_sqlite.c:53 1721#: src/namecache/plugin_namecache_sqlite.c:53
1587#: src/namestore/plugin_namestore_postgres.c:53
1588#: src/namestore/plugin_namestore_sqlite.c:53 1722#: src/namestore/plugin_namestore_sqlite.c:53
1589#: src/peerstore/plugin_peerstore_sqlite.c:52 1723#: src/peerstore/plugin_peerstore_sqlite.c:52
1590#: src/psycstore/plugin_psycstore_mysql.c:62 1724#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1593,14 +1727,15 @@ msgstr "Caché de datos de montículo (heap) ejecutándose\n"
1593#: src/testbed/gnunet-daemon-testbed-underlay.c:56 1727#: src/testbed/gnunet-daemon-testbed-underlay.c:56
1594#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 1728#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
1595#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 1729#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
1596#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 1730#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
1597#: src/scalarproduct/scalarproduct.h:35 1731#: src/scalarproduct/scalarproduct.h:35
1598#, c-format 1732#, c-format
1599msgid "`%s' failed at %s:%d with error: %s\n" 1733msgid "`%s' failed at %s:%d with error: %s\n"
1600msgstr "«%s» falló en %s: %d con el error: %s\n" 1734msgstr "«%s» falló en %s: %d con el error: %s\n"
1601 1735
1602#: src/datacache/plugin_datacache_sqlite.c:817 1736#: src/datacache/plugin_datacache_sqlite.c:817
1603#: src/datastore/plugin_datastore_sqlite.c:475 1737#: src/datastore/plugin_datastore_sqlite.c:456
1738#: src/identity-provider/plugin_identity_provider_sqlite.c:336
1604#: src/namecache/plugin_namecache_sqlite.c:296 1739#: src/namecache/plugin_namecache_sqlite.c:296
1605#: src/namestore/plugin_namestore_sqlite.c:355 1740#: src/namestore/plugin_namestore_sqlite.c:355
1606msgid "Tried to close sqlite without finalizing all prepared statements.\n" 1741msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1665,23 +1800,75 @@ msgstr "# peticiones «GET ZERO ANONYMITY» ejecutadas"
1665msgid "# GET requests executed" 1800msgid "# GET requests executed"
1666msgstr "# peticiones «GET» ejecutadas" 1801msgstr "# peticiones «GET» ejecutadas"
1667 1802
1668#: src/datastore/gnunet-datastore.c:113 1803#: src/datastore/gnunet-datastore.c:189
1804#, c-format
1805msgid "Dumped %<PRIu64> records\n"
1806msgstr ""
1807
1808#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
1809#, c-format
1810msgid "Short write to file: %zd bytes expecting %zd\n"
1811msgstr ""
1812
1813#: src/datastore/gnunet-datastore.c:261
1814#, fuzzy
1815msgid "Error queueing datastore GET operation\n"
1816msgstr "Error leyendo «%s»: %s"
1817
1818#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
1819#, fuzzy, c-format
1820msgid "Unable to open dump file: %s\n"
1821msgstr "Se produjo un fallo al crear los índices\n"
1822
1823#: src/datastore/gnunet-datastore.c:326
1669#, fuzzy, c-format 1824#, fuzzy, c-format
1670msgid "Failed to store item: %s, aborting\n" 1825msgid "Failed to store item: %s, aborting\n"
1671msgstr "Se produjo un fallo al abrir «%s» para escritura" 1826msgstr "Se produjo un fallo al abrir «%s» para escritura"
1672 1827
1673#: src/datastore/gnunet-datastore.c:209 1828#: src/datastore/gnunet-datastore.c:340
1829#, fuzzy, c-format
1830msgid "Inserted %<PRIu64> records\n"
1831msgstr "establece registros de clase A"
1832
1833#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
1674#, c-format 1834#, c-format
1675msgid "Cannot use the same configuration for source and destination\n" 1835msgid "Short read from file: %zd bytes expecting %zd\n"
1676msgstr "" 1836msgstr ""
1677 1837
1678#: src/datastore/gnunet-datastore.c:256 1838#: src/datastore/gnunet-datastore.c:389
1679msgid "" 1839#, fuzzy
1680"specifies the configuration to use to access an alternative datastore; will " 1840msgid "Error queueing datastore PUT operation\n"
1681"merge that datastore into our current datastore" 1841msgstr "Error leyendo «%s»: %s"
1842
1843#: src/datastore/gnunet-datastore.c:432
1844msgid "Input file is not of a supported format\n"
1682msgstr "" 1845msgstr ""
1683 1846
1684#: src/datastore/gnunet-datastore.c:265 1847#: src/datastore/gnunet-datastore.c:458
1848#, fuzzy
1849msgid "Failed connecting to the datastore.\n"
1850msgstr "Se produjo un fallo al conectar con el almacén de datos."
1851
1852#: src/datastore/gnunet-datastore.c:470
1853#, fuzzy, c-format
1854msgid "Please choose at least one operation: %s, %s\n"
1855msgstr "Por favor, seleccione una operación: %s o %s o %s o %s o %s\n"
1856
1857#: src/datastore/gnunet-datastore.c:493
1858#, fuzzy
1859msgid "Dump all records from the datastore"
1860msgstr "Buscar el registro para el nombre dado"
1861
1862#: src/datastore/gnunet-datastore.c:497
1863#, fuzzy
1864msgid "Insert records into the datastore"
1865msgstr "# bytes mandados al almacén de datos"
1866
1867#: src/datastore/gnunet-datastore.c:502
1868msgid "File to dump or insert"
1869msgstr ""
1870
1871#: src/datastore/gnunet-datastore.c:511
1685#, fuzzy 1872#, fuzzy
1686msgid "Manipulate GNUnet datastore" 1873msgid "Manipulate GNUnet datastore"
1687msgstr "Manipular ficheros de configuración de GNUnet" 1874msgstr "Manipular ficheros de configuración de GNUnet"
@@ -1730,8 +1917,8 @@ msgstr "Espacio insuficiente para satisfacer la petición"
1730 1917
1731#: src/datastore/gnunet-service-datastore.c:634 1918#: src/datastore/gnunet-service-datastore.c:634
1732#: src/datastore/gnunet-service-datastore.c:689 1919#: src/datastore/gnunet-service-datastore.c:689
1733#: src/datastore/gnunet-service-datastore.c:977 1920#: src/datastore/gnunet-service-datastore.c:837
1734#: src/datastore/gnunet-service-datastore.c:1633 1921#: src/datastore/gnunet-service-datastore.c:1469
1735msgid "# reserved" 1922msgid "# reserved"
1736msgstr "# reservado" 1923msgstr "# reservado"
1737 1924
@@ -1739,47 +1926,47 @@ msgstr "# reservado"
1739msgid "Could not find matching reservation" 1926msgid "Could not find matching reservation"
1740msgstr "No se pudo encontrar una reserva coincidente" 1927msgstr "No se pudo encontrar una reserva coincidente"
1741 1928
1742#: src/datastore/gnunet-service-datastore.c:792 1929#: src/datastore/gnunet-service-datastore.c:773
1743#, c-format 1930#, c-format
1744msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" 1931msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
1745msgstr "" 1932msgstr ""
1746"Se necesitan %llu bytes más de espacio (%llu permitidos, usando %llu)\n" 1933"Se necesitan %llu bytes más de espacio (%llu permitidos, usando %llu)\n"
1747 1934
1748#: src/datastore/gnunet-service-datastore.c:1026 1935#: src/datastore/gnunet-service-datastore.c:876
1749msgid "# GET requests received" 1936msgid "# GET requests received"
1750msgstr "# peticiones «GET» recibidas" 1937msgstr "# peticiones «GET» recibidas"
1751 1938
1752#: src/datastore/gnunet-service-datastore.c:1058 1939#: src/datastore/gnunet-service-datastore.c:907
1753#, fuzzy 1940#, fuzzy
1754msgid "# GET KEY requests received" 1941msgid "# GET KEY requests received"
1755msgstr "# peticiones «GET» recibidas" 1942msgstr "# peticiones «GET» recibidas"
1756 1943
1757#: src/datastore/gnunet-service-datastore.c:1071 1944#: src/datastore/gnunet-service-datastore.c:920
1758msgid "# requests filtered by bloomfilter" 1945msgid "# requests filtered by bloomfilter"
1759msgstr "# peticiones filtradas por el «bloomfilter»" 1946msgstr "# peticiones filtradas por el «bloomfilter»"
1760 1947
1761#: src/datastore/gnunet-service-datastore.c:1108 1948#: src/datastore/gnunet-service-datastore.c:956
1762msgid "# GET REPLICATION requests received" 1949msgid "# GET REPLICATION requests received"
1763msgstr "# peticiones «GET REPLICATION» recibidas" 1950msgstr "# peticiones «GET REPLICATION» recibidas"
1764 1951
1765#: src/datastore/gnunet-service-datastore.c:1141 1952#: src/datastore/gnunet-service-datastore.c:989
1766msgid "# GET ZERO ANONYMITY requests received" 1953msgid "# GET ZERO ANONYMITY requests received"
1767msgstr "# peticiones «GET ZERO ANONYMITY» recibidas" 1954msgstr "# peticiones «GET ZERO ANONYMITY» recibidas"
1768 1955
1769#: src/datastore/gnunet-service-datastore.c:1190 1956#: src/datastore/gnunet-service-datastore.c:1036
1770msgid "Content not found" 1957msgid "Content not found"
1771msgstr "Contenido no encontrado" 1958msgstr "Contenido no encontrado"
1772 1959
1773#: src/datastore/gnunet-service-datastore.c:1199 1960#: src/datastore/gnunet-service-datastore.c:1043
1774msgid "# bytes removed (explicit request)" 1961msgid "# bytes removed (explicit request)"
1775msgstr "# bytes eliminados (petición explícita)" 1962msgstr "# bytes eliminados (petición explícita)"
1776 1963
1777#: src/datastore/gnunet-service-datastore.c:1246 1964#: src/datastore/gnunet-service-datastore.c:1088
1778msgid "# REMOVE requests received" 1965msgid "# REMOVE requests received"
1779msgstr "# peticiones «REMOVE» recibidas" 1966msgstr "# peticiones «REMOVE» recibidas"
1780 1967
1781# Miguel: ¿Cómo traducir «payload»? ¿Código cargado? 1968# Miguel: ¿Cómo traducir «payload»? ¿Código cargado?
1782#: src/datastore/gnunet-service-datastore.c:1301 1969#: src/datastore/gnunet-service-datastore.c:1137
1783#, fuzzy, c-format 1970#, fuzzy, c-format
1784msgid "" 1971msgid ""
1785"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" 1972"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
@@ -1787,102 +1974,103 @@ msgstr ""
1787"El «payload» del almacén de datos es impreciso (%lld < %lld). Intentando " 1974"El «payload» del almacén de datos es impreciso (%lld < %lld). Intentando "
1788"repararlo.\n" 1975"repararlo.\n"
1789 1976
1790#: src/datastore/gnunet-service-datastore.c:1307 1977#: src/datastore/gnunet-service-datastore.c:1143
1791#: src/datastore/gnunet-service-datastore.c:1482 1978#: src/datastore/gnunet-service-datastore.c:1318
1792#, c-format 1979#, c-format
1793msgid "New payload: %lld\n" 1980msgid "New payload: %lld\n"
1794msgstr "" 1981msgstr ""
1795 1982
1796#: src/datastore/gnunet-service-datastore.c:1361 1983#: src/datastore/gnunet-service-datastore.c:1197
1797#, c-format 1984#, c-format
1798msgid "Loading `%s' datastore plugin\n" 1985msgid "Loading `%s' datastore plugin\n"
1799msgstr "Cargando el módulo del almacén de datos «%s»\n" 1986msgstr "Cargando el módulo del almacén de datos «%s»\n"
1800 1987
1801#: src/datastore/gnunet-service-datastore.c:1373 1988#: src/datastore/gnunet-service-datastore.c:1209
1802#, c-format 1989#, c-format
1803msgid "Failed to load datastore plugin for `%s'\n" 1990msgid "Failed to load datastore plugin for `%s'\n"
1804msgstr "" 1991msgstr ""
1805"Se produjo un fallo al inicializar el módulo del almacén de datos para «%s»\n" 1992"Se produjo un fallo al inicializar el módulo del almacén de datos para «%s»\n"
1806 1993
1807#: src/datastore/gnunet-service-datastore.c:1433 1994#: src/datastore/gnunet-service-datastore.c:1269
1808msgid "Bloomfilter construction complete.\n" 1995msgid "Bloomfilter construction complete.\n"
1809msgstr "Construcción de «bloomfilter» completa.\n" 1996msgstr "Construcción de «bloomfilter» completa.\n"
1810 1997
1811#: src/datastore/gnunet-service-datastore.c:1489 1998#: src/datastore/gnunet-service-datastore.c:1325
1812msgid "Rebuilding bloomfilter. Please be patient.\n" 1999msgid "Rebuilding bloomfilter. Please be patient.\n"
1813msgstr "Reconstruyendo «bloomfilter». Por favor, tenga paciencia.\n" 2000msgstr "Reconstruyendo «bloomfilter». Por favor, tenga paciencia.\n"
1814 2001
1815#: src/datastore/gnunet-service-datastore.c:1500 2002#: src/datastore/gnunet-service-datastore.c:1336
1816msgid "Plugin does not support get_keys function. Please fix!\n" 2003msgid "Plugin does not support get_keys function. Please fix!\n"
1817msgstr "El módulo no soporta la función «get_keys». Por favor, corríjalo.\n" 2004msgstr "El módulo no soporta la función «get_keys». Por favor, corríjalo.\n"
1818 2005
1819#: src/datastore/gnunet-service-datastore.c:1670 2006#: src/datastore/gnunet-service-datastore.c:1506
1820#, c-format 2007#, c-format
1821msgid "# bytes used in file-sharing datastore `%s'" 2008msgid "# bytes used in file-sharing datastore `%s'"
1822msgstr "# bytes usados en el almacén de ficheros compartidos «%s»" 2009msgstr "# bytes usados en el almacén de ficheros compartidos «%s»"
1823 2010
1824#: src/datastore/gnunet-service-datastore.c:1686 2011#: src/datastore/gnunet-service-datastore.c:1522
1825msgid "# quota" 2012msgid "# quota"
1826msgstr "# cuota" 2013msgstr "# cuota"
1827 2014
1828#: src/datastore/gnunet-service-datastore.c:1691 2015#: src/datastore/gnunet-service-datastore.c:1527
1829msgid "# cache size" 2016msgid "# cache size"
1830msgstr "# tamaño de la caché" 2017msgstr "# tamaño de la caché"
1831 2018
1832#: src/datastore/gnunet-service-datastore.c:1707 2019#: src/datastore/gnunet-service-datastore.c:1543
1833#, c-format 2020#, c-format
1834msgid "Could not use specified filename `%s' for bloomfilter.\n" 2021msgid "Could not use specified filename `%s' for bloomfilter.\n"
1835msgstr "" 2022msgstr ""
1836"No se pudo usar el nombre de fichero especificado «%s» para «bloomfilter».\n" 2023"No se pudo usar el nombre de fichero especificado «%s» para «bloomfilter».\n"
1837 2024
1838#: src/datastore/gnunet-service-datastore.c:1725 2025#: src/datastore/gnunet-service-datastore.c:1561
1839#: src/datastore/gnunet-service-datastore.c:1741 2026#: src/datastore/gnunet-service-datastore.c:1577
1840#, c-format 2027#, c-format
1841msgid "Failed to remove bogus bloomfilter file `%s'\n" 2028msgid "Failed to remove bogus bloomfilter file `%s'\n"
1842msgstr "" 2029msgstr ""
1843"Se produjo un fallo al borrar el fichero de configuración defectuoso de " 2030"Se produjo un fallo al borrar el fichero de configuración defectuoso de "
1844"«bloomfilter» «%s»:\n" 2031"«bloomfilter» «%s»:\n"
1845 2032
1846#: src/datastore/gnunet-service-datastore.c:1773 2033#: src/datastore/gnunet-service-datastore.c:1609
1847msgid "Failed to initialize bloomfilter.\n" 2034msgid "Failed to initialize bloomfilter.\n"
1848msgstr "Se produjo un fallo al inicializar «bloomfilter».\n" 2035msgstr "Se produjo un fallo al inicializar «bloomfilter».\n"
1849 2036
1850#: src/datastore/plugin_datastore_heap.c:769 2037#: src/datastore/plugin_datastore_heap.c:893
1851msgid "Heap database running\n" 2038msgid "Heap database running\n"
1852msgstr "Base de datos de montículo ejecutándose\n" 2039msgstr "Base de datos de montículo ejecutándose\n"
1853 2040
1854#: src/datastore/plugin_datastore_mysql.c:377 2041#: src/datastore/plugin_datastore_mysql.c:371
1855#: src/datastore/plugin_datastore_sqlite.c:590 2042#: src/datastore/plugin_datastore_mysql.c:423
2043#: src/datastore/plugin_datastore_mysql.c:1075
2044msgid "MySQL statement run failure"
2045msgstr ""
2046
2047#: src/datastore/plugin_datastore_mysql.c:410
2048#: src/datastore/plugin_datastore_sqlite.c:626
1856#, fuzzy 2049#, fuzzy
1857msgid "Data too large" 2050msgid "Data too large"
1858msgstr "número de valores" 2051msgstr "número de valores"
1859 2052
1860#: src/datastore/plugin_datastore_mysql.c:393 2053#: src/datastore/plugin_datastore_mysql.c:848
1861msgid "MySQL statement run failure"
1862msgstr ""
1863
1864#: src/datastore/plugin_datastore_mysql.c:936
1865#, c-format 2054#, c-format
1866msgid "`%s' for `%s' failed at %s:%d with error: %s\n" 2055msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
1867msgstr "«%s» para «%s» falló en %s: %d con error: %s\n" 2056msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
1868 2057
1869#: src/datastore/plugin_datastore_mysql.c:1208 2058#: src/datastore/plugin_datastore_mysql.c:1180
1870#: src/psycstore/plugin_psycstore_mysql.c:1936 2059#: src/psycstore/plugin_psycstore_mysql.c:1936
1871msgid "Mysql database running\n" 2060msgid "Mysql database running\n"
1872msgstr "Base de datos Mysql ejecutándose\n" 2061msgstr "Base de datos Mysql ejecutándose\n"
1873 2062
1874#: src/datastore/plugin_datastore_postgres.c:345 2063#: src/datastore/plugin_datastore_postgres.c:274
2064#: src/datastore/plugin_datastore_postgres.c:891
1875msgid "Postgress exec failure" 2065msgid "Postgress exec failure"
1876msgstr "" 2066msgstr ""
1877 2067
1878#: src/datastore/plugin_datastore_postgres.c:866 2068#: src/datastore/plugin_datastore_postgres.c:852
1879msgid "Failed to drop table from database.\n" 2069msgid "Failed to drop table from database.\n"
1880msgstr "Se produjo un fallo al borrar una tabla de la base de datos.\n" 2070msgstr "Se produjo un fallo al borrar una tabla de la base de datos.\n"
1881 2071
1882#: src/datastore/plugin_datastore_postgres.c:903 2072#: src/datastore/plugin_datastore_postgres.c:950
1883#: src/namecache/plugin_namecache_postgres.c:398 2073#: src/psycstore/plugin_psycstore_postgres.c:1506
1884#: src/namestore/plugin_namestore_postgres.c:571
1885#: src/psycstore/plugin_psycstore_postgres.c:1721
1886msgid "Postgres database running\n" 2074msgid "Postgres database running\n"
1887msgstr "Base de datos Postgres ejecutándose\n" 2075msgstr "Base de datos Postgres ejecutándose\n"
1888 2076
@@ -1894,7 +2082,8 @@ msgstr "Base de datos Postgres ejecutándose\n"
1894msgid "`%s' failed at %s:%u with error: %s" 2082msgid "`%s' failed at %s:%u with error: %s"
1895msgstr "«%s» falló en %s:%u con el error: %s" 2083msgstr "«%s» falló en %s:%u con el error: %s"
1896 2084
1897#: src/datastore/plugin_datastore_sqlite.c:281 2085#: src/datastore/plugin_datastore_sqlite.c:271
2086#: src/identity-provider/plugin_identity_provider_sqlite.c:212
1898#: src/namecache/plugin_namecache_sqlite.c:194 2087#: src/namecache/plugin_namecache_sqlite.c:194
1899#: src/namestore/plugin_namestore_sqlite.c:222 2088#: src/namestore/plugin_namestore_sqlite.c:222
1900#: src/peerstore/plugin_peerstore_sqlite.c:535 2089#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1903,14 +2092,18 @@ msgstr "«%s» falló en %s:%u con el error: %s"
1903msgid "Unable to initialize SQLite: %s.\n" 2092msgid "Unable to initialize SQLite: %s.\n"
1904msgstr "Imposible inicializar SQLite: %s.\n" 2093msgstr "Imposible inicializar SQLite: %s.\n"
1905 2094
2095#: src/datastore/plugin_datastore_sqlite.c:577
2096msgid "sqlite bind failure"
2097msgstr ""
2098
1906# to should be too, i think 2099# to should be too, i think
1907#: src/datastore/plugin_datastore_sqlite.c:1234 2100#: src/datastore/plugin_datastore_sqlite.c:1259
1908msgid "sqlite version to old to determine size, assuming zero\n" 2101msgid "sqlite version to old to determine size, assuming zero\n"
1909msgstr "" 2102msgstr ""
1910"la versión de sqlite es muy antigua para determinar el tamaño, se asume " 2103"la versión de sqlite es muy antigua para determinar el tamaño, se asume "
1911"cero\n" 2104"cero\n"
1912 2105
1913#: src/datastore/plugin_datastore_sqlite.c:1268 2106#: src/datastore/plugin_datastore_sqlite.c:1293
1914#, c-format 2107#, c-format
1915msgid "" 2108msgid ""
1916"Using sqlite page utilization to estimate payload (%llu pages of size %llu " 2109"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
@@ -1919,13 +2112,14 @@ msgstr ""
1919"Usando la utilización de páginas de sqlite para estimar el «payload» (%llu " 2112"Usando la utilización de páginas de sqlite para estimar el «payload» (%llu "
1920"páginas de %llu bytes de tamaño)\n" 2113"páginas de %llu bytes de tamaño)\n"
1921 2114
1922#: src/datastore/plugin_datastore_sqlite.c:1312 2115#: src/datastore/plugin_datastore_sqlite.c:1337
2116#: src/identity-provider/plugin_identity_provider_sqlite.c:711
1923#: src/namecache/plugin_namecache_sqlite.c:603 2117#: src/namecache/plugin_namecache_sqlite.c:603
1924#: src/namestore/plugin_namestore_sqlite.c:802 2118#: src/namestore/plugin_namestore_sqlite.c:802
1925msgid "Sqlite database running\n" 2119msgid "Sqlite database running\n"
1926msgstr "Base de datos sqlite ejecutándose\n" 2120msgstr "Base de datos sqlite ejecutándose\n"
1927 2121
1928#: src/datastore/plugin_datastore_template.c:259 2122#: src/datastore/plugin_datastore_template.c:253
1929msgid "Template database running\n" 2123msgid "Template database running\n"
1930msgstr "Base de datos de plantilla ejecutándose\n" 2124msgstr "Base de datos de plantilla ejecutándose\n"
1931 2125
@@ -1989,54 +2183,6 @@ msgstr "ser prolijo (imprime información de progreso)"
1989msgid "Prints all packets that go through the DHT." 2183msgid "Prints all packets that go through the DHT."
1990msgstr "Imprime todos los paquetes que pasan por la DHT." 2184msgstr "Imprime todos los paquetes que pasan por la DHT."
1991 2185
1992#: src/dht/gnunet_dht_profiler.c:1161
1993#: src/testbed/gnunet-testbed-profiler.c:255
1994#, fuzzy, c-format
1995msgid "Exiting as the number of peers is %u\n"
1996msgstr "El número máximo de conexiones es %u\n"
1997
1998#: src/dht/gnunet_dht_profiler.c:1188
1999msgid "number of peers to start"
2000msgstr "número de pares para empezar"
2001
2002#: src/dht/gnunet_dht_profiler.c:1194
2003msgid ""
2004"maximum number of times we try to search for successor circle formation (0 "
2005"for R5N)"
2006msgstr ""
2007
2008#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2009#: src/testbed/gnunet-testbed-profiler.c:305
2010msgid "name of the file with the login information for the testbed"
2011msgstr ""
2012"nombre del fichero con la información de acceso usada para la batería de "
2013"pruebas"
2014
2015#: src/dht/gnunet_dht_profiler.c:1206
2016msgid "delay between rounds for collecting statistics (default: 30 sec)"
2017msgstr ""
2018
2019#: src/dht/gnunet_dht_profiler.c:1212
2020msgid "delay to start doing PUTs (default: 1 sec)"
2021msgstr ""
2022
2023#: src/dht/gnunet_dht_profiler.c:1218
2024msgid "delay to start doing GETs (default: 5 min)"
2025msgstr ""
2026
2027#: src/dht/gnunet_dht_profiler.c:1223
2028msgid "replication degree for DHT PUTs"
2029msgstr ""
2030
2031#: src/dht/gnunet_dht_profiler.c:1230
2032msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2033msgstr ""
2034
2035#: src/dht/gnunet_dht_profiler.c:1248
2036#, fuzzy
2037msgid "Measure quality and performance of the DHT service."
2038msgstr "Medir la calidad y rendimiento del servicio NSE."
2039
2040#: src/dht/gnunet-dht-put.c:120 2186#: src/dht/gnunet-dht-put.c:120
2041msgid "PUT request sent with key" 2187msgid "PUT request sent with key"
2042msgstr "Petición «PUT» enviada con clave" 2188msgstr "Petición «PUT» enviada con clave"
@@ -2303,6 +2449,53 @@ msgstr "# Entradas añadidas a la tabla de encaminamiento"
2303msgid "# DHT requests combined" 2449msgid "# DHT requests combined"
2304msgstr "# Peticiones a la DHT combinadas" 2450msgstr "# Peticiones a la DHT combinadas"
2305 2451
2452#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
2453#, fuzzy, c-format
2454msgid "Exiting as the number of peers is %u\n"
2455msgstr "El número máximo de conexiones es %u\n"
2456
2457#: src/dht/gnunet_dht_profiler.c:1188
2458msgid "number of peers to start"
2459msgstr "número de pares para empezar"
2460
2461#: src/dht/gnunet_dht_profiler.c:1194
2462msgid ""
2463"maximum number of times we try to search for successor circle formation (0 "
2464"for R5N)"
2465msgstr ""
2466
2467#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2468#: src/testbed/gnunet-testbed-profiler.c:305
2469msgid "name of the file with the login information for the testbed"
2470msgstr ""
2471"nombre del fichero con la información de acceso usada para la batería de "
2472"pruebas"
2473
2474#: src/dht/gnunet_dht_profiler.c:1206
2475msgid "delay between rounds for collecting statistics (default: 30 sec)"
2476msgstr ""
2477
2478#: src/dht/gnunet_dht_profiler.c:1212
2479msgid "delay to start doing PUTs (default: 1 sec)"
2480msgstr ""
2481
2482#: src/dht/gnunet_dht_profiler.c:1218
2483msgid "delay to start doing GETs (default: 5 min)"
2484msgstr ""
2485
2486#: src/dht/gnunet_dht_profiler.c:1223
2487msgid "replication degree for DHT PUTs"
2488msgstr ""
2489
2490#: src/dht/gnunet_dht_profiler.c:1230
2491msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2492msgstr ""
2493
2494#: src/dht/gnunet_dht_profiler.c:1248
2495#, fuzzy
2496msgid "Measure quality and performance of the DHT service."
2497msgstr "Medir la calidad y rendimiento del servicio NSE."
2498
2306#: src/dht/plugin_block_dht.c:187 2499#: src/dht/plugin_block_dht.c:187
2307#, c-format 2500#, c-format
2308msgid "Block not of type %u\n" 2501msgid "Block not of type %u\n"
@@ -2646,7 +2839,7 @@ msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
2646msgid "No useful service enabled. Exiting.\n" 2839msgid "No useful service enabled. Exiting.\n"
2647msgstr "Ningún servicio útil habilitado. Saliendo.\n" 2840msgstr "Ningún servicio útil habilitado. Saliendo.\n"
2648 2841
2649#: src/exit/gnunet-daemon-exit.c:3969 2842#: src/exit/gnunet-daemon-exit.c:3970
2650msgid "Daemon to run to provide an IP exit node for the VPN" 2843msgid "Daemon to run to provide an IP exit node for the VPN"
2651msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN" 2844msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN"
2652 2845
@@ -3325,14 +3518,6 @@ msgstr ""
3325"Descargar ficheros de GNUnet usando una URI GNUnet CHK o LOC (gnunet://fs/" 3518"Descargar ficheros de GNUnet usando una URI GNUnet CHK o LOC (gnunet://fs/"
3326"chk/...)" 3519"chk/...)"
3327 3520
3328#: src/fs/gnunet-fs.c:119
3329msgid "print a list of all indexed files"
3330msgstr "imprimir una lista de todos los ficheros indexados"
3331
3332#: src/fs/gnunet-fs.c:130
3333msgid "Special file-sharing operations"
3334msgstr "Operaciones especiales de compartición de ficheros"
3335
3336#: src/fs/gnunet-fs-profiler.c:211 3521#: src/fs/gnunet-fs-profiler.c:211
3337msgid "run the experiment with COUNT peers" 3522msgid "run the experiment with COUNT peers"
3338msgstr "ejecuta el experimento con «COUNT» pares" 3523msgstr "ejecuta el experimento con «COUNT» pares"
@@ -3353,6 +3538,14 @@ msgstr ""
3353"ejecuta una batería de pruebas para medir el rendimiento de la compartición " 3538"ejecuta una batería de pruebas para medir el rendimiento de la compartición "
3354"de ficheros" 3539"de ficheros"
3355 3540
3541#: src/fs/gnunet-fs.c:119
3542msgid "print a list of all indexed files"
3543msgstr "imprimir una lista de todos los ficheros indexados"
3544
3545#: src/fs/gnunet-fs.c:130
3546msgid "Special file-sharing operations"
3547msgstr "Operaciones especiales de compartición de ficheros"
3548
3356#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231 3549#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
3357#, c-format 3550#, c-format
3358msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" 3551msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4049,22 +4242,11 @@ msgstr ""
4049msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4242msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
4050msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)" 4243msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)"
4051 4244
4052#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 4245#: src/gns/gnunet-gns-helper-service-w32.c:602
4053#, c-format 4246msgid "Not ready to process requests, lacking ego data\n"
4054msgid "Invalid typename specified, assuming `ANY'\n"
4055msgstr ""
4056
4057#: src/gns/gnunet-gns.c:252
4058#, c-format
4059msgid "Please specify name to lookup!\n"
4060msgstr ""
4061
4062#: src/gns/gnunet-gns.c:276
4063#, c-format
4064msgid "Ego for `%s' not found, cannot perform lookup.\n"
4065msgstr "" 4247msgstr ""
4066 4248
4067#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701 4249#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
4068#: src/gns/plugin_rest_gns.c:422 4250#: src/gns/plugin_rest_gns.c:422
4069#, c-format 4251#, c-format
4070msgid "" 4252msgid ""
@@ -4072,58 +4254,12 @@ msgid ""
4072"gns-import.sh?\n" 4254"gns-import.sh?\n"
4073msgstr "" 4255msgstr ""
4074 4256
4075#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
4076#, c-format
4077msgid "Failed to connect to GNS\n"
4078msgstr "Se produjo un fallo al conectar con GNS\n"
4079
4080#: src/gns/gnunet-gns.c:374
4081#, c-format
4082msgid "Public key `%s' is not well-formed\n"
4083msgstr ""
4084
4085#: src/gns/gnunet-gns.c:428
4086msgid "Lookup a record for the given name"
4087msgstr "Buscar el registro para el nombre dado"
4088
4089#: src/gns/gnunet-gns.c:434
4090msgid "Specify the type of the record to lookup"
4091msgstr "Especificar el tipo del registro a buscar"
4092
4093#: src/gns/gnunet-gns.c:440
4094#, fuzzy
4095msgid "Specify timeout for the lookup"
4096msgstr "Especificar el tipo del registro a buscar"
4097
4098#: src/gns/gnunet-gns.c:445
4099msgid "No unneeded output"
4100msgstr "Sin salida innecesaria"
4101
4102#: src/gns/gnunet-gns.c:451
4103#, fuzzy
4104msgid "Specify the public key of the zone to lookup the record in"
4105msgstr "Especificar el tipo del registro a buscar"
4106
4107#: src/gns/gnunet-gns.c:457
4108#, fuzzy
4109msgid "Specify the name of the ego of the zone to lookup the record in"
4110msgstr "Especificar el tipo del registro a buscar"
4111
4112#: src/gns/gnunet-gns.c:476
4113#, fuzzy
4114msgid "GNUnet GNS resolver tool"
4115msgstr "Herramienta de acceso GNUnet GNS"
4116
4117#: src/gns/gnunet-gns-helper-service-w32.c:602
4118msgid "Not ready to process requests, lacking ego data\n"
4119msgstr ""
4120
4121#: src/gns/gnunet-gns-helper-service-w32.c:739 4257#: src/gns/gnunet-gns-helper-service-w32.c:739
4122#, fuzzy, c-format 4258#, fuzzy, c-format
4123msgid "Failed to connect to identity service\n" 4259msgid "Failed to connect to identity service\n"
4124msgstr "Fallo al conectar a gnunetd.\n" 4260msgstr "Fallo al conectar a gnunetd.\n"
4125 4261
4126#: src/gns/gnunet-gns-import.c:489 4262#: src/gns/gnunet-gns-import.c:452
4127msgid "This program will import some GNS authorities into your GNS namestore." 4263msgid "This program will import some GNS authorities into your GNS namestore."
4128msgstr "" 4264msgstr ""
4129 4265
@@ -4249,13 +4385,65 @@ msgstr "fichero pem para usar como autoridad de certificación (CA)"
4249msgid "GNUnet GNS proxy" 4385msgid "GNUnet GNS proxy"
4250msgstr "Proxy GNUnet GNS" 4386msgstr "Proxy GNUnet GNS"
4251 4387
4388#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
4389#, c-format
4390msgid "Invalid typename specified, assuming `ANY'\n"
4391msgstr ""
4392
4393#: src/gns/gnunet-gns.c:252
4394#, c-format
4395msgid "Please specify name to lookup!\n"
4396msgstr ""
4397
4398#: src/gns/gnunet-gns.c:276
4399#, c-format
4400msgid "Ego for `%s' not found, cannot perform lookup.\n"
4401msgstr ""
4402
4403#: src/gns/gnunet-gns.c:374
4404#, c-format
4405msgid "Public key `%s' is not well-formed\n"
4406msgstr ""
4407
4408#: src/gns/gnunet-gns.c:428
4409msgid "Lookup a record for the given name"
4410msgstr "Buscar el registro para el nombre dado"
4411
4412#: src/gns/gnunet-gns.c:434
4413msgid "Specify the type of the record to lookup"
4414msgstr "Especificar el tipo del registro a buscar"
4415
4416#: src/gns/gnunet-gns.c:440
4417#, fuzzy
4418msgid "Specify timeout for the lookup"
4419msgstr "Especificar el tipo del registro a buscar"
4420
4421#: src/gns/gnunet-gns.c:445
4422msgid "No unneeded output"
4423msgstr "Sin salida innecesaria"
4424
4425#: src/gns/gnunet-gns.c:451
4426#, fuzzy
4427msgid "Specify the public key of the zone to lookup the record in"
4428msgstr "Especificar el tipo del registro a buscar"
4429
4430#: src/gns/gnunet-gns.c:457
4431#, fuzzy
4432msgid "Specify the name of the ego of the zone to lookup the record in"
4433msgstr "Especificar el tipo del registro a buscar"
4434
4435#: src/gns/gnunet-gns.c:476
4436#, fuzzy
4437msgid "GNUnet GNS resolver tool"
4438msgstr "Herramienta de acceso GNUnet GNS"
4439
4252#: src/gns/gnunet-service-gns.c:442 4440#: src/gns/gnunet-service-gns.c:442
4253#, fuzzy 4441#, fuzzy
4254msgid "Failed to connect to the namecache!\n" 4442msgid "Failed to connect to the namecache!\n"
4255msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n" 4443msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n"
4256 4444
4257#: src/gns/gnunet-service-gns.c:461 4445#: src/gns/gnunet-service-gns.c:461
4258#: src/zonemaster/gnunet-service-zonemaster.c:741 4446#: src/zonemaster/gnunet-service-zonemaster.c:742
4259msgid "Could not connect to DHT!\n" 4447msgid "Could not connect to DHT!\n"
4260msgstr "¡No se pudo conectar a la DHT!\n" 4448msgstr "¡No se pudo conectar a la DHT!\n"
4261 4449
@@ -4313,47 +4501,37 @@ msgstr ""
4313msgid "Hostname `%s' is not well-formed, resolution fails\n" 4501msgid "Hostname `%s' is not well-formed, resolution fails\n"
4314msgstr "" 4502msgstr ""
4315 4503
4316#: src/gns/plugin_gnsrecord_gns.c:203 4504#: src/gns/plugin_gnsrecord_gns.c:179
4317#, c-format 4505#, c-format
4318msgid "Unable to parse PKEY record `%s'\n" 4506msgid "Unable to parse PKEY record `%s'\n"
4319msgstr "No se pudo procesar el registro PKEY «%s»\n" 4507msgstr "No se pudo procesar el registro PKEY «%s»\n"
4320 4508
4321#: src/gns/plugin_gnsrecord_gns.c:232 4509#: src/gns/plugin_gnsrecord_gns.c:208
4322#, fuzzy, c-format 4510#, fuzzy, c-format
4323msgid "Unable to parse GNS2DNS record `%s'\n" 4511msgid "Unable to parse GNS2DNS record `%s'\n"
4324msgstr "No se pudo procesar el registro SOA «%s»\n" 4512msgstr "No se pudo procesar el registro SOA «%s»\n"
4325 4513
4326#: src/gns/plugin_gnsrecord_gns.c:253 4514#: src/gns/plugin_gnsrecord_gns.c:229
4327#, fuzzy, c-format 4515#, fuzzy, c-format
4328msgid "Failed to serialize GNS2DNS record with value `%s'\n" 4516msgid "Failed to serialize GNS2DNS record with value `%s'\n"
4329msgstr "" 4517msgstr ""
4330"Se produjo un fallo al escribir el directorio con los resultados de búsqueda " 4518"Se produjo un fallo al escribir el directorio con los resultados de búsqueda "
4331"de «%s»\n" 4519"de «%s»\n"
4332 4520
4333#: src/gns/plugin_gnsrecord_gns.c:276 4521#: src/gns/plugin_gnsrecord_gns.c:252
4334#, c-format 4522#, c-format
4335msgid "Unable to parse VPN record string `%s'\n" 4523msgid "Unable to parse VPN record string `%s'\n"
4336msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" 4524msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
4337 4525
4338#: src/gns/plugin_gnsrecord_gns.c:312 4526#: src/gns/plugin_gnsrecord_gns.c:288
4339#, fuzzy, c-format 4527#, fuzzy, c-format
4340msgid "Unable to parse BOX record string `%s'\n" 4528msgid "Unable to parse BOX record string `%s'\n"
4341msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" 4529msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
4342 4530
4343#: src/gns/plugin_gnsrecord_gns.c:360
4344#, fuzzy, c-format
4345msgid "Unable to parse REVERSE record string `%s'\n"
4346msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
4347
4348#: src/gns/plugin_rest_gns.c:384 4531#: src/gns/plugin_rest_gns.c:384
4349msgid "Ego for not found, cannot perform lookup.\n" 4532msgid "Ego for not found, cannot perform lookup.\n"
4350msgstr "" 4533msgstr ""
4351 4534
4352#: src/gns/plugin_rest_gns.c:668
4353#, fuzzy
4354msgid "GNS REST API initialized\n"
4355msgstr "Conexión fallida\n"
4356
4357#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4535#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4358#, c-format 4536#, c-format
4359msgid "Unable to parse IPv4 address `%s'\n" 4537msgid "Unable to parse IPv4 address `%s'\n"
@@ -4816,6 +4994,53 @@ msgid "Could not start hostlist HTTP server on port %u\n"
4816msgstr "" 4994msgstr ""
4817"No se pudo arrancar un servidor de listas de máquinas HTTP en el puerto %u\n" 4995"No se pudo arrancar un servidor de listas de máquinas HTTP en el puerto %u\n"
4818 4996
4997#: src/identity-provider/gnunet-idp.c:348
4998#, fuzzy
4999msgid "Ego is required\n"
5000msgstr "Las opción «%s» o «%s» es necesaria.\n"
5001
5002#: src/identity-provider/gnunet-idp.c:370
5003msgid "Add attribute"
5004msgstr ""
5005
5006#: src/identity-provider/gnunet-idp.c:376
5007msgid "Attribute value"
5008msgstr ""
5009
5010#: src/identity-provider/gnunet-idp.c:381
5011msgid "Ego"
5012msgstr ""
5013
5014#: src/identity-provider/gnunet-idp.c:386
5015msgid "Audience (relying party)"
5016msgstr ""
5017
5018#: src/identity-provider/gnunet-idp.c:390
5019msgid "List attributes for Ego"
5020msgstr ""
5021
5022#: src/identity-provider/gnunet-idp.c:395
5023msgid "Issue a ticket"
5024msgstr ""
5025
5026#: src/identity-provider/gnunet-idp.c:400
5027msgid "Consume a ticket"
5028msgstr ""
5029
5030#: src/identity-provider/gnunet-idp.c:405
5031msgid "Revoke a ticket"
5032msgstr ""
5033
5034#: src/identity-provider/identity_provider_api.c:429
5035#, fuzzy
5036msgid "failed to store record\n"
5037msgstr "El almacén de nombres no pudo añadir el registro\n"
5038
5039#: src/identity-provider/plugin_rest_identity_provider.c:1175
5040#, fuzzy
5041msgid "Identity Provider REST API initialized\n"
5042msgstr "Conexión fallida\n"
5043
4819#: src/identity/gnunet-identity.c:179 5044#: src/identity/gnunet-identity.c:179
4820#, fuzzy, c-format 5045#, fuzzy, c-format
4821msgid "Failed to create ego: %s\n" 5046msgid "Failed to create ego: %s\n"
@@ -4910,34 +5135,11 @@ msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
4910msgid "Failed to create directory `%s' for storing egos\n" 5135msgid "Failed to create directory `%s' for storing egos\n"
4911msgstr "Se produjo un fallo al leer el directorio «%s»\n" 5136msgstr "Se produjo un fallo al leer el directorio «%s»\n"
4912 5137
4913#: src/identity/plugin_rest_identity.c:967 5138#: src/identity/plugin_rest_identity.c:964
4914#, fuzzy 5139#, fuzzy
4915msgid "Identity REST API initialized\n" 5140msgid "Identity REST API initialized\n"
4916msgstr "Conexión fallida\n" 5141msgstr "Conexión fallida\n"
4917 5142
4918#: src/identity-provider/gnunet-identity-token.c:66
4919#, fuzzy
4920msgid "Option `-t' is required\n"
4921msgstr "Las opción «%s» o «%s» es necesaria.\n"
4922
4923#: src/identity-provider/gnunet-identity-token.c:77
4924#, fuzzy, c-format
4925msgid "Token `%s' is malformed\n"
4926msgstr "El bloque del tipo %u está mal formado\n"
4927
4928#: src/identity-provider/gnunet-identity-token.c:166
4929msgid "GNUid token"
4930msgstr ""
4931
4932#: src/identity-provider/gnunet-identity-token.c:171
4933msgid "Print token contents"
4934msgstr ""
4935
4936#: src/identity-provider/plugin_rest_identity_provider.c:1166
4937#, fuzzy
4938msgid "Identity Token REST API initialized\n"
4939msgstr "Conexión fallida\n"
4940
4941#: src/json/json.c:119 5143#: src/json/json.c:119
4942#, fuzzy, c-format 5144#, fuzzy, c-format
4943msgid "Failed to parse JSON in option `%s': %s (%s)\n" 5145msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5040,10 +5242,66 @@ msgstr "Se produjo un fallo al crear los índices\n"
5040msgid "flat plugin running\n" 5242msgid "flat plugin running\n"
5041msgstr "Base de datos sqlite ejecutándose\n" 5243msgstr "Base de datos sqlite ejecutándose\n"
5042 5244
5043#: src/namecache/plugin_namecache_postgres.c:90 5245# form??
5044#: src/namestore/plugin_namestore_postgres.c:97 5246#: src/namestore/gnunet-namestore-fcfsd.c:508
5045msgid "Failed to create indices\n" 5247#, c-format
5046msgstr "Se produjo un fallo al crear los índices\n" 5248msgid "Unsupported form value `%s'\n"
5249msgstr "Forma de valor no soportada «%s»\n"
5250
5251#: src/namestore/gnunet-namestore-fcfsd.c:535
5252#, c-format
5253msgid "Failed to create record for domain `%s': %s\n"
5254msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n"
5255
5256#: src/namestore/gnunet-namestore-fcfsd.c:555
5257msgid "Error when mapping zone to name\n"
5258msgstr ""
5259
5260#: src/namestore/gnunet-namestore-fcfsd.c:585
5261#, c-format
5262msgid "Found existing name `%s' for the given key\n"
5263msgstr "Encontrado nombre «%s» para la clave dada\n"
5264
5265#: src/namestore/gnunet-namestore-fcfsd.c:662
5266#, c-format
5267msgid "Found %u existing records for domain `%s'\n"
5268msgstr "Encontrados %u registros para el dominio «%s»\n"
5269
5270#: src/namestore/gnunet-namestore-fcfsd.c:718
5271#, c-format
5272msgid "Failed to create page for `%s'\n"
5273msgstr "Se produjo un fallo al crear la página para «%s»\n"
5274
5275#: src/namestore/gnunet-namestore-fcfsd.c:734
5276#, c-format
5277msgid "Failed to setup post processor for `%s'\n"
5278msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n"
5279
5280#: src/namestore/gnunet-namestore-fcfsd.c:770
5281msgid "Domain name must not contain `.'\n"
5282msgstr "El nombre de dominio no puede contener «.»\n"
5283
5284#: src/namestore/gnunet-namestore-fcfsd.c:778
5285msgid "Domain name must not contain `+'\n"
5286msgstr "El nombre de dominio no puede contener «+»\n"
5287
5288#: src/namestore/gnunet-namestore-fcfsd.c:974
5289msgid "No ego configured for `fcfsd` subsystem\n"
5290msgstr ""
5291
5292#: src/namestore/gnunet-namestore-fcfsd.c:1000
5293msgid "Failed to start HTTP server\n"
5294msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
5295
5296#: src/namestore/gnunet-namestore-fcfsd.c:1042
5297#, fuzzy
5298msgid "Failed to connect to identity\n"
5299msgstr "Se produjo un fallo al conectar con GNS\n"
5300
5301#: src/namestore/gnunet-namestore-fcfsd.c:1074
5302#, fuzzy
5303msgid "GNU Name System First Come First Serve name registration service"
5304msgstr "Servicio de registro GNUnet GNS primero en llegar, primero en servirse"
5047 5305
5048#: src/namestore/gnunet-namestore.c:301 5306#: src/namestore/gnunet-namestore.c:301
5049#, c-format 5307#, c-format
@@ -5051,13 +5309,13 @@ msgid "Adding record failed: %s\n"
5051msgstr "No se pudo añadir el registro: %s\n" 5309msgstr "No se pudo añadir el registro: %s\n"
5052 5310
5053#: src/namestore/gnunet-namestore.c:330 5311#: src/namestore/gnunet-namestore.c:330
5054#: src/namestore/plugin_rest_namestore.c:562 5312#: src/namestore/plugin_rest_namestore.c:567
5055#, fuzzy, c-format 5313#, fuzzy, c-format
5056msgid "Deleting record failed, record does not exist%s%s\n" 5314msgid "Deleting record failed, record does not exist%s%s\n"
5057msgstr "No se pudo borrar el registro: %s\n" 5315msgstr "No se pudo borrar el registro: %s\n"
5058 5316
5059#: src/namestore/gnunet-namestore.c:337 5317#: src/namestore/gnunet-namestore.c:337
5060#: src/namestore/plugin_rest_namestore.c:571 5318#: src/namestore/plugin_rest_namestore.c:576
5061#, fuzzy, c-format 5319#, fuzzy, c-format
5062msgid "Deleting record failed%s%s\n" 5320msgid "Deleting record failed%s%s\n"
5063msgstr "No se pudo borrar el registro: %s\n" 5321msgstr "No se pudo borrar el registro: %s\n"
@@ -5075,7 +5333,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
5075msgstr "" 5333msgstr ""
5076 5334
5077#: src/namestore/gnunet-namestore.c:698 5335#: src/namestore/gnunet-namestore.c:698
5078#: src/namestore/plugin_rest_namestore.c:597 5336#: src/namestore/plugin_rest_namestore.c:602
5079#, c-format 5337#, c-format
5080msgid "There are no records under label `%s' that could be deleted.\n" 5338msgid "There are no records under label `%s' that could be deleted.\n"
5081msgstr "" 5339msgstr ""
@@ -5086,23 +5344,11 @@ msgid ""
5086"There are no records under label `%s' that match the request for deletion.\n" 5344"There are no records under label `%s' that match the request for deletion.\n"
5087msgstr "" 5345msgstr ""
5088 5346
5089#: src/namestore/gnunet-namestore.c:776
5090#: src/namestore/plugin_rest_namestore.c:1004
5091#, fuzzy, c-format
5092msgid "Ego `%s' not known to identity service\n"
5093msgstr "'%s': servicio desconocido: %s\n"
5094
5095#: src/namestore/gnunet-namestore.c:791 5347#: src/namestore/gnunet-namestore.c:791
5096#, c-format 5348#, c-format
5097msgid "No options given\n" 5349msgid "No options given\n"
5098msgstr "No se han proporcionado opciones\n" 5350msgstr "No se han proporcionado opciones\n"
5099 5351
5100#: src/namestore/gnunet-namestore.c:802
5101#: src/namestore/gnunet-namestore-fcfsd.c:1034
5102#: src/namestore/plugin_rest_namestore.c:1017
5103msgid "Failed to connect to namestore\n"
5104msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
5105
5106#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819 5352#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
5107#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861 5353#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
5108#: src/namestore/gnunet-namestore.c:915 5354#: src/namestore/gnunet-namestore.c:915
@@ -5116,14 +5362,14 @@ msgid "add"
5116msgstr "añadir" 5362msgstr "añadir"
5117 5363
5118#: src/namestore/gnunet-namestore.c:829 5364#: src/namestore/gnunet-namestore.c:829
5119#: src/namestore/plugin_rest_namestore.c:671 5365#: src/namestore/plugin_rest_namestore.c:676
5120#, c-format 5366#, c-format
5121msgid "Unsupported type `%s'\n" 5367msgid "Unsupported type `%s'\n"
5122msgstr "Tipo no soportado «%s»\n" 5368msgstr "Tipo no soportado «%s»\n"
5123 5369
5124#: src/namestore/gnunet-namestore.c:851 5370#: src/namestore/gnunet-namestore.c:851
5125#: src/namestore/plugin_rest_namestore.c:689 5371#: src/namestore/plugin_rest_namestore.c:694
5126#: src/namestore/plugin_rest_namestore.c:729 5372#: src/namestore/plugin_rest_namestore.c:734
5127#, c-format 5373#, c-format
5128msgid "Value `%s' invalid for record type `%s'\n" 5374msgid "Value `%s' invalid for record type `%s'\n"
5129msgstr "Valor «%s» no válido para el tipo de registro «%s»\n" 5375msgstr "Valor «%s» no válido para el tipo de registro «%s»\n"
@@ -5142,8 +5388,7 @@ msgstr "borrar"
5142msgid "Invalid public key for reverse lookup `%s'\n" 5388msgid "Invalid public key for reverse lookup `%s'\n"
5143msgstr "Parámetro no válido «%s»\n" 5389msgstr "Parámetro no válido «%s»\n"
5144 5390
5145#: src/namestore/gnunet-namestore.c:979 5391#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
5146#: src/peerinfo-tool/gnunet-peerinfo.c:775
5147#, c-format 5392#, c-format
5148msgid "Invalid URI `%s'\n" 5393msgid "Invalid URI `%s'\n"
5149msgstr "URI no válida: «%s»\n" 5394msgstr "URI no válida: «%s»\n"
@@ -5154,13 +5399,13 @@ msgid "Invalid nick `%s'\n"
5154msgstr "URI no válida: «%s»\n" 5399msgstr "URI no válida: «%s»\n"
5155 5400
5156#: src/namestore/gnunet-namestore.c:1051 5401#: src/namestore/gnunet-namestore.c:1051
5157#: src/namestore/plugin_rest_namestore.c:1047 5402#: src/namestore/plugin_rest_namestore.c:1052
5158#, fuzzy, c-format 5403#, fuzzy, c-format
5159msgid "No default ego configured in identity service\n" 5404msgid "No default ego configured in identity service\n"
5160msgstr "'%s': servicio desconocido: %s\n" 5405msgstr "'%s': servicio desconocido: %s\n"
5161 5406
5162#: src/namestore/gnunet-namestore.c:1108 5407#: src/namestore/gnunet-namestore.c:1108
5163#: src/namestore/plugin_rest_namestore.c:1143 5408#: src/namestore/plugin_rest_namestore.c:1148
5164#, fuzzy, c-format 5409#, fuzzy, c-format
5165msgid "Cannot connect to identity service\n" 5410msgid "Cannot connect to identity service\n"
5166msgstr "¡No se pudo conectar al servicio %s!\n" 5411msgstr "¡No se pudo conectar al servicio %s!\n"
@@ -5226,68 +5471,7 @@ msgstr ""
5226msgid "name of the ego controlling the zone" 5471msgid "name of the ego controlling the zone"
5227msgstr "nombre de la sección a la que acceder" 5472msgstr "nombre de la sección a la que acceder"
5228 5473
5229# form?? 5474#: src/namestore/gnunet-service-namestore.c:615
5230#: src/namestore/gnunet-namestore-fcfsd.c:508
5231#, c-format
5232msgid "Unsupported form value `%s'\n"
5233msgstr "Forma de valor no soportada «%s»\n"
5234
5235#: src/namestore/gnunet-namestore-fcfsd.c:535
5236#, c-format
5237msgid "Failed to create record for domain `%s': %s\n"
5238msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n"
5239
5240#: src/namestore/gnunet-namestore-fcfsd.c:555
5241msgid "Error when mapping zone to name\n"
5242msgstr ""
5243
5244#: src/namestore/gnunet-namestore-fcfsd.c:585
5245#, c-format
5246msgid "Found existing name `%s' for the given key\n"
5247msgstr "Encontrado nombre «%s» para la clave dada\n"
5248
5249#: src/namestore/gnunet-namestore-fcfsd.c:662
5250#, c-format
5251msgid "Found %u existing records for domain `%s'\n"
5252msgstr "Encontrados %u registros para el dominio «%s»\n"
5253
5254#: src/namestore/gnunet-namestore-fcfsd.c:718
5255#, c-format
5256msgid "Failed to create page for `%s'\n"
5257msgstr "Se produjo un fallo al crear la página para «%s»\n"
5258
5259#: src/namestore/gnunet-namestore-fcfsd.c:734
5260#, c-format
5261msgid "Failed to setup post processor for `%s'\n"
5262msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n"
5263
5264#: src/namestore/gnunet-namestore-fcfsd.c:770
5265msgid "Domain name must not contain `.'\n"
5266msgstr "El nombre de dominio no puede contener «.»\n"
5267
5268#: src/namestore/gnunet-namestore-fcfsd.c:778
5269msgid "Domain name must not contain `+'\n"
5270msgstr "El nombre de dominio no puede contener «+»\n"
5271
5272#: src/namestore/gnunet-namestore-fcfsd.c:974
5273msgid "No ego configured for `fcfsd` subsystem\n"
5274msgstr ""
5275
5276#: src/namestore/gnunet-namestore-fcfsd.c:1000
5277msgid "Failed to start HTTP server\n"
5278msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
5279
5280#: src/namestore/gnunet-namestore-fcfsd.c:1042
5281#, fuzzy
5282msgid "Failed to connect to identity\n"
5283msgstr "Se produjo un fallo al conectar con GNS\n"
5284
5285#: src/namestore/gnunet-namestore-fcfsd.c:1074
5286#, fuzzy
5287msgid "GNU Name System First Come First Serve name registration service"
5288msgstr "Servicio de registro GNUnet GNS primero en llegar, primero en servirse"
5289
5290#: src/namestore/gnunet-service-namestore.c:612
5291#, fuzzy, c-format 5475#, fuzzy, c-format
5292msgid "Failed to replicate block in namecache: %s\n" 5476msgid "Failed to replicate block in namecache: %s\n"
5293msgstr "Se produjo un fallo al crear el espacio de nombres «%s»\n" 5477msgstr "Se produjo un fallo al crear el espacio de nombres «%s»\n"
@@ -5302,7 +5486,7 @@ msgstr "El almacén de nombres no pudo añadir el registro\n"
5302msgid "flat file database running\n" 5486msgid "flat file database running\n"
5303msgstr "Base de datos de plantilla ejecutándose\n" 5487msgstr "Base de datos de plantilla ejecutándose\n"
5304 5488
5305#: src/namestore/plugin_rest_namestore.c:1188 5489#: src/namestore/plugin_rest_namestore.c:1193
5306#, fuzzy 5490#, fuzzy
5307msgid "Namestore REST API initialized\n" 5491msgid "Namestore REST API initialized\n"
5308msgstr "Conexión fallida\n" 5492msgstr "Conexión fallida\n"
@@ -5602,11 +5786,6 @@ msgstr "comando «external-ip» no encontrado\n"
5602msgid "`upnpc' command not found\n" 5786msgid "`upnpc' command not found\n"
5603msgstr "comando «upnpc» no encontrado\n" 5787msgstr "comando «upnpc» no encontrado\n"
5604 5788
5605#: src/nse/gnunet-nse.c:122
5606#, fuzzy
5607msgid "Show network size estimates from NSE service."
5608msgstr "# Estimaciones del tamaño de red recibidas"
5609
5610#: src/nse/gnunet-nse-profiler.c:842 5789#: src/nse/gnunet-nse-profiler.c:842
5611msgid "limit to the number of connections to NSE services, 0 for none" 5790msgid "limit to the number of connections to NSE services, 0 for none"
5612msgstr "límite al número de conexiones a servicios NSE, 0 para ilimitadas" 5791msgstr "límite al número de conexiones a servicios NSE, 0 para ilimitadas"
@@ -5632,70 +5811,16 @@ msgstr "retraso entre rondas"
5632msgid "Measure quality and performance of the NSE service." 5811msgid "Measure quality and performance of the NSE service."
5633msgstr "Medir la calidad y rendimiento del servicio NSE." 5812msgstr "Medir la calidad y rendimiento del servicio NSE."
5634 5813
5814#: src/nse/gnunet-nse.c:122
5815#, fuzzy
5816msgid "Show network size estimates from NSE service."
5817msgstr "# Estimaciones del tamaño de red recibidas"
5818
5635#: src/nse/gnunet-service-nse.c:1534 5819#: src/nse/gnunet-service-nse.c:1534
5636#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 5820#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
5637msgid "Value is too large.\n" 5821msgid "Value is too large.\n"
5638msgstr "" 5822msgstr ""
5639 5823
5640#: src/peerinfo/gnunet-service-peerinfo.c:178
5641#, c-format
5642msgid "Removing expired address of transport `%s'\n"
5643msgstr "Eliminando dirección de transporte «%s»\n"
5644
5645#: src/peerinfo/gnunet-service-peerinfo.c:310
5646#, fuzzy, c-format
5647msgid "Failed to parse HELLO in file `%s': %s\n"
5648msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
5649
5650#: src/peerinfo/gnunet-service-peerinfo.c:331
5651#: src/peerinfo/gnunet-service-peerinfo.c:362
5652#, fuzzy, c-format
5653msgid "Failed to parse HELLO in file `%s'\n"
5654msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
5655
5656#: src/peerinfo/gnunet-service-peerinfo.c:446
5657msgid "# peers known"
5658msgstr "# pares conocidos"
5659
5660#: src/peerinfo/gnunet-service-peerinfo.c:489
5661#, c-format
5662msgid ""
5663"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5664msgstr ""
5665"El fichero «%s» en el directorio «%s» no sigue la convención de nombres. "
5666"Eliminado.\n"
5667
5668#: src/peerinfo/gnunet-service-peerinfo.c:655
5669#, fuzzy, c-format
5670msgid "Scanning directory `%s'\n"
5671msgstr "Escaneando directorio «%s».\n"
5672
5673#: src/peerinfo/gnunet-service-peerinfo.c:663
5674#, c-format
5675msgid "Still no peers found in `%s'!\n"
5676msgstr "¡Aún no se han encontrado pares en «%s»!\n"
5677
5678#: src/peerinfo/gnunet-service-peerinfo.c:1076
5679#, fuzzy, c-format
5680msgid "Cleaning up directory `%s'\n"
5681msgstr "Escaneando directorio «%s».\n"
5682
5683#: src/peerinfo/gnunet-service-peerinfo.c:1405
5684#, c-format
5685msgid "Importing HELLOs from `%s'\n"
5686msgstr "Importando HELLO de «%s»\n"
5687
5688#: src/peerinfo/gnunet-service-peerinfo.c:1418
5689msgid "Skipping import of included HELLOs\n"
5690msgstr ""
5691
5692# Miguel: "Failed to receive" también aquí está traducido como
5693# "no se obtuvo respuesta" por claridad.
5694#: src/peerinfo/peerinfo_api.c:220
5695msgid "Failed to receive response from `PEERINFO' service."
5696msgstr ""
5697"No se obtuvo respuesta del servicio de información de pares (PEERINFO)."
5698
5699#: src/peerinfo-tool/gnunet-peerinfo.c:239 5824#: src/peerinfo-tool/gnunet-peerinfo.c:239
5700#, fuzzy, c-format 5825#, fuzzy, c-format
5701msgid "%sPeer `%s'\n" 5826msgid "%sPeer `%s'\n"
@@ -5785,6 +5910,65 @@ msgstr "Cargando el módulo de transporte «%s»\n"
5785msgid "Failed to load transport plugin for `%s'\n" 5910msgid "Failed to load transport plugin for `%s'\n"
5786msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n" 5911msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n"
5787 5912
5913#: src/peerinfo/gnunet-service-peerinfo.c:178
5914#, c-format
5915msgid "Removing expired address of transport `%s'\n"
5916msgstr "Eliminando dirección de transporte «%s»\n"
5917
5918#: src/peerinfo/gnunet-service-peerinfo.c:310
5919#, fuzzy, c-format
5920msgid "Failed to parse HELLO in file `%s': %s\n"
5921msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
5922
5923#: src/peerinfo/gnunet-service-peerinfo.c:331
5924#: src/peerinfo/gnunet-service-peerinfo.c:362
5925#, fuzzy, c-format
5926msgid "Failed to parse HELLO in file `%s'\n"
5927msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
5928
5929#: src/peerinfo/gnunet-service-peerinfo.c:446
5930msgid "# peers known"
5931msgstr "# pares conocidos"
5932
5933#: src/peerinfo/gnunet-service-peerinfo.c:489
5934#, c-format
5935msgid ""
5936"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5937msgstr ""
5938"El fichero «%s» en el directorio «%s» no sigue la convención de nombres. "
5939"Eliminado.\n"
5940
5941#: src/peerinfo/gnunet-service-peerinfo.c:655
5942#, fuzzy, c-format
5943msgid "Scanning directory `%s'\n"
5944msgstr "Escaneando directorio «%s».\n"
5945
5946#: src/peerinfo/gnunet-service-peerinfo.c:663
5947#, c-format
5948msgid "Still no peers found in `%s'!\n"
5949msgstr "¡Aún no se han encontrado pares en «%s»!\n"
5950
5951#: src/peerinfo/gnunet-service-peerinfo.c:1076
5952#, fuzzy, c-format
5953msgid "Cleaning up directory `%s'\n"
5954msgstr "Escaneando directorio «%s».\n"
5955
5956#: src/peerinfo/gnunet-service-peerinfo.c:1405
5957#, c-format
5958msgid "Importing HELLOs from `%s'\n"
5959msgstr "Importando HELLO de «%s»\n"
5960
5961#: src/peerinfo/gnunet-service-peerinfo.c:1418
5962msgid "Skipping import of included HELLOs\n"
5963msgstr ""
5964
5965# Miguel: "Failed to receive" también aquí está traducido como
5966# "no se obtuvo respuesta" por claridad.
5967#: src/peerinfo/peerinfo_api.c:220
5968msgid "Failed to receive response from `PEERINFO' service."
5969msgstr ""
5970"No se obtuvo respuesta del servicio de información de pares (PEERINFO)."
5971
5788#: src/peerstore/gnunet-peerstore.c:91 5972#: src/peerstore/gnunet-peerstore.c:91
5789msgid "peerstore" 5973msgid "peerstore"
5790msgstr "" 5974msgstr ""
@@ -5834,15 +6018,10 @@ msgstr "Error leyendo de «%s»: %s\n"
5834msgid "Unable to create indices: %s.\n" 6018msgid "Unable to create indices: %s.\n"
5835msgstr "Se produjo un fallo al crear los índices\n" 6019msgstr "Se produjo un fallo al crear los índices\n"
5836 6020
5837#: src/postgres/postgres.c:67 6021#: src/pq/pq_prepare.c:80
5838#, fuzzy, c-format 6022#, fuzzy, c-format
5839msgid "`%s:%s' failed at %s:%d with error: %s\n" 6023msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
5840msgstr "«%s:%s» falló en %s:%d con error: %s" 6024msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
5841
5842#: src/postgres/postgres.c:192
5843#, fuzzy, c-format
5844msgid "Unable to connect to Postgres database '%s': %s\n"
5845msgstr "Imposible guardar el fichero de configuración '%s':"
5846 6025
5847#: src/psycstore/gnunet-service-psycstore.c:249 6026#: src/psycstore/gnunet-service-psycstore.c:249
5848#, fuzzy 6027#, fuzzy
@@ -6019,11 +6198,11 @@ msgstr ""
6019msgid "Daemon to announce regular expressions for the peer using cadet." 6198msgid "Daemon to announce regular expressions for the peer using cadet."
6020msgstr "Demonio para anunciar expresiones regulares para el par usando mesh." 6199msgstr "Demonio para anunciar expresiones regulares para el par usando mesh."
6021 6200
6022#: src/regex/gnunet-regex-profiler.c:1314 6201#: src/regex/gnunet-regex-profiler.c:1386
6023msgid "No configuration file given. Exiting\n" 6202msgid "No configuration file given. Exiting\n"
6024msgstr "No se ha introducido ningún fichero de configuración. Saliendo\n" 6203msgstr "No se ha introducido ningún fichero de configuración. Saliendo\n"
6025 6204
6026#: src/regex/gnunet-regex-profiler.c:1355 6205#: src/regex/gnunet-regex-profiler.c:1427
6027#: src/regex/gnunet-regex-simulation-profiler.c:630 6206#: src/regex/gnunet-regex-simulation-profiler.c:630
6028#, c-format 6207#, c-format
6029msgid "No policy directory specified on command line. Exiting.\n" 6208msgid "No policy directory specified on command line. Exiting.\n"
@@ -6031,51 +6210,51 @@ msgstr ""
6031"No se ha especificado una política de directorios en la línea de comandos. " 6210"No se ha especificado una política de directorios en la línea de comandos. "
6032"Saliendo.\n" 6211"Saliendo.\n"
6033 6212
6034#: src/regex/gnunet-regex-profiler.c:1361 6213#: src/regex/gnunet-regex-profiler.c:1433
6035#: src/regex/gnunet-regex-simulation-profiler.c:638 6214#: src/regex/gnunet-regex-simulation-profiler.c:638
6036#, c-format 6215#, c-format
6037msgid "Specified policies directory does not exist. Exiting.\n" 6216msgid "Specified policies directory does not exist. Exiting.\n"
6038msgstr "Las políticas de directorio especificadas no existen. Saliendo.\n" 6217msgstr "Las políticas de directorio especificadas no existen. Saliendo.\n"
6039 6218
6040#: src/regex/gnunet-regex-profiler.c:1368 6219#: src/regex/gnunet-regex-profiler.c:1440
6041#, c-format 6220#, c-format
6042msgid "No files found in `%s'\n" 6221msgid "No files found in `%s'\n"
6043msgstr "No se han encontrado ficheros en «%s»\n" 6222msgstr "No se han encontrado ficheros en «%s»\n"
6044 6223
6045#: src/regex/gnunet-regex-profiler.c:1377 6224#: src/regex/gnunet-regex-profiler.c:1449
6046msgid "No search strings file given. Exiting.\n" 6225msgid "No search strings file given. Exiting.\n"
6047msgstr "No se ha proporcionado un fichero de cadenas de búsqueda. Saliendo.\n" 6226msgstr "No se ha proporcionado un fichero de cadenas de búsqueda. Saliendo.\n"
6048 6227
6049#: src/regex/gnunet-regex-profiler.c:1397 6228#: src/regex/gnunet-regex-profiler.c:1469
6050msgid "Error loading search strings. Exiting.\n" 6229msgid "Error loading search strings. Exiting.\n"
6051msgstr "Error cargando cadenas de búsqueda. Saliendo.\n" 6230msgstr "Error cargando cadenas de búsqueda. Saliendo.\n"
6052 6231
6053#: src/regex/gnunet-regex-profiler.c:1485 6232#: src/regex/gnunet-regex-profiler.c:1557
6054msgid "name of the file for writing statistics" 6233msgid "name of the file for writing statistics"
6055msgstr "nombre del fichero para escribir las estadísticas" 6234msgstr "nombre del fichero para escribir las estadísticas"
6056 6235
6057#: src/regex/gnunet-regex-profiler.c:1491 6236#: src/regex/gnunet-regex-profiler.c:1563
6058#, fuzzy 6237#, fuzzy
6059msgid "wait TIMEOUT before ending the experiment" 6238msgid "wait TIMEOUT before ending the experiment"
6060msgstr "" 6239msgstr ""
6061"esperar «TIMEOUT» antes de considerar que una coincidencia de cadenas como " 6240"esperar «TIMEOUT» antes de considerar que una coincidencia de cadenas como "
6062"fallida" 6241"fallida"
6063 6242
6064#: src/regex/gnunet-regex-profiler.c:1497 6243#: src/regex/gnunet-regex-profiler.c:1569
6065msgid "directory with policy files" 6244msgid "directory with policy files"
6066msgstr "" 6245msgstr ""
6067 6246
6068#: src/regex/gnunet-regex-profiler.c:1504 6247#: src/regex/gnunet-regex-profiler.c:1576
6069#, fuzzy 6248#, fuzzy
6070msgid "name of file with input strings" 6249msgid "name of file with input strings"
6071msgstr "nombre del fichero para escribir las estadísticas" 6250msgstr "nombre del fichero para escribir las estadísticas"
6072 6251
6073#: src/regex/gnunet-regex-profiler.c:1510 6252#: src/regex/gnunet-regex-profiler.c:1582
6074#, fuzzy 6253#, fuzzy
6075msgid "name of file with hosts' names" 6254msgid "name of file with hosts' names"
6076msgstr "nombre del fichero para escribir las estadísticas" 6255msgstr "nombre del fichero para escribir las estadísticas"
6077 6256
6078#: src/regex/gnunet-regex-profiler.c:1523 6257#: src/regex/gnunet-regex-profiler.c:1595
6079msgid "Profiler for regex" 6258msgid "Profiler for regex"
6080msgstr "Perfilador para expresiones regulares." 6259msgstr "Perfilador para expresiones regulares."
6081 6260
@@ -6312,10 +6491,10 @@ msgstr ""
6312msgid "Calculate the Vectorproduct with a GNUnet peer." 6491msgid "Calculate the Vectorproduct with a GNUnet peer."
6313msgstr "" 6492msgstr ""
6314 6493
6315#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 6494#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
6316#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6317#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
6318#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 6495#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
6496#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
6497#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6319#, fuzzy 6498#, fuzzy
6320msgid "Connect to CADET failed\n" 6499msgid "Connect to CADET failed\n"
6321msgstr "Conexión fallida (¿bug?)\n" 6500msgstr "Conexión fallida (¿bug?)\n"
@@ -6340,7 +6519,7 @@ msgstr ""
6340msgid "also profile decryption" 6519msgid "also profile decryption"
6341msgstr "" 6520msgstr ""
6342 6521
6343#: src/set/gnunet-service-set.c:1948 6522#: src/set/gnunet-service-set.c:1989
6344#, fuzzy 6523#, fuzzy
6345msgid "Could not connect to CADET service\n" 6524msgid "Could not connect to CADET service\n"
6346msgstr "¡No se pudo conectar al servicio %s!\n" 6525msgstr "¡No se pudo conectar al servicio %s!\n"
@@ -6401,116 +6580,116 @@ msgstr ""
6401msgid "say good-bye and leave somebody else's place" 6580msgid "say good-bye and leave somebody else's place"
6402msgstr "" 6581msgstr ""
6403 6582
6404#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 6583#: src/social/gnunet-social.c:1227
6405msgid "create a place" 6584msgid "create a place"
6406msgstr "" 6585msgstr ""
6407 6586
6408#: src/social/gnunet-social.c:1237 6587#: src/social/gnunet-social.c:1232
6409msgid "destroy a place we were hosting" 6588msgid "destroy a place we were hosting"
6410msgstr "" 6589msgstr ""
6411 6590
6412#: src/social/gnunet-social.c:1242 6591#: src/social/gnunet-social.c:1237
6413msgid "enter somebody else's place" 6592msgid "enter somebody else's place"
6414msgstr "" 6593msgstr ""
6415 6594
6416#: src/social/gnunet-social.c:1248 6595#: src/social/gnunet-social.c:1243
6417msgid "find state matching name prefix" 6596msgid "find state matching name prefix"
6418msgstr "" 6597msgstr ""
6419 6598
6420#: src/social/gnunet-social.c:1253 6599#: src/social/gnunet-social.c:1248
6421msgid "replay history of messages up to the given --limit" 6600msgid "replay history of messages up to the given --limit"
6422msgstr "" 6601msgstr ""
6423 6602
6424#: src/social/gnunet-social.c:1258 6603#: src/social/gnunet-social.c:1253
6425msgid "reconnect to a previously created place" 6604msgid "reconnect to a previously created place"
6426msgstr "" 6605msgstr ""
6427 6606
6428#: src/social/gnunet-social.c:1263 6607#: src/social/gnunet-social.c:1258
6429msgid "publish something to a place we are hosting" 6608msgid "publish something to a place we are hosting"
6430msgstr "" 6609msgstr ""
6431 6610
6432#: src/social/gnunet-social.c:1268 6611#: src/social/gnunet-social.c:1263
6433msgid "reconnect to a previously entered place" 6612msgid "reconnect to a previously entered place"
6434msgstr "" 6613msgstr ""
6435 6614
6436#: src/social/gnunet-social.c:1273 6615#: src/social/gnunet-social.c:1268
6437msgid "search for state matching exact name" 6616msgid "search for state matching exact name"
6438msgstr "" 6617msgstr ""
6439 6618
6440#: src/social/gnunet-social.c:1278 6619#: src/social/gnunet-social.c:1273
6441msgid "submit something to somebody's place" 6620msgid "submit something to somebody's place"
6442msgstr "" 6621msgstr ""
6443 6622
6444#: src/social/gnunet-social.c:1283 6623#: src/social/gnunet-social.c:1278
6445msgid "list of egos and subscribed places" 6624msgid "list of egos and subscribed places"
6446msgstr "" 6625msgstr ""
6447 6626
6448#: src/social/gnunet-social.c:1288 6627#: src/social/gnunet-social.c:1283
6449msgid "extract and replay history between message IDs --start and --until" 6628msgid "extract and replay history between message IDs --start and --until"
6450msgstr "" 6629msgstr ""
6451 6630
6452#: src/social/gnunet-social.c:1297 6631#: src/social/gnunet-social.c:1292
6453msgid "application ID to use when connecting" 6632msgid "application ID to use when connecting"
6454msgstr "" 6633msgstr ""
6455 6634
6456#: src/social/gnunet-social.c:1303 6635#: src/social/gnunet-social.c:1298
6457msgid "message body or state value" 6636msgid "message body or state value"
6458msgstr "" 6637msgstr ""
6459 6638
6460#: src/social/gnunet-social.c:1309 6639#: src/social/gnunet-social.c:1304
6461#, fuzzy 6640#, fuzzy
6462msgid "name or public key of ego" 6641msgid "name or public key of ego"
6463msgstr "Parámetro no válido «%s»\n" 6642msgstr "Parámetro no válido «%s»\n"
6464 6643
6465#: src/social/gnunet-social.c:1314 6644#: src/social/gnunet-social.c:1309
6466#, fuzzy 6645#, fuzzy
6467msgid "wait for incoming messages" 6646msgid "wait for incoming messages"
6468msgstr "Falló al entregar el mensaje '%s'.\n" 6647msgstr "Falló al entregar el mensaje '%s'.\n"
6469 6648
6470#: src/social/gnunet-social.c:1320 6649#: src/social/gnunet-social.c:1315
6471#, fuzzy 6650#, fuzzy
6472msgid "GNS name" 6651msgid "GNS name"
6473msgstr "Mostrar el _nombre" 6652msgstr "Mostrar el _nombre"
6474 6653
6475#: src/social/gnunet-social.c:1326 6654#: src/social/gnunet-social.c:1321
6476msgid "peer ID for --guest-enter" 6655msgid "peer ID for --guest-enter"
6477msgstr "" 6656msgstr ""
6478 6657
6479#: src/social/gnunet-social.c:1332 6658#: src/social/gnunet-social.c:1327
6480msgid "name (key) to query from state" 6659msgid "name (key) to query from state"
6481msgstr "" 6660msgstr ""
6482 6661
6483#: src/social/gnunet-social.c:1338 6662#: src/social/gnunet-social.c:1333
6484#, fuzzy 6663#, fuzzy
6485msgid "method name" 6664msgid "method name"
6486msgstr "Mostrar el _nombre" 6665msgstr "Mostrar el _nombre"
6487 6666
6488#: src/social/gnunet-social.c:1344 6667#: src/social/gnunet-social.c:1339
6489#, fuzzy 6668#, fuzzy
6490msgid "number of messages to replay from history" 6669msgid "number of messages to replay from history"
6491msgstr "número de mensajes a usar por iteración" 6670msgstr "número de mensajes a usar por iteración"
6492 6671
6493#: src/social/gnunet-social.c:1350 6672#: src/social/gnunet-social.c:1345
6494msgid "key address of place" 6673msgid "key address of place"
6495msgstr "" 6674msgstr ""
6496 6675
6497#: src/social/gnunet-social.c:1356 6676#: src/social/gnunet-social.c:1351
6498msgid "start message ID for history replay" 6677msgid "start message ID for history replay"
6499msgstr "" 6678msgstr ""
6500 6679
6501#: src/social/gnunet-social.c:1361 6680#: src/social/gnunet-social.c:1356
6502msgid "respond to entry requests by admitting all guests" 6681msgid "respond to entry requests by admitting all guests"
6503msgstr "" 6682msgstr ""
6504 6683
6505#: src/social/gnunet-social.c:1367 6684#: src/social/gnunet-social.c:1362
6506msgid "end message ID for history replay" 6685msgid "end message ID for history replay"
6507msgstr "" 6686msgstr ""
6508 6687
6509#: src/social/gnunet-social.c:1372 6688#: src/social/gnunet-social.c:1367
6510msgid "respond to entry requests by refusing all guests" 6689msgid "respond to entry requests by refusing all guests"
6511msgstr "" 6690msgstr ""
6512 6691
6513#: src/social/gnunet-social.c:1382 6692#: src/social/gnunet-social.c:1377
6514msgid "" 6693msgid ""
6515"gnunet-social - Interact with the social service: enter/leave, send/receive " 6694"gnunet-social - Interact with the social service: enter/leave, send/receive "
6516"messages, access history and state.\n" 6695"messages, access history and state.\n"
@@ -6703,7 +6882,7 @@ msgid ""
6703msgstr "" 6882msgstr ""
6704 6883
6705#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 6884#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
6706#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 6885#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
6707#, c-format 6886#, c-format
6708msgid "Incorrect hostkey file format: %s\n" 6887msgid "Incorrect hostkey file format: %s\n"
6709msgstr "El fichero de máquinas no tiene el formato correcto: %s\n" 6888msgstr "El fichero de máquinas no tiene el formato correcto: %s\n"
@@ -6777,16 +6956,6 @@ msgstr "Petición ignorada porque el ARM se está apagando.\n"
6777msgid "%.s Unknown result code." 6956msgid "%.s Unknown result code."
6778msgstr "Código de respuesta del ARM desconocido.\n" 6957msgstr "Código de respuesta del ARM desconocido.\n"
6779 6958
6780#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6781#, fuzzy
6782msgid "Waiting for child to exit.\n"
6783msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n"
6784
6785#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6786#, fuzzy, c-format
6787msgid "Spawning process `%s'\n"
6788msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n"
6789
6790#: src/testbed/gnunet-testbed-profiler.c:290 6959#: src/testbed/gnunet-testbed-profiler.c:290
6791msgid "tolerate COUNT number of continious timeout failures" 6960msgid "tolerate COUNT number of continious timeout failures"
6792msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo" 6961msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo"
@@ -6798,6 +6967,16 @@ msgid ""
6798"signal is received" 6967"signal is received"
6799msgstr "" 6968msgstr ""
6800 6969
6970#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6971#, fuzzy
6972msgid "Waiting for child to exit.\n"
6973msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n"
6974
6975#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6976#, fuzzy, c-format
6977msgid "Spawning process `%s'\n"
6978msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n"
6979
6801#: src/testbed/testbed_api.c:410 6980#: src/testbed/testbed_api.c:410
6802#, c-format 6981#, c-format
6803msgid "Adding host %u failed with error: %s\n" 6982msgid "Adding host %u failed with error: %s\n"
@@ -7118,10 +7297,6 @@ msgstr "# mensajes «HELLO» recibidos"
7118msgid "GNUnet topology control" 7297msgid "GNUnet topology control"
7119msgstr "" 7298msgstr ""
7120 7299
7121#: src/transport/gnunet-service-transport_ats.c:141
7122msgid "# Addresses given to ATS"
7123msgstr ""
7124
7125#: src/transport/gnunet-service-transport.c:448 7300#: src/transport/gnunet-service-transport.c:448
7126msgid "# messages dropped due to slow client" 7301msgid "# messages dropped due to slow client"
7127msgstr "# mensajes omitidos debido a un cliente lento" 7302msgstr "# mensajes omitidos debido a un cliente lento"
@@ -7170,6 +7345,10 @@ msgstr ""
7170"El servicio de transporte carece de opciones de configuración de clave. " 7345"El servicio de transporte carece de opciones de configuración de clave. "
7171"Saliendo.\n" 7346"Saliendo.\n"
7172 7347
7348#: src/transport/gnunet-service-transport_ats.c:141
7349msgid "# Addresses given to ATS"
7350msgstr ""
7351
7173#: src/transport/gnunet-service-transport_hello.c:195 7352#: src/transport/gnunet-service-transport_hello.c:195
7174msgid "# refreshed my HELLO" 7353msgid "# refreshed my HELLO"
7175msgstr "# refrescos de mi «HELLO»" 7354msgstr "# refrescos de mi «HELLO»"
@@ -7506,6 +7685,45 @@ msgstr "# Mensajes PONG omitidos, firma expirada"
7506msgid "# validations succeeded" 7685msgid "# validations succeeded"
7507msgstr "# revalidaciones de direcciones iniciadas" 7686msgstr "# revalidaciones de direcciones iniciadas"
7508 7687
7688#: src/transport/gnunet-transport-profiler.c:219
7689#, c-format
7690msgid "%llu B in %llu ms == %.2f KB/s!\n"
7691msgstr ""
7692
7693#: src/transport/gnunet-transport-profiler.c:617
7694msgid "send data to peer"
7695msgstr ""
7696
7697#: src/transport/gnunet-transport-profiler.c:621
7698#, fuzzy
7699msgid "receive data from peer"
7700msgstr "# respuestas recibidas de otros pares"
7701
7702#: src/transport/gnunet-transport-profiler.c:626
7703#, fuzzy
7704msgid "iterations"
7705msgstr "Otras configuraciones"
7706
7707#: src/transport/gnunet-transport-profiler.c:631
7708#, fuzzy
7709msgid "number of messages to send"
7710msgstr "número de mensajes a usar por iteración"
7711
7712#: src/transport/gnunet-transport-profiler.c:636
7713#, fuzzy
7714msgid "message size to use"
7715msgstr "tamaño del mensaje"
7716
7717#: src/transport/gnunet-transport-profiler.c:641
7718#: src/transport/gnunet-transport.c:1462
7719msgid "peer identity"
7720msgstr "identidad del par"
7721
7722#: src/transport/gnunet-transport-profiler.c:652
7723#: src/transport/gnunet-transport.c:1482
7724msgid "Direct access to transport service."
7725msgstr "Acceso directo al servicio de transporte."
7726
7509#: src/transport/gnunet-transport.c:413 7727#: src/transport/gnunet-transport.c:413
7510#, c-format 7728#, c-format
7511msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" 7729msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7649,11 +7867,6 @@ msgstr ""
7649msgid "do not resolve hostnames" 7867msgid "do not resolve hostnames"
7650msgstr "no resolver nombres de máquinas" 7868msgstr "no resolver nombres de máquinas"
7651 7869
7652#: src/transport/gnunet-transport.c:1462
7653#: src/transport/gnunet-transport-profiler.c:641
7654msgid "peer identity"
7655msgstr "identidad del par"
7656
7657#: src/transport/gnunet-transport.c:1466 7870#: src/transport/gnunet-transport.c:1466
7658#, fuzzy 7871#, fuzzy
7659msgid "monitor plugin sessions" 7872msgid "monitor plugin sessions"
@@ -7663,43 +7876,9 @@ msgstr "# sesiones wlan pendientes"
7663msgid "send data for benchmarking to the other peer (until CTRL-C)" 7876msgid "send data for benchmarking to the other peer (until CTRL-C)"
7664msgstr "enviar data para prueba a otro par (hasta CTRL-C)" 7877msgstr "enviar data para prueba a otro par (hasta CTRL-C)"
7665 7878
7666#: src/transport/gnunet-transport.c:1482
7667#: src/transport/gnunet-transport-profiler.c:652
7668msgid "Direct access to transport service."
7669msgstr "Acceso directo al servicio de transporte."
7670
7671#: src/transport/gnunet-transport-profiler.c:219
7672#, c-format
7673msgid "%llu B in %llu ms == %.2f KB/s!\n"
7674msgstr ""
7675
7676#: src/transport/gnunet-transport-profiler.c:617
7677msgid "send data to peer"
7678msgstr ""
7679
7680#: src/transport/gnunet-transport-profiler.c:621
7681#, fuzzy
7682msgid "receive data from peer"
7683msgstr "# respuestas recibidas de otros pares"
7684
7685#: src/transport/gnunet-transport-profiler.c:626
7686#, fuzzy
7687msgid "iterations"
7688msgstr "Otras configuraciones"
7689
7690#: src/transport/gnunet-transport-profiler.c:631
7691#, fuzzy
7692msgid "number of messages to send"
7693msgstr "número de mensajes a usar por iteración"
7694
7695#: src/transport/gnunet-transport-profiler.c:636
7696#, fuzzy
7697msgid "message size to use"
7698msgstr "tamaño del mensaje"
7699
7700#: src/transport/plugin_transport_http_client.c:1474 7879#: src/transport/plugin_transport_http_client.c:1474
7701#: src/transport/plugin_transport_http_server.c:2249 7880#: src/transport/plugin_transport_http_server.c:2312
7702#: src/transport/plugin_transport_http_server.c:3463 7881#: src/transport/plugin_transport_http_server.c:3526
7703#: src/transport/plugin_transport_tcp.c:3890 7882#: src/transport/plugin_transport_tcp.c:3890
7704#: src/transport/plugin_transport_tcp.c:3897 7883#: src/transport/plugin_transport_tcp.c:3897
7705msgid "TCP_STEALTH not supported on this platform.\n" 7884msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7713,13 +7892,13 @@ msgstr ""
7713"módulo %s!\n" 7892"módulo %s!\n"
7714 7893
7715#: src/transport/plugin_transport_http_client.c:2164 7894#: src/transport/plugin_transport_http_client.c:2164
7716#: src/transport/plugin_transport_http_server.c:3178 7895#: src/transport/plugin_transport_http_server.c:3241
7717#, c-format 7896#, c-format
7718msgid "Shutting down plugin `%s'\n" 7897msgid "Shutting down plugin `%s'\n"
7719msgstr "Finalizando el módulo «%s»\n" 7898msgstr "Finalizando el módulo «%s»\n"
7720 7899
7721#: src/transport/plugin_transport_http_client.c:2181 7900#: src/transport/plugin_transport_http_client.c:2181
7722#: src/transport/plugin_transport_http_server.c:3248 7901#: src/transport/plugin_transport_http_server.c:3311
7723#, c-format 7902#, c-format
7724msgid "Shutdown for plugin `%s' complete\n" 7903msgid "Shutdown for plugin `%s' complete\n"
7725msgstr "Finalización del módulo «%s» completa\n" 7904msgstr "Finalización del módulo «%s» completa\n"
@@ -7729,7 +7908,7 @@ msgstr "Finalización del módulo «%s» completa\n"
7729msgid "Maximum number of requests is %u\n" 7908msgid "Maximum number of requests is %u\n"
7730msgstr "El número máximo de conexiones es %u\n" 7909msgstr "El número máximo de conexiones es %u\n"
7731 7910
7732#: src/transport/plugin_transport_http_server.c:1727 7911#: src/transport/plugin_transport_http_server.c:1756
7733#, c-format 7912#, c-format
7734msgid "" 7913msgid ""
7735"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " 7914"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
@@ -7738,12 +7917,12 @@ msgstr ""
7738"Acceso desde la conexión %p (%u de %u) para «%s» «%s» URL «%s» con tamaño de " 7917"Acceso desde la conexión %p (%u de %u) para «%s» «%s» URL «%s» con tamaño de "
7739"los datos de subida %u\n" 7918"los datos de subida %u\n"
7740 7919
7741#: src/transport/plugin_transport_http_server.c:1967 7920#: src/transport/plugin_transport_http_server.c:2028
7742#, c-format 7921#, c-format
7743msgid "Accepting connection (%u of %u) from `%s'\n" 7922msgid "Accepting connection (%u of %u) from `%s'\n"
7744msgstr "Aceptando conexión (%u de %u) desde «%s»\n" 7923msgstr "Aceptando conexión (%u de %u) desde «%s»\n"
7745 7924
7746#: src/transport/plugin_transport_http_server.c:1975 7925#: src/transport/plugin_transport_http_server.c:2036
7747#, c-format 7926#, c-format
7748msgid "" 7927msgid ""
7749"Server reached maximum number connections (%u), rejecting new connection\n" 7928"Server reached maximum number connections (%u), rejecting new connection\n"
@@ -7751,7 +7930,7 @@ msgstr ""
7751"El servidor ha alcanzado el número máximo de conexiones (%u), rechazando " 7930"El servidor ha alcanzado el número máximo de conexiones (%u), rechazando "
7752"nueva conexión\n" 7931"nueva conexión\n"
7753 7932
7754#: src/transport/plugin_transport_http_server.c:2125 7933#: src/transport/plugin_transport_http_server.c:2186
7755msgid "" 7934msgid ""
7756"Could not create a new TLS certificate, program `gnunet-transport-" 7935"Could not create a new TLS certificate, program `gnunet-transport-"
7757"certificate-creation' could not be started!\n" 7936"certificate-creation' could not be started!\n"
@@ -7759,84 +7938,84 @@ msgstr ""
7759"¡No se pudo crear un certificado TLS nuevo, el programa «gnunet-transport-" 7938"¡No se pudo crear un certificado TLS nuevo, el programa «gnunet-transport-"
7760"certificate-creation» no pudo ser iniciado!\n" 7939"certificate-creation» no pudo ser iniciado!\n"
7761 7940
7762#: src/transport/plugin_transport_http_server.c:2148 7941#: src/transport/plugin_transport_http_server.c:2209
7763#, fuzzy, c-format 7942#, fuzzy, c-format
7764msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" 7943msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
7765msgstr "" 7944msgstr ""
7766"¡No se encontró ningún certificado TLS útil y se produjo un fallo al crear " 7945"¡No se encontró ningún certificado TLS útil y se produjo un fallo al crear "
7767"uno!\n" 7946"uno!\n"
7768 7947
7769#: src/transport/plugin_transport_http_server.c:2275 7948#: src/transport/plugin_transport_http_server.c:2338
7770msgid "Could not load or create server certificate! Loading plugin failed!\n" 7949msgid "Could not load or create server certificate! Loading plugin failed!\n"
7771msgstr "" 7950msgstr ""
7772 7951
7773#: src/transport/plugin_transport_http_server.c:2587 7952#: src/transport/plugin_transport_http_server.c:2650
7774msgid "Require valid port number for service in configuration!\n" 7953msgid "Require valid port number for service in configuration!\n"
7775msgstr "¡Se necesita un puerto válido para el servicio en la configuración!\n" 7954msgstr "¡Se necesita un puerto válido para el servicio en la configuración!\n"
7776 7955
7777#: src/transport/plugin_transport_http_server.c:2752 7956#: src/transport/plugin_transport_http_server.c:2815
7778#, c-format 7957#, c-format
7779msgid "Found %u addresses to report to NAT service\n" 7958msgid "Found %u addresses to report to NAT service\n"
7780msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n" 7959msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n"
7781 7960
7782#: src/transport/plugin_transport_http_server.c:2838 7961#: src/transport/plugin_transport_http_server.c:2901
7783#: src/transport/plugin_transport_udp.c:3622 7962#: src/transport/plugin_transport_udp.c:3622
7784msgid "Disabling IPv6 since it is not supported on this system!\n" 7963msgid "Disabling IPv6 since it is not supported on this system!\n"
7785msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n" 7964msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
7786 7965
7787#: src/transport/plugin_transport_http_server.c:2944 7966#: src/transport/plugin_transport_http_server.c:3007
7788#, c-format 7967#, c-format
7789msgid "IPv4 support is %s\n" 7968msgid "IPv4 support is %s\n"
7790msgstr "El soporte IPv4 es %s\n" 7969msgstr "El soporte IPv4 es %s\n"
7791 7970
7792#: src/transport/plugin_transport_http_server.c:2959 7971#: src/transport/plugin_transport_http_server.c:3022
7793#, c-format 7972#, c-format
7794msgid "IPv6 support is %s\n" 7973msgid "IPv6 support is %s\n"
7795msgstr "El soporte IPv6 es %s\n" 7974msgstr "El soporte IPv6 es %s\n"
7796 7975
7797#: src/transport/plugin_transport_http_server.c:2965 7976#: src/transport/plugin_transport_http_server.c:3028
7798msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" 7977msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
7799msgstr "¡Ni IPv4 ni IPv6 están habilitadas! Corrija la configuración\n" 7978msgstr "¡Ni IPv4 ni IPv6 están habilitadas! Corrija la configuración\n"
7800 7979
7801#: src/transport/plugin_transport_http_server.c:2976 7980#: src/transport/plugin_transport_http_server.c:3039
7802msgid "Port is required! Fix in configuration\n" 7981msgid "Port is required! Fix in configuration\n"
7803msgstr "¡El puerto es necesario! Corrija la configuración\n" 7982msgstr "¡El puerto es necesario! Corrija la configuración\n"
7804 7983
7805#: src/transport/plugin_transport_http_server.c:2982 7984#: src/transport/plugin_transport_http_server.c:3045
7806#, c-format 7985#, c-format
7807msgid "Using port %u\n" 7986msgid "Using port %u\n"
7808msgstr "Usando puerto %u\n" 7987msgstr "Usando puerto %u\n"
7809 7988
7810#: src/transport/plugin_transport_http_server.c:3001 7989#: src/transport/plugin_transport_http_server.c:3064
7811#, c-format 7990#, c-format
7812msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" 7991msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
7813msgstr "" 7992msgstr ""
7814"¡La dirección IPv4 «%s» especificada en el fichero de configuración no es " 7993"¡La dirección IPv4 «%s» especificada en el fichero de configuración no es "
7815"válida!\n" 7994"válida!\n"
7816 7995
7817#: src/transport/plugin_transport_http_server.c:3036 7996#: src/transport/plugin_transport_http_server.c:3099
7818#, c-format 7997#, c-format
7819msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" 7998msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
7820msgstr "" 7999msgstr ""
7821"¡La dirección IPv6 «%s» especificada en el fichero de configuración no es " 8000"¡La dirección IPv6 «%s» especificada en el fichero de configuración no es "
7822"válida!\n" 8001"válida!\n"
7823 8002
7824#: src/transport/plugin_transport_http_server.c:3111 8003#: src/transport/plugin_transport_http_server.c:3174
7825#, c-format 8004#, c-format
7826msgid "Using external hostname `%s'\n" 8005msgid "Using external hostname `%s'\n"
7827msgstr "Usando nombre de máquina externo «%s»\n" 8006msgstr "Usando nombre de máquina externo «%s»\n"
7828 8007
7829#: src/transport/plugin_transport_http_server.c:3132 8008#: src/transport/plugin_transport_http_server.c:3195
7830#, c-format 8009#, c-format
7831msgid "Notifying transport only about hostname `%s'\n" 8010msgid "Notifying transport only about hostname `%s'\n"
7832msgstr "Notificando al transporte sólo el nombre de máquina «%s»\n" 8011msgstr "Notificando al transporte sólo el nombre de máquina «%s»\n"
7833 8012
7834#: src/transport/plugin_transport_http_server.c:3149 8013#: src/transport/plugin_transport_http_server.c:3212
7835#, c-format 8014#, c-format
7836msgid "Maximum number of connections is %u\n" 8015msgid "Maximum number of connections is %u\n"
7837msgstr "El número máximo de conexiones es %u\n" 8016msgstr "El número máximo de conexiones es %u\n"
7838 8017
7839#: src/transport/plugin_transport_http_server.c:3475 8018#: src/transport/plugin_transport_http_server.c:3538
7840#, fuzzy 8019#, fuzzy
7841msgid "Unable to compile URL regex\n" 8020msgid "Unable to compile URL regex\n"
7842msgstr "¡Imposible obtener «HELLO» del par!\n" 8021msgstr "¡Imposible obtener «HELLO» del par!\n"
@@ -7981,23 +8160,6 @@ msgstr "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n"
7981msgid "TCP transport advertises itself as being on port %llu\n" 8160msgid "TCP transport advertises itself as being on port %llu\n"
7982msgstr "El transporte TCP anuncia que está en el puerto %llu\n" 8161msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
7983 8162
7984#: src/transport/plugin_transport_udp_broadcasting.c:168
7985#, fuzzy
7986msgid "# Multicast HELLO beacons received via UDP"
7987msgstr "# beacons HELLO multicast IPv6 recibidos vía UDP"
7988
7989#: src/transport/plugin_transport_udp_broadcasting.c:548
7990msgid ""
7991"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7992msgstr ""
7993
7994#: src/transport/plugin_transport_udp_broadcasting.c:565
7995#, c-format
7996msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7997msgstr ""
7998"Se produjo un fallo al establecer la opción de «broadcast» IPv4 para el "
7999"«socket» en el puerto %d\n"
8000
8001#: src/transport/plugin_transport_udp.c:3366 8163#: src/transport/plugin_transport_udp.c:3366
8002#, c-format 8164#, c-format
8003msgid "" 8165msgid ""
@@ -8052,6 +8214,23 @@ msgstr "«%s» no es una dirección IP válida.\n"
8052msgid "Failed to create UDP network sockets\n" 8214msgid "Failed to create UDP network sockets\n"
8053msgstr "Se produjo un fallo al crear una nueva firma" 8215msgstr "Se produjo un fallo al crear una nueva firma"
8054 8216
8217#: src/transport/plugin_transport_udp_broadcasting.c:168
8218#, fuzzy
8219msgid "# Multicast HELLO beacons received via UDP"
8220msgstr "# beacons HELLO multicast IPv6 recibidos vía UDP"
8221
8222#: src/transport/plugin_transport_udp_broadcasting.c:548
8223msgid ""
8224"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
8225msgstr ""
8226
8227#: src/transport/plugin_transport_udp_broadcasting.c:565
8228#, c-format
8229msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
8230msgstr ""
8231"Se produjo un fallo al establecer la opción de «broadcast» IPv4 para el "
8232"«socket» en el puerto %d\n"
8233
8055#: src/transport/plugin_transport_unix.c:1403 8234#: src/transport/plugin_transport_unix.c:1403
8056#, fuzzy, c-format 8235#, fuzzy, c-format
8057msgid "Cannot create path to `%s'\n" 8236msgid "Cannot create path to `%s'\n"
@@ -8171,7 +8350,7 @@ msgstr ""
8171"El código de procesado para el mensaje del tipo %u no llamó a " 8350"El código de procesado para el mensaje del tipo %u no llamó a "
8172"«GNUNET_SERVER_receive_done» después de %s\n" 8351"«GNUNET_SERVER_receive_done» después de %s\n"
8173 8352
8174#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 8353#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
8175#, c-format 8354#, c-format
8176msgid "Unknown address family %d\n" 8355msgid "Unknown address family %d\n"
8177msgstr "Familia de direcciones %d desconocida\n" 8356msgstr "Familia de direcciones %d desconocida\n"
@@ -8220,52 +8399,52 @@ msgstr "Se produjo un fallo al inciar «%s» en «%s»\n"
8220msgid "Service `%s' runs at %s\n" 8399msgid "Service `%s' runs at %s\n"
8221msgstr "El servicio «%s» se ejecuta en %s\n" 8400msgstr "El servicio «%s» se ejecuta en %s\n"
8222 8401
8223#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 8402#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
8224msgid "Service process failed to initialize\n" 8403msgid "Service process failed to initialize\n"
8225msgstr "No se pudo inicializar el proceso del servicio\n" 8404msgstr "No se pudo inicializar el proceso del servicio\n"
8226 8405
8227#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 8406#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
8228msgid "Service process could not initialize server function\n" 8407msgid "Service process could not initialize server function\n"
8229msgstr "" 8408msgstr ""
8230"No se pudo inicializar la función del servidor en el proceso del servicio\n" 8409"No se pudo inicializar la función del servidor en el proceso del servicio\n"
8231 8410
8232#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 8411#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
8233msgid "Service process failed to report status\n" 8412msgid "Service process failed to report status\n"
8234msgstr "El proceso del servicio no devolvió un estado\n" 8413msgstr "El proceso del servicio no devolvió un estado\n"
8235 8414
8236#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 8415#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
8237#: src/util/service.c:1379 8416#: src/util/service.c:1378
8238#, c-format 8417#, c-format
8239msgid "Cannot obtain information about user `%s': %s\n" 8418msgid "Cannot obtain information about user `%s': %s\n"
8240msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n" 8419msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n"
8241 8420
8242#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 8421#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
8243msgid "No such user" 8422msgid "No such user"
8244msgstr "No existe tal usuario" 8423msgstr "No existe tal usuario"
8245 8424
8246#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 8425#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
8247#, c-format 8426#, c-format
8248msgid "Cannot change user/group to `%s': %s\n" 8427msgid "Cannot change user/group to `%s': %s\n"
8249msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n" 8428msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n"
8250 8429
8251#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 8430#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
8252msgid "do daemonize (detach from terminal)" 8431msgid "do daemonize (detach from terminal)"
8253msgstr "demonizar (desasociar del terminal)" 8432msgstr "demonizar (desasociar del terminal)"
8254 8433
8255#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 8434#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
8256#: src/util/service.c:1791 8435#: src/util/service.c:1790
8257#, fuzzy, c-format 8436#, fuzzy, c-format
8258msgid "Malformed configuration file `%s', exit ...\n" 8437msgid "Malformed configuration file `%s', exit ...\n"
8259msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" 8438msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
8260 8439
8261#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 8440#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
8262#: src/util/service.c:1802 8441#: src/util/service.c:1801
8263#, fuzzy 8442#, fuzzy
8264msgid "Malformed configuration, exit ...\n" 8443msgid "Malformed configuration, exit ...\n"
8265msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" 8444msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
8266 8445
8267#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 8446#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
8268#: src/util/service.c:1808 8447#: src/util/service.c:1807
8269#, c-format 8448#, c-format
8270msgid "Could not access configuration file `%s'\n" 8449msgid "Could not access configuration file `%s'\n"
8271msgstr "No se pudo acceder al fichero de configuración «%s»\n" 8450msgstr "No se pudo acceder al fichero de configuración «%s»\n"
@@ -8309,53 +8488,53 @@ msgstr "Se produjo un fallo al deserializar los metadatos «%s»"
8309msgid "Need a non-empty hostname for service `%s'.\n" 8488msgid "Need a non-empty hostname for service `%s'.\n"
8310msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n" 8489msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n"
8311 8490
8312#: src/util/common_logging.c:256 src/util/common_logging.c:1129 8491#: src/util/common_logging.c:259 src/util/common_logging.c:1132
8313msgid "DEBUG" 8492msgid "DEBUG"
8314msgstr "DEPURACIÓN" 8493msgstr "DEPURACIÓN"
8315 8494
8316#: src/util/common_logging.c:258 src/util/common_logging.c:1127 8495#: src/util/common_logging.c:261 src/util/common_logging.c:1130
8317msgid "INFO" 8496msgid "INFO"
8318msgstr "INFORMACIÓN" 8497msgstr "INFORMACIÓN"
8319 8498
8320#: src/util/common_logging.c:260 src/util/common_logging.c:1125 8499#: src/util/common_logging.c:263 src/util/common_logging.c:1128
8321msgid "MESSAGE" 8500msgid "MESSAGE"
8322msgstr "MENSAJE" 8501msgstr "MENSAJE"
8323 8502
8324#: src/util/common_logging.c:262 src/util/common_logging.c:1123 8503#: src/util/common_logging.c:265 src/util/common_logging.c:1126
8325msgid "WARNING" 8504msgid "WARNING"
8326msgstr "PELIGRO" 8505msgstr "PELIGRO"
8327 8506
8328#: src/util/common_logging.c:264 src/util/common_logging.c:1121 8507#: src/util/common_logging.c:267 src/util/common_logging.c:1124
8329msgid "ERROR" 8508msgid "ERROR"
8330msgstr "ERROR" 8509msgstr "ERROR"
8331 8510
8332#: src/util/common_logging.c:266 src/util/common_logging.c:1131 8511#: src/util/common_logging.c:269 src/util/common_logging.c:1134
8333msgid "NONE" 8512msgid "NONE"
8334msgstr "NINGUNO" 8513msgstr "NINGUNO"
8335 8514
8336#: src/util/common_logging.c:879 8515#: src/util/common_logging.c:882
8337#, c-format 8516#, c-format
8338msgid "Message `%.*s' repeated %u times in the last %s\n" 8517msgid "Message `%.*s' repeated %u times in the last %s\n"
8339msgstr "Mensaje `%.*s» repetido %u veces en el último %s\n" 8518msgstr "Mensaje `%.*s» repetido %u veces en el último %s\n"
8340 8519
8341#: src/util/common_logging.c:1132 8520#: src/util/common_logging.c:1135
8342msgid "INVALID" 8521msgid "INVALID"
8343msgstr "NO VÃLIDO" 8522msgstr "NO VÃLIDO"
8344 8523
8345#: src/util/common_logging.c:1302 8524#: src/util/common_logging.c:1326
8346msgid "unknown address" 8525msgid "unknown address"
8347msgstr "dirección desconocida" 8526msgstr "dirección desconocida"
8348 8527
8349#: src/util/common_logging.c:1344 8528#: src/util/common_logging.c:1368
8350msgid "invalid address" 8529msgid "invalid address"
8351msgstr "dirección no válida" 8530msgstr "dirección no válida"
8352 8531
8353#: src/util/common_logging.c:1362 8532#: src/util/common_logging.c:1386
8354#, c-format 8533#, c-format
8355msgid "Configuration fails to specify option `%s' in section `%s'!\n" 8534msgid "Configuration fails to specify option `%s' in section `%s'!\n"
8356msgstr "¡La configuración no especifica la opción «%s» en la sección «%s»!\n" 8535msgstr "¡La configuración no especifica la opción «%s» en la sección «%s»!\n"
8357 8536
8358#: src/util/common_logging.c:1383 8537#: src/util/common_logging.c:1407
8359#, c-format 8538#, c-format
8360msgid "" 8539msgid ""
8361"Configuration specifies invalid value for option `%s' in section `%s': %s\n" 8540"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
@@ -8363,17 +8542,17 @@ msgstr ""
8363"La configuración especifica un valor no válido en la opción «%s» de la " 8542"La configuración especifica un valor no válido en la opción «%s» de la "
8364"sección «%s»: %s\n" 8543"sección «%s»: %s\n"
8365 8544
8366#: src/util/configuration.c:286 8545#: src/util/configuration.c:296
8367#, c-format 8546#, c-format
8368msgid "Syntax error while deserializing in line %u\n" 8547msgid "Syntax error while deserializing in line %u\n"
8369msgstr "Error de sintaxis en la línea %u mientras se deserializaba\n" 8548msgstr "Error de sintaxis en la línea %u mientras se deserializaba\n"
8370 8549
8371#: src/util/configuration.c:344 8550#: src/util/configuration.c:355
8372#, fuzzy, c-format 8551#, fuzzy, c-format
8373msgid "Error while reading file `%s'\n" 8552msgid "Error while reading file `%s'\n"
8374msgstr "Error decodificando clave %u\n" 8553msgstr "Error decodificando clave %u\n"
8375 8554
8376#: src/util/configuration.c:1017 8555#: src/util/configuration.c:1034
8377#, c-format 8556#, c-format
8378msgid "" 8557msgid ""
8379"Configuration value '%s' for '%s' in section '%s' is not in set of legal " 8558"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8382,17 +8561,17 @@ msgstr ""
8382"El valor de configuración «%s» para «%s» de la sección «%s» no está dentro " 8561"El valor de configuración «%s» para «%s» de la sección «%s» no está dentro "
8383"de las opciones legales\n" 8562"de las opciones legales\n"
8384 8563
8385#: src/util/configuration.c:1136 8564#: src/util/configuration.c:1153
8386#, c-format 8565#, c-format
8387msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" 8566msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
8388msgstr "" 8567msgstr ""
8389 8568
8390#: src/util/configuration.c:1169 8569#: src/util/configuration.c:1186
8391#, fuzzy, c-format 8570#, fuzzy, c-format
8392msgid "Missing closing `%s' in option `%s'\n" 8571msgid "Missing closing `%s' in option `%s'\n"
8393msgstr "Falta la opción «%s» para la operación «%s»\n" 8572msgstr "Falta la opción «%s» para la operación «%s»\n"
8394 8573
8395#: src/util/configuration.c:1237 8574#: src/util/configuration.c:1254
8396#, c-format 8575#, c-format
8397msgid "" 8576msgid ""
8398"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " 8577"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8428,23 +8607,23 @@ msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
8428msgid "EdDSA signature verification failed at %s:%d: %s\n" 8607msgid "EdDSA signature verification failed at %s:%d: %s\n"
8429msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n" 8608msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
8430 8609
8431#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 8610#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
8432#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 8611#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
8433#, c-format 8612#, c-format
8434msgid "Could not acquire lock on file `%s': %s...\n" 8613msgid "Could not acquire lock on file `%s': %s...\n"
8435msgstr "No se pudo bloquear el fichero «%s»: %s...\n" 8614msgstr "No se pudo bloquear el fichero «%s»: %s...\n"
8436 8615
8437#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 8616#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
8438msgid "Creating a new private key. This may take a while.\n" 8617msgid "Creating a new private key. This may take a while.\n"
8439msgstr "Generando una clave privada nueva. Esto puede tomar un tiempo.\n" 8618msgstr "Generando una clave privada nueva. Esto puede tomar un tiempo.\n"
8440 8619
8441#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 8620#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
8442msgid "This may be ok if someone is currently generating a private key.\n" 8621msgid "This may be ok if someone is currently generating a private key.\n"
8443msgstr "" 8622msgstr ""
8444"Esto puede estar bien si alguien está actualmente generando una clave " 8623"Esto puede estar bien si alguien está actualmente generando una clave "
8445"privada.\n" 8624"privada.\n"
8446 8625
8447#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 8626#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
8448#, c-format 8627#, c-format
8449msgid "" 8628msgid ""
8450"When trying to read key file `%s' I found %u bytes but I need at least %u.\n" 8629"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
@@ -8452,13 +8631,13 @@ msgstr ""
8452"Cuando se intentaba leer el fichero de claves «%s» se encontraron %u bytes " 8631"Cuando se intentaba leer el fichero de claves «%s» se encontraron %u bytes "
8453"pero al menos %u son necesarios.\n" 8632"pero al menos %u son necesarios.\n"
8454 8633
8455#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 8634#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
8456msgid "This may be ok if someone is currently generating a key.\n" 8635msgid "This may be ok if someone is currently generating a key.\n"
8457msgstr "" 8636msgstr ""
8458"Esto puede ser correcto si alguien está actualmente generando una clave de " 8637"Esto puede ser correcto si alguien está actualmente generando una clave de "
8459"máquina.\n" 8638"máquina.\n"
8460 8639
8461#: src/util/crypto_ecc_setup.c:413 8640#: src/util/crypto_ecc_setup.c:415
8462#, fuzzy 8641#, fuzzy
8463msgid "Could not load peer's private key\n" 8642msgid "Could not load peer's private key\n"
8464msgstr "No se pudo acceder a la clave de máquina.\n" 8643msgstr "No se pudo acceder a la clave de máquina.\n"
@@ -8651,22 +8830,22 @@ msgstr ""
8651msgid "Manipulate GNUnet configuration files" 8830msgid "Manipulate GNUnet configuration files"
8652msgstr "Manipular ficheros de configuración de GNUnet" 8831msgstr "Manipular ficheros de configuración de GNUnet"
8653 8832
8654#: src/util/gnunet-ecc.c:84 8833#: src/util/gnunet-ecc.c:89
8655#, c-format 8834#, c-format
8656msgid "Failed to open `%s': %s\n" 8835msgid "Failed to open `%s': %s\n"
8657msgstr "Se produjo un fallo al abrir «%s»: %s\n" 8836msgstr "Se produjo un fallo al abrir «%s»: %s\n"
8658 8837
8659#: src/util/gnunet-ecc.c:120 8838#: src/util/gnunet-ecc.c:125
8660#, fuzzy, c-format 8839#, fuzzy, c-format
8661msgid "Generating %u keys like %s, please wait" 8840msgid "Generating %u keys like %s, please wait"
8662msgstr "Generando %u claves, por favor, espere" 8841msgstr "Generando %u claves, por favor, espere"
8663 8842
8664#: src/util/gnunet-ecc.c:133 8843#: src/util/gnunet-ecc.c:138
8665#, c-format 8844#, c-format
8666msgid "Generating %u keys, please wait" 8845msgid "Generating %u keys, please wait"
8667msgstr "Generando %u claves, por favor, espere" 8846msgstr "Generando %u claves, por favor, espere"
8668 8847
8669#: src/util/gnunet-ecc.c:174 8848#: src/util/gnunet-ecc.c:179
8670#, c-format 8849#, c-format
8671msgid "" 8850msgid ""
8672"\n" 8851"\n"
@@ -8675,60 +8854,65 @@ msgstr ""
8675"\n" 8854"\n"
8676"Se produjo un fallo al escribir en «%s»: %s\n" 8855"Se produjo un fallo al escribir en «%s»: %s\n"
8677 8856
8678#: src/util/gnunet-ecc.c:184 8857#: src/util/gnunet-ecc.c:189
8679#, fuzzy, c-format 8858#, fuzzy, c-format
8680msgid "" 8859msgid ""
8681"\n" 8860"\n"
8682"Finished!\n" 8861"Finished!\n"
8683msgstr "¡Finalizado!\n" 8862msgstr "¡Finalizado!\n"
8684 8863
8685#: src/util/gnunet-ecc.c:187 8864#: src/util/gnunet-ecc.c:192
8686#, c-format 8865#, c-format
8687msgid "" 8866msgid ""
8688"\n" 8867"\n"
8689"Error, %u keys not generated\n" 8868"Error, %u keys not generated\n"
8690msgstr "" 8869msgstr ""
8691 8870
8692#: src/util/gnunet-ecc.c:280 8871#: src/util/gnunet-ecc.c:283
8693#, fuzzy, c-format 8872#, fuzzy, c-format
8694msgid "Hostkeys file `%s' not found\n" 8873msgid "Hostkeys file `%s' not found\n"
8695msgstr "El fichero de máquinas %s no fue encontrado\n" 8874msgstr "El fichero de máquinas %s no fue encontrado\n"
8696 8875
8697#: src/util/gnunet-ecc.c:291 8876#: src/util/gnunet-ecc.c:294
8698#, fuzzy, c-format 8877#, fuzzy, c-format
8699msgid "Hostkeys file `%s' is empty\n" 8878msgid "Hostkeys file `%s' is empty\n"
8700msgstr "El archivo de amigos «%s» está vacío.\n" 8879msgstr "El archivo de amigos «%s» está vacío.\n"
8701 8880
8702#: src/util/gnunet-ecc.c:313 8881#: src/util/gnunet-ecc.c:316
8703#, fuzzy, c-format 8882#, fuzzy, c-format
8704msgid "Could not read hostkey file: %s\n" 8883msgid "Could not read hostkey file: %s\n"
8705msgstr "¡No se puede leer el fichero de claves de máquina!\n" 8884msgstr "¡No se puede leer el fichero de claves de máquina!\n"
8706 8885
8707#: src/util/gnunet-ecc.c:364 8886#: src/util/gnunet-ecc.c:367
8708msgid "No hostkey file specified on command line\n" 8887msgid "No hostkey file specified on command line\n"
8709msgstr "No se ha especificado la clave de máquina en la línea de comandos\n" 8888msgstr "No se ha especificado la clave de máquina en la línea de comandos\n"
8710 8889
8711#: src/util/gnunet-ecc.c:416 8890#: src/util/gnunet-ecc.c:425
8712msgid "list keys included in a file (for testing)" 8891msgid "list keys included in a file (for testing)"
8713msgstr "" 8892msgstr ""
8714 8893
8715#: src/util/gnunet-ecc.c:421 8894#: src/util/gnunet-ecc.c:430
8716msgid "number of keys to list included in a file (for testing)" 8895msgid "number of keys to list included in a file (for testing)"
8717msgstr "" 8896msgstr ""
8718 8897
8719#: src/util/gnunet-ecc.c:426 8898#: src/util/gnunet-ecc.c:435
8720msgid "create COUNT public-private key pairs (for testing)" 8899msgid "create COUNT public-private key pairs (for testing)"
8721msgstr "crea «COUNT» pares de claves pública-privada (para pruebas)" 8900msgstr "crea «COUNT» pares de claves pública-privada (para pruebas)"
8722 8901
8723#: src/util/gnunet-ecc.c:430 8902#: src/util/gnunet-ecc.c:439
8724msgid "print the public key in ASCII format" 8903msgid "print the public key in ASCII format"
8725msgstr "imprime la clave pública en formato ASCII" 8904msgstr "imprime la clave pública en formato ASCII"
8726 8905
8727#: src/util/gnunet-ecc.c:434 8906#: src/util/gnunet-ecc.c:443
8907#, fuzzy
8908msgid "print the public key in HEX format"
8909msgstr "imprime la clave pública en formato ASCII"
8910
8911#: src/util/gnunet-ecc.c:447
8728msgid "print examples of ECC operations (used for compatibility testing)" 8912msgid "print examples of ECC operations (used for compatibility testing)"
8729msgstr "" 8913msgstr ""
8730 8914
8731#: src/util/gnunet-ecc.c:449 8915#: src/util/gnunet-ecc.c:463
8732msgid "Manipulate GNUnet private ECC key files" 8916msgid "Manipulate GNUnet private ECC key files"
8733msgstr "Manipular los ficheros de clave privada ECC de GNUnet" 8917msgstr "Manipular los ficheros de clave privada ECC de GNUnet"
8734 8918
@@ -8823,7 +9007,7 @@ msgstr "Error escribiendo a «%s»: %s\n"
8823msgid "Unable to shorten unix path `%s' while keeping name unique\n" 9007msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8824msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n" 9008msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n"
8825 9009
8826#: src/util/network.c:1793 src/util/network.c:1969 9010#: src/util/network.c:1793 src/util/network.c:1977
8827#, c-format 9011#, c-format
8828msgid "" 9012msgid ""
8829"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 9013"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8879,7 +9063,7 @@ msgstr "Falló «%s» para la biblioteca «%s» con error: %s\n"
8879msgid "Could not determine plugin installation path.\n" 9063msgid "Could not determine plugin installation path.\n"
8880msgstr "No se pudo determinar la ruta de instalación de los módulos.\n" 9064msgstr "No se pudo determinar la ruta de instalación de los módulos.\n"
8881 9065
8882#: src/util/resolver_api.c:204 9066#: src/util/resolver_api.c:203
8883#, c-format 9067#, c-format
8884msgid "" 9068msgid ""
8885"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" 9069"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8894,12 +9078,12 @@ msgstr ""
8894"¡Se debe especificar «%s» o una dirección numérica IP para «%s» de «%s» en " 9078"¡Se debe especificar «%s» o una dirección numérica IP para «%s» de «%s» en "
8895"la configuración!\n" 9079"la configuración!\n"
8896 9080
8897#: src/util/resolver_api.c:815 9081#: src/util/resolver_api.c:826
8898#, c-format 9082#, c-format
8899msgid "Timeout trying to resolve hostname `%s'.\n" 9083msgid "Timeout trying to resolve hostname `%s'.\n"
8900msgstr "Expiración de plazo intentando resolver el nombre de máquina «%s».\n" 9084msgstr "Expiración de plazo intentando resolver el nombre de máquina «%s».\n"
8901 9085
8902#: src/util/resolver_api.c:827 9086#: src/util/resolver_api.c:839
8903#, c-format 9087#, c-format
8904msgid "Timeout trying to resolve IP address `%s'.\n" 9088msgid "Timeout trying to resolve IP address `%s'.\n"
8905msgstr "Expiración de plazo intentando resolver la dirección IP «%s».\n" 9089msgstr "Expiración de plazo intentando resolver la dirección IP «%s».\n"
@@ -8907,24 +9091,24 @@ msgstr "Expiración de plazo intentando resolver la dirección IP «%s».\n"
8907# Miguel: He traducido "default" por "predeterminado", la locución 9091# Miguel: He traducido "default" por "predeterminado", la locución
8908# "por defecto" no tiene sentido en sitios como este y he tratado 9092# "por defecto" no tiene sentido en sitios como este y he tratado
8909# de ser consistente. 9093# de ser consistente.
8910#: src/util/resolver_api.c:1004 9094#: src/util/resolver_api.c:1023
8911#, fuzzy 9095#, fuzzy
8912msgid "Resolver not configured correctly.\n" 9096msgid "Resolver not configured correctly.\n"
8913msgstr "¡El servicio predeterminado «%s» no está configurado correctamente!\n" 9097msgstr "¡El servicio predeterminado «%s» no está configurado correctamente!\n"
8914 9098
8915#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 9099#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
8916#: src/util/resolver_api.c:1121 9100#: src/util/resolver_api.c:1146
8917#, fuzzy, c-format 9101#, fuzzy, c-format
8918msgid "Could not resolve our FQDN: %s\n" 9102msgid "Could not resolve our FQDN: %s\n"
8919msgstr "" 9103msgstr ""
8920"No se pudo resolver nuestro nombre de dominio cualificado (FQDN) : %s\n" 9104"No se pudo resolver nuestro nombre de dominio cualificado (FQDN) : %s\n"
8921 9105
8922#: src/util/service.c:1306 9106#: src/util/service.c:1305
8923msgid "" 9107msgid ""
8924"Could not bind to any of the ports I was supposed to, refusing to run!\n" 9108"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8925msgstr "" 9109msgstr ""
8926 9110
8927#: src/util/service.c:2082 9111#: src/util/service.c:2081
8928#, fuzzy, c-format 9112#, fuzzy, c-format
8929msgid "" 9113msgid ""
8930"Processing code for message of type %u did not call " 9114"Processing code for message of type %u did not call "
@@ -9003,67 +9187,67 @@ msgstr "días"
9003msgid "end of time" 9187msgid "end of time"
9004msgstr "fin del plazo" 9188msgstr "fin del plazo"
9005 9189
9006#: src/util/strings.c:1269 9190#: src/util/strings.c:1270
9007msgid "IPv6 address did not start with `['\n" 9191msgid "IPv6 address did not start with `['\n"
9008msgstr "La dirección IPv6 no empezaba con «[»\n" 9192msgstr "La dirección IPv6 no empezaba con «[»\n"
9009 9193
9010#: src/util/strings.c:1277 9194#: src/util/strings.c:1278
9011msgid "IPv6 address did contain ':' to separate port number\n" 9195msgid "IPv6 address did contain ':' to separate port number\n"
9012msgstr "La dirección IPv6 contenía «:» para separar el número de puerto\n" 9196msgstr "La dirección IPv6 contenía «:» para separar el número de puerto\n"
9013 9197
9014#: src/util/strings.c:1283 9198#: src/util/strings.c:1284
9015msgid "IPv6 address did contain ']' before ':' to separate port number\n" 9199msgid "IPv6 address did contain ']' before ':' to separate port number\n"
9016msgstr "" 9200msgstr ""
9017"La dirección IPv6 contenía «]» antes de «:» para separar el número de " 9201"La dirección IPv6 contenía «]» antes de «:» para separar el número de "
9018"puerto\n" 9202"puerto\n"
9019 9203
9020#: src/util/strings.c:1290 9204#: src/util/strings.c:1291
9021msgid "IPv6 address did contain a valid port number after the last ':'\n" 9205msgid "IPv6 address did contain a valid port number after the last ':'\n"
9022msgstr "" 9206msgstr ""
9023"La dirección IPv6 contenía un número de puerto válido después del último " 9207"La dirección IPv6 contenía un número de puerto válido después del último "
9024"«:»\n" 9208"«:»\n"
9025 9209
9026#: src/util/strings.c:1299 9210#: src/util/strings.c:1300
9027#, c-format 9211#, c-format
9028msgid "Invalid IPv6 address `%s': %s\n" 9212msgid "Invalid IPv6 address `%s': %s\n"
9029msgstr "Dirección IPv6 «%s» no válida: %s\n" 9213msgstr "Dirección IPv6 «%s» no válida: %s\n"
9030 9214
9031#: src/util/strings.c:1571 src/util/strings.c:1587 9215#: src/util/strings.c:1572 src/util/strings.c:1588
9032msgid "Port not in range\n" 9216msgid "Port not in range\n"
9033msgstr "" 9217msgstr ""
9034 9218
9035#: src/util/strings.c:1596 9219#: src/util/strings.c:1597
9036#, fuzzy, c-format 9220#, fuzzy, c-format
9037msgid "Malformed port policy `%s'\n" 9221msgid "Malformed port policy `%s'\n"
9038msgstr "Se produjo un fallo al iniciar el servicio «%s»\n" 9222msgstr "Se produjo un fallo al iniciar el servicio «%s»\n"
9039 9223
9040#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 9224#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
9041#: src/util/strings.c:1779 9225#: src/util/strings.c:1780
9042#, c-format 9226#, c-format
9043msgid "Invalid format for IP: `%s'\n" 9227msgid "Invalid format for IP: `%s'\n"
9044msgstr "Formato no válido para la IP: «%s»\n" 9228msgstr "Formato no válido para la IP: «%s»\n"
9045 9229
9046#: src/util/strings.c:1736 9230#: src/util/strings.c:1737
9047#, c-format 9231#, c-format
9048msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." 9232msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
9049msgstr "Notación de red no válida («/%d» no es válido en IPv4 CIDR)." 9233msgstr "Notación de red no válida («/%d» no es válido en IPv4 CIDR)."
9050 9234
9051#: src/util/strings.c:1788 9235#: src/util/strings.c:1789
9052#, fuzzy, c-format 9236#, fuzzy, c-format
9053msgid "Invalid format: `%s'\n" 9237msgid "Invalid format: `%s'\n"
9054msgstr "Formato de tiempo no válido «%s»\n" 9238msgstr "Formato de tiempo no válido «%s»\n"
9055 9239
9056#: src/util/strings.c:1840 9240#: src/util/strings.c:1841
9057#, c-format 9241#, c-format
9058msgid "Invalid network notation (does not end with ';': `%s')\n" 9242msgid "Invalid network notation (does not end with ';': `%s')\n"
9059msgstr "Notación de red no válida (no termina con «;»: «%s»)\n" 9243msgstr "Notación de red no válida (no termina con «;»: «%s»)\n"
9060 9244
9061#: src/util/strings.c:1890 9245#: src/util/strings.c:1891
9062#, c-format 9246#, c-format
9063msgid "Wrong format `%s' for netmask\n" 9247msgid "Wrong format `%s' for netmask\n"
9064msgstr "Formato «%s» erroneo para máscara de red\n" 9248msgstr "Formato «%s» erroneo para máscara de red\n"
9065 9249
9066#: src/util/strings.c:1921 9250#: src/util/strings.c:1922
9067#, c-format 9251#, c-format
9068msgid "Wrong format `%s' for network\n" 9252msgid "Wrong format `%s' for network\n"
9069msgstr "Formato «%s» erroneo para red\n" 9253msgstr "Formato «%s» erroneo para red\n"
@@ -9244,27 +9428,42 @@ msgstr "el servicio es ofrecido vía UDP"
9244msgid "Setup tunnels via VPN." 9428msgid "Setup tunnels via VPN."
9245msgstr "Configurar túneles vía VPN." 9429msgstr "Configurar túneles vía VPN."
9246 9430
9247#: src/zonemaster/gnunet-service-zonemaster.c:705 9431#: src/zonemaster/gnunet-service-zonemaster.c:706
9248msgid "Failed to connect to the namestore!\n" 9432msgid "Failed to connect to the namestore!\n"
9249msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n" 9433msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n"
9250 9434
9251#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 9435#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
9252#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 9436#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
9253#, c-format 9437#, c-format
9254msgid "Assertion failed at %s:%d.\n" 9438msgid "Assertion failed at %s:%d.\n"
9255msgstr "Aserción fallida en %s:%d.\n" 9439msgstr "Aserción fallida en %s:%d.\n"
9256 9440
9257#: src/include/gnunet_common.h:711 9441#: src/include/gnunet_common.h:726
9258#, c-format 9442#, c-format
9259msgid "External protocol violation detected at %s:%d.\n" 9443msgid "External protocol violation detected at %s:%d.\n"
9260msgstr "Violación externa del protocolo detectada en %s:%d.\n" 9444msgstr "Violación externa del protocolo detectada en %s:%d.\n"
9261 9445
9262#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 9446#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
9263#, c-format 9447#, c-format
9264msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" 9448msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9265msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" 9449msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
9266 9450
9267#, fuzzy 9451#, fuzzy
9452#~ msgid "Token `%s' is malformed\n"
9453#~ msgstr "El bloque del tipo %u está mal formado\n"
9454
9455#~ msgid "Failed to create indices\n"
9456#~ msgstr "Se produjo un fallo al crear los índices\n"
9457
9458#, fuzzy
9459#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
9460#~ msgstr "«%s:%s» falló en %s:%d con error: %s"
9461
9462#, fuzzy
9463#~ msgid "Unable to connect to Postgres database '%s': %s\n"
9464#~ msgstr "Imposible guardar el fichero de configuración '%s':"
9465
9466#, fuzzy
9268#~ msgid "Misconfiguration (can not connect to the ARM service)" 9467#~ msgid "Misconfiguration (can not connect to the ARM service)"
9269#~ msgstr "¡Se produjo un fallo al conectar con el servicio dv!\n" 9468#~ msgstr "¡Se produjo un fallo al conectar con el servicio dv!\n"
9270 9469
@@ -9473,9 +9672,6 @@ msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
9473#~ msgid "# transmission request failures" 9672#~ msgid "# transmission request failures"
9474#~ msgstr "# fallos en peticiones de transmisión" 9673#~ msgstr "# fallos en peticiones de transmisión"
9475 9674
9476#~ msgid "# bytes sent to datastore"
9477#~ msgstr "# bytes mandados al almacén de datos"
9478
9479#~ msgid "Failed to receive status response from database." 9675#~ msgid "Failed to receive status response from database."
9480#~ msgstr "" 9676#~ msgstr ""
9481#~ "Se produjo un fallo al recibir el estado de respuesta de la base de datos." 9677#~ "Se produjo un fallo al recibir el estado de respuesta de la base de datos."
@@ -9857,10 +10053,6 @@ msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
9857#~ "información de pares (PEERINFO)." 10053#~ "información de pares (PEERINFO)."
9858 10054
9859#, fuzzy 10055#, fuzzy
9860#~ msgid "Error reading sensor version\n"
9861#~ msgstr "Error leyendo «%s»: %s"
9862
9863#, fuzzy
9864#~ msgid "Error reading sensor category\n" 10056#~ msgid "Error reading sensor category\n"
9865#~ msgstr "Error leyendo «%s»: %s" 10057#~ msgstr "Error leyendo «%s»: %s"
9866 10058
diff --git a/po/fr.po b/po/fr.po
index ef1361425..be24a2c35 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: gnunet 0.10.1\n" 8"Project-Id-Version: gnunet 0.10.1\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2017-03-31 19:22-0500\n" 10"POT-Creation-Date: 2017-10-20 15:14+0000\n"
11"PO-Revision-Date: 2015-12-24 01:20+0100\n" 11"PO-Revision-Date: 2015-12-24 01:20+0100\n"
12"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n" 12"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
13"Language-Team: French <traduc@traduc.org>\n" 13"Language-Team: French <traduc@traduc.org>\n"
@@ -267,7 +267,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
267msgstr "" 267msgstr ""
268 268
269#: src/arm/gnunet-service-arm.c:513 269#: src/arm/gnunet-service-arm.c:513
270#: src/transport/plugin_transport_http_server.c:2621 270#: src/transport/plugin_transport_http_server.c:2684
271#: src/transport/plugin_transport_tcp.c:1259 271#: src/transport/plugin_transport_tcp.c:1259
272#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 272#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
273#, c-format 273#, c-format
@@ -275,7 +275,7 @@ msgid "Failed to resolve `%s': %s\n"
275msgstr "Résolution de « %s » échouée : %s\n" 275msgstr "Résolution de « %s » échouée : %s\n"
276 276
277#: src/arm/gnunet-service-arm.c:532 277#: src/arm/gnunet-service-arm.c:532
278#: src/transport/plugin_transport_http_server.c:2639 278#: src/transport/plugin_transport_http_server.c:2702
279#: src/transport/plugin_transport_tcp.c:1278 279#: src/transport/plugin_transport_tcp.c:1278
280#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 280#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
281#, c-format 281#, c-format
@@ -348,133 +348,14 @@ msgstr ""
348msgid "Initiating shutdown as requested by client.\n" 348msgid "Initiating shutdown as requested by client.\n"
349msgstr "" 349msgstr ""
350 350
351#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 351#: src/ats-tests/ats-testing-log.c:837
352#, c-format 352msgid "Stop logging\n"
353msgid "" 353msgstr "Arrêter la journalisation\n"
354"Could not load quota for network `%s': `%s', assigning default bandwidth "
355"%llu\n"
356msgstr ""
357
358#: src/ats/gnunet-ats-solver-eval.c:2799
359#, c-format
360msgid ""
361"No outbound quota configured for network `%s', assigning default bandwidth "
362"%llu\n"
363msgstr ""
364
365#: src/ats/gnunet-ats-solver-eval.c:2840
366#, c-format
367msgid ""
368"No outbound quota configure for network `%s', assigning default bandwidth "
369"%llu\n"
370msgstr ""
371
372#: src/ats/gnunet-ats-solver-eval.c:3294
373#: src/ats-tests/gnunet-solver-eval.c:939
374msgid "solver to use"
375msgstr "solveur utilisé"
376
377#: src/ats/gnunet-ats-solver-eval.c:3299
378#: src/ats-tests/gnunet-solver-eval.c:945
379#: src/ats-tests/gnunet-solver-eval.c:950
380msgid "experiment to use"
381msgstr ""
382
383#: src/ats/gnunet-ats-solver-eval.c:3306
384msgid "print logging"
385msgstr "afficher le journal"
386
387#: src/ats/gnunet-ats-solver-eval.c:3311
388msgid "save logging to disk"
389msgstr ""
390
391#: src/ats/gnunet-ats-solver-eval.c:3316
392msgid "disable normalization"
393msgstr ""
394
395#: src/ats/gnunet-service-ats_plugins.c:304
396#, c-format
397msgid ""
398"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
399"%llu\n"
400msgstr ""
401
402#: src/ats/gnunet-service-ats_plugins.c:314
403#, c-format
404msgid "%s quota configured for network `%s' is %llu\n"
405msgstr ""
406
407#: src/ats/gnunet-service-ats_plugins.c:359
408#, c-format
409msgid ""
410"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
411msgstr ""
412
413#: src/ats/gnunet-service-ats_plugins.c:451
414#, c-format
415msgid "Failed to initialize solver `%s'!\n"
416msgstr ""
417
418#: src/ats/plugin_ats_mlp.c:1274
419msgid "Problem size too large, cannot allocate memory!\n"
420msgstr ""
421
422#: src/ats/plugin_ats_mlp.c:1869
423#, c-format
424msgid "Adding address for peer `%s' multiple times\n"
425msgstr ""
426
427#: src/ats/plugin_ats_mlp.c:1913
428#, c-format
429msgid "Updating address property for peer `%s' %p not added before\n"
430msgstr ""
431
432#: src/ats/plugin_ats_mlp.c:2475
433msgid ""
434"MLP solver is not optimizing for anything, changing to feasibility check\n"
435msgstr ""
436
437#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
438#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
439#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
440#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
441#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
442#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
443#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
444#, fuzzy, c-format
445msgid "Invalid %s configuration %f \n"
446msgstr "fornat invalide : « %s »\n"
447
448#: src/ats/plugin_ats_mlp.c:2670
449#, c-format
450msgid ""
451"Adjusting inconsistent outbound quota configuration for network `%s', is "
452"%llu must be at least %llu\n"
453msgstr ""
454
455#: src/ats/plugin_ats_mlp.c:2679
456#, c-format
457msgid ""
458"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
459"must be at least %llu\n"
460msgstr ""
461
462#: src/ats/plugin_ats_mlp.c:2689
463#, c-format
464msgid ""
465"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
466msgstr ""
467 354
468#: src/ats/plugin_ats_mlp.c:2698 355#: src/ats-tests/ats-testing-log.c:892
469#, c-format 356#, c-format
470msgid "" 357msgid "Start logging `%s'\n"
471"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" 358msgstr "Démarrer la journalisation « %s »\n"
472msgstr ""
473
474#: src/ats/plugin_ats_proportional.c:1164
475#, fuzzy, c-format
476msgid "Invalid %s configuration %f\n"
477msgstr "fornat invalide : « %s »\n"
478 359
479#: src/ats-tests/ats-testing.c:422 360#: src/ats-tests/ats-testing.c:422
480#, c-format 361#, c-format
@@ -486,15 +367,6 @@ msgstr ""
486msgid "Failed to connect master peer [%u] with slave [%u]\n" 367msgid "Failed to connect master peer [%u] with slave [%u]\n"
487msgstr "" 368msgstr ""
488 369
489#: src/ats-tests/ats-testing-log.c:837
490msgid "Stop logging\n"
491msgstr "Arrêter la journalisation\n"
492
493#: src/ats-tests/ats-testing-log.c:892
494#, c-format
495msgid "Start logging `%s'\n"
496msgstr "Démarrer la journalisation « %s »\n"
497
498#: src/ats-tests/gnunet-ats-sim.c:90 370#: src/ats-tests/gnunet-ats-sim.c:90
499#, c-format 371#, c-format
500msgid "" 372msgid ""
@@ -502,6 +374,15 @@ msgid ""
502"= %u KiB/s\n" 374"= %u KiB/s\n"
503msgstr "" 375msgstr ""
504 376
377#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
378msgid "solver to use"
379msgstr "solveur utilisé"
380
381#: src/ats-tests/gnunet-solver-eval.c:945
382#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
383msgid "experiment to use"
384msgstr ""
385
505#: src/ats-tool/gnunet-ats.c:307 386#: src/ats-tool/gnunet-ats.c:307
506#, c-format 387#, c-format
507msgid "%u address resolutions had a timeout\n" 388msgid "%u address resolutions had a timeout\n"
@@ -617,6 +498,123 @@ msgstr ""
617msgid "Print information about ATS state" 498msgid "Print information about ATS state"
618msgstr "" 499msgstr ""
619 500
501#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
502#, c-format
503msgid ""
504"Could not load quota for network `%s': `%s', assigning default bandwidth "
505"%llu\n"
506msgstr ""
507
508#: src/ats/gnunet-ats-solver-eval.c:2799
509#, c-format
510msgid ""
511"No outbound quota configured for network `%s', assigning default bandwidth "
512"%llu\n"
513msgstr ""
514
515#: src/ats/gnunet-ats-solver-eval.c:2840
516#, c-format
517msgid ""
518"No outbound quota configure for network `%s', assigning default bandwidth "
519"%llu\n"
520msgstr ""
521
522#: src/ats/gnunet-ats-solver-eval.c:3306
523msgid "print logging"
524msgstr "afficher le journal"
525
526#: src/ats/gnunet-ats-solver-eval.c:3311
527msgid "save logging to disk"
528msgstr ""
529
530#: src/ats/gnunet-ats-solver-eval.c:3316
531msgid "disable normalization"
532msgstr ""
533
534#: src/ats/gnunet-service-ats_plugins.c:304
535#, c-format
536msgid ""
537"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
538"%llu\n"
539msgstr ""
540
541#: src/ats/gnunet-service-ats_plugins.c:314
542#, c-format
543msgid "%s quota configured for network `%s' is %llu\n"
544msgstr ""
545
546#: src/ats/gnunet-service-ats_plugins.c:359
547#, c-format
548msgid ""
549"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
550msgstr ""
551
552#: src/ats/gnunet-service-ats_plugins.c:451
553#, c-format
554msgid "Failed to initialize solver `%s'!\n"
555msgstr ""
556
557#: src/ats/plugin_ats_mlp.c:1274
558msgid "Problem size too large, cannot allocate memory!\n"
559msgstr ""
560
561#: src/ats/plugin_ats_mlp.c:1869
562#, c-format
563msgid "Adding address for peer `%s' multiple times\n"
564msgstr ""
565
566#: src/ats/plugin_ats_mlp.c:1913
567#, c-format
568msgid "Updating address property for peer `%s' %p not added before\n"
569msgstr ""
570
571#: src/ats/plugin_ats_mlp.c:2475
572msgid ""
573"MLP solver is not optimizing for anything, changing to feasibility check\n"
574msgstr ""
575
576#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
577#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
578#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
579#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
580#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
581#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
582#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
583#, fuzzy, c-format
584msgid "Invalid %s configuration %f \n"
585msgstr "fornat invalide : « %s »\n"
586
587#: src/ats/plugin_ats_mlp.c:2670
588#, c-format
589msgid ""
590"Adjusting inconsistent outbound quota configuration for network `%s', is "
591"%llu must be at least %llu\n"
592msgstr ""
593
594#: src/ats/plugin_ats_mlp.c:2679
595#, c-format
596msgid ""
597"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
598"must be at least %llu\n"
599msgstr ""
600
601#: src/ats/plugin_ats_mlp.c:2689
602#, c-format
603msgid ""
604"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
605msgstr ""
606
607#: src/ats/plugin_ats_mlp.c:2698
608#, c-format
609msgid ""
610"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
611msgstr ""
612
613#: src/ats/plugin_ats_proportional.c:1164
614#, fuzzy, c-format
615msgid "Invalid %s configuration %f\n"
616msgstr "fornat invalide : « %s »\n"
617
620#: src/auction/gnunet-auction-create.c:163 618#: src/auction/gnunet-auction-create.c:163
621msgid "description of the item to be sold" 619msgid "description of the item to be sold"
622msgstr "" 620msgstr ""
@@ -755,6 +753,28 @@ msgstr ""
755msgid "Connection to conversation service lost, trying to reconnect\n" 753msgid "Connection to conversation service lost, trying to reconnect\n"
756msgstr "" 754msgstr ""
757 755
756#: src/conversation/gnunet-conversation-test.c:119
757#, c-format
758msgid ""
759"\n"
760"End of transmission. Have a GNU day.\n"
761msgstr ""
762
763#: src/conversation/gnunet-conversation-test.c:145
764#, c-format
765msgid ""
766"\n"
767"We are now playing your recording back. If you can hear it, your audio "
768"settings are working..."
769msgstr ""
770
771#: src/conversation/gnunet-conversation-test.c:210
772#, c-format
773msgid ""
774"We will now be recording you for %s. After that time, the recording will be "
775"played back to you..."
776msgstr ""
777
758#: src/conversation/gnunet-conversation.c:269 778#: src/conversation/gnunet-conversation.c:269
759#, c-format 779#, c-format
760msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" 780msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1008,30 +1028,8 @@ msgstr ""
1008msgid "Enables having a conversation with other GNUnet users." 1028msgid "Enables having a conversation with other GNUnet users."
1009msgstr "" 1029msgstr ""
1010 1030
1011#: src/conversation/gnunet-conversation-test.c:119
1012#, c-format
1013msgid ""
1014"\n"
1015"End of transmission. Have a GNU day.\n"
1016msgstr ""
1017
1018#: src/conversation/gnunet-conversation-test.c:145
1019#, c-format
1020msgid ""
1021"\n"
1022"We are now playing your recording back. If you can hear it, your audio "
1023"settings are working..."
1024msgstr ""
1025
1026#: src/conversation/gnunet-conversation-test.c:210
1027#, c-format
1028msgid ""
1029"We will now be recording you for %s. After that time, the recording will be "
1030"played back to you..."
1031msgstr ""
1032
1033#: src/conversation/gnunet_gst.c:622
1034#: src/conversation/gnunet-helper-audio-playback-gst.c:356 1031#: src/conversation/gnunet-helper-audio-playback-gst.c:356
1032#: src/conversation/gnunet_gst.c:622
1035#, c-format 1033#, c-format
1036msgid "Read error from STDIN: %d %s\n" 1034msgid "Read error from STDIN: %d %s\n"
1037msgstr "" 1035msgstr ""
@@ -1155,6 +1153,11 @@ msgstr "ogg_stream_init() échoué.\n"
1155msgid "Failed to allocate %u bytes for second packet\n" 1153msgid "Failed to allocate %u bytes for second packet\n"
1156msgstr "" 1154msgstr ""
1157 1155
1156#: src/conversation/gnunet-service-conversation.c:1276
1157#, c-format
1158msgid "Could not open line, port %s already in use!\n"
1159msgstr ""
1160
1158#: src/conversation/microphone.c:119 1161#: src/conversation/microphone.c:119
1159msgid "Could not start record audio helper\n" 1162msgid "Could not start record audio helper\n"
1160msgstr "" 1163msgstr ""
@@ -1418,8 +1421,135 @@ msgstr ""
1418msgid "# updates to my type map" 1421msgid "# updates to my type map"
1419msgstr "" 1422msgstr ""
1420 1423
1424#: src/credential/credential_misc.c:88
1425#, c-format
1426msgid "Unable to parse CRED record string `%s'\n"
1427msgstr ""
1428
1429#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
1430#: src/namestore/plugin_rest_namestore.c:1009
1431#, c-format
1432msgid "Ego `%s' not known to identity service\n"
1433msgstr ""
1434
1435#: src/credential/gnunet-credential.c:294
1436#: src/credential/gnunet-credential.c:446
1437#, c-format
1438msgid "Issuer public key `%s' is not well-formed\n"
1439msgstr ""
1440
1441#: src/credential/gnunet-credential.c:375
1442#: src/credential/gnunet-credential.c:435
1443#, c-format
1444msgid "Issuer public key not well-formed\n"
1445msgstr ""
1446
1447#: src/credential/gnunet-credential.c:386
1448#: src/credential/gnunet-credential.c:455
1449#, fuzzy, c-format
1450msgid "Failed to connect to CREDENTIAL\n"
1451msgstr "Impossible d’ouvrir « %s ».\n"
1452
1453#: src/credential/gnunet-credential.c:392
1454#, c-format
1455msgid "You must provide issuer the attribute\n"
1456msgstr ""
1457
1458#: src/credential/gnunet-credential.c:399
1459#, c-format
1460msgid "ego required\n"
1461msgstr ""
1462
1463#: src/credential/gnunet-credential.c:415
1464#, c-format
1465msgid "Subject public key needed\n"
1466msgstr ""
1467
1468#: src/credential/gnunet-credential.c:426
1469#, c-format
1470msgid "Subject public key `%s' is not well-formed\n"
1471msgstr ""
1472
1473#: src/credential/gnunet-credential.c:461
1474#, c-format
1475msgid "You must provide issuer and subject attributes\n"
1476msgstr ""
1477
1478#: src/credential/gnunet-credential.c:511
1479#, c-format
1480msgid "Issuer ego required\n"
1481msgstr ""
1482
1483#: src/credential/gnunet-credential.c:523
1484#, c-format
1485msgid "Please specify name to lookup, subject key and issuer key!\n"
1486msgstr ""
1487
1488#: src/credential/gnunet-credential.c:543
1489msgid "create credential"
1490msgstr ""
1491
1492#: src/credential/gnunet-credential.c:547
1493msgid "verify credential against attribute"
1494msgstr ""
1495
1496#: src/credential/gnunet-credential.c:552
1497msgid "The public key of the subject to lookup the credential for"
1498msgstr ""
1499
1500#: src/credential/gnunet-credential.c:557
1501msgid "The name of the credential presented by the subject"
1502msgstr ""
1503
1504#: src/credential/gnunet-credential.c:562
1505msgid "The public key of the authority to verify the credential against"
1506msgstr ""
1507
1508#: src/credential/gnunet-credential.c:567
1509msgid "The ego to use"
1510msgstr ""
1511
1512#: src/credential/gnunet-credential.c:572
1513msgid "The issuer attribute to verify against or to issue"
1514msgstr ""
1515
1516#: src/credential/gnunet-credential.c:577
1517msgid "The time to live for the credential"
1518msgstr ""
1519
1520#: src/credential/gnunet-credential.c:581
1521msgid "collect credentials"
1522msgstr ""
1523
1524#: src/credential/gnunet-credential.c:595
1525msgid "GNUnet credential resolver tool"
1526msgstr ""
1527
1528#: src/credential/gnunet-service-credential.c:1204
1529#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
1530#, c-format
1531msgid "Failed to connect to GNS\n"
1532msgstr ""
1533
1534#: src/credential/gnunet-service-credential.c:1210
1535#: src/namestore/gnunet-namestore-fcfsd.c:1034
1536#: src/namestore/gnunet-namestore.c:802
1537#: src/namestore/plugin_rest_namestore.c:1022
1538#, c-format
1539msgid "Failed to connect to namestore\n"
1540msgstr ""
1541
1542#: src/credential/plugin_gnsrecord_credential.c:186
1543#, fuzzy, c-format
1544msgid "Unable to parse ATTR record string `%s'\n"
1545msgstr "Résolution de « %s » échouée\n"
1546
1547#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
1548msgid "GNS REST API initialized\n"
1549msgstr ""
1550
1421#: src/datacache/datacache.c:119 src/datacache/datacache.c:294 1551#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
1422#: src/datastore/gnunet-service-datastore.c:775 1552#: src/datastore/gnunet-service-datastore.c:757
1423msgid "# bytes stored" 1553msgid "# bytes stored"
1424msgstr "" 1554msgstr ""
1425 1555
@@ -1459,13 +1589,12 @@ msgstr ""
1459 1589
1460#: src/datacache/plugin_datacache_sqlite.c:113 1590#: src/datacache/plugin_datacache_sqlite.c:113
1461#: src/datacache/plugin_datacache_sqlite.c:122 1591#: src/datacache/plugin_datacache_sqlite.c:122
1462#: src/datastore/plugin_datastore_mysql.c:980 1592#: src/datastore/plugin_datastore_mysql.c:892
1463#: src/datastore/plugin_datastore_sqlite.c:58 1593#: src/datastore/plugin_datastore_sqlite.c:58
1464#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 1594#: src/datastore/plugin_datastore_sqlite.c:66
1465#: src/mysql/mysql.c:42 src/mysql/mysql.c:49 1595#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
1466#: src/namecache/plugin_namecache_postgres.c:53 1596#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
1467#: src/namecache/plugin_namecache_sqlite.c:53 1597#: src/namecache/plugin_namecache_sqlite.c:53
1468#: src/namestore/plugin_namestore_postgres.c:53
1469#: src/namestore/plugin_namestore_sqlite.c:53 1598#: src/namestore/plugin_namestore_sqlite.c:53
1470#: src/peerstore/plugin_peerstore_sqlite.c:52 1599#: src/peerstore/plugin_peerstore_sqlite.c:52
1471#: src/psycstore/plugin_psycstore_mysql.c:62 1600#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1474,14 +1603,15 @@ msgstr ""
1474#: src/testbed/gnunet-daemon-testbed-underlay.c:56 1603#: src/testbed/gnunet-daemon-testbed-underlay.c:56
1475#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 1604#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
1476#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 1605#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
1477#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 1606#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
1478#: src/scalarproduct/scalarproduct.h:35 1607#: src/scalarproduct/scalarproduct.h:35
1479#, c-format 1608#, c-format
1480msgid "`%s' failed at %s:%d with error: %s\n" 1609msgid "`%s' failed at %s:%d with error: %s\n"
1481msgstr "" 1610msgstr ""
1482 1611
1483#: src/datacache/plugin_datacache_sqlite.c:817 1612#: src/datacache/plugin_datacache_sqlite.c:817
1484#: src/datastore/plugin_datastore_sqlite.c:475 1613#: src/datastore/plugin_datastore_sqlite.c:456
1614#: src/identity-provider/plugin_identity_provider_sqlite.c:336
1485#: src/namecache/plugin_namecache_sqlite.c:296 1615#: src/namecache/plugin_namecache_sqlite.c:296
1486#: src/namestore/plugin_namestore_sqlite.c:355 1616#: src/namestore/plugin_namestore_sqlite.c:355
1487msgid "Tried to close sqlite without finalizing all prepared statements.\n" 1617msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1545,23 +1675,70 @@ msgstr ""
1545msgid "# GET requests executed" 1675msgid "# GET requests executed"
1546msgstr "" 1676msgstr ""
1547 1677
1548#: src/datastore/gnunet-datastore.c:113 1678#: src/datastore/gnunet-datastore.c:189
1679#, c-format
1680msgid "Dumped %<PRIu64> records\n"
1681msgstr ""
1682
1683#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
1684#, c-format
1685msgid "Short write to file: %zd bytes expecting %zd\n"
1686msgstr ""
1687
1688#: src/datastore/gnunet-datastore.c:261
1689msgid "Error queueing datastore GET operation\n"
1690msgstr ""
1691
1692#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
1693#, fuzzy, c-format
1694msgid "Unable to open dump file: %s\n"
1695msgstr "Résolution de « %s » échouée\n"
1696
1697#: src/datastore/gnunet-datastore.c:326
1549#, c-format 1698#, c-format
1550msgid "Failed to store item: %s, aborting\n" 1699msgid "Failed to store item: %s, aborting\n"
1551msgstr "" 1700msgstr ""
1552 1701
1553#: src/datastore/gnunet-datastore.c:209 1702#: src/datastore/gnunet-datastore.c:340
1554#, c-format 1703#, c-format
1555msgid "Cannot use the same configuration for source and destination\n" 1704msgid "Inserted %<PRIu64> records\n"
1556msgstr "" 1705msgstr ""
1557 1706
1558#: src/datastore/gnunet-datastore.c:256 1707#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
1559msgid "" 1708#, c-format
1560"specifies the configuration to use to access an alternative datastore; will " 1709msgid "Short read from file: %zd bytes expecting %zd\n"
1561"merge that datastore into our current datastore" 1710msgstr ""
1711
1712#: src/datastore/gnunet-datastore.c:389
1713msgid "Error queueing datastore PUT operation\n"
1714msgstr ""
1715
1716#: src/datastore/gnunet-datastore.c:432
1717msgid "Input file is not of a supported format\n"
1718msgstr ""
1719
1720#: src/datastore/gnunet-datastore.c:458
1721msgid "Failed connecting to the datastore.\n"
1562msgstr "" 1722msgstr ""
1563 1723
1564#: src/datastore/gnunet-datastore.c:265 1724#: src/datastore/gnunet-datastore.c:470
1725#, c-format
1726msgid "Please choose at least one operation: %s, %s\n"
1727msgstr ""
1728
1729#: src/datastore/gnunet-datastore.c:493
1730msgid "Dump all records from the datastore"
1731msgstr ""
1732
1733#: src/datastore/gnunet-datastore.c:497
1734msgid "Insert records into the datastore"
1735msgstr ""
1736
1737#: src/datastore/gnunet-datastore.c:502
1738msgid "File to dump or insert"
1739msgstr ""
1740
1741#: src/datastore/gnunet-datastore.c:511
1565msgid "Manipulate GNUnet datastore" 1742msgid "Manipulate GNUnet datastore"
1566msgstr "" 1743msgstr ""
1567 1744
@@ -1603,8 +1780,8 @@ msgstr ""
1603 1780
1604#: src/datastore/gnunet-service-datastore.c:634 1781#: src/datastore/gnunet-service-datastore.c:634
1605#: src/datastore/gnunet-service-datastore.c:689 1782#: src/datastore/gnunet-service-datastore.c:689
1606#: src/datastore/gnunet-service-datastore.c:977 1783#: src/datastore/gnunet-service-datastore.c:837
1607#: src/datastore/gnunet-service-datastore.c:1633 1784#: src/datastore/gnunet-service-datastore.c:1469
1608msgid "# reserved" 1785msgid "# reserved"
1609msgstr "# réservé" 1786msgstr "# réservé"
1610 1787
@@ -1612,140 +1789,141 @@ msgstr "# réservé"
1612msgid "Could not find matching reservation" 1789msgid "Could not find matching reservation"
1613msgstr "" 1790msgstr ""
1614 1791
1615#: src/datastore/gnunet-service-datastore.c:792 1792#: src/datastore/gnunet-service-datastore.c:773
1616#, c-format 1793#, c-format
1617msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" 1794msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
1618msgstr "" 1795msgstr ""
1619 1796
1620#: src/datastore/gnunet-service-datastore.c:1026 1797#: src/datastore/gnunet-service-datastore.c:876
1621msgid "# GET requests received" 1798msgid "# GET requests received"
1622msgstr "" 1799msgstr ""
1623 1800
1624#: src/datastore/gnunet-service-datastore.c:1058 1801#: src/datastore/gnunet-service-datastore.c:907
1625msgid "# GET KEY requests received" 1802msgid "# GET KEY requests received"
1626msgstr "" 1803msgstr ""
1627 1804
1628#: src/datastore/gnunet-service-datastore.c:1071 1805#: src/datastore/gnunet-service-datastore.c:920
1629msgid "# requests filtered by bloomfilter" 1806msgid "# requests filtered by bloomfilter"
1630msgstr "" 1807msgstr ""
1631 1808
1632#: src/datastore/gnunet-service-datastore.c:1108 1809#: src/datastore/gnunet-service-datastore.c:956
1633msgid "# GET REPLICATION requests received" 1810msgid "# GET REPLICATION requests received"
1634msgstr "" 1811msgstr ""
1635 1812
1636#: src/datastore/gnunet-service-datastore.c:1141 1813#: src/datastore/gnunet-service-datastore.c:989
1637msgid "# GET ZERO ANONYMITY requests received" 1814msgid "# GET ZERO ANONYMITY requests received"
1638msgstr "" 1815msgstr ""
1639 1816
1640#: src/datastore/gnunet-service-datastore.c:1190 1817#: src/datastore/gnunet-service-datastore.c:1036
1641msgid "Content not found" 1818msgid "Content not found"
1642msgstr "" 1819msgstr ""
1643 1820
1644#: src/datastore/gnunet-service-datastore.c:1199 1821#: src/datastore/gnunet-service-datastore.c:1043
1645msgid "# bytes removed (explicit request)" 1822msgid "# bytes removed (explicit request)"
1646msgstr "" 1823msgstr ""
1647 1824
1648#: src/datastore/gnunet-service-datastore.c:1246 1825#: src/datastore/gnunet-service-datastore.c:1088
1649msgid "# REMOVE requests received" 1826msgid "# REMOVE requests received"
1650msgstr "" 1827msgstr ""
1651 1828
1652#: src/datastore/gnunet-service-datastore.c:1301 1829#: src/datastore/gnunet-service-datastore.c:1137
1653#, c-format 1830#, c-format
1654msgid "" 1831msgid ""
1655"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" 1832"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
1656msgstr "" 1833msgstr ""
1657 1834
1658#: src/datastore/gnunet-service-datastore.c:1307 1835#: src/datastore/gnunet-service-datastore.c:1143
1659#: src/datastore/gnunet-service-datastore.c:1482 1836#: src/datastore/gnunet-service-datastore.c:1318
1660#, c-format 1837#, c-format
1661msgid "New payload: %lld\n" 1838msgid "New payload: %lld\n"
1662msgstr "" 1839msgstr ""
1663 1840
1664#: src/datastore/gnunet-service-datastore.c:1361 1841#: src/datastore/gnunet-service-datastore.c:1197
1665#, c-format 1842#, c-format
1666msgid "Loading `%s' datastore plugin\n" 1843msgid "Loading `%s' datastore plugin\n"
1667msgstr "" 1844msgstr ""
1668 1845
1669#: src/datastore/gnunet-service-datastore.c:1373 1846#: src/datastore/gnunet-service-datastore.c:1209
1670#, c-format 1847#, c-format
1671msgid "Failed to load datastore plugin for `%s'\n" 1848msgid "Failed to load datastore plugin for `%s'\n"
1672msgstr "" 1849msgstr ""
1673 1850
1674#: src/datastore/gnunet-service-datastore.c:1433 1851#: src/datastore/gnunet-service-datastore.c:1269
1675msgid "Bloomfilter construction complete.\n" 1852msgid "Bloomfilter construction complete.\n"
1676msgstr "" 1853msgstr ""
1677 1854
1678#: src/datastore/gnunet-service-datastore.c:1489 1855#: src/datastore/gnunet-service-datastore.c:1325
1679msgid "Rebuilding bloomfilter. Please be patient.\n" 1856msgid "Rebuilding bloomfilter. Please be patient.\n"
1680msgstr "" 1857msgstr ""
1681 1858
1682#: src/datastore/gnunet-service-datastore.c:1500 1859#: src/datastore/gnunet-service-datastore.c:1336
1683msgid "Plugin does not support get_keys function. Please fix!\n" 1860msgid "Plugin does not support get_keys function. Please fix!\n"
1684msgstr "" 1861msgstr ""
1685 1862
1686#: src/datastore/gnunet-service-datastore.c:1670 1863#: src/datastore/gnunet-service-datastore.c:1506
1687#, c-format 1864#, c-format
1688msgid "# bytes used in file-sharing datastore `%s'" 1865msgid "# bytes used in file-sharing datastore `%s'"
1689msgstr "" 1866msgstr ""
1690 1867
1691#: src/datastore/gnunet-service-datastore.c:1686 1868#: src/datastore/gnunet-service-datastore.c:1522
1692msgid "# quota" 1869msgid "# quota"
1693msgstr "# quota" 1870msgstr "# quota"
1694 1871
1695#: src/datastore/gnunet-service-datastore.c:1691 1872#: src/datastore/gnunet-service-datastore.c:1527
1696msgid "# cache size" 1873msgid "# cache size"
1697msgstr "# taille du cache" 1874msgstr "# taille du cache"
1698 1875
1699#: src/datastore/gnunet-service-datastore.c:1707 1876#: src/datastore/gnunet-service-datastore.c:1543
1700#, c-format 1877#, c-format
1701msgid "Could not use specified filename `%s' for bloomfilter.\n" 1878msgid "Could not use specified filename `%s' for bloomfilter.\n"
1702msgstr "" 1879msgstr ""
1703 1880
1704#: src/datastore/gnunet-service-datastore.c:1725 1881#: src/datastore/gnunet-service-datastore.c:1561
1705#: src/datastore/gnunet-service-datastore.c:1741 1882#: src/datastore/gnunet-service-datastore.c:1577
1706#, c-format 1883#, c-format
1707msgid "Failed to remove bogus bloomfilter file `%s'\n" 1884msgid "Failed to remove bogus bloomfilter file `%s'\n"
1708msgstr "" 1885msgstr ""
1709 1886
1710#: src/datastore/gnunet-service-datastore.c:1773 1887#: src/datastore/gnunet-service-datastore.c:1609
1711msgid "Failed to initialize bloomfilter.\n" 1888msgid "Failed to initialize bloomfilter.\n"
1712msgstr "" 1889msgstr ""
1713 1890
1714#: src/datastore/plugin_datastore_heap.c:769 1891#: src/datastore/plugin_datastore_heap.c:893
1715msgid "Heap database running\n" 1892msgid "Heap database running\n"
1716msgstr "" 1893msgstr ""
1717 1894
1718#: src/datastore/plugin_datastore_mysql.c:377 1895#: src/datastore/plugin_datastore_mysql.c:371
1719#: src/datastore/plugin_datastore_sqlite.c:590 1896#: src/datastore/plugin_datastore_mysql.c:423
1720msgid "Data too large" 1897#: src/datastore/plugin_datastore_mysql.c:1075
1898msgid "MySQL statement run failure"
1721msgstr "" 1899msgstr ""
1722 1900
1723#: src/datastore/plugin_datastore_mysql.c:393 1901#: src/datastore/plugin_datastore_mysql.c:410
1724msgid "MySQL statement run failure" 1902#: src/datastore/plugin_datastore_sqlite.c:626
1903msgid "Data too large"
1725msgstr "" 1904msgstr ""
1726 1905
1727#: src/datastore/plugin_datastore_mysql.c:936 1906#: src/datastore/plugin_datastore_mysql.c:848
1728#, c-format 1907#, c-format
1729msgid "`%s' for `%s' failed at %s:%d with error: %s\n" 1908msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
1730msgstr "" 1909msgstr ""
1731 1910
1732#: src/datastore/plugin_datastore_mysql.c:1208 1911#: src/datastore/plugin_datastore_mysql.c:1180
1733#: src/psycstore/plugin_psycstore_mysql.c:1936 1912#: src/psycstore/plugin_psycstore_mysql.c:1936
1734msgid "Mysql database running\n" 1913msgid "Mysql database running\n"
1735msgstr "" 1914msgstr ""
1736 1915
1737#: src/datastore/plugin_datastore_postgres.c:345 1916#: src/datastore/plugin_datastore_postgres.c:274
1917#: src/datastore/plugin_datastore_postgres.c:891
1738msgid "Postgress exec failure" 1918msgid "Postgress exec failure"
1739msgstr "" 1919msgstr ""
1740 1920
1741#: src/datastore/plugin_datastore_postgres.c:866 1921#: src/datastore/plugin_datastore_postgres.c:852
1742msgid "Failed to drop table from database.\n" 1922msgid "Failed to drop table from database.\n"
1743msgstr "" 1923msgstr ""
1744 1924
1745#: src/datastore/plugin_datastore_postgres.c:903 1925#: src/datastore/plugin_datastore_postgres.c:950
1746#: src/namecache/plugin_namecache_postgres.c:398 1926#: src/psycstore/plugin_psycstore_postgres.c:1506
1747#: src/namestore/plugin_namestore_postgres.c:571
1748#: src/psycstore/plugin_psycstore_postgres.c:1721
1749msgid "Postgres database running\n" 1927msgid "Postgres database running\n"
1750msgstr "" 1928msgstr ""
1751 1929
@@ -1757,7 +1935,8 @@ msgstr ""
1757msgid "`%s' failed at %s:%u with error: %s" 1935msgid "`%s' failed at %s:%u with error: %s"
1758msgstr "" 1936msgstr ""
1759 1937
1760#: src/datastore/plugin_datastore_sqlite.c:281 1938#: src/datastore/plugin_datastore_sqlite.c:271
1939#: src/identity-provider/plugin_identity_provider_sqlite.c:212
1761#: src/namecache/plugin_namecache_sqlite.c:194 1940#: src/namecache/plugin_namecache_sqlite.c:194
1762#: src/namestore/plugin_namestore_sqlite.c:222 1941#: src/namestore/plugin_namestore_sqlite.c:222
1763#: src/peerstore/plugin_peerstore_sqlite.c:535 1942#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1766,24 +1945,29 @@ msgstr ""
1766msgid "Unable to initialize SQLite: %s.\n" 1945msgid "Unable to initialize SQLite: %s.\n"
1767msgstr "" 1946msgstr ""
1768 1947
1769#: src/datastore/plugin_datastore_sqlite.c:1234 1948#: src/datastore/plugin_datastore_sqlite.c:577
1949msgid "sqlite bind failure"
1950msgstr ""
1951
1952#: src/datastore/plugin_datastore_sqlite.c:1259
1770msgid "sqlite version to old to determine size, assuming zero\n" 1953msgid "sqlite version to old to determine size, assuming zero\n"
1771msgstr "" 1954msgstr ""
1772 1955
1773#: src/datastore/plugin_datastore_sqlite.c:1268 1956#: src/datastore/plugin_datastore_sqlite.c:1293
1774#, c-format 1957#, c-format
1775msgid "" 1958msgid ""
1776"Using sqlite page utilization to estimate payload (%llu pages of size %llu " 1959"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
1777"bytes)\n" 1960"bytes)\n"
1778msgstr "" 1961msgstr ""
1779 1962
1780#: src/datastore/plugin_datastore_sqlite.c:1312 1963#: src/datastore/plugin_datastore_sqlite.c:1337
1964#: src/identity-provider/plugin_identity_provider_sqlite.c:711
1781#: src/namecache/plugin_namecache_sqlite.c:603 1965#: src/namecache/plugin_namecache_sqlite.c:603
1782#: src/namestore/plugin_namestore_sqlite.c:802 1966#: src/namestore/plugin_namestore_sqlite.c:802
1783msgid "Sqlite database running\n" 1967msgid "Sqlite database running\n"
1784msgstr "" 1968msgstr ""
1785 1969
1786#: src/datastore/plugin_datastore_template.c:259 1970#: src/datastore/plugin_datastore_template.c:253
1787msgid "Template database running\n" 1971msgid "Template database running\n"
1788msgstr "" 1972msgstr ""
1789 1973
@@ -1846,52 +2030,6 @@ msgstr ""
1846msgid "Prints all packets that go through the DHT." 2030msgid "Prints all packets that go through the DHT."
1847msgstr "" 2031msgstr ""
1848 2032
1849#: src/dht/gnunet_dht_profiler.c:1161
1850#: src/testbed/gnunet-testbed-profiler.c:255
1851#, c-format
1852msgid "Exiting as the number of peers is %u\n"
1853msgstr ""
1854
1855#: src/dht/gnunet_dht_profiler.c:1188
1856#, fuzzy
1857msgid "number of peers to start"
1858msgstr "nombre de valeurs"
1859
1860#: src/dht/gnunet_dht_profiler.c:1194
1861msgid ""
1862"maximum number of times we try to search for successor circle formation (0 "
1863"for R5N)"
1864msgstr ""
1865
1866#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
1867#: src/testbed/gnunet-testbed-profiler.c:305
1868msgid "name of the file with the login information for the testbed"
1869msgstr ""
1870
1871#: src/dht/gnunet_dht_profiler.c:1206
1872msgid "delay between rounds for collecting statistics (default: 30 sec)"
1873msgstr ""
1874
1875#: src/dht/gnunet_dht_profiler.c:1212
1876msgid "delay to start doing PUTs (default: 1 sec)"
1877msgstr ""
1878
1879#: src/dht/gnunet_dht_profiler.c:1218
1880msgid "delay to start doing GETs (default: 5 min)"
1881msgstr ""
1882
1883#: src/dht/gnunet_dht_profiler.c:1223
1884msgid "replication degree for DHT PUTs"
1885msgstr ""
1886
1887#: src/dht/gnunet_dht_profiler.c:1230
1888msgid "timeout for DHT PUT and GET requests (default: 1 min)"
1889msgstr ""
1890
1891#: src/dht/gnunet_dht_profiler.c:1248
1892msgid "Measure quality and performance of the DHT service."
1893msgstr ""
1894
1895#: src/dht/gnunet-dht-put.c:120 2033#: src/dht/gnunet-dht-put.c:120
1896msgid "PUT request sent with key" 2034msgid "PUT request sent with key"
1897msgstr "" 2035msgstr ""
@@ -2141,6 +2279,51 @@ msgstr ""
2141msgid "# DHT requests combined" 2279msgid "# DHT requests combined"
2142msgstr "" 2280msgstr ""
2143 2281
2282#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
2283#, c-format
2284msgid "Exiting as the number of peers is %u\n"
2285msgstr ""
2286
2287#: src/dht/gnunet_dht_profiler.c:1188
2288#, fuzzy
2289msgid "number of peers to start"
2290msgstr "nombre de valeurs"
2291
2292#: src/dht/gnunet_dht_profiler.c:1194
2293msgid ""
2294"maximum number of times we try to search for successor circle formation (0 "
2295"for R5N)"
2296msgstr ""
2297
2298#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2299#: src/testbed/gnunet-testbed-profiler.c:305
2300msgid "name of the file with the login information for the testbed"
2301msgstr ""
2302
2303#: src/dht/gnunet_dht_profiler.c:1206
2304msgid "delay between rounds for collecting statistics (default: 30 sec)"
2305msgstr ""
2306
2307#: src/dht/gnunet_dht_profiler.c:1212
2308msgid "delay to start doing PUTs (default: 1 sec)"
2309msgstr ""
2310
2311#: src/dht/gnunet_dht_profiler.c:1218
2312msgid "delay to start doing GETs (default: 5 min)"
2313msgstr ""
2314
2315#: src/dht/gnunet_dht_profiler.c:1223
2316msgid "replication degree for DHT PUTs"
2317msgstr ""
2318
2319#: src/dht/gnunet_dht_profiler.c:1230
2320msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2321msgstr ""
2322
2323#: src/dht/gnunet_dht_profiler.c:1248
2324msgid "Measure quality and performance of the DHT service."
2325msgstr ""
2326
2144#: src/dht/plugin_block_dht.c:187 2327#: src/dht/plugin_block_dht.c:187
2145#, c-format 2328#, c-format
2146msgid "Block not of type %u\n" 2329msgid "Block not of type %u\n"
@@ -2455,7 +2638,7 @@ msgstr ""
2455msgid "No useful service enabled. Exiting.\n" 2638msgid "No useful service enabled. Exiting.\n"
2456msgstr "" 2639msgstr ""
2457 2640
2458#: src/exit/gnunet-daemon-exit.c:3969 2641#: src/exit/gnunet-daemon-exit.c:3970
2459msgid "Daemon to run to provide an IP exit node for the VPN" 2642msgid "Daemon to run to provide an IP exit node for the VPN"
2460msgstr "" 2643msgstr ""
2461 2644
@@ -3074,14 +3257,6 @@ msgid ""
3074"chk/...)" 3257"chk/...)"
3075msgstr "" 3258msgstr ""
3076 3259
3077#: src/fs/gnunet-fs.c:119
3078msgid "print a list of all indexed files"
3079msgstr ""
3080
3081#: src/fs/gnunet-fs.c:130
3082msgid "Special file-sharing operations"
3083msgstr ""
3084
3085#: src/fs/gnunet-fs-profiler.c:211 3260#: src/fs/gnunet-fs-profiler.c:211
3086msgid "run the experiment with COUNT peers" 3261msgid "run the experiment with COUNT peers"
3087msgstr "" 3262msgstr ""
@@ -3098,6 +3273,14 @@ msgstr ""
3098msgid "run a testbed to measure file-sharing performance" 3273msgid "run a testbed to measure file-sharing performance"
3099msgstr "" 3274msgstr ""
3100 3275
3276#: src/fs/gnunet-fs.c:119
3277msgid "print a list of all indexed files"
3278msgstr ""
3279
3280#: src/fs/gnunet-fs.c:130
3281msgid "Special file-sharing operations"
3282msgstr ""
3283
3101#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231 3284#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
3102#, c-format 3285#, c-format
3103msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" 3286msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3743,22 +3926,11 @@ msgstr ""
3743msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 3926msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3744msgstr "" 3927msgstr ""
3745 3928
3746#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 3929#: src/gns/gnunet-gns-helper-service-w32.c:602
3747#, c-format 3930msgid "Not ready to process requests, lacking ego data\n"
3748msgid "Invalid typename specified, assuming `ANY'\n"
3749msgstr ""
3750
3751#: src/gns/gnunet-gns.c:252
3752#, c-format
3753msgid "Please specify name to lookup!\n"
3754msgstr ""
3755
3756#: src/gns/gnunet-gns.c:276
3757#, c-format
3758msgid "Ego for `%s' not found, cannot perform lookup.\n"
3759msgstr "" 3931msgstr ""
3760 3932
3761#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701 3933#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
3762#: src/gns/plugin_rest_gns.c:422 3934#: src/gns/plugin_rest_gns.c:422
3763#, c-format 3935#, c-format
3764msgid "" 3936msgid ""
@@ -3766,54 +3938,12 @@ msgid ""
3766"gns-import.sh?\n" 3938"gns-import.sh?\n"
3767msgstr "" 3939msgstr ""
3768 3940
3769#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
3770#, c-format
3771msgid "Failed to connect to GNS\n"
3772msgstr ""
3773
3774#: src/gns/gnunet-gns.c:374
3775#, c-format
3776msgid "Public key `%s' is not well-formed\n"
3777msgstr ""
3778
3779#: src/gns/gnunet-gns.c:428
3780msgid "Lookup a record for the given name"
3781msgstr ""
3782
3783#: src/gns/gnunet-gns.c:434
3784msgid "Specify the type of the record to lookup"
3785msgstr ""
3786
3787#: src/gns/gnunet-gns.c:440
3788msgid "Specify timeout for the lookup"
3789msgstr ""
3790
3791#: src/gns/gnunet-gns.c:445
3792msgid "No unneeded output"
3793msgstr ""
3794
3795#: src/gns/gnunet-gns.c:451
3796msgid "Specify the public key of the zone to lookup the record in"
3797msgstr ""
3798
3799#: src/gns/gnunet-gns.c:457
3800msgid "Specify the name of the ego of the zone to lookup the record in"
3801msgstr ""
3802
3803#: src/gns/gnunet-gns.c:476
3804msgid "GNUnet GNS resolver tool"
3805msgstr ""
3806
3807#: src/gns/gnunet-gns-helper-service-w32.c:602
3808msgid "Not ready to process requests, lacking ego data\n"
3809msgstr ""
3810
3811#: src/gns/gnunet-gns-helper-service-w32.c:739 3941#: src/gns/gnunet-gns-helper-service-w32.c:739
3812#, c-format 3942#, c-format
3813msgid "Failed to connect to identity service\n" 3943msgid "Failed to connect to identity service\n"
3814msgstr "" 3944msgstr ""
3815 3945
3816#: src/gns/gnunet-gns-import.c:489 3946#: src/gns/gnunet-gns-import.c:452
3817msgid "This program will import some GNS authorities into your GNS namestore." 3947msgid "This program will import some GNS authorities into your GNS namestore."
3818msgstr "" 3948msgstr ""
3819 3949
@@ -3937,12 +4067,60 @@ msgstr ""
3937msgid "GNUnet GNS proxy" 4067msgid "GNUnet GNS proxy"
3938msgstr "" 4068msgstr ""
3939 4069
4070#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
4071#, c-format
4072msgid "Invalid typename specified, assuming `ANY'\n"
4073msgstr ""
4074
4075#: src/gns/gnunet-gns.c:252
4076#, c-format
4077msgid "Please specify name to lookup!\n"
4078msgstr ""
4079
4080#: src/gns/gnunet-gns.c:276
4081#, c-format
4082msgid "Ego for `%s' not found, cannot perform lookup.\n"
4083msgstr ""
4084
4085#: src/gns/gnunet-gns.c:374
4086#, c-format
4087msgid "Public key `%s' is not well-formed\n"
4088msgstr ""
4089
4090#: src/gns/gnunet-gns.c:428
4091msgid "Lookup a record for the given name"
4092msgstr ""
4093
4094#: src/gns/gnunet-gns.c:434
4095msgid "Specify the type of the record to lookup"
4096msgstr ""
4097
4098#: src/gns/gnunet-gns.c:440
4099msgid "Specify timeout for the lookup"
4100msgstr ""
4101
4102#: src/gns/gnunet-gns.c:445
4103msgid "No unneeded output"
4104msgstr ""
4105
4106#: src/gns/gnunet-gns.c:451
4107msgid "Specify the public key of the zone to lookup the record in"
4108msgstr ""
4109
4110#: src/gns/gnunet-gns.c:457
4111msgid "Specify the name of the ego of the zone to lookup the record in"
4112msgstr ""
4113
4114#: src/gns/gnunet-gns.c:476
4115msgid "GNUnet GNS resolver tool"
4116msgstr ""
4117
3940#: src/gns/gnunet-service-gns.c:442 4118#: src/gns/gnunet-service-gns.c:442
3941msgid "Failed to connect to the namecache!\n" 4119msgid "Failed to connect to the namecache!\n"
3942msgstr "" 4120msgstr ""
3943 4121
3944#: src/gns/gnunet-service-gns.c:461 4122#: src/gns/gnunet-service-gns.c:461
3945#: src/zonemaster/gnunet-service-zonemaster.c:741 4123#: src/zonemaster/gnunet-service-zonemaster.c:742
3946msgid "Could not connect to DHT!\n" 4124msgid "Could not connect to DHT!\n"
3947msgstr "" 4125msgstr ""
3948 4126
@@ -3997,44 +4175,35 @@ msgstr ""
3997msgid "Hostname `%s' is not well-formed, resolution fails\n" 4175msgid "Hostname `%s' is not well-formed, resolution fails\n"
3998msgstr "" 4176msgstr ""
3999 4177
4000#: src/gns/plugin_gnsrecord_gns.c:203 4178#: src/gns/plugin_gnsrecord_gns.c:179
4001#, c-format 4179#, c-format
4002msgid "Unable to parse PKEY record `%s'\n" 4180msgid "Unable to parse PKEY record `%s'\n"
4003msgstr "" 4181msgstr ""
4004 4182
4005#: src/gns/plugin_gnsrecord_gns.c:232 4183#: src/gns/plugin_gnsrecord_gns.c:208
4006#, c-format 4184#, c-format
4007msgid "Unable to parse GNS2DNS record `%s'\n" 4185msgid "Unable to parse GNS2DNS record `%s'\n"
4008msgstr "" 4186msgstr ""
4009 4187
4010#: src/gns/plugin_gnsrecord_gns.c:253 4188#: src/gns/plugin_gnsrecord_gns.c:229
4011#, c-format 4189#, c-format
4012msgid "Failed to serialize GNS2DNS record with value `%s'\n" 4190msgid "Failed to serialize GNS2DNS record with value `%s'\n"
4013msgstr "" 4191msgstr ""
4014 4192
4015#: src/gns/plugin_gnsrecord_gns.c:276 4193#: src/gns/plugin_gnsrecord_gns.c:252
4016#, c-format 4194#, c-format
4017msgid "Unable to parse VPN record string `%s'\n" 4195msgid "Unable to parse VPN record string `%s'\n"
4018msgstr "" 4196msgstr ""
4019 4197
4020#: src/gns/plugin_gnsrecord_gns.c:312 4198#: src/gns/plugin_gnsrecord_gns.c:288
4021#, c-format 4199#, c-format
4022msgid "Unable to parse BOX record string `%s'\n" 4200msgid "Unable to parse BOX record string `%s'\n"
4023msgstr "" 4201msgstr ""
4024 4202
4025#: src/gns/plugin_gnsrecord_gns.c:360
4026#, c-format
4027msgid "Unable to parse REVERSE record string `%s'\n"
4028msgstr ""
4029
4030#: src/gns/plugin_rest_gns.c:384 4203#: src/gns/plugin_rest_gns.c:384
4031msgid "Ego for not found, cannot perform lookup.\n" 4204msgid "Ego for not found, cannot perform lookup.\n"
4032msgstr "" 4205msgstr ""
4033 4206
4034#: src/gns/plugin_rest_gns.c:668
4035msgid "GNS REST API initialized\n"
4036msgstr ""
4037
4038#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4207#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4039#, c-format 4208#, c-format
4040msgid "Unable to parse IPv4 address `%s'\n" 4209msgid "Unable to parse IPv4 address `%s'\n"
@@ -4454,6 +4623,51 @@ msgstr ""
4454msgid "Could not start hostlist HTTP server on port %u\n" 4623msgid "Could not start hostlist HTTP server on port %u\n"
4455msgstr "" 4624msgstr ""
4456 4625
4626#: src/identity-provider/gnunet-idp.c:348
4627msgid "Ego is required\n"
4628msgstr ""
4629
4630#: src/identity-provider/gnunet-idp.c:370
4631msgid "Add attribute"
4632msgstr ""
4633
4634#: src/identity-provider/gnunet-idp.c:376
4635msgid "Attribute value"
4636msgstr ""
4637
4638#: src/identity-provider/gnunet-idp.c:381
4639msgid "Ego"
4640msgstr ""
4641
4642#: src/identity-provider/gnunet-idp.c:386
4643msgid "Audience (relying party)"
4644msgstr ""
4645
4646#: src/identity-provider/gnunet-idp.c:390
4647msgid "List attributes for Ego"
4648msgstr ""
4649
4650#: src/identity-provider/gnunet-idp.c:395
4651msgid "Issue a ticket"
4652msgstr ""
4653
4654#: src/identity-provider/gnunet-idp.c:400
4655msgid "Consume a ticket"
4656msgstr ""
4657
4658#: src/identity-provider/gnunet-idp.c:405
4659msgid "Revoke a ticket"
4660msgstr ""
4661
4662#: src/identity-provider/identity_provider_api.c:429
4663#, fuzzy
4664msgid "failed to store record\n"
4665msgstr "Échec du démarrage de %s\n"
4666
4667#: src/identity-provider/plugin_rest_identity_provider.c:1175
4668msgid "Identity Provider REST API initialized\n"
4669msgstr ""
4670
4457#: src/identity/gnunet-identity.c:179 4671#: src/identity/gnunet-identity.c:179
4458#, c-format 4672#, c-format
4459msgid "Failed to create ego: %s\n" 4673msgid "Failed to create ego: %s\n"
@@ -4541,31 +4755,10 @@ msgstr ""
4541msgid "Failed to create directory `%s' for storing egos\n" 4755msgid "Failed to create directory `%s' for storing egos\n"
4542msgstr "" 4756msgstr ""
4543 4757
4544#: src/identity/plugin_rest_identity.c:967 4758#: src/identity/plugin_rest_identity.c:964
4545msgid "Identity REST API initialized\n" 4759msgid "Identity REST API initialized\n"
4546msgstr "" 4760msgstr ""
4547 4761
4548#: src/identity-provider/gnunet-identity-token.c:66
4549msgid "Option `-t' is required\n"
4550msgstr ""
4551
4552#: src/identity-provider/gnunet-identity-token.c:77
4553#, c-format
4554msgid "Token `%s' is malformed\n"
4555msgstr ""
4556
4557#: src/identity-provider/gnunet-identity-token.c:166
4558msgid "GNUid token"
4559msgstr ""
4560
4561#: src/identity-provider/gnunet-identity-token.c:171
4562msgid "Print token contents"
4563msgstr ""
4564
4565#: src/identity-provider/plugin_rest_identity_provider.c:1166
4566msgid "Identity Token REST API initialized\n"
4567msgstr ""
4568
4569#: src/json/json.c:119 4762#: src/json/json.c:119
4570#, fuzzy, c-format 4763#, fuzzy, c-format
4571msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4764msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4663,9 +4856,62 @@ msgstr "Résolution de « %s » échouée\n"
4663msgid "flat plugin running\n" 4856msgid "flat plugin running\n"
4664msgstr "" 4857msgstr ""
4665 4858
4666#: src/namecache/plugin_namecache_postgres.c:90 4859#: src/namestore/gnunet-namestore-fcfsd.c:508
4667#: src/namestore/plugin_namestore_postgres.c:97 4860#, c-format
4668msgid "Failed to create indices\n" 4861msgid "Unsupported form value `%s'\n"
4862msgstr ""
4863
4864#: src/namestore/gnunet-namestore-fcfsd.c:535
4865#, c-format
4866msgid "Failed to create record for domain `%s': %s\n"
4867msgstr ""
4868
4869#: src/namestore/gnunet-namestore-fcfsd.c:555
4870msgid "Error when mapping zone to name\n"
4871msgstr ""
4872
4873#: src/namestore/gnunet-namestore-fcfsd.c:585
4874#, c-format
4875msgid "Found existing name `%s' for the given key\n"
4876msgstr ""
4877
4878#: src/namestore/gnunet-namestore-fcfsd.c:662
4879#, c-format
4880msgid "Found %u existing records for domain `%s'\n"
4881msgstr ""
4882
4883#: src/namestore/gnunet-namestore-fcfsd.c:718
4884#, c-format
4885msgid "Failed to create page for `%s'\n"
4886msgstr ""
4887
4888#: src/namestore/gnunet-namestore-fcfsd.c:734
4889#, c-format
4890msgid "Failed to setup post processor for `%s'\n"
4891msgstr ""
4892
4893#: src/namestore/gnunet-namestore-fcfsd.c:770
4894msgid "Domain name must not contain `.'\n"
4895msgstr ""
4896
4897#: src/namestore/gnunet-namestore-fcfsd.c:778
4898msgid "Domain name must not contain `+'\n"
4899msgstr ""
4900
4901#: src/namestore/gnunet-namestore-fcfsd.c:974
4902msgid "No ego configured for `fcfsd` subsystem\n"
4903msgstr ""
4904
4905#: src/namestore/gnunet-namestore-fcfsd.c:1000
4906msgid "Failed to start HTTP server\n"
4907msgstr ""
4908
4909#: src/namestore/gnunet-namestore-fcfsd.c:1042
4910msgid "Failed to connect to identity\n"
4911msgstr ""
4912
4913#: src/namestore/gnunet-namestore-fcfsd.c:1074
4914msgid "GNU Name System First Come First Serve name registration service"
4669msgstr "" 4915msgstr ""
4670 4916
4671#: src/namestore/gnunet-namestore.c:301 4917#: src/namestore/gnunet-namestore.c:301
@@ -4674,13 +4920,13 @@ msgid "Adding record failed: %s\n"
4674msgstr "" 4920msgstr ""
4675 4921
4676#: src/namestore/gnunet-namestore.c:330 4922#: src/namestore/gnunet-namestore.c:330
4677#: src/namestore/plugin_rest_namestore.c:562 4923#: src/namestore/plugin_rest_namestore.c:567
4678#, c-format 4924#, c-format
4679msgid "Deleting record failed, record does not exist%s%s\n" 4925msgid "Deleting record failed, record does not exist%s%s\n"
4680msgstr "" 4926msgstr ""
4681 4927
4682#: src/namestore/gnunet-namestore.c:337 4928#: src/namestore/gnunet-namestore.c:337
4683#: src/namestore/plugin_rest_namestore.c:571 4929#: src/namestore/plugin_rest_namestore.c:576
4684#, c-format 4930#, c-format
4685msgid "Deleting record failed%s%s\n" 4931msgid "Deleting record failed%s%s\n"
4686msgstr "" 4932msgstr ""
@@ -4698,7 +4944,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
4698msgstr "" 4944msgstr ""
4699 4945
4700#: src/namestore/gnunet-namestore.c:698 4946#: src/namestore/gnunet-namestore.c:698
4701#: src/namestore/plugin_rest_namestore.c:597 4947#: src/namestore/plugin_rest_namestore.c:602
4702#, c-format 4948#, c-format
4703msgid "There are no records under label `%s' that could be deleted.\n" 4949msgid "There are no records under label `%s' that could be deleted.\n"
4704msgstr "" 4950msgstr ""
@@ -4709,23 +4955,11 @@ msgid ""
4709"There are no records under label `%s' that match the request for deletion.\n" 4955"There are no records under label `%s' that match the request for deletion.\n"
4710msgstr "" 4956msgstr ""
4711 4957
4712#: src/namestore/gnunet-namestore.c:776
4713#: src/namestore/plugin_rest_namestore.c:1004
4714#, c-format
4715msgid "Ego `%s' not known to identity service\n"
4716msgstr ""
4717
4718#: src/namestore/gnunet-namestore.c:791 4958#: src/namestore/gnunet-namestore.c:791
4719#, c-format 4959#, c-format
4720msgid "No options given\n" 4960msgid "No options given\n"
4721msgstr "" 4961msgstr ""
4722 4962
4723#: src/namestore/gnunet-namestore.c:802
4724#: src/namestore/gnunet-namestore-fcfsd.c:1034
4725#: src/namestore/plugin_rest_namestore.c:1017
4726msgid "Failed to connect to namestore\n"
4727msgstr ""
4728
4729#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819 4963#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
4730#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861 4964#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
4731#: src/namestore/gnunet-namestore.c:915 4965#: src/namestore/gnunet-namestore.c:915
@@ -4739,14 +4973,14 @@ msgid "add"
4739msgstr "ajouter" 4973msgstr "ajouter"
4740 4974
4741#: src/namestore/gnunet-namestore.c:829 4975#: src/namestore/gnunet-namestore.c:829
4742#: src/namestore/plugin_rest_namestore.c:671 4976#: src/namestore/plugin_rest_namestore.c:676
4743#, c-format 4977#, c-format
4744msgid "Unsupported type `%s'\n" 4978msgid "Unsupported type `%s'\n"
4745msgstr "" 4979msgstr ""
4746 4980
4747#: src/namestore/gnunet-namestore.c:851 4981#: src/namestore/gnunet-namestore.c:851
4748#: src/namestore/plugin_rest_namestore.c:689 4982#: src/namestore/plugin_rest_namestore.c:694
4749#: src/namestore/plugin_rest_namestore.c:729 4983#: src/namestore/plugin_rest_namestore.c:734
4750#, c-format 4984#, c-format
4751msgid "Value `%s' invalid for record type `%s'\n" 4985msgid "Value `%s' invalid for record type `%s'\n"
4752msgstr "" 4986msgstr ""
@@ -4765,8 +4999,7 @@ msgstr "supprimer"
4765msgid "Invalid public key for reverse lookup `%s'\n" 4999msgid "Invalid public key for reverse lookup `%s'\n"
4766msgstr "" 5000msgstr ""
4767 5001
4768#: src/namestore/gnunet-namestore.c:979 5002#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
4769#: src/peerinfo-tool/gnunet-peerinfo.c:775
4770#, c-format 5003#, c-format
4771msgid "Invalid URI `%s'\n" 5004msgid "Invalid URI `%s'\n"
4772msgstr "URI invalide « %s »\n" 5005msgstr "URI invalide « %s »\n"
@@ -4777,13 +5010,13 @@ msgid "Invalid nick `%s'\n"
4777msgstr "" 5010msgstr ""
4778 5011
4779#: src/namestore/gnunet-namestore.c:1051 5012#: src/namestore/gnunet-namestore.c:1051
4780#: src/namestore/plugin_rest_namestore.c:1047 5013#: src/namestore/plugin_rest_namestore.c:1052
4781#, c-format 5014#, c-format
4782msgid "No default ego configured in identity service\n" 5015msgid "No default ego configured in identity service\n"
4783msgstr "" 5016msgstr ""
4784 5017
4785#: src/namestore/gnunet-namestore.c:1108 5018#: src/namestore/gnunet-namestore.c:1108
4786#: src/namestore/plugin_rest_namestore.c:1143 5019#: src/namestore/plugin_rest_namestore.c:1148
4787#, c-format 5020#, c-format
4788msgid "Cannot connect to identity service\n" 5021msgid "Cannot connect to identity service\n"
4789msgstr "" 5022msgstr ""
@@ -4843,65 +5076,7 @@ msgstr ""
4843msgid "name of the ego controlling the zone" 5076msgid "name of the ego controlling the zone"
4844msgstr "" 5077msgstr ""
4845 5078
4846#: src/namestore/gnunet-namestore-fcfsd.c:508 5079#: src/namestore/gnunet-service-namestore.c:615
4847#, c-format
4848msgid "Unsupported form value `%s'\n"
4849msgstr ""
4850
4851#: src/namestore/gnunet-namestore-fcfsd.c:535
4852#, c-format
4853msgid "Failed to create record for domain `%s': %s\n"
4854msgstr ""
4855
4856#: src/namestore/gnunet-namestore-fcfsd.c:555
4857msgid "Error when mapping zone to name\n"
4858msgstr ""
4859
4860#: src/namestore/gnunet-namestore-fcfsd.c:585
4861#, c-format
4862msgid "Found existing name `%s' for the given key\n"
4863msgstr ""
4864
4865#: src/namestore/gnunet-namestore-fcfsd.c:662
4866#, c-format
4867msgid "Found %u existing records for domain `%s'\n"
4868msgstr ""
4869
4870#: src/namestore/gnunet-namestore-fcfsd.c:718
4871#, c-format
4872msgid "Failed to create page for `%s'\n"
4873msgstr ""
4874
4875#: src/namestore/gnunet-namestore-fcfsd.c:734
4876#, c-format
4877msgid "Failed to setup post processor for `%s'\n"
4878msgstr ""
4879
4880#: src/namestore/gnunet-namestore-fcfsd.c:770
4881msgid "Domain name must not contain `.'\n"
4882msgstr ""
4883
4884#: src/namestore/gnunet-namestore-fcfsd.c:778
4885msgid "Domain name must not contain `+'\n"
4886msgstr ""
4887
4888#: src/namestore/gnunet-namestore-fcfsd.c:974
4889msgid "No ego configured for `fcfsd` subsystem\n"
4890msgstr ""
4891
4892#: src/namestore/gnunet-namestore-fcfsd.c:1000
4893msgid "Failed to start HTTP server\n"
4894msgstr ""
4895
4896#: src/namestore/gnunet-namestore-fcfsd.c:1042
4897msgid "Failed to connect to identity\n"
4898msgstr ""
4899
4900#: src/namestore/gnunet-namestore-fcfsd.c:1074
4901msgid "GNU Name System First Come First Serve name registration service"
4902msgstr ""
4903
4904#: src/namestore/gnunet-service-namestore.c:612
4905#, c-format 5080#, c-format
4906msgid "Failed to replicate block in namecache: %s\n" 5081msgid "Failed to replicate block in namecache: %s\n"
4907msgstr "" 5082msgstr ""
@@ -4914,7 +5089,7 @@ msgstr ""
4914msgid "flat file database running\n" 5089msgid "flat file database running\n"
4915msgstr "" 5090msgstr ""
4916 5091
4917#: src/namestore/plugin_rest_namestore.c:1188 5092#: src/namestore/plugin_rest_namestore.c:1193
4918msgid "Namestore REST API initialized\n" 5093msgid "Namestore REST API initialized\n"
4919msgstr "" 5094msgstr ""
4920 5095
@@ -5189,10 +5364,6 @@ msgstr ""
5189msgid "`upnpc' command not found\n" 5364msgid "`upnpc' command not found\n"
5190msgstr "" 5365msgstr ""
5191 5366
5192#: src/nse/gnunet-nse.c:122
5193msgid "Show network size estimates from NSE service."
5194msgstr ""
5195
5196#: src/nse/gnunet-nse-profiler.c:842 5367#: src/nse/gnunet-nse-profiler.c:842
5197msgid "limit to the number of connections to NSE services, 0 for none" 5368msgid "limit to the number of connections to NSE services, 0 for none"
5198msgstr "" 5369msgstr ""
@@ -5217,65 +5388,15 @@ msgstr ""
5217msgid "Measure quality and performance of the NSE service." 5388msgid "Measure quality and performance of the NSE service."
5218msgstr "" 5389msgstr ""
5219 5390
5391#: src/nse/gnunet-nse.c:122
5392msgid "Show network size estimates from NSE service."
5393msgstr ""
5394
5220#: src/nse/gnunet-service-nse.c:1534 5395#: src/nse/gnunet-service-nse.c:1534
5221#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 5396#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
5222msgid "Value is too large.\n" 5397msgid "Value is too large.\n"
5223msgstr "" 5398msgstr ""
5224 5399
5225#: src/peerinfo/gnunet-service-peerinfo.c:178
5226#, c-format
5227msgid "Removing expired address of transport `%s'\n"
5228msgstr ""
5229
5230#: src/peerinfo/gnunet-service-peerinfo.c:310
5231#, c-format
5232msgid "Failed to parse HELLO in file `%s': %s\n"
5233msgstr ""
5234
5235#: src/peerinfo/gnunet-service-peerinfo.c:331
5236#: src/peerinfo/gnunet-service-peerinfo.c:362
5237#, c-format
5238msgid "Failed to parse HELLO in file `%s'\n"
5239msgstr ""
5240
5241#: src/peerinfo/gnunet-service-peerinfo.c:446
5242msgid "# peers known"
5243msgstr ""
5244
5245#: src/peerinfo/gnunet-service-peerinfo.c:489
5246#, c-format
5247msgid ""
5248"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5249msgstr ""
5250
5251#: src/peerinfo/gnunet-service-peerinfo.c:655
5252#, c-format
5253msgid "Scanning directory `%s'\n"
5254msgstr ""
5255
5256#: src/peerinfo/gnunet-service-peerinfo.c:663
5257#, c-format
5258msgid "Still no peers found in `%s'!\n"
5259msgstr ""
5260
5261#: src/peerinfo/gnunet-service-peerinfo.c:1076
5262#, c-format
5263msgid "Cleaning up directory `%s'\n"
5264msgstr ""
5265
5266#: src/peerinfo/gnunet-service-peerinfo.c:1405
5267#, c-format
5268msgid "Importing HELLOs from `%s'\n"
5269msgstr ""
5270
5271#: src/peerinfo/gnunet-service-peerinfo.c:1418
5272msgid "Skipping import of included HELLOs\n"
5273msgstr ""
5274
5275#: src/peerinfo/peerinfo_api.c:220
5276msgid "Failed to receive response from `PEERINFO' service."
5277msgstr ""
5278
5279#: src/peerinfo-tool/gnunet-peerinfo.c:239 5400#: src/peerinfo-tool/gnunet-peerinfo.c:239
5280#, c-format 5401#, c-format
5281msgid "%sPeer `%s'\n" 5402msgid "%sPeer `%s'\n"
@@ -5365,6 +5486,60 @@ msgstr ""
5365msgid "Failed to load transport plugin for `%s'\n" 5486msgid "Failed to load transport plugin for `%s'\n"
5366msgstr "" 5487msgstr ""
5367 5488
5489#: src/peerinfo/gnunet-service-peerinfo.c:178
5490#, c-format
5491msgid "Removing expired address of transport `%s'\n"
5492msgstr ""
5493
5494#: src/peerinfo/gnunet-service-peerinfo.c:310
5495#, c-format
5496msgid "Failed to parse HELLO in file `%s': %s\n"
5497msgstr ""
5498
5499#: src/peerinfo/gnunet-service-peerinfo.c:331
5500#: src/peerinfo/gnunet-service-peerinfo.c:362
5501#, c-format
5502msgid "Failed to parse HELLO in file `%s'\n"
5503msgstr ""
5504
5505#: src/peerinfo/gnunet-service-peerinfo.c:446
5506msgid "# peers known"
5507msgstr ""
5508
5509#: src/peerinfo/gnunet-service-peerinfo.c:489
5510#, c-format
5511msgid ""
5512"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5513msgstr ""
5514
5515#: src/peerinfo/gnunet-service-peerinfo.c:655
5516#, c-format
5517msgid "Scanning directory `%s'\n"
5518msgstr ""
5519
5520#: src/peerinfo/gnunet-service-peerinfo.c:663
5521#, c-format
5522msgid "Still no peers found in `%s'!\n"
5523msgstr ""
5524
5525#: src/peerinfo/gnunet-service-peerinfo.c:1076
5526#, c-format
5527msgid "Cleaning up directory `%s'\n"
5528msgstr ""
5529
5530#: src/peerinfo/gnunet-service-peerinfo.c:1405
5531#, c-format
5532msgid "Importing HELLOs from `%s'\n"
5533msgstr ""
5534
5535#: src/peerinfo/gnunet-service-peerinfo.c:1418
5536msgid "Skipping import of included HELLOs\n"
5537msgstr ""
5538
5539#: src/peerinfo/peerinfo_api.c:220
5540msgid "Failed to receive response from `PEERINFO' service."
5541msgstr ""
5542
5368#: src/peerstore/gnunet-peerstore.c:91 5543#: src/peerstore/gnunet-peerstore.c:91
5369msgid "peerstore" 5544msgid "peerstore"
5370msgstr "" 5545msgstr ""
@@ -5412,16 +5587,11 @@ msgstr ""
5412msgid "Unable to create indices: %s.\n" 5587msgid "Unable to create indices: %s.\n"
5413msgstr "" 5588msgstr ""
5414 5589
5415#: src/postgres/postgres.c:67 5590#: src/pq/pq_prepare.c:80
5416#, c-format 5591#, c-format
5417msgid "`%s:%s' failed at %s:%d with error: %s\n" 5592msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
5418msgstr "" 5593msgstr ""
5419 5594
5420#: src/postgres/postgres.c:192
5421#, fuzzy, c-format
5422msgid "Unable to connect to Postgres database '%s': %s\n"
5423msgstr "Résolution de « %s » échouée\n"
5424
5425#: src/psycstore/gnunet-service-psycstore.c:249 5595#: src/psycstore/gnunet-service-psycstore.c:249
5426msgid "Failed to store membership information!\n" 5596msgid "Failed to store membership information!\n"
5427msgstr "" 5597msgstr ""
@@ -5580,56 +5750,56 @@ msgstr ""
5580msgid "Daemon to announce regular expressions for the peer using cadet." 5750msgid "Daemon to announce regular expressions for the peer using cadet."
5581msgstr "" 5751msgstr ""
5582 5752
5583#: src/regex/gnunet-regex-profiler.c:1314 5753#: src/regex/gnunet-regex-profiler.c:1386
5584msgid "No configuration file given. Exiting\n" 5754msgid "No configuration file given. Exiting\n"
5585msgstr "" 5755msgstr ""
5586 5756
5587#: src/regex/gnunet-regex-profiler.c:1355 5757#: src/regex/gnunet-regex-profiler.c:1427
5588#: src/regex/gnunet-regex-simulation-profiler.c:630 5758#: src/regex/gnunet-regex-simulation-profiler.c:630
5589#, c-format 5759#, c-format
5590msgid "No policy directory specified on command line. Exiting.\n" 5760msgid "No policy directory specified on command line. Exiting.\n"
5591msgstr "" 5761msgstr ""
5592 5762
5593#: src/regex/gnunet-regex-profiler.c:1361 5763#: src/regex/gnunet-regex-profiler.c:1433
5594#: src/regex/gnunet-regex-simulation-profiler.c:638 5764#: src/regex/gnunet-regex-simulation-profiler.c:638
5595#, c-format 5765#, c-format
5596msgid "Specified policies directory does not exist. Exiting.\n" 5766msgid "Specified policies directory does not exist. Exiting.\n"
5597msgstr "" 5767msgstr ""
5598 5768
5599#: src/regex/gnunet-regex-profiler.c:1368 5769#: src/regex/gnunet-regex-profiler.c:1440
5600#, c-format 5770#, c-format
5601msgid "No files found in `%s'\n" 5771msgid "No files found in `%s'\n"
5602msgstr "" 5772msgstr ""
5603 5773
5604#: src/regex/gnunet-regex-profiler.c:1377 5774#: src/regex/gnunet-regex-profiler.c:1449
5605msgid "No search strings file given. Exiting.\n" 5775msgid "No search strings file given. Exiting.\n"
5606msgstr "" 5776msgstr ""
5607 5777
5608#: src/regex/gnunet-regex-profiler.c:1397 5778#: src/regex/gnunet-regex-profiler.c:1469
5609msgid "Error loading search strings. Exiting.\n" 5779msgid "Error loading search strings. Exiting.\n"
5610msgstr "" 5780msgstr ""
5611 5781
5612#: src/regex/gnunet-regex-profiler.c:1485 5782#: src/regex/gnunet-regex-profiler.c:1557
5613msgid "name of the file for writing statistics" 5783msgid "name of the file for writing statistics"
5614msgstr "" 5784msgstr ""
5615 5785
5616#: src/regex/gnunet-regex-profiler.c:1491 5786#: src/regex/gnunet-regex-profiler.c:1563
5617msgid "wait TIMEOUT before ending the experiment" 5787msgid "wait TIMEOUT before ending the experiment"
5618msgstr "" 5788msgstr ""
5619 5789
5620#: src/regex/gnunet-regex-profiler.c:1497 5790#: src/regex/gnunet-regex-profiler.c:1569
5621msgid "directory with policy files" 5791msgid "directory with policy files"
5622msgstr "" 5792msgstr ""
5623 5793
5624#: src/regex/gnunet-regex-profiler.c:1504 5794#: src/regex/gnunet-regex-profiler.c:1576
5625msgid "name of file with input strings" 5795msgid "name of file with input strings"
5626msgstr "" 5796msgstr ""
5627 5797
5628#: src/regex/gnunet-regex-profiler.c:1510 5798#: src/regex/gnunet-regex-profiler.c:1582
5629msgid "name of file with hosts' names" 5799msgid "name of file with hosts' names"
5630msgstr "" 5800msgstr ""
5631 5801
5632#: src/regex/gnunet-regex-profiler.c:1523 5802#: src/regex/gnunet-regex-profiler.c:1595
5633msgid "Profiler for regex" 5803msgid "Profiler for regex"
5634msgstr "" 5804msgstr ""
5635 5805
@@ -5851,10 +6021,10 @@ msgstr ""
5851msgid "Calculate the Vectorproduct with a GNUnet peer." 6021msgid "Calculate the Vectorproduct with a GNUnet peer."
5852msgstr "" 6022msgstr ""
5853 6023
5854#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 6024#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
5855#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
5856#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
5857#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 6025#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
6026#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
6027#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
5858msgid "Connect to CADET failed\n" 6028msgid "Connect to CADET failed\n"
5859msgstr "" 6029msgstr ""
5860 6030
@@ -5878,7 +6048,7 @@ msgstr "threshold"
5878msgid "also profile decryption" 6048msgid "also profile decryption"
5879msgstr "" 6049msgstr ""
5880 6050
5881#: src/set/gnunet-service-set.c:1948 6051#: src/set/gnunet-service-set.c:1989
5882#, fuzzy 6052#, fuzzy
5883msgid "Could not connect to CADET service\n" 6053msgid "Could not connect to CADET service\n"
5884msgstr "Impossible d’ouvrir « %s ».\n" 6054msgstr "Impossible d’ouvrir « %s ».\n"
@@ -5935,112 +6105,112 @@ msgstr ""
5935msgid "say good-bye and leave somebody else's place" 6105msgid "say good-bye and leave somebody else's place"
5936msgstr "" 6106msgstr ""
5937 6107
5938#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 6108#: src/social/gnunet-social.c:1227
5939msgid "create a place" 6109msgid "create a place"
5940msgstr "" 6110msgstr ""
5941 6111
5942#: src/social/gnunet-social.c:1237 6112#: src/social/gnunet-social.c:1232
5943msgid "destroy a place we were hosting" 6113msgid "destroy a place we were hosting"
5944msgstr "" 6114msgstr ""
5945 6115
5946#: src/social/gnunet-social.c:1242 6116#: src/social/gnunet-social.c:1237
5947msgid "enter somebody else's place" 6117msgid "enter somebody else's place"
5948msgstr "" 6118msgstr ""
5949 6119
5950#: src/social/gnunet-social.c:1248 6120#: src/social/gnunet-social.c:1243
5951msgid "find state matching name prefix" 6121msgid "find state matching name prefix"
5952msgstr "" 6122msgstr ""
5953 6123
5954#: src/social/gnunet-social.c:1253 6124#: src/social/gnunet-social.c:1248
5955msgid "replay history of messages up to the given --limit" 6125msgid "replay history of messages up to the given --limit"
5956msgstr "" 6126msgstr ""
5957 6127
5958#: src/social/gnunet-social.c:1258 6128#: src/social/gnunet-social.c:1253
5959msgid "reconnect to a previously created place" 6129msgid "reconnect to a previously created place"
5960msgstr "" 6130msgstr ""
5961 6131
5962#: src/social/gnunet-social.c:1263 6132#: src/social/gnunet-social.c:1258
5963msgid "publish something to a place we are hosting" 6133msgid "publish something to a place we are hosting"
5964msgstr "" 6134msgstr ""
5965 6135
5966#: src/social/gnunet-social.c:1268 6136#: src/social/gnunet-social.c:1263
5967msgid "reconnect to a previously entered place" 6137msgid "reconnect to a previously entered place"
5968msgstr "" 6138msgstr ""
5969 6139
5970#: src/social/gnunet-social.c:1273 6140#: src/social/gnunet-social.c:1268
5971msgid "search for state matching exact name" 6141msgid "search for state matching exact name"
5972msgstr "" 6142msgstr ""
5973 6143
5974#: src/social/gnunet-social.c:1278 6144#: src/social/gnunet-social.c:1273
5975msgid "submit something to somebody's place" 6145msgid "submit something to somebody's place"
5976msgstr "" 6146msgstr ""
5977 6147
5978#: src/social/gnunet-social.c:1283 6148#: src/social/gnunet-social.c:1278
5979msgid "list of egos and subscribed places" 6149msgid "list of egos and subscribed places"
5980msgstr "" 6150msgstr ""
5981 6151
5982#: src/social/gnunet-social.c:1288 6152#: src/social/gnunet-social.c:1283
5983msgid "extract and replay history between message IDs --start and --until" 6153msgid "extract and replay history between message IDs --start and --until"
5984msgstr "" 6154msgstr ""
5985 6155
5986#: src/social/gnunet-social.c:1297 6156#: src/social/gnunet-social.c:1292
5987msgid "application ID to use when connecting" 6157msgid "application ID to use when connecting"
5988msgstr "" 6158msgstr ""
5989 6159
5990#: src/social/gnunet-social.c:1303 6160#: src/social/gnunet-social.c:1298
5991msgid "message body or state value" 6161msgid "message body or state value"
5992msgstr "" 6162msgstr ""
5993 6163
5994#: src/social/gnunet-social.c:1309 6164#: src/social/gnunet-social.c:1304
5995msgid "name or public key of ego" 6165msgid "name or public key of ego"
5996msgstr "" 6166msgstr ""
5997 6167
5998#: src/social/gnunet-social.c:1314 6168#: src/social/gnunet-social.c:1309
5999msgid "wait for incoming messages" 6169msgid "wait for incoming messages"
6000msgstr "" 6170msgstr ""
6001 6171
6002#: src/social/gnunet-social.c:1320 6172#: src/social/gnunet-social.c:1315
6003msgid "GNS name" 6173msgid "GNS name"
6004msgstr "" 6174msgstr ""
6005 6175
6006#: src/social/gnunet-social.c:1326 6176#: src/social/gnunet-social.c:1321
6007msgid "peer ID for --guest-enter" 6177msgid "peer ID for --guest-enter"
6008msgstr "" 6178msgstr ""
6009 6179
6010#: src/social/gnunet-social.c:1332 6180#: src/social/gnunet-social.c:1327
6011msgid "name (key) to query from state" 6181msgid "name (key) to query from state"
6012msgstr "" 6182msgstr ""
6013 6183
6014#: src/social/gnunet-social.c:1338 6184#: src/social/gnunet-social.c:1333
6015msgid "method name" 6185msgid "method name"
6016msgstr "" 6186msgstr ""
6017 6187
6018#: src/social/gnunet-social.c:1344 6188#: src/social/gnunet-social.c:1339
6019#, fuzzy 6189#, fuzzy
6020msgid "number of messages to replay from history" 6190msgid "number of messages to replay from history"
6021msgstr "nombre de valeurs" 6191msgstr "nombre de valeurs"
6022 6192
6023#: src/social/gnunet-social.c:1350 6193#: src/social/gnunet-social.c:1345
6024msgid "key address of place" 6194msgid "key address of place"
6025msgstr "" 6195msgstr ""
6026 6196
6027#: src/social/gnunet-social.c:1356 6197#: src/social/gnunet-social.c:1351
6028msgid "start message ID for history replay" 6198msgid "start message ID for history replay"
6029msgstr "" 6199msgstr ""
6030 6200
6031#: src/social/gnunet-social.c:1361 6201#: src/social/gnunet-social.c:1356
6032msgid "respond to entry requests by admitting all guests" 6202msgid "respond to entry requests by admitting all guests"
6033msgstr "" 6203msgstr ""
6034 6204
6035#: src/social/gnunet-social.c:1367 6205#: src/social/gnunet-social.c:1362
6036msgid "end message ID for history replay" 6206msgid "end message ID for history replay"
6037msgstr "" 6207msgstr ""
6038 6208
6039#: src/social/gnunet-social.c:1372 6209#: src/social/gnunet-social.c:1367
6040msgid "respond to entry requests by refusing all guests" 6210msgid "respond to entry requests by refusing all guests"
6041msgstr "" 6211msgstr ""
6042 6212
6043#: src/social/gnunet-social.c:1382 6213#: src/social/gnunet-social.c:1377
6044msgid "" 6214msgid ""
6045"gnunet-social - Interact with the social service: enter/leave, send/receive " 6215"gnunet-social - Interact with the social service: enter/leave, send/receive "
6046"messages, access history and state.\n" 6216"messages, access history and state.\n"
@@ -6230,7 +6400,7 @@ msgid ""
6230msgstr "" 6400msgstr ""
6231 6401
6232#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 6402#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
6233#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 6403#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
6234#, c-format 6404#, c-format
6235msgid "Incorrect hostkey file format: %s\n" 6405msgid "Incorrect hostkey file format: %s\n"
6236msgstr "" 6406msgstr ""
@@ -6300,15 +6470,6 @@ msgstr ""
6300msgid "%.s Unknown result code." 6470msgid "%.s Unknown result code."
6301msgstr "%.s Code d'erreur inconnu" 6471msgstr "%.s Code d'erreur inconnu"
6302 6472
6303#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6304msgid "Waiting for child to exit.\n"
6305msgstr ""
6306
6307#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6308#, c-format
6309msgid "Spawning process `%s'\n"
6310msgstr ""
6311
6312#: src/testbed/gnunet-testbed-profiler.c:290 6473#: src/testbed/gnunet-testbed-profiler.c:290
6313msgid "tolerate COUNT number of continious timeout failures" 6474msgid "tolerate COUNT number of continious timeout failures"
6314msgstr "" 6475msgstr ""
@@ -6320,6 +6481,15 @@ msgid ""
6320"signal is received" 6481"signal is received"
6321msgstr "" 6482msgstr ""
6322 6483
6484#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6485msgid "Waiting for child to exit.\n"
6486msgstr ""
6487
6488#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6489#, c-format
6490msgid "Spawning process `%s'\n"
6491msgstr ""
6492
6323#: src/testbed/testbed_api.c:410 6493#: src/testbed/testbed_api.c:410
6324#, c-format 6494#, c-format
6325msgid "Adding host %u failed with error: %s\n" 6495msgid "Adding host %u failed with error: %s\n"
@@ -6607,10 +6777,6 @@ msgstr ""
6607msgid "GNUnet topology control" 6777msgid "GNUnet topology control"
6608msgstr "" 6778msgstr ""
6609 6779
6610#: src/transport/gnunet-service-transport_ats.c:141
6611msgid "# Addresses given to ATS"
6612msgstr ""
6613
6614#: src/transport/gnunet-service-transport.c:448 6780#: src/transport/gnunet-service-transport.c:448
6615msgid "# messages dropped due to slow client" 6781msgid "# messages dropped due to slow client"
6616msgstr "" 6782msgstr ""
@@ -6655,6 +6821,10 @@ msgstr ""
6655msgid "Transport service is lacking key configuration settings. Exiting.\n" 6821msgid "Transport service is lacking key configuration settings. Exiting.\n"
6656msgstr "" 6822msgstr ""
6657 6823
6824#: src/transport/gnunet-service-transport_ats.c:141
6825msgid "# Addresses given to ATS"
6826msgstr ""
6827
6658#: src/transport/gnunet-service-transport_hello.c:195 6828#: src/transport/gnunet-service-transport_hello.c:195
6659msgid "# refreshed my HELLO" 6829msgid "# refreshed my HELLO"
6660msgstr "" 6830msgstr ""
@@ -6956,6 +7126,42 @@ msgstr ""
6956msgid "# validations succeeded" 7126msgid "# validations succeeded"
6957msgstr "" 7127msgstr ""
6958 7128
7129#: src/transport/gnunet-transport-profiler.c:219
7130#, c-format
7131msgid "%llu B in %llu ms == %.2f KB/s!\n"
7132msgstr ""
7133
7134#: src/transport/gnunet-transport-profiler.c:617
7135msgid "send data to peer"
7136msgstr ""
7137
7138#: src/transport/gnunet-transport-profiler.c:621
7139msgid "receive data from peer"
7140msgstr ""
7141
7142#: src/transport/gnunet-transport-profiler.c:626
7143msgid "iterations"
7144msgstr ""
7145
7146#: src/transport/gnunet-transport-profiler.c:631
7147#, fuzzy
7148msgid "number of messages to send"
7149msgstr "nombre de valeurs"
7150
7151#: src/transport/gnunet-transport-profiler.c:636
7152msgid "message size to use"
7153msgstr ""
7154
7155#: src/transport/gnunet-transport-profiler.c:641
7156#: src/transport/gnunet-transport.c:1462
7157msgid "peer identity"
7158msgstr ""
7159
7160#: src/transport/gnunet-transport-profiler.c:652
7161#: src/transport/gnunet-transport.c:1482
7162msgid "Direct access to transport service."
7163msgstr ""
7164
6959#: src/transport/gnunet-transport.c:413 7165#: src/transport/gnunet-transport.c:413
6960#, c-format 7166#, c-format
6961msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" 7167msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7084,11 +7290,6 @@ msgstr ""
7084msgid "do not resolve hostnames" 7290msgid "do not resolve hostnames"
7085msgstr "" 7291msgstr ""
7086 7292
7087#: src/transport/gnunet-transport.c:1462
7088#: src/transport/gnunet-transport-profiler.c:641
7089msgid "peer identity"
7090msgstr ""
7091
7092#: src/transport/gnunet-transport.c:1466 7293#: src/transport/gnunet-transport.c:1466
7093msgid "monitor plugin sessions" 7294msgid "monitor plugin sessions"
7094msgstr "" 7295msgstr ""
@@ -7097,40 +7298,9 @@ msgstr ""
7097msgid "send data for benchmarking to the other peer (until CTRL-C)" 7298msgid "send data for benchmarking to the other peer (until CTRL-C)"
7098msgstr "" 7299msgstr ""
7099 7300
7100#: src/transport/gnunet-transport.c:1482
7101#: src/transport/gnunet-transport-profiler.c:652
7102msgid "Direct access to transport service."
7103msgstr ""
7104
7105#: src/transport/gnunet-transport-profiler.c:219
7106#, c-format
7107msgid "%llu B in %llu ms == %.2f KB/s!\n"
7108msgstr ""
7109
7110#: src/transport/gnunet-transport-profiler.c:617
7111msgid "send data to peer"
7112msgstr ""
7113
7114#: src/transport/gnunet-transport-profiler.c:621
7115msgid "receive data from peer"
7116msgstr ""
7117
7118#: src/transport/gnunet-transport-profiler.c:626
7119msgid "iterations"
7120msgstr ""
7121
7122#: src/transport/gnunet-transport-profiler.c:631
7123#, fuzzy
7124msgid "number of messages to send"
7125msgstr "nombre de valeurs"
7126
7127#: src/transport/gnunet-transport-profiler.c:636
7128msgid "message size to use"
7129msgstr ""
7130
7131#: src/transport/plugin_transport_http_client.c:1474 7301#: src/transport/plugin_transport_http_client.c:1474
7132#: src/transport/plugin_transport_http_server.c:2249 7302#: src/transport/plugin_transport_http_server.c:2312
7133#: src/transport/plugin_transport_http_server.c:3463 7303#: src/transport/plugin_transport_http_server.c:3526
7134#: src/transport/plugin_transport_tcp.c:3890 7304#: src/transport/plugin_transport_tcp.c:3890
7135#: src/transport/plugin_transport_tcp.c:3897 7305#: src/transport/plugin_transport_tcp.c:3897
7136msgid "TCP_STEALTH not supported on this platform.\n" 7306msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7142,13 +7312,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
7142msgstr "" 7312msgstr ""
7143 7313
7144#: src/transport/plugin_transport_http_client.c:2164 7314#: src/transport/plugin_transport_http_client.c:2164
7145#: src/transport/plugin_transport_http_server.c:3178 7315#: src/transport/plugin_transport_http_server.c:3241
7146#, c-format 7316#, c-format
7147msgid "Shutting down plugin `%s'\n" 7317msgid "Shutting down plugin `%s'\n"
7148msgstr "" 7318msgstr ""
7149 7319
7150#: src/transport/plugin_transport_http_client.c:2181 7320#: src/transport/plugin_transport_http_client.c:2181
7151#: src/transport/plugin_transport_http_server.c:3248 7321#: src/transport/plugin_transport_http_server.c:3311
7152#, c-format 7322#, c-format
7153msgid "Shutdown for plugin `%s' complete\n" 7323msgid "Shutdown for plugin `%s' complete\n"
7154msgstr "" 7324msgstr ""
@@ -7158,102 +7328,102 @@ msgstr ""
7158msgid "Maximum number of requests is %u\n" 7328msgid "Maximum number of requests is %u\n"
7159msgstr "" 7329msgstr ""
7160 7330
7161#: src/transport/plugin_transport_http_server.c:1727 7331#: src/transport/plugin_transport_http_server.c:1756
7162#, c-format 7332#, c-format
7163msgid "" 7333msgid ""
7164"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " 7334"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
7165"size %u\n" 7335"size %u\n"
7166msgstr "" 7336msgstr ""
7167 7337
7168#: src/transport/plugin_transport_http_server.c:1967 7338#: src/transport/plugin_transport_http_server.c:2028
7169#, c-format 7339#, c-format
7170msgid "Accepting connection (%u of %u) from `%s'\n" 7340msgid "Accepting connection (%u of %u) from `%s'\n"
7171msgstr "" 7341msgstr ""
7172 7342
7173#: src/transport/plugin_transport_http_server.c:1975 7343#: src/transport/plugin_transport_http_server.c:2036
7174#, c-format 7344#, c-format
7175msgid "" 7345msgid ""
7176"Server reached maximum number connections (%u), rejecting new connection\n" 7346"Server reached maximum number connections (%u), rejecting new connection\n"
7177msgstr "" 7347msgstr ""
7178 7348
7179#: src/transport/plugin_transport_http_server.c:2125 7349#: src/transport/plugin_transport_http_server.c:2186
7180msgid "" 7350msgid ""
7181"Could not create a new TLS certificate, program `gnunet-transport-" 7351"Could not create a new TLS certificate, program `gnunet-transport-"
7182"certificate-creation' could not be started!\n" 7352"certificate-creation' could not be started!\n"
7183msgstr "" 7353msgstr ""
7184 7354
7185#: src/transport/plugin_transport_http_server.c:2148 7355#: src/transport/plugin_transport_http_server.c:2209
7186#, c-format 7356#, c-format
7187msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" 7357msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
7188msgstr "" 7358msgstr ""
7189 7359
7190#: src/transport/plugin_transport_http_server.c:2275 7360#: src/transport/plugin_transport_http_server.c:2338
7191msgid "Could not load or create server certificate! Loading plugin failed!\n" 7361msgid "Could not load or create server certificate! Loading plugin failed!\n"
7192msgstr "" 7362msgstr ""
7193 7363
7194#: src/transport/plugin_transport_http_server.c:2587 7364#: src/transport/plugin_transport_http_server.c:2650
7195msgid "Require valid port number for service in configuration!\n" 7365msgid "Require valid port number for service in configuration!\n"
7196msgstr "" 7366msgstr ""
7197 7367
7198#: src/transport/plugin_transport_http_server.c:2752 7368#: src/transport/plugin_transport_http_server.c:2815
7199#, c-format 7369#, c-format
7200msgid "Found %u addresses to report to NAT service\n" 7370msgid "Found %u addresses to report to NAT service\n"
7201msgstr "" 7371msgstr ""
7202 7372
7203#: src/transport/plugin_transport_http_server.c:2838 7373#: src/transport/plugin_transport_http_server.c:2901
7204#: src/transport/plugin_transport_udp.c:3622 7374#: src/transport/plugin_transport_udp.c:3622
7205msgid "Disabling IPv6 since it is not supported on this system!\n" 7375msgid "Disabling IPv6 since it is not supported on this system!\n"
7206msgstr "" 7376msgstr ""
7207 7377
7208#: src/transport/plugin_transport_http_server.c:2944 7378#: src/transport/plugin_transport_http_server.c:3007
7209#, c-format 7379#, c-format
7210msgid "IPv4 support is %s\n" 7380msgid "IPv4 support is %s\n"
7211msgstr "Prise en charge d’IPv4 %s\n" 7381msgstr "Prise en charge d’IPv4 %s\n"
7212 7382
7213#: src/transport/plugin_transport_http_server.c:2959 7383#: src/transport/plugin_transport_http_server.c:3022
7214#, c-format 7384#, c-format
7215msgid "IPv6 support is %s\n" 7385msgid "IPv6 support is %s\n"
7216msgstr "Prise en charge d’IPv6 %s\n" 7386msgstr "Prise en charge d’IPv6 %s\n"
7217 7387
7218#: src/transport/plugin_transport_http_server.c:2965 7388#: src/transport/plugin_transport_http_server.c:3028
7219msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" 7389msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
7220msgstr "" 7390msgstr ""
7221 7391
7222#: src/transport/plugin_transport_http_server.c:2976 7392#: src/transport/plugin_transport_http_server.c:3039
7223msgid "Port is required! Fix in configuration\n" 7393msgid "Port is required! Fix in configuration\n"
7224msgstr "" 7394msgstr ""
7225 7395
7226#: src/transport/plugin_transport_http_server.c:2982 7396#: src/transport/plugin_transport_http_server.c:3045
7227#, c-format 7397#, c-format
7228msgid "Using port %u\n" 7398msgid "Using port %u\n"
7229msgstr "Utilisation du port %u\n" 7399msgstr "Utilisation du port %u\n"
7230 7400
7231#: src/transport/plugin_transport_http_server.c:3001 7401#: src/transport/plugin_transport_http_server.c:3064
7232#, c-format 7402#, c-format
7233msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" 7403msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
7234msgstr "" 7404msgstr ""
7235 7405
7236#: src/transport/plugin_transport_http_server.c:3036 7406#: src/transport/plugin_transport_http_server.c:3099
7237#, c-format 7407#, c-format
7238msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" 7408msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
7239msgstr "" 7409msgstr ""
7240 7410
7241#: src/transport/plugin_transport_http_server.c:3111 7411#: src/transport/plugin_transport_http_server.c:3174
7242#, c-format 7412#, c-format
7243msgid "Using external hostname `%s'\n" 7413msgid "Using external hostname `%s'\n"
7244msgstr "" 7414msgstr ""
7245 7415
7246#: src/transport/plugin_transport_http_server.c:3132 7416#: src/transport/plugin_transport_http_server.c:3195
7247#, c-format 7417#, c-format
7248msgid "Notifying transport only about hostname `%s'\n" 7418msgid "Notifying transport only about hostname `%s'\n"
7249msgstr "" 7419msgstr ""
7250 7420
7251#: src/transport/plugin_transport_http_server.c:3149 7421#: src/transport/plugin_transport_http_server.c:3212
7252#, c-format 7422#, c-format
7253msgid "Maximum number of connections is %u\n" 7423msgid "Maximum number of connections is %u\n"
7254msgstr "" 7424msgstr ""
7255 7425
7256#: src/transport/plugin_transport_http_server.c:3475 7426#: src/transport/plugin_transport_http_server.c:3538
7257msgid "Unable to compile URL regex\n" 7427msgid "Unable to compile URL regex\n"
7258msgstr "" 7428msgstr ""
7259 7429
@@ -7393,20 +7563,6 @@ msgstr ""
7393msgid "TCP transport advertises itself as being on port %llu\n" 7563msgid "TCP transport advertises itself as being on port %llu\n"
7394msgstr "" 7564msgstr ""
7395 7565
7396#: src/transport/plugin_transport_udp_broadcasting.c:168
7397msgid "# Multicast HELLO beacons received via UDP"
7398msgstr ""
7399
7400#: src/transport/plugin_transport_udp_broadcasting.c:548
7401msgid ""
7402"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7403msgstr ""
7404
7405#: src/transport/plugin_transport_udp_broadcasting.c:565
7406#, c-format
7407msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7408msgstr ""
7409
7410#: src/transport/plugin_transport_udp.c:3366 7566#: src/transport/plugin_transport_udp.c:3366
7411#, c-format 7567#, c-format
7412msgid "" 7568msgid ""
@@ -7453,6 +7609,20 @@ msgstr "adresse invalide"
7453msgid "Failed to create UDP network sockets\n" 7609msgid "Failed to create UDP network sockets\n"
7454msgstr "" 7610msgstr ""
7455 7611
7612#: src/transport/plugin_transport_udp_broadcasting.c:168
7613msgid "# Multicast HELLO beacons received via UDP"
7614msgstr ""
7615
7616#: src/transport/plugin_transport_udp_broadcasting.c:548
7617msgid ""
7618"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7619msgstr ""
7620
7621#: src/transport/plugin_transport_udp_broadcasting.c:565
7622#, c-format
7623msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7624msgstr ""
7625
7456#: src/transport/plugin_transport_unix.c:1403 7626#: src/transport/plugin_transport_unix.c:1403
7457#, c-format 7627#, c-format
7458msgid "Cannot create path to `%s'\n" 7628msgid "Cannot create path to `%s'\n"
@@ -7557,7 +7727,7 @@ msgid ""
7557"`GNUNET_SERVER_receive_done' after %s\n" 7727"`GNUNET_SERVER_receive_done' after %s\n"
7558msgstr "" 7728msgstr ""
7559 7729
7560#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 7730#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
7561#, c-format 7731#, c-format
7562msgid "Unknown address family %d\n" 7732msgid "Unknown address family %d\n"
7563msgstr "" 7733msgstr ""
@@ -7602,50 +7772,50 @@ msgstr ""
7602msgid "Service `%s' runs at %s\n" 7772msgid "Service `%s' runs at %s\n"
7603msgstr "" 7773msgstr ""
7604 7774
7605#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 7775#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
7606msgid "Service process failed to initialize\n" 7776msgid "Service process failed to initialize\n"
7607msgstr "" 7777msgstr ""
7608 7778
7609#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 7779#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
7610msgid "Service process could not initialize server function\n" 7780msgid "Service process could not initialize server function\n"
7611msgstr "" 7781msgstr ""
7612 7782
7613#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 7783#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
7614msgid "Service process failed to report status\n" 7784msgid "Service process failed to report status\n"
7615msgstr "" 7785msgstr ""
7616 7786
7617#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 7787#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
7618#: src/util/service.c:1379 7788#: src/util/service.c:1378
7619#, c-format 7789#, c-format
7620msgid "Cannot obtain information about user `%s': %s\n" 7790msgid "Cannot obtain information about user `%s': %s\n"
7621msgstr "" 7791msgstr ""
7622 7792
7623#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 7793#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
7624msgid "No such user" 7794msgid "No such user"
7625msgstr "Aucun utilisateur trouvé" 7795msgstr "Aucun utilisateur trouvé"
7626 7796
7627#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 7797#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
7628#, c-format 7798#, c-format
7629msgid "Cannot change user/group to `%s': %s\n" 7799msgid "Cannot change user/group to `%s': %s\n"
7630msgstr "" 7800msgstr ""
7631 7801
7632#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 7802#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
7633msgid "do daemonize (detach from terminal)" 7803msgid "do daemonize (detach from terminal)"
7634msgstr "" 7804msgstr ""
7635 7805
7636#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 7806#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
7637#: src/util/service.c:1791 7807#: src/util/service.c:1790
7638#, c-format 7808#, c-format
7639msgid "Malformed configuration file `%s', exit ...\n" 7809msgid "Malformed configuration file `%s', exit ...\n"
7640msgstr "" 7810msgstr ""
7641 7811
7642#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 7812#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
7643#: src/util/service.c:1802 7813#: src/util/service.c:1801
7644msgid "Malformed configuration, exit ...\n" 7814msgid "Malformed configuration, exit ...\n"
7645msgstr "" 7815msgstr ""
7646 7816
7647#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 7817#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
7648#: src/util/service.c:1808 7818#: src/util/service.c:1807
7649#, c-format 7819#, c-format
7650msgid "Could not access configuration file `%s'\n" 7820msgid "Could not access configuration file `%s'\n"
7651msgstr "" 7821msgstr ""
@@ -7689,86 +7859,86 @@ msgstr ""
7689msgid "Need a non-empty hostname for service `%s'.\n" 7859msgid "Need a non-empty hostname for service `%s'.\n"
7690msgstr "" 7860msgstr ""
7691 7861
7692#: src/util/common_logging.c:256 src/util/common_logging.c:1129 7862#: src/util/common_logging.c:259 src/util/common_logging.c:1132
7693msgid "DEBUG" 7863msgid "DEBUG"
7694msgstr "DEBUG" 7864msgstr "DEBUG"
7695 7865
7696#: src/util/common_logging.c:258 src/util/common_logging.c:1127 7866#: src/util/common_logging.c:261 src/util/common_logging.c:1130
7697msgid "INFO" 7867msgid "INFO"
7698msgstr "INFO" 7868msgstr "INFO"
7699 7869
7700#: src/util/common_logging.c:260 src/util/common_logging.c:1125 7870#: src/util/common_logging.c:263 src/util/common_logging.c:1128
7701msgid "MESSAGE" 7871msgid "MESSAGE"
7702msgstr "" 7872msgstr ""
7703 7873
7704#: src/util/common_logging.c:262 src/util/common_logging.c:1123 7874#: src/util/common_logging.c:265 src/util/common_logging.c:1126
7705msgid "WARNING" 7875msgid "WARNING"
7706msgstr "AVERTISSEMENT" 7876msgstr "AVERTISSEMENT"
7707 7877
7708#: src/util/common_logging.c:264 src/util/common_logging.c:1121 7878#: src/util/common_logging.c:267 src/util/common_logging.c:1124
7709msgid "ERROR" 7879msgid "ERROR"
7710msgstr "ERREUR" 7880msgstr "ERREUR"
7711 7881
7712#: src/util/common_logging.c:266 src/util/common_logging.c:1131 7882#: src/util/common_logging.c:269 src/util/common_logging.c:1134
7713msgid "NONE" 7883msgid "NONE"
7714msgstr "AUCUN" 7884msgstr "AUCUN"
7715 7885
7716#: src/util/common_logging.c:879 7886#: src/util/common_logging.c:882
7717#, c-format 7887#, c-format
7718msgid "Message `%.*s' repeated %u times in the last %s\n" 7888msgid "Message `%.*s' repeated %u times in the last %s\n"
7719msgstr "" 7889msgstr ""
7720 7890
7721#: src/util/common_logging.c:1132 7891#: src/util/common_logging.c:1135
7722msgid "INVALID" 7892msgid "INVALID"
7723msgstr "INVALIDE" 7893msgstr "INVALIDE"
7724 7894
7725#: src/util/common_logging.c:1302 7895#: src/util/common_logging.c:1326
7726msgid "unknown address" 7896msgid "unknown address"
7727msgstr "adresse inconnue" 7897msgstr "adresse inconnue"
7728 7898
7729#: src/util/common_logging.c:1344 7899#: src/util/common_logging.c:1368
7730msgid "invalid address" 7900msgid "invalid address"
7731msgstr "adresse invalide" 7901msgstr "adresse invalide"
7732 7902
7733#: src/util/common_logging.c:1362 7903#: src/util/common_logging.c:1386
7734#, c-format 7904#, c-format
7735msgid "Configuration fails to specify option `%s' in section `%s'!\n" 7905msgid "Configuration fails to specify option `%s' in section `%s'!\n"
7736msgstr "" 7906msgstr ""
7737 7907
7738#: src/util/common_logging.c:1383 7908#: src/util/common_logging.c:1407
7739#, c-format 7909#, c-format
7740msgid "" 7910msgid ""
7741"Configuration specifies invalid value for option `%s' in section `%s': %s\n" 7911"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
7742msgstr "" 7912msgstr ""
7743 7913
7744#: src/util/configuration.c:286 7914#: src/util/configuration.c:296
7745#, c-format 7915#, c-format
7746msgid "Syntax error while deserializing in line %u\n" 7916msgid "Syntax error while deserializing in line %u\n"
7747msgstr "" 7917msgstr ""
7748 7918
7749#: src/util/configuration.c:344 7919#: src/util/configuration.c:355
7750#, fuzzy, c-format 7920#, fuzzy, c-format
7751msgid "Error while reading file `%s'\n" 7921msgid "Error while reading file `%s'\n"
7752msgstr "Erreur de lecture : « %s » : %s" 7922msgstr "Erreur de lecture : « %s » : %s"
7753 7923
7754#: src/util/configuration.c:1017 7924#: src/util/configuration.c:1034
7755#, c-format 7925#, c-format
7756msgid "" 7926msgid ""
7757"Configuration value '%s' for '%s' in section '%s' is not in set of legal " 7927"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
7758"choices\n" 7928"choices\n"
7759msgstr "" 7929msgstr ""
7760 7930
7761#: src/util/configuration.c:1136 7931#: src/util/configuration.c:1153
7762#, c-format 7932#, c-format
7763msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" 7933msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
7764msgstr "" 7934msgstr ""
7765 7935
7766#: src/util/configuration.c:1169 7936#: src/util/configuration.c:1186
7767#, c-format 7937#, c-format
7768msgid "Missing closing `%s' in option `%s'\n" 7938msgid "Missing closing `%s' in option `%s'\n"
7769msgstr "" 7939msgstr ""
7770 7940
7771#: src/util/configuration.c:1237 7941#: src/util/configuration.c:1254
7772#, c-format 7942#, c-format
7773msgid "" 7943msgid ""
7774"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " 7944"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -7802,31 +7972,31 @@ msgstr ""
7802msgid "EdDSA signature verification failed at %s:%d: %s\n" 7972msgid "EdDSA signature verification failed at %s:%d: %s\n"
7803msgstr "" 7973msgstr ""
7804 7974
7805#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 7975#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
7806#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 7976#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
7807#, c-format 7977#, c-format
7808msgid "Could not acquire lock on file `%s': %s...\n" 7978msgid "Could not acquire lock on file `%s': %s...\n"
7809msgstr "" 7979msgstr ""
7810 7980
7811#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 7981#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
7812msgid "Creating a new private key. This may take a while.\n" 7982msgid "Creating a new private key. This may take a while.\n"
7813msgstr "" 7983msgstr ""
7814 7984
7815#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 7985#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
7816msgid "This may be ok if someone is currently generating a private key.\n" 7986msgid "This may be ok if someone is currently generating a private key.\n"
7817msgstr "" 7987msgstr ""
7818 7988
7819#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 7989#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
7820#, c-format 7990#, c-format
7821msgid "" 7991msgid ""
7822"When trying to read key file `%s' I found %u bytes but I need at least %u.\n" 7992"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
7823msgstr "" 7993msgstr ""
7824 7994
7825#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 7995#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
7826msgid "This may be ok if someone is currently generating a key.\n" 7996msgid "This may be ok if someone is currently generating a key.\n"
7827msgstr "" 7997msgstr ""
7828 7998
7829#: src/util/crypto_ecc_setup.c:413 7999#: src/util/crypto_ecc_setup.c:415
7830msgid "Could not load peer's private key\n" 8000msgid "Could not load peer's private key\n"
7831msgstr "" 8001msgstr ""
7832 8002
@@ -8014,29 +8184,29 @@ msgstr ""
8014msgid "Manipulate GNUnet configuration files" 8184msgid "Manipulate GNUnet configuration files"
8015msgstr "" 8185msgstr ""
8016 8186
8017#: src/util/gnunet-ecc.c:84 8187#: src/util/gnunet-ecc.c:89
8018#, c-format 8188#, c-format
8019msgid "Failed to open `%s': %s\n" 8189msgid "Failed to open `%s': %s\n"
8020msgstr "" 8190msgstr ""
8021 8191
8022#: src/util/gnunet-ecc.c:120 8192#: src/util/gnunet-ecc.c:125
8023#, c-format 8193#, c-format
8024msgid "Generating %u keys like %s, please wait" 8194msgid "Generating %u keys like %s, please wait"
8025msgstr "" 8195msgstr ""
8026 8196
8027#: src/util/gnunet-ecc.c:133 8197#: src/util/gnunet-ecc.c:138
8028#, c-format 8198#, c-format
8029msgid "Generating %u keys, please wait" 8199msgid "Generating %u keys, please wait"
8030msgstr "" 8200msgstr ""
8031 8201
8032#: src/util/gnunet-ecc.c:174 8202#: src/util/gnunet-ecc.c:179
8033#, c-format 8203#, c-format
8034msgid "" 8204msgid ""
8035"\n" 8205"\n"
8036"Failed to write to `%s': %s\n" 8206"Failed to write to `%s': %s\n"
8037msgstr "" 8207msgstr ""
8038 8208
8039#: src/util/gnunet-ecc.c:184 8209#: src/util/gnunet-ecc.c:189
8040#, c-format 8210#, c-format
8041msgid "" 8211msgid ""
8042"\n" 8212"\n"
@@ -8045,53 +8215,57 @@ msgstr ""
8045"\n" 8215"\n"
8046"Terminé !\n" 8216"Terminé !\n"
8047 8217
8048#: src/util/gnunet-ecc.c:187 8218#: src/util/gnunet-ecc.c:192
8049#, c-format 8219#, c-format
8050msgid "" 8220msgid ""
8051"\n" 8221"\n"
8052"Error, %u keys not generated\n" 8222"Error, %u keys not generated\n"
8053msgstr "" 8223msgstr ""
8054 8224
8055#: src/util/gnunet-ecc.c:280 8225#: src/util/gnunet-ecc.c:283
8056#, c-format 8226#, c-format
8057msgid "Hostkeys file `%s' not found\n" 8227msgid "Hostkeys file `%s' not found\n"
8058msgstr "" 8228msgstr ""
8059 8229
8060#: src/util/gnunet-ecc.c:291 8230#: src/util/gnunet-ecc.c:294
8061#, c-format 8231#, c-format
8062msgid "Hostkeys file `%s' is empty\n" 8232msgid "Hostkeys file `%s' is empty\n"
8063msgstr "" 8233msgstr ""
8064 8234
8065#: src/util/gnunet-ecc.c:313 8235#: src/util/gnunet-ecc.c:316
8066#, c-format 8236#, c-format
8067msgid "Could not read hostkey file: %s\n" 8237msgid "Could not read hostkey file: %s\n"
8068msgstr "" 8238msgstr ""
8069 8239
8070#: src/util/gnunet-ecc.c:364 8240#: src/util/gnunet-ecc.c:367
8071msgid "No hostkey file specified on command line\n" 8241msgid "No hostkey file specified on command line\n"
8072msgstr "" 8242msgstr ""
8073 8243
8074#: src/util/gnunet-ecc.c:416 8244#: src/util/gnunet-ecc.c:425
8075msgid "list keys included in a file (for testing)" 8245msgid "list keys included in a file (for testing)"
8076msgstr "" 8246msgstr ""
8077 8247
8078#: src/util/gnunet-ecc.c:421 8248#: src/util/gnunet-ecc.c:430
8079msgid "number of keys to list included in a file (for testing)" 8249msgid "number of keys to list included in a file (for testing)"
8080msgstr "" 8250msgstr ""
8081 8251
8082#: src/util/gnunet-ecc.c:426 8252#: src/util/gnunet-ecc.c:435
8083msgid "create COUNT public-private key pairs (for testing)" 8253msgid "create COUNT public-private key pairs (for testing)"
8084msgstr "" 8254msgstr ""
8085 8255
8086#: src/util/gnunet-ecc.c:430 8256#: src/util/gnunet-ecc.c:439
8087msgid "print the public key in ASCII format" 8257msgid "print the public key in ASCII format"
8088msgstr "" 8258msgstr ""
8089 8259
8090#: src/util/gnunet-ecc.c:434 8260#: src/util/gnunet-ecc.c:443
8261msgid "print the public key in HEX format"
8262msgstr ""
8263
8264#: src/util/gnunet-ecc.c:447
8091msgid "print examples of ECC operations (used for compatibility testing)" 8265msgid "print examples of ECC operations (used for compatibility testing)"
8092msgstr "" 8266msgstr ""
8093 8267
8094#: src/util/gnunet-ecc.c:449 8268#: src/util/gnunet-ecc.c:463
8095msgid "Manipulate GNUnet private ECC key files" 8269msgid "Manipulate GNUnet private ECC key files"
8096msgstr "" 8270msgstr ""
8097 8271
@@ -8183,7 +8357,7 @@ msgstr ""
8183msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8357msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8184msgstr "" 8358msgstr ""
8185 8359
8186#: src/util/network.c:1793 src/util/network.c:1969 8360#: src/util/network.c:1793 src/util/network.c:1977
8187#, c-format 8361#, c-format
8188msgid "" 8362msgid ""
8189"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8363"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8235,7 +8409,7 @@ msgstr ""
8235msgid "Could not determine plugin installation path.\n" 8409msgid "Could not determine plugin installation path.\n"
8236msgstr "" 8410msgstr ""
8237 8411
8238#: src/util/resolver_api.c:204 8412#: src/util/resolver_api.c:203
8239#, c-format 8413#, c-format
8240msgid "" 8414msgid ""
8241"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" 8415"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8248,32 +8422,32 @@ msgid ""
8248"resolution will be unavailable.\n" 8422"resolution will be unavailable.\n"
8249msgstr "" 8423msgstr ""
8250 8424
8251#: src/util/resolver_api.c:815 8425#: src/util/resolver_api.c:826
8252#, c-format 8426#, c-format
8253msgid "Timeout trying to resolve hostname `%s'.\n" 8427msgid "Timeout trying to resolve hostname `%s'.\n"
8254msgstr "" 8428msgstr ""
8255 8429
8256#: src/util/resolver_api.c:827 8430#: src/util/resolver_api.c:839
8257#, c-format 8431#, c-format
8258msgid "Timeout trying to resolve IP address `%s'.\n" 8432msgid "Timeout trying to resolve IP address `%s'.\n"
8259msgstr "" 8433msgstr ""
8260 8434
8261#: src/util/resolver_api.c:1004 8435#: src/util/resolver_api.c:1023
8262msgid "Resolver not configured correctly.\n" 8436msgid "Resolver not configured correctly.\n"
8263msgstr "" 8437msgstr ""
8264 8438
8265#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 8439#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
8266#: src/util/resolver_api.c:1121 8440#: src/util/resolver_api.c:1146
8267#, fuzzy, c-format 8441#, fuzzy, c-format
8268msgid "Could not resolve our FQDN: %s\n" 8442msgid "Could not resolve our FQDN: %s\n"
8269msgstr "Résolution de « %s » échouée : %s\n" 8443msgstr "Résolution de « %s » échouée : %s\n"
8270 8444
8271#: src/util/service.c:1306 8445#: src/util/service.c:1305
8272msgid "" 8446msgid ""
8273"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8447"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8274msgstr "" 8448msgstr ""
8275 8449
8276#: src/util/service.c:2082 8450#: src/util/service.c:2081
8277#, c-format 8451#, c-format
8278msgid "" 8452msgid ""
8279"Processing code for message of type %u did not call " 8453"Processing code for message of type %u did not call "
@@ -8348,63 +8522,63 @@ msgstr "jours"
8348msgid "end of time" 8522msgid "end of time"
8349msgstr "fin du temps" 8523msgstr "fin du temps"
8350 8524
8351#: src/util/strings.c:1269 8525#: src/util/strings.c:1270
8352msgid "IPv6 address did not start with `['\n" 8526msgid "IPv6 address did not start with `['\n"
8353msgstr "" 8527msgstr ""
8354 8528
8355#: src/util/strings.c:1277 8529#: src/util/strings.c:1278
8356msgid "IPv6 address did contain ':' to separate port number\n" 8530msgid "IPv6 address did contain ':' to separate port number\n"
8357msgstr "" 8531msgstr ""
8358 8532
8359#: src/util/strings.c:1283 8533#: src/util/strings.c:1284
8360msgid "IPv6 address did contain ']' before ':' to separate port number\n" 8534msgid "IPv6 address did contain ']' before ':' to separate port number\n"
8361msgstr "" 8535msgstr ""
8362 8536
8363#: src/util/strings.c:1290 8537#: src/util/strings.c:1291
8364msgid "IPv6 address did contain a valid port number after the last ':'\n" 8538msgid "IPv6 address did contain a valid port number after the last ':'\n"
8365msgstr "" 8539msgstr ""
8366 8540
8367#: src/util/strings.c:1299 8541#: src/util/strings.c:1300
8368#, c-format 8542#, c-format
8369msgid "Invalid IPv6 address `%s': %s\n" 8543msgid "Invalid IPv6 address `%s': %s\n"
8370msgstr "" 8544msgstr ""
8371 8545
8372#: src/util/strings.c:1571 src/util/strings.c:1587 8546#: src/util/strings.c:1572 src/util/strings.c:1588
8373msgid "Port not in range\n" 8547msgid "Port not in range\n"
8374msgstr "" 8548msgstr ""
8375 8549
8376#: src/util/strings.c:1596 8550#: src/util/strings.c:1597
8377#, c-format 8551#, c-format
8378msgid "Malformed port policy `%s'\n" 8552msgid "Malformed port policy `%s'\n"
8379msgstr "" 8553msgstr ""
8380 8554
8381#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 8555#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
8382#: src/util/strings.c:1779 8556#: src/util/strings.c:1780
8383#, c-format 8557#, c-format
8384msgid "Invalid format for IP: `%s'\n" 8558msgid "Invalid format for IP: `%s'\n"
8385msgstr "" 8559msgstr ""
8386 8560
8387#: src/util/strings.c:1736 8561#: src/util/strings.c:1737
8388#, c-format 8562#, c-format
8389msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." 8563msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
8390msgstr "" 8564msgstr ""
8391 8565
8392#: src/util/strings.c:1788 8566#: src/util/strings.c:1789
8393#, c-format 8567#, c-format
8394msgid "Invalid format: `%s'\n" 8568msgid "Invalid format: `%s'\n"
8395msgstr "fornat invalide : « %s »\n" 8569msgstr "fornat invalide : « %s »\n"
8396 8570
8397#: src/util/strings.c:1840 8571#: src/util/strings.c:1841
8398#, c-format 8572#, c-format
8399msgid "Invalid network notation (does not end with ';': `%s')\n" 8573msgid "Invalid network notation (does not end with ';': `%s')\n"
8400msgstr "" 8574msgstr ""
8401 8575
8402#: src/util/strings.c:1890 8576#: src/util/strings.c:1891
8403#, c-format 8577#, c-format
8404msgid "Wrong format `%s' for netmask\n" 8578msgid "Wrong format `%s' for netmask\n"
8405msgstr "" 8579msgstr ""
8406 8580
8407#: src/util/strings.c:1921 8581#: src/util/strings.c:1922
8408#, c-format 8582#, c-format
8409msgid "Wrong format `%s' for network\n" 8583msgid "Wrong format `%s' for network\n"
8410msgstr "" 8584msgstr ""
@@ -8573,26 +8747,30 @@ msgstr ""
8573msgid "Setup tunnels via VPN." 8747msgid "Setup tunnels via VPN."
8574msgstr "Configurer des tunnels via VPN." 8748msgstr "Configurer des tunnels via VPN."
8575 8749
8576#: src/zonemaster/gnunet-service-zonemaster.c:705 8750#: src/zonemaster/gnunet-service-zonemaster.c:706
8577msgid "Failed to connect to the namestore!\n" 8751msgid "Failed to connect to the namestore!\n"
8578msgstr "" 8752msgstr ""
8579 8753
8580#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 8754#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
8581#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 8755#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
8582#, c-format 8756#, c-format
8583msgid "Assertion failed at %s:%d.\n" 8757msgid "Assertion failed at %s:%d.\n"
8584msgstr "" 8758msgstr ""
8585 8759
8586#: src/include/gnunet_common.h:711 8760#: src/include/gnunet_common.h:726
8587#, c-format 8761#, c-format
8588msgid "External protocol violation detected at %s:%d.\n" 8762msgid "External protocol violation detected at %s:%d.\n"
8589msgstr "" 8763msgstr ""
8590 8764
8591#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 8765#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
8592#, c-format 8766#, c-format
8593msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" 8767msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
8594msgstr "" 8768msgstr ""
8595 8769
8770#, fuzzy
8771#~ msgid "Unable to connect to Postgres database '%s': %s\n"
8772#~ msgstr "Résolution de « %s » échouée\n"
8773
8596#~ msgid "ARM API is busy" 8774#~ msgid "ARM API is busy"
8597#~ msgstr "API ARM occupé" 8775#~ msgstr "API ARM occupé"
8598 8776
@@ -8670,10 +8848,6 @@ msgstr ""
8670#~ msgid "Failed to start resolver!\n" 8848#~ msgid "Failed to start resolver!\n"
8671#~ msgstr "Échec du démarrage de %s\n" 8849#~ msgstr "Échec du démarrage de %s\n"
8672 8850
8673#, fuzzy
8674#~ msgid "Failed to start NAT test for plugin `%s'\n"
8675#~ msgstr "Résolution de « %s » échouée\n"
8676
8677#~ msgid "Benchmarking done\n" 8851#~ msgid "Benchmarking done\n"
8678#~ msgstr "Benchmark terminé\n" 8852#~ msgstr "Benchmark terminé\n"
8679 8853
diff --git a/po/sv.po b/po/sv.po
index 3120e6594..f03bfb2b9 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: GNUnet 0.7.0b\n" 8"Project-Id-Version: GNUnet 0.7.0b\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2017-03-31 19:22-0500\n" 10"POT-Creation-Date: 2017-10-20 15:14+0000\n"
11"PO-Revision-Date: 2006-01-21 17:16+0100\n" 11"PO-Revision-Date: 2006-01-21 17:16+0100\n"
12"Last-Translator: Daniel Nylander <po@danielnylander.se>\n" 12"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" 13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -273,7 +273,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
273msgstr "" 273msgstr ""
274 274
275#: src/arm/gnunet-service-arm.c:513 275#: src/arm/gnunet-service-arm.c:513
276#: src/transport/plugin_transport_http_server.c:2621 276#: src/transport/plugin_transport_http_server.c:2684
277#: src/transport/plugin_transport_tcp.c:1259 277#: src/transport/plugin_transport_tcp.c:1259
278#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 278#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
279#, fuzzy, c-format 279#, fuzzy, c-format
@@ -281,7 +281,7 @@ msgid "Failed to resolve `%s': %s\n"
281msgstr "Misslyckades att leverera \"%s\" meddelande.\n" 281msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
282 282
283#: src/arm/gnunet-service-arm.c:532 283#: src/arm/gnunet-service-arm.c:532
284#: src/transport/plugin_transport_http_server.c:2639 284#: src/transport/plugin_transport_http_server.c:2702
285#: src/transport/plugin_transport_tcp.c:1278 285#: src/transport/plugin_transport_tcp.c:1278
286#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 286#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
287#, fuzzy, c-format 287#, fuzzy, c-format
@@ -355,134 +355,14 @@ msgstr ""
355msgid "Initiating shutdown as requested by client.\n" 355msgid "Initiating shutdown as requested by client.\n"
356msgstr "" 356msgstr ""
357 357
358#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 358#: src/ats-tests/ats-testing-log.c:837
359#, c-format 359msgid "Stop logging\n"
360msgid ""
361"Could not load quota for network `%s': `%s', assigning default bandwidth "
362"%llu\n"
363msgstr ""
364
365#: src/ats/gnunet-ats-solver-eval.c:2799
366#, c-format
367msgid ""
368"No outbound quota configured for network `%s', assigning default bandwidth "
369"%llu\n"
370msgstr ""
371
372#: src/ats/gnunet-ats-solver-eval.c:2840
373#, c-format
374msgid ""
375"No outbound quota configure for network `%s', assigning default bandwidth "
376"%llu\n"
377msgstr ""
378
379#: src/ats/gnunet-ats-solver-eval.c:3294
380#: src/ats-tests/gnunet-solver-eval.c:939
381msgid "solver to use"
382msgstr ""
383
384#: src/ats/gnunet-ats-solver-eval.c:3299
385#: src/ats-tests/gnunet-solver-eval.c:945
386#: src/ats-tests/gnunet-solver-eval.c:950
387msgid "experiment to use"
388msgstr ""
389
390#: src/ats/gnunet-ats-solver-eval.c:3306
391#, fuzzy
392msgid "print logging"
393msgstr "Startade samling \"%s\".\n"
394
395#: src/ats/gnunet-ats-solver-eval.c:3311
396msgid "save logging to disk"
397msgstr ""
398
399#: src/ats/gnunet-ats-solver-eval.c:3316
400msgid "disable normalization"
401msgstr ""
402
403#: src/ats/gnunet-service-ats_plugins.c:304
404#, c-format
405msgid ""
406"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
407"%llu\n"
408msgstr ""
409
410#: src/ats/gnunet-service-ats_plugins.c:314
411#, c-format
412msgid "%s quota configured for network `%s' is %llu\n"
413msgstr ""
414
415#: src/ats/gnunet-service-ats_plugins.c:359
416#, c-format
417msgid ""
418"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
419msgstr ""
420
421#: src/ats/gnunet-service-ats_plugins.c:451
422#, fuzzy, c-format
423msgid "Failed to initialize solver `%s'!\n"
424msgstr "Kunde inte initiera SQLite.\n"
425
426#: src/ats/plugin_ats_mlp.c:1274
427msgid "Problem size too large, cannot allocate memory!\n"
428msgstr ""
429
430#: src/ats/plugin_ats_mlp.c:1869
431#, fuzzy, c-format
432msgid "Adding address for peer `%s' multiple times\n"
433msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
434
435#: src/ats/plugin_ats_mlp.c:1913
436#, fuzzy, c-format
437msgid "Updating address property for peer `%s' %p not added before\n"
438msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
439
440#: src/ats/plugin_ats_mlp.c:2475
441msgid ""
442"MLP solver is not optimizing for anything, changing to feasibility check\n"
443msgstr ""
444
445#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
446#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
447#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
448#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
449#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
450#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
451#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
452#, fuzzy, c-format
453msgid "Invalid %s configuration %f \n"
454msgstr "Kunde inte spara konfigurationsfil \"%s\":"
455
456#: src/ats/plugin_ats_mlp.c:2670
457#, c-format
458msgid ""
459"Adjusting inconsistent outbound quota configuration for network `%s', is "
460"%llu must be at least %llu\n"
461msgstr ""
462
463#: src/ats/plugin_ats_mlp.c:2679
464#, c-format
465msgid ""
466"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
467"must be at least %llu\n"
468msgstr ""
469
470#: src/ats/plugin_ats_mlp.c:2689
471#, c-format
472msgid ""
473"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
474msgstr ""
475
476#: src/ats/plugin_ats_mlp.c:2698
477#, c-format
478msgid ""
479"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
480msgstr "" 360msgstr ""
481 361
482#: src/ats/plugin_ats_proportional.c:1164 362#: src/ats-tests/ats-testing-log.c:892
483#, fuzzy, c-format 363#, fuzzy, c-format
484msgid "Invalid %s configuration %f\n" 364msgid "Start logging `%s'\n"
485msgstr "Kunde inte spara konfigurationsfil \"%s\":" 365msgstr "Startade samling \"%s\".\n"
486 366
487#: src/ats-tests/ats-testing.c:422 367#: src/ats-tests/ats-testing.c:422
488#, c-format 368#, c-format
@@ -494,15 +374,6 @@ msgstr ""
494msgid "Failed to connect master peer [%u] with slave [%u]\n" 374msgid "Failed to connect master peer [%u] with slave [%u]\n"
495msgstr "Misslyckades att ansluta till gnunetd.\n" 375msgstr "Misslyckades att ansluta till gnunetd.\n"
496 376
497#: src/ats-tests/ats-testing-log.c:837
498msgid "Stop logging\n"
499msgstr ""
500
501#: src/ats-tests/ats-testing-log.c:892
502#, fuzzy, c-format
503msgid "Start logging `%s'\n"
504msgstr "Startade samling \"%s\".\n"
505
506#: src/ats-tests/gnunet-ats-sim.c:90 377#: src/ats-tests/gnunet-ats-sim.c:90
507#, c-format 378#, c-format
508msgid "" 379msgid ""
@@ -510,6 +381,15 @@ msgid ""
510"= %u KiB/s\n" 381"= %u KiB/s\n"
511msgstr "" 382msgstr ""
512 383
384#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
385msgid "solver to use"
386msgstr ""
387
388#: src/ats-tests/gnunet-solver-eval.c:945
389#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
390msgid "experiment to use"
391msgstr ""
392
513#: src/ats-tool/gnunet-ats.c:307 393#: src/ats-tool/gnunet-ats.c:307
514#, c-format 394#, c-format
515msgid "%u address resolutions had a timeout\n" 395msgid "%u address resolutions had a timeout\n"
@@ -631,6 +511,124 @@ msgstr ""
631msgid "Print information about ATS state" 511msgid "Print information about ATS state"
632msgstr "Skriv ut information om GNUnets motparter." 512msgstr "Skriv ut information om GNUnets motparter."
633 513
514#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
515#, c-format
516msgid ""
517"Could not load quota for network `%s': `%s', assigning default bandwidth "
518"%llu\n"
519msgstr ""
520
521#: src/ats/gnunet-ats-solver-eval.c:2799
522#, c-format
523msgid ""
524"No outbound quota configured for network `%s', assigning default bandwidth "
525"%llu\n"
526msgstr ""
527
528#: src/ats/gnunet-ats-solver-eval.c:2840
529#, c-format
530msgid ""
531"No outbound quota configure for network `%s', assigning default bandwidth "
532"%llu\n"
533msgstr ""
534
535#: src/ats/gnunet-ats-solver-eval.c:3306
536#, fuzzy
537msgid "print logging"
538msgstr "Startade samling \"%s\".\n"
539
540#: src/ats/gnunet-ats-solver-eval.c:3311
541msgid "save logging to disk"
542msgstr ""
543
544#: src/ats/gnunet-ats-solver-eval.c:3316
545msgid "disable normalization"
546msgstr ""
547
548#: src/ats/gnunet-service-ats_plugins.c:304
549#, c-format
550msgid ""
551"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
552"%llu\n"
553msgstr ""
554
555#: src/ats/gnunet-service-ats_plugins.c:314
556#, c-format
557msgid "%s quota configured for network `%s' is %llu\n"
558msgstr ""
559
560#: src/ats/gnunet-service-ats_plugins.c:359
561#, c-format
562msgid ""
563"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
564msgstr ""
565
566#: src/ats/gnunet-service-ats_plugins.c:451
567#, fuzzy, c-format
568msgid "Failed to initialize solver `%s'!\n"
569msgstr "Kunde inte initiera SQLite.\n"
570
571#: src/ats/plugin_ats_mlp.c:1274
572msgid "Problem size too large, cannot allocate memory!\n"
573msgstr ""
574
575#: src/ats/plugin_ats_mlp.c:1869
576#, fuzzy, c-format
577msgid "Adding address for peer `%s' multiple times\n"
578msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
579
580#: src/ats/plugin_ats_mlp.c:1913
581#, fuzzy, c-format
582msgid "Updating address property for peer `%s' %p not added before\n"
583msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
584
585#: src/ats/plugin_ats_mlp.c:2475
586msgid ""
587"MLP solver is not optimizing for anything, changing to feasibility check\n"
588msgstr ""
589
590#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
591#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
592#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
593#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
594#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
595#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
596#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
597#, fuzzy, c-format
598msgid "Invalid %s configuration %f \n"
599msgstr "Kunde inte spara konfigurationsfil \"%s\":"
600
601#: src/ats/plugin_ats_mlp.c:2670
602#, c-format
603msgid ""
604"Adjusting inconsistent outbound quota configuration for network `%s', is "
605"%llu must be at least %llu\n"
606msgstr ""
607
608#: src/ats/plugin_ats_mlp.c:2679
609#, c-format
610msgid ""
611"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
612"must be at least %llu\n"
613msgstr ""
614
615#: src/ats/plugin_ats_mlp.c:2689
616#, c-format
617msgid ""
618"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
619msgstr ""
620
621#: src/ats/plugin_ats_mlp.c:2698
622#, c-format
623msgid ""
624"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
625msgstr ""
626
627#: src/ats/plugin_ats_proportional.c:1164
628#, fuzzy, c-format
629msgid "Invalid %s configuration %f\n"
630msgstr "Kunde inte spara konfigurationsfil \"%s\":"
631
634#: src/auction/gnunet-auction-create.c:163 632#: src/auction/gnunet-auction-create.c:163
635msgid "description of the item to be sold" 633msgid "description of the item to be sold"
636msgstr "" 634msgstr ""
@@ -779,6 +777,28 @@ msgstr ""
779msgid "Connection to conversation service lost, trying to reconnect\n" 777msgid "Connection to conversation service lost, trying to reconnect\n"
780msgstr "" 778msgstr ""
781 779
780#: src/conversation/gnunet-conversation-test.c:119
781#, c-format
782msgid ""
783"\n"
784"End of transmission. Have a GNU day.\n"
785msgstr ""
786
787#: src/conversation/gnunet-conversation-test.c:145
788#, c-format
789msgid ""
790"\n"
791"We are now playing your recording back. If you can hear it, your audio "
792"settings are working..."
793msgstr ""
794
795#: src/conversation/gnunet-conversation-test.c:210
796#, c-format
797msgid ""
798"We will now be recording you for %s. After that time, the recording will be "
799"played back to you..."
800msgstr ""
801
782#: src/conversation/gnunet-conversation.c:269 802#: src/conversation/gnunet-conversation.c:269
783#, c-format 803#, c-format
784msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" 804msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1036,30 +1056,8 @@ msgstr ""
1036msgid "Enables having a conversation with other GNUnet users." 1056msgid "Enables having a conversation with other GNUnet users."
1037msgstr "" 1057msgstr ""
1038 1058
1039#: src/conversation/gnunet-conversation-test.c:119
1040#, c-format
1041msgid ""
1042"\n"
1043"End of transmission. Have a GNU day.\n"
1044msgstr ""
1045
1046#: src/conversation/gnunet-conversation-test.c:145
1047#, c-format
1048msgid ""
1049"\n"
1050"We are now playing your recording back. If you can hear it, your audio "
1051"settings are working..."
1052msgstr ""
1053
1054#: src/conversation/gnunet-conversation-test.c:210
1055#, c-format
1056msgid ""
1057"We will now be recording you for %s. After that time, the recording will be "
1058"played back to you..."
1059msgstr ""
1060
1061#: src/conversation/gnunet_gst.c:622
1062#: src/conversation/gnunet-helper-audio-playback-gst.c:356 1059#: src/conversation/gnunet-helper-audio-playback-gst.c:356
1060#: src/conversation/gnunet_gst.c:622
1063#, c-format 1061#, c-format
1064msgid "Read error from STDIN: %d %s\n" 1062msgid "Read error from STDIN: %d %s\n"
1065msgstr "" 1063msgstr ""
@@ -1191,6 +1189,11 @@ msgstr "\"%s\" %s misslyckades: %s\n"
1191msgid "Failed to allocate %u bytes for second packet\n" 1189msgid "Failed to allocate %u bytes for second packet\n"
1192msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 1190msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
1193 1191
1192#: src/conversation/gnunet-service-conversation.c:1276
1193#, fuzzy, c-format
1194msgid "Could not open line, port %s already in use!\n"
1195msgstr "Kunde inte ansluta till gnunetd.\n"
1196
1194#: src/conversation/microphone.c:119 1197#: src/conversation/microphone.c:119
1195#, fuzzy 1198#, fuzzy
1196msgid "Could not start record audio helper\n" 1199msgid "Could not start record audio helper\n"
@@ -1490,8 +1493,140 @@ msgstr "# krypterade PONG-meddelanden mottagna"
1490msgid "# updates to my type map" 1493msgid "# updates to my type map"
1491msgstr "" 1494msgstr ""
1492 1495
1496#: src/credential/credential_misc.c:88
1497#, fuzzy, c-format
1498msgid "Unable to parse CRED record string `%s'\n"
1499msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
1500
1501#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
1502#: src/namestore/plugin_rest_namestore.c:1009
1503#, fuzzy, c-format
1504msgid "Ego `%s' not known to identity service\n"
1505msgstr "\"%s\": okänd tjänst: %s\n"
1506
1507#: src/credential/gnunet-credential.c:294
1508#: src/credential/gnunet-credential.c:446
1509#, fuzzy, c-format
1510msgid "Issuer public key `%s' is not well-formed\n"
1511msgstr "Ogiltigt argument: \"%s\"\n"
1512
1513#: src/credential/gnunet-credential.c:375
1514#: src/credential/gnunet-credential.c:435
1515#, fuzzy, c-format
1516msgid "Issuer public key not well-formed\n"
1517msgstr "Ogiltigt argument: \"%s\"\n"
1518
1519#: src/credential/gnunet-credential.c:386
1520#: src/credential/gnunet-credential.c:455
1521#, fuzzy, c-format
1522msgid "Failed to connect to CREDENTIAL\n"
1523msgstr "Misslyckades att ansluta till gnunetd.\n"
1524
1525#: src/credential/gnunet-credential.c:392
1526#, c-format
1527msgid "You must provide issuer the attribute\n"
1528msgstr ""
1529
1530#: src/credential/gnunet-credential.c:399
1531#, c-format
1532msgid "ego required\n"
1533msgstr ""
1534
1535#: src/credential/gnunet-credential.c:415
1536#, c-format
1537msgid "Subject public key needed\n"
1538msgstr ""
1539
1540#: src/credential/gnunet-credential.c:426
1541#, fuzzy, c-format
1542msgid "Subject public key `%s' is not well-formed\n"
1543msgstr "Ogiltigt argument: \"%s\"\n"
1544
1545#: src/credential/gnunet-credential.c:461
1546#, c-format
1547msgid "You must provide issuer and subject attributes\n"
1548msgstr ""
1549
1550#: src/credential/gnunet-credential.c:511
1551#, c-format
1552msgid "Issuer ego required\n"
1553msgstr ""
1554
1555#: src/credential/gnunet-credential.c:523
1556#, c-format
1557msgid "Please specify name to lookup, subject key and issuer key!\n"
1558msgstr ""
1559
1560#: src/credential/gnunet-credential.c:543
1561msgid "create credential"
1562msgstr ""
1563
1564#: src/credential/gnunet-credential.c:547
1565msgid "verify credential against attribute"
1566msgstr ""
1567
1568#: src/credential/gnunet-credential.c:552
1569#, fuzzy
1570msgid "The public key of the subject to lookup the credential for"
1571msgstr "ange prioritet för innehållet"
1572
1573#: src/credential/gnunet-credential.c:557
1574msgid "The name of the credential presented by the subject"
1575msgstr ""
1576
1577#: src/credential/gnunet-credential.c:562
1578#, fuzzy
1579msgid "The public key of the authority to verify the credential against"
1580msgstr "ange prioritet för innehållet"
1581
1582#: src/credential/gnunet-credential.c:567
1583#, fuzzy
1584msgid "The ego to use"
1585msgstr "meddelandestorlek"
1586
1587#: src/credential/gnunet-credential.c:572
1588msgid "The issuer attribute to verify against or to issue"
1589msgstr ""
1590
1591#: src/credential/gnunet-credential.c:577
1592msgid "The time to live for the credential"
1593msgstr ""
1594
1595#: src/credential/gnunet-credential.c:581
1596msgid "collect credentials"
1597msgstr ""
1598
1599#: src/credential/gnunet-credential.c:595
1600#, fuzzy
1601msgid "GNUnet credential resolver tool"
1602msgstr "Spåra GNUnets nätverkstopologi."
1603
1604#: src/credential/gnunet-service-credential.c:1204
1605#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
1606#, fuzzy, c-format
1607msgid "Failed to connect to GNS\n"
1608msgstr "Misslyckades att ansluta till gnunetd.\n"
1609
1610#: src/credential/gnunet-service-credential.c:1210
1611#: src/namestore/gnunet-namestore-fcfsd.c:1034
1612#: src/namestore/gnunet-namestore.c:802
1613#: src/namestore/plugin_rest_namestore.c:1022
1614#, fuzzy, c-format
1615msgid "Failed to connect to namestore\n"
1616msgstr "Misslyckades att ansluta till gnunetd.\n"
1617
1618#: src/credential/plugin_gnsrecord_credential.c:186
1619#, fuzzy, c-format
1620msgid "Unable to parse ATTR record string `%s'\n"
1621msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
1622
1623#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
1624#, fuzzy
1625msgid "GNS REST API initialized\n"
1626msgstr " Anslutning misslyckades\n"
1627
1493#: src/datacache/datacache.c:119 src/datacache/datacache.c:294 1628#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
1494#: src/datastore/gnunet-service-datastore.c:775 1629#: src/datastore/gnunet-service-datastore.c:757
1495#, fuzzy 1630#, fuzzy
1496msgid "# bytes stored" 1631msgid "# bytes stored"
1497msgstr "# byte krypterade" 1632msgstr "# byte krypterade"
@@ -1536,13 +1671,12 @@ msgstr ""
1536 1671
1537#: src/datacache/plugin_datacache_sqlite.c:113 1672#: src/datacache/plugin_datacache_sqlite.c:113
1538#: src/datacache/plugin_datacache_sqlite.c:122 1673#: src/datacache/plugin_datacache_sqlite.c:122
1539#: src/datastore/plugin_datastore_mysql.c:980 1674#: src/datastore/plugin_datastore_mysql.c:892
1540#: src/datastore/plugin_datastore_sqlite.c:58 1675#: src/datastore/plugin_datastore_sqlite.c:58
1541#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 1676#: src/datastore/plugin_datastore_sqlite.c:66
1542#: src/mysql/mysql.c:42 src/mysql/mysql.c:49 1677#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
1543#: src/namecache/plugin_namecache_postgres.c:53 1678#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
1544#: src/namecache/plugin_namecache_sqlite.c:53 1679#: src/namecache/plugin_namecache_sqlite.c:53
1545#: src/namestore/plugin_namestore_postgres.c:53
1546#: src/namestore/plugin_namestore_sqlite.c:53 1680#: src/namestore/plugin_namestore_sqlite.c:53
1547#: src/peerstore/plugin_peerstore_sqlite.c:52 1681#: src/peerstore/plugin_peerstore_sqlite.c:52
1548#: src/psycstore/plugin_psycstore_mysql.c:62 1682#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1551,14 +1685,15 @@ msgstr ""
1551#: src/testbed/gnunet-daemon-testbed-underlay.c:56 1685#: src/testbed/gnunet-daemon-testbed-underlay.c:56
1552#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 1686#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
1553#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 1687#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
1554#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 1688#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
1555#: src/scalarproduct/scalarproduct.h:35 1689#: src/scalarproduct/scalarproduct.h:35
1556#, c-format 1690#, c-format
1557msgid "`%s' failed at %s:%d with error: %s\n" 1691msgid "`%s' failed at %s:%d with error: %s\n"
1558msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" 1692msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
1559 1693
1560#: src/datacache/plugin_datacache_sqlite.c:817 1694#: src/datacache/plugin_datacache_sqlite.c:817
1561#: src/datastore/plugin_datastore_sqlite.c:475 1695#: src/datastore/plugin_datastore_sqlite.c:456
1696#: src/identity-provider/plugin_identity_provider_sqlite.c:336
1562#: src/namecache/plugin_namecache_sqlite.c:296 1697#: src/namecache/plugin_namecache_sqlite.c:296
1563#: src/namestore/plugin_namestore_sqlite.c:355 1698#: src/namestore/plugin_namestore_sqlite.c:355
1564msgid "Tried to close sqlite without finalizing all prepared statements.\n" 1699msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1626,23 +1761,75 @@ msgstr ""
1626msgid "# GET requests executed" 1761msgid "# GET requests executed"
1627msgstr "" 1762msgstr ""
1628 1763
1629#: src/datastore/gnunet-datastore.c:113 1764#: src/datastore/gnunet-datastore.c:189
1765#, c-format
1766msgid "Dumped %<PRIu64> records\n"
1767msgstr ""
1768
1769#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
1770#, c-format
1771msgid "Short write to file: %zd bytes expecting %zd\n"
1772msgstr ""
1773
1774#: src/datastore/gnunet-datastore.c:261
1775#, fuzzy
1776msgid "Error queueing datastore GET operation\n"
1777msgstr "Fel vid skapandet av användare"
1778
1779#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
1780#, fuzzy, c-format
1781msgid "Unable to open dump file: %s\n"
1782msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
1783
1784#: src/datastore/gnunet-datastore.c:326
1630#, fuzzy, c-format 1785#, fuzzy, c-format
1631msgid "Failed to store item: %s, aborting\n" 1786msgid "Failed to store item: %s, aborting\n"
1632msgstr "Misslyckades att leverera \"%s\" meddelande.\n" 1787msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
1633 1788
1634#: src/datastore/gnunet-datastore.c:209 1789#: src/datastore/gnunet-datastore.c:340
1635#, c-format 1790#, c-format
1636msgid "Cannot use the same configuration for source and destination\n" 1791msgid "Inserted %<PRIu64> records\n"
1637msgstr "" 1792msgstr ""
1638 1793
1639#: src/datastore/gnunet-datastore.c:256 1794#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
1640msgid "" 1795#, c-format
1641"specifies the configuration to use to access an alternative datastore; will " 1796msgid "Short read from file: %zd bytes expecting %zd\n"
1642"merge that datastore into our current datastore"
1643msgstr "" 1797msgstr ""
1644 1798
1645#: src/datastore/gnunet-datastore.c:265 1799#: src/datastore/gnunet-datastore.c:389
1800#, fuzzy
1801msgid "Error queueing datastore PUT operation\n"
1802msgstr "Fel vid skapandet av användare"
1803
1804#: src/datastore/gnunet-datastore.c:432
1805msgid "Input file is not of a supported format\n"
1806msgstr ""
1807
1808#: src/datastore/gnunet-datastore.c:458
1809#, fuzzy
1810msgid "Failed connecting to the datastore.\n"
1811msgstr "Misslyckades att ansluta till gnunetd.\n"
1812
1813#: src/datastore/gnunet-datastore.c:470
1814#, c-format
1815msgid "Please choose at least one operation: %s, %s\n"
1816msgstr ""
1817
1818#: src/datastore/gnunet-datastore.c:493
1819#, fuzzy
1820msgid "Dump all records from the datastore"
1821msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
1822
1823#: src/datastore/gnunet-datastore.c:497
1824#, fuzzy
1825msgid "Insert records into the datastore"
1826msgstr "# byte krypterade"
1827
1828#: src/datastore/gnunet-datastore.c:502
1829msgid "File to dump or insert"
1830msgstr ""
1831
1832#: src/datastore/gnunet-datastore.c:511
1646#, fuzzy 1833#, fuzzy
1647msgid "Manipulate GNUnet datastore" 1834msgid "Manipulate GNUnet datastore"
1648msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" 1835msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
@@ -1686,8 +1873,8 @@ msgstr ""
1686 1873
1687#: src/datastore/gnunet-service-datastore.c:634 1874#: src/datastore/gnunet-service-datastore.c:634
1688#: src/datastore/gnunet-service-datastore.c:689 1875#: src/datastore/gnunet-service-datastore.c:689
1689#: src/datastore/gnunet-service-datastore.c:977 1876#: src/datastore/gnunet-service-datastore.c:837
1690#: src/datastore/gnunet-service-datastore.c:1633 1877#: src/datastore/gnunet-service-datastore.c:1469
1691msgid "# reserved" 1878msgid "# reserved"
1692msgstr "" 1879msgstr ""
1693 1880
@@ -1695,147 +1882,148 @@ msgstr ""
1695msgid "Could not find matching reservation" 1882msgid "Could not find matching reservation"
1696msgstr "" 1883msgstr ""
1697 1884
1698#: src/datastore/gnunet-service-datastore.c:792 1885#: src/datastore/gnunet-service-datastore.c:773
1699#, c-format 1886#, c-format
1700msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" 1887msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
1701msgstr "" 1888msgstr ""
1702 1889
1703#: src/datastore/gnunet-service-datastore.c:1026 1890#: src/datastore/gnunet-service-datastore.c:876
1704#, fuzzy 1891#, fuzzy
1705msgid "# GET requests received" 1892msgid "# GET requests received"
1706msgstr "# byte mottogs via TCP" 1893msgstr "# byte mottogs via TCP"
1707 1894
1708#: src/datastore/gnunet-service-datastore.c:1058 1895#: src/datastore/gnunet-service-datastore.c:907
1709#, fuzzy 1896#, fuzzy
1710msgid "# GET KEY requests received" 1897msgid "# GET KEY requests received"
1711msgstr "# byte mottogs via TCP" 1898msgstr "# byte mottogs via TCP"
1712 1899
1713#: src/datastore/gnunet-service-datastore.c:1071 1900#: src/datastore/gnunet-service-datastore.c:920
1714msgid "# requests filtered by bloomfilter" 1901msgid "# requests filtered by bloomfilter"
1715msgstr "" 1902msgstr ""
1716 1903
1717#: src/datastore/gnunet-service-datastore.c:1108 1904#: src/datastore/gnunet-service-datastore.c:956
1718msgid "# GET REPLICATION requests received" 1905msgid "# GET REPLICATION requests received"
1719msgstr "" 1906msgstr ""
1720 1907
1721#: src/datastore/gnunet-service-datastore.c:1141 1908#: src/datastore/gnunet-service-datastore.c:989
1722msgid "# GET ZERO ANONYMITY requests received" 1909msgid "# GET ZERO ANONYMITY requests received"
1723msgstr "" 1910msgstr ""
1724 1911
1725#: src/datastore/gnunet-service-datastore.c:1190 1912#: src/datastore/gnunet-service-datastore.c:1036
1726#, fuzzy 1913#, fuzzy
1727msgid "Content not found" 1914msgid "Content not found"
1728msgstr "Kommando \"%s\" hittades inte!\n" 1915msgstr "Kommando \"%s\" hittades inte!\n"
1729 1916
1730#: src/datastore/gnunet-service-datastore.c:1199 1917#: src/datastore/gnunet-service-datastore.c:1043
1731msgid "# bytes removed (explicit request)" 1918msgid "# bytes removed (explicit request)"
1732msgstr "" 1919msgstr ""
1733 1920
1734#: src/datastore/gnunet-service-datastore.c:1246 1921#: src/datastore/gnunet-service-datastore.c:1088
1735#, fuzzy 1922#, fuzzy
1736msgid "# REMOVE requests received" 1923msgid "# REMOVE requests received"
1737msgstr "# byte mottogs via TCP" 1924msgstr "# byte mottogs via TCP"
1738 1925
1739#: src/datastore/gnunet-service-datastore.c:1301 1926#: src/datastore/gnunet-service-datastore.c:1137
1740#, c-format 1927#, c-format
1741msgid "" 1928msgid ""
1742"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" 1929"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
1743msgstr "" 1930msgstr ""
1744 1931
1745#: src/datastore/gnunet-service-datastore.c:1307 1932#: src/datastore/gnunet-service-datastore.c:1143
1746#: src/datastore/gnunet-service-datastore.c:1482 1933#: src/datastore/gnunet-service-datastore.c:1318
1747#, c-format 1934#, c-format
1748msgid "New payload: %lld\n" 1935msgid "New payload: %lld\n"
1749msgstr "" 1936msgstr ""
1750 1937
1751#: src/datastore/gnunet-service-datastore.c:1361 1938#: src/datastore/gnunet-service-datastore.c:1197
1752#, c-format 1939#, c-format
1753msgid "Loading `%s' datastore plugin\n" 1940msgid "Loading `%s' datastore plugin\n"
1754msgstr "" 1941msgstr ""
1755 1942
1756#: src/datastore/gnunet-service-datastore.c:1373 1943#: src/datastore/gnunet-service-datastore.c:1209
1757#, fuzzy, c-format 1944#, fuzzy, c-format
1758msgid "Failed to load datastore plugin for `%s'\n" 1945msgid "Failed to load datastore plugin for `%s'\n"
1759msgstr "Kunde inte slå upp \"%s\": %s\n" 1946msgstr "Kunde inte slå upp \"%s\": %s\n"
1760 1947
1761#: src/datastore/gnunet-service-datastore.c:1433 1948#: src/datastore/gnunet-service-datastore.c:1269
1762msgid "Bloomfilter construction complete.\n" 1949msgid "Bloomfilter construction complete.\n"
1763msgstr "" 1950msgstr ""
1764 1951
1765#: src/datastore/gnunet-service-datastore.c:1489 1952#: src/datastore/gnunet-service-datastore.c:1325
1766msgid "Rebuilding bloomfilter. Please be patient.\n" 1953msgid "Rebuilding bloomfilter. Please be patient.\n"
1767msgstr "" 1954msgstr ""
1768 1955
1769#: src/datastore/gnunet-service-datastore.c:1500 1956#: src/datastore/gnunet-service-datastore.c:1336
1770msgid "Plugin does not support get_keys function. Please fix!\n" 1957msgid "Plugin does not support get_keys function. Please fix!\n"
1771msgstr "" 1958msgstr ""
1772 1959
1773#: src/datastore/gnunet-service-datastore.c:1670 1960#: src/datastore/gnunet-service-datastore.c:1506
1774#, fuzzy, c-format 1961#, fuzzy, c-format
1775msgid "# bytes used in file-sharing datastore `%s'" 1962msgid "# bytes used in file-sharing datastore `%s'"
1776msgstr "# byte krypterade" 1963msgstr "# byte krypterade"
1777 1964
1778#: src/datastore/gnunet-service-datastore.c:1686 1965#: src/datastore/gnunet-service-datastore.c:1522
1779msgid "# quota" 1966msgid "# quota"
1780msgstr "" 1967msgstr ""
1781 1968
1782#: src/datastore/gnunet-service-datastore.c:1691 1969#: src/datastore/gnunet-service-datastore.c:1527
1783msgid "# cache size" 1970msgid "# cache size"
1784msgstr "" 1971msgstr ""
1785 1972
1786#: src/datastore/gnunet-service-datastore.c:1707 1973#: src/datastore/gnunet-service-datastore.c:1543
1787#, c-format 1974#, c-format
1788msgid "Could not use specified filename `%s' for bloomfilter.\n" 1975msgid "Could not use specified filename `%s' for bloomfilter.\n"
1789msgstr "" 1976msgstr ""
1790 1977
1791#: src/datastore/gnunet-service-datastore.c:1725 1978#: src/datastore/gnunet-service-datastore.c:1561
1792#: src/datastore/gnunet-service-datastore.c:1741 1979#: src/datastore/gnunet-service-datastore.c:1577
1793#, fuzzy, c-format 1980#, fuzzy, c-format
1794msgid "Failed to remove bogus bloomfilter file `%s'\n" 1981msgid "Failed to remove bogus bloomfilter file `%s'\n"
1795msgstr "Kunde inte spara konfigurationsfil \"%s\":" 1982msgstr "Kunde inte spara konfigurationsfil \"%s\":"
1796 1983
1797#: src/datastore/gnunet-service-datastore.c:1773 1984#: src/datastore/gnunet-service-datastore.c:1609
1798#, fuzzy 1985#, fuzzy
1799msgid "Failed to initialize bloomfilter.\n" 1986msgid "Failed to initialize bloomfilter.\n"
1800msgstr "Misslyckades att initiera tjänsten \"%s\".\n" 1987msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
1801 1988
1802#: src/datastore/plugin_datastore_heap.c:769 1989#: src/datastore/plugin_datastore_heap.c:893
1803msgid "Heap database running\n" 1990msgid "Heap database running\n"
1804msgstr "" 1991msgstr ""
1805 1992
1806#: src/datastore/plugin_datastore_mysql.c:377 1993#: src/datastore/plugin_datastore_mysql.c:371
1807#: src/datastore/plugin_datastore_sqlite.c:590 1994#: src/datastore/plugin_datastore_mysql.c:423
1995#: src/datastore/plugin_datastore_mysql.c:1075
1996msgid "MySQL statement run failure"
1997msgstr ""
1998
1999#: src/datastore/plugin_datastore_mysql.c:410
2000#: src/datastore/plugin_datastore_sqlite.c:626
1808#, fuzzy 2001#, fuzzy
1809msgid "Data too large" 2002msgid "Data too large"
1810msgstr "antal iterationer" 2003msgstr "antal iterationer"
1811 2004
1812#: src/datastore/plugin_datastore_mysql.c:393 2005#: src/datastore/plugin_datastore_mysql.c:848
1813msgid "MySQL statement run failure"
1814msgstr ""
1815
1816#: src/datastore/plugin_datastore_mysql.c:936
1817#, fuzzy, c-format 2006#, fuzzy, c-format
1818msgid "`%s' for `%s' failed at %s:%d with error: %s\n" 2007msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
1819msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n" 2008msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n"
1820 2009
1821#: src/datastore/plugin_datastore_mysql.c:1208 2010#: src/datastore/plugin_datastore_mysql.c:1180
1822#: src/psycstore/plugin_psycstore_mysql.c:1936 2011#: src/psycstore/plugin_psycstore_mysql.c:1936
1823msgid "Mysql database running\n" 2012msgid "Mysql database running\n"
1824msgstr "" 2013msgstr ""
1825 2014
1826#: src/datastore/plugin_datastore_postgres.c:345 2015#: src/datastore/plugin_datastore_postgres.c:274
2016#: src/datastore/plugin_datastore_postgres.c:891
1827msgid "Postgress exec failure" 2017msgid "Postgress exec failure"
1828msgstr "" 2018msgstr ""
1829 2019
1830#: src/datastore/plugin_datastore_postgres.c:866 2020#: src/datastore/plugin_datastore_postgres.c:852
1831#, fuzzy 2021#, fuzzy
1832msgid "Failed to drop table from database.\n" 2022msgid "Failed to drop table from database.\n"
1833msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" 2023msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
1834 2024
1835#: src/datastore/plugin_datastore_postgres.c:903 2025#: src/datastore/plugin_datastore_postgres.c:950
1836#: src/namecache/plugin_namecache_postgres.c:398 2026#: src/psycstore/plugin_psycstore_postgres.c:1506
1837#: src/namestore/plugin_namestore_postgres.c:571
1838#: src/psycstore/plugin_psycstore_postgres.c:1721
1839msgid "Postgres database running\n" 2027msgid "Postgres database running\n"
1840msgstr "" 2028msgstr ""
1841 2029
@@ -1847,7 +2035,8 @@ msgstr ""
1847msgid "`%s' failed at %s:%u with error: %s" 2035msgid "`%s' failed at %s:%u with error: %s"
1848msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" 2036msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
1849 2037
1850#: src/datastore/plugin_datastore_sqlite.c:281 2038#: src/datastore/plugin_datastore_sqlite.c:271
2039#: src/identity-provider/plugin_identity_provider_sqlite.c:212
1851#: src/namecache/plugin_namecache_sqlite.c:194 2040#: src/namecache/plugin_namecache_sqlite.c:194
1852#: src/namestore/plugin_namestore_sqlite.c:222 2041#: src/namestore/plugin_namestore_sqlite.c:222
1853#: src/peerstore/plugin_peerstore_sqlite.c:535 2042#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1856,24 +2045,29 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
1856msgid "Unable to initialize SQLite: %s.\n" 2045msgid "Unable to initialize SQLite: %s.\n"
1857msgstr "Kunde inte initiera SQLite.\n" 2046msgstr "Kunde inte initiera SQLite.\n"
1858 2047
1859#: src/datastore/plugin_datastore_sqlite.c:1234 2048#: src/datastore/plugin_datastore_sqlite.c:577
2049msgid "sqlite bind failure"
2050msgstr ""
2051
2052#: src/datastore/plugin_datastore_sqlite.c:1259
1860msgid "sqlite version to old to determine size, assuming zero\n" 2053msgid "sqlite version to old to determine size, assuming zero\n"
1861msgstr "" 2054msgstr ""
1862 2055
1863#: src/datastore/plugin_datastore_sqlite.c:1268 2056#: src/datastore/plugin_datastore_sqlite.c:1293
1864#, c-format 2057#, c-format
1865msgid "" 2058msgid ""
1866"Using sqlite page utilization to estimate payload (%llu pages of size %llu " 2059"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
1867"bytes)\n" 2060"bytes)\n"
1868msgstr "" 2061msgstr ""
1869 2062
1870#: src/datastore/plugin_datastore_sqlite.c:1312 2063#: src/datastore/plugin_datastore_sqlite.c:1337
2064#: src/identity-provider/plugin_identity_provider_sqlite.c:711
1871#: src/namecache/plugin_namecache_sqlite.c:603 2065#: src/namecache/plugin_namecache_sqlite.c:603
1872#: src/namestore/plugin_namestore_sqlite.c:802 2066#: src/namestore/plugin_namestore_sqlite.c:802
1873msgid "Sqlite database running\n" 2067msgid "Sqlite database running\n"
1874msgstr "" 2068msgstr ""
1875 2069
1876#: src/datastore/plugin_datastore_template.c:259 2070#: src/datastore/plugin_datastore_template.c:253
1877msgid "Template database running\n" 2071msgid "Template database running\n"
1878msgstr "" 2072msgstr ""
1879 2073
@@ -1935,53 +2129,6 @@ msgstr ""
1935msgid "Prints all packets that go through the DHT." 2129msgid "Prints all packets that go through the DHT."
1936msgstr "" 2130msgstr ""
1937 2131
1938#: src/dht/gnunet_dht_profiler.c:1161
1939#: src/testbed/gnunet-testbed-profiler.c:255
1940#, fuzzy, c-format
1941msgid "Exiting as the number of peers is %u\n"
1942msgstr "Maximalt antal chattklienter uppnått.\n"
1943
1944#: src/dht/gnunet_dht_profiler.c:1188
1945#, fuzzy
1946msgid "number of peers to start"
1947msgstr "antal iterationer"
1948
1949#: src/dht/gnunet_dht_profiler.c:1194
1950msgid ""
1951"maximum number of times we try to search for successor circle formation (0 "
1952"for R5N)"
1953msgstr ""
1954
1955#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
1956#: src/testbed/gnunet-testbed-profiler.c:305
1957msgid "name of the file with the login information for the testbed"
1958msgstr ""
1959
1960#: src/dht/gnunet_dht_profiler.c:1206
1961msgid "delay between rounds for collecting statistics (default: 30 sec)"
1962msgstr ""
1963
1964#: src/dht/gnunet_dht_profiler.c:1212
1965msgid "delay to start doing PUTs (default: 1 sec)"
1966msgstr ""
1967
1968#: src/dht/gnunet_dht_profiler.c:1218
1969msgid "delay to start doing GETs (default: 5 min)"
1970msgstr ""
1971
1972#: src/dht/gnunet_dht_profiler.c:1223
1973msgid "replication degree for DHT PUTs"
1974msgstr ""
1975
1976#: src/dht/gnunet_dht_profiler.c:1230
1977msgid "timeout for DHT PUT and GET requests (default: 1 min)"
1978msgstr ""
1979
1980#: src/dht/gnunet_dht_profiler.c:1248
1981#, fuzzy
1982msgid "Measure quality and performance of the DHT service."
1983msgstr "Kan inte tillgå tjänsten"
1984
1985#: src/dht/gnunet-dht-put.c:120 2132#: src/dht/gnunet-dht-put.c:120
1986#, fuzzy 2133#, fuzzy
1987msgid "PUT request sent with key" 2134msgid "PUT request sent with key"
@@ -2258,6 +2405,52 @@ msgstr ""
2258msgid "# DHT requests combined" 2405msgid "# DHT requests combined"
2259msgstr "# byte mottogs via TCP" 2406msgstr "# byte mottogs via TCP"
2260 2407
2408#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
2409#, fuzzy, c-format
2410msgid "Exiting as the number of peers is %u\n"
2411msgstr "Maximalt antal chattklienter uppnått.\n"
2412
2413#: src/dht/gnunet_dht_profiler.c:1188
2414#, fuzzy
2415msgid "number of peers to start"
2416msgstr "antal iterationer"
2417
2418#: src/dht/gnunet_dht_profiler.c:1194
2419msgid ""
2420"maximum number of times we try to search for successor circle formation (0 "
2421"for R5N)"
2422msgstr ""
2423
2424#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2425#: src/testbed/gnunet-testbed-profiler.c:305
2426msgid "name of the file with the login information for the testbed"
2427msgstr ""
2428
2429#: src/dht/gnunet_dht_profiler.c:1206
2430msgid "delay between rounds for collecting statistics (default: 30 sec)"
2431msgstr ""
2432
2433#: src/dht/gnunet_dht_profiler.c:1212
2434msgid "delay to start doing PUTs (default: 1 sec)"
2435msgstr ""
2436
2437#: src/dht/gnunet_dht_profiler.c:1218
2438msgid "delay to start doing GETs (default: 5 min)"
2439msgstr ""
2440
2441#: src/dht/gnunet_dht_profiler.c:1223
2442msgid "replication degree for DHT PUTs"
2443msgstr ""
2444
2445#: src/dht/gnunet_dht_profiler.c:1230
2446msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2447msgstr ""
2448
2449#: src/dht/gnunet_dht_profiler.c:1248
2450#, fuzzy
2451msgid "Measure quality and performance of the DHT service."
2452msgstr "Kan inte tillgå tjänsten"
2453
2261#: src/dht/plugin_block_dht.c:187 2454#: src/dht/plugin_block_dht.c:187
2262#, fuzzy, c-format 2455#, fuzzy, c-format
2263msgid "Block not of type %u\n" 2456msgid "Block not of type %u\n"
@@ -2591,7 +2784,7 @@ msgstr ""
2591msgid "No useful service enabled. Exiting.\n" 2784msgid "No useful service enabled. Exiting.\n"
2592msgstr "" 2785msgstr ""
2593 2786
2594#: src/exit/gnunet-daemon-exit.c:3969 2787#: src/exit/gnunet-daemon-exit.c:3970
2595msgid "Daemon to run to provide an IP exit node for the VPN" 2788msgid "Daemon to run to provide an IP exit node for the VPN"
2596msgstr "" 2789msgstr ""
2597 2790
@@ -3244,15 +3437,6 @@ msgid ""
3244"chk/...)" 3437"chk/...)"
3245msgstr "" 3438msgstr ""
3246 3439
3247#: src/fs/gnunet-fs.c:119
3248msgid "print a list of all indexed files"
3249msgstr ""
3250
3251#: src/fs/gnunet-fs.c:130
3252#, fuzzy
3253msgid "Special file-sharing operations"
3254msgstr "Visa alla alternativ"
3255
3256#: src/fs/gnunet-fs-profiler.c:211 3440#: src/fs/gnunet-fs-profiler.c:211
3257msgid "run the experiment with COUNT peers" 3441msgid "run the experiment with COUNT peers"
3258msgstr "" 3442msgstr ""
@@ -3269,6 +3453,15 @@ msgstr ""
3269msgid "run a testbed to measure file-sharing performance" 3453msgid "run a testbed to measure file-sharing performance"
3270msgstr "" 3454msgstr ""
3271 3455
3456#: src/fs/gnunet-fs.c:119
3457msgid "print a list of all indexed files"
3458msgstr ""
3459
3460#: src/fs/gnunet-fs.c:130
3461#, fuzzy
3462msgid "Special file-sharing operations"
3463msgstr "Visa alla alternativ"
3464
3272#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231 3465#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
3273#, c-format 3466#, c-format
3274msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" 3467msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3956,22 +4149,11 @@ msgstr ""
3956msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4149msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3957msgstr "" 4150msgstr ""
3958 4151
3959#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 4152#: src/gns/gnunet-gns-helper-service-w32.c:602
3960#, c-format 4153msgid "Not ready to process requests, lacking ego data\n"
3961msgid "Invalid typename specified, assuming `ANY'\n"
3962msgstr ""
3963
3964#: src/gns/gnunet-gns.c:252
3965#, c-format
3966msgid "Please specify name to lookup!\n"
3967msgstr ""
3968
3969#: src/gns/gnunet-gns.c:276
3970#, c-format
3971msgid "Ego for `%s' not found, cannot perform lookup.\n"
3972msgstr "" 4154msgstr ""
3973 4155
3974#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701 4156#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
3975#: src/gns/plugin_rest_gns.c:422 4157#: src/gns/plugin_rest_gns.c:422
3976#, c-format 4158#, c-format
3977msgid "" 4159msgid ""
@@ -3979,59 +4161,12 @@ msgid ""
3979"gns-import.sh?\n" 4161"gns-import.sh?\n"
3980msgstr "" 4162msgstr ""
3981 4163
3982#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
3983#, fuzzy, c-format
3984msgid "Failed to connect to GNS\n"
3985msgstr "Misslyckades att ansluta till gnunetd.\n"
3986
3987#: src/gns/gnunet-gns.c:374
3988#, c-format
3989msgid "Public key `%s' is not well-formed\n"
3990msgstr ""
3991
3992#: src/gns/gnunet-gns.c:428
3993msgid "Lookup a record for the given name"
3994msgstr ""
3995
3996#: src/gns/gnunet-gns.c:434
3997#, fuzzy
3998msgid "Specify the type of the record to lookup"
3999msgstr "ange prioritet för innehållet"
4000
4001#: src/gns/gnunet-gns.c:440
4002#, fuzzy
4003msgid "Specify timeout for the lookup"
4004msgstr "ange prioritet för innehållet"
4005
4006#: src/gns/gnunet-gns.c:445
4007msgid "No unneeded output"
4008msgstr ""
4009
4010#: src/gns/gnunet-gns.c:451
4011#, fuzzy
4012msgid "Specify the public key of the zone to lookup the record in"
4013msgstr "ange prioritet för innehållet"
4014
4015#: src/gns/gnunet-gns.c:457
4016#, fuzzy
4017msgid "Specify the name of the ego of the zone to lookup the record in"
4018msgstr "ange prioritet för innehållet"
4019
4020#: src/gns/gnunet-gns.c:476
4021#, fuzzy
4022msgid "GNUnet GNS resolver tool"
4023msgstr "Spåra GNUnets nätverkstopologi."
4024
4025#: src/gns/gnunet-gns-helper-service-w32.c:602
4026msgid "Not ready to process requests, lacking ego data\n"
4027msgstr ""
4028
4029#: src/gns/gnunet-gns-helper-service-w32.c:739 4164#: src/gns/gnunet-gns-helper-service-w32.c:739
4030#, fuzzy, c-format 4165#, fuzzy, c-format
4031msgid "Failed to connect to identity service\n" 4166msgid "Failed to connect to identity service\n"
4032msgstr "Misslyckades att ansluta till gnunetd.\n" 4167msgstr "Misslyckades att ansluta till gnunetd.\n"
4033 4168
4034#: src/gns/gnunet-gns-import.c:489 4169#: src/gns/gnunet-gns-import.c:452
4035msgid "This program will import some GNS authorities into your GNS namestore." 4170msgid "This program will import some GNS authorities into your GNS namestore."
4036msgstr "" 4171msgstr ""
4037 4172
@@ -4156,13 +4291,66 @@ msgstr ""
4156msgid "GNUnet GNS proxy" 4291msgid "GNUnet GNS proxy"
4157msgstr "" 4292msgstr ""
4158 4293
4294#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
4295#, c-format
4296msgid "Invalid typename specified, assuming `ANY'\n"
4297msgstr ""
4298
4299#: src/gns/gnunet-gns.c:252
4300#, c-format
4301msgid "Please specify name to lookup!\n"
4302msgstr ""
4303
4304#: src/gns/gnunet-gns.c:276
4305#, c-format
4306msgid "Ego for `%s' not found, cannot perform lookup.\n"
4307msgstr ""
4308
4309#: src/gns/gnunet-gns.c:374
4310#, c-format
4311msgid "Public key `%s' is not well-formed\n"
4312msgstr ""
4313
4314#: src/gns/gnunet-gns.c:428
4315msgid "Lookup a record for the given name"
4316msgstr ""
4317
4318#: src/gns/gnunet-gns.c:434
4319#, fuzzy
4320msgid "Specify the type of the record to lookup"
4321msgstr "ange prioritet för innehållet"
4322
4323#: src/gns/gnunet-gns.c:440
4324#, fuzzy
4325msgid "Specify timeout for the lookup"
4326msgstr "ange prioritet för innehållet"
4327
4328#: src/gns/gnunet-gns.c:445
4329msgid "No unneeded output"
4330msgstr ""
4331
4332#: src/gns/gnunet-gns.c:451
4333#, fuzzy
4334msgid "Specify the public key of the zone to lookup the record in"
4335msgstr "ange prioritet för innehållet"
4336
4337#: src/gns/gnunet-gns.c:457
4338#, fuzzy
4339msgid "Specify the name of the ego of the zone to lookup the record in"
4340msgstr "ange prioritet för innehållet"
4341
4342#: src/gns/gnunet-gns.c:476
4343#, fuzzy
4344msgid "GNUnet GNS resolver tool"
4345msgstr "Spåra GNUnets nätverkstopologi."
4346
4159#: src/gns/gnunet-service-gns.c:442 4347#: src/gns/gnunet-service-gns.c:442
4160#, fuzzy 4348#, fuzzy
4161msgid "Failed to connect to the namecache!\n" 4349msgid "Failed to connect to the namecache!\n"
4162msgstr "Misslyckades att ansluta till gnunetd.\n" 4350msgstr "Misslyckades att ansluta till gnunetd.\n"
4163 4351
4164#: src/gns/gnunet-service-gns.c:461 4352#: src/gns/gnunet-service-gns.c:461
4165#: src/zonemaster/gnunet-service-zonemaster.c:741 4353#: src/zonemaster/gnunet-service-zonemaster.c:742
4166#, fuzzy 4354#, fuzzy
4167msgid "Could not connect to DHT!\n" 4355msgid "Could not connect to DHT!\n"
4168msgstr "Kunde inte ansluta till gnunetd.\n" 4356msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -4220,45 +4408,35 @@ msgstr ""
4220msgid "Hostname `%s' is not well-formed, resolution fails\n" 4408msgid "Hostname `%s' is not well-formed, resolution fails\n"
4221msgstr "" 4409msgstr ""
4222 4410
4223#: src/gns/plugin_gnsrecord_gns.c:203 4411#: src/gns/plugin_gnsrecord_gns.c:179
4224#, fuzzy, c-format 4412#, fuzzy, c-format
4225msgid "Unable to parse PKEY record `%s'\n" 4413msgid "Unable to parse PKEY record `%s'\n"
4226msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4414msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4227 4415
4228#: src/gns/plugin_gnsrecord_gns.c:232 4416#: src/gns/plugin_gnsrecord_gns.c:208
4229#, fuzzy, c-format 4417#, fuzzy, c-format
4230msgid "Unable to parse GNS2DNS record `%s'\n" 4418msgid "Unable to parse GNS2DNS record `%s'\n"
4231msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4419msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4232 4420
4233#: src/gns/plugin_gnsrecord_gns.c:253 4421#: src/gns/plugin_gnsrecord_gns.c:229
4234#, fuzzy, c-format 4422#, fuzzy, c-format
4235msgid "Failed to serialize GNS2DNS record with value `%s'\n" 4423msgid "Failed to serialize GNS2DNS record with value `%s'\n"
4236msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" 4424msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
4237 4425
4238#: src/gns/plugin_gnsrecord_gns.c:276 4426#: src/gns/plugin_gnsrecord_gns.c:252
4239#, fuzzy, c-format 4427#, fuzzy, c-format
4240msgid "Unable to parse VPN record string `%s'\n" 4428msgid "Unable to parse VPN record string `%s'\n"
4241msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4429msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4242 4430
4243#: src/gns/plugin_gnsrecord_gns.c:312 4431#: src/gns/plugin_gnsrecord_gns.c:288
4244#, fuzzy, c-format 4432#, fuzzy, c-format
4245msgid "Unable to parse BOX record string `%s'\n" 4433msgid "Unable to parse BOX record string `%s'\n"
4246msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4434msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4247 4435
4248#: src/gns/plugin_gnsrecord_gns.c:360
4249#, fuzzy, c-format
4250msgid "Unable to parse REVERSE record string `%s'\n"
4251msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4252
4253#: src/gns/plugin_rest_gns.c:384 4436#: src/gns/plugin_rest_gns.c:384
4254msgid "Ego for not found, cannot perform lookup.\n" 4437msgid "Ego for not found, cannot perform lookup.\n"
4255msgstr "" 4438msgstr ""
4256 4439
4257#: src/gns/plugin_rest_gns.c:668
4258#, fuzzy
4259msgid "GNS REST API initialized\n"
4260msgstr " Anslutning misslyckades\n"
4261
4262#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4440#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4263#, fuzzy, c-format 4441#, fuzzy, c-format
4264msgid "Unable to parse IPv4 address `%s'\n" 4442msgid "Unable to parse IPv4 address `%s'\n"
@@ -4689,6 +4867,53 @@ msgstr "\"%s\" är inte tillgänglig."
4689msgid "Could not start hostlist HTTP server on port %u\n" 4867msgid "Could not start hostlist HTTP server on port %u\n"
4690msgstr "" 4868msgstr ""
4691 4869
4870#: src/identity-provider/gnunet-idp.c:348
4871#, fuzzy
4872msgid "Ego is required\n"
4873msgstr "%s: flagga \"%s\" är tvetydig\n"
4874
4875#: src/identity-provider/gnunet-idp.c:370
4876msgid "Add attribute"
4877msgstr ""
4878
4879#: src/identity-provider/gnunet-idp.c:376
4880msgid "Attribute value"
4881msgstr ""
4882
4883#: src/identity-provider/gnunet-idp.c:381
4884msgid "Ego"
4885msgstr ""
4886
4887#: src/identity-provider/gnunet-idp.c:386
4888msgid "Audience (relying party)"
4889msgstr ""
4890
4891#: src/identity-provider/gnunet-idp.c:390
4892msgid "List attributes for Ego"
4893msgstr ""
4894
4895#: src/identity-provider/gnunet-idp.c:395
4896msgid "Issue a ticket"
4897msgstr ""
4898
4899#: src/identity-provider/gnunet-idp.c:400
4900msgid "Consume a ticket"
4901msgstr ""
4902
4903#: src/identity-provider/gnunet-idp.c:405
4904msgid "Revoke a ticket"
4905msgstr ""
4906
4907#: src/identity-provider/identity_provider_api.c:429
4908#, fuzzy
4909msgid "failed to store record\n"
4910msgstr "Misslyckades att starta samling.\n"
4911
4912#: src/identity-provider/plugin_rest_identity_provider.c:1175
4913#, fuzzy
4914msgid "Identity Provider REST API initialized\n"
4915msgstr " Anslutning misslyckades\n"
4916
4692#: src/identity/gnunet-identity.c:179 4917#: src/identity/gnunet-identity.c:179
4693#, fuzzy, c-format 4918#, fuzzy, c-format
4694msgid "Failed to create ego: %s\n" 4919msgid "Failed to create ego: %s\n"
@@ -4776,34 +5001,11 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":"
4776msgid "Failed to create directory `%s' for storing egos\n" 5001msgid "Failed to create directory `%s' for storing egos\n"
4777msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 5002msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4778 5003
4779#: src/identity/plugin_rest_identity.c:967 5004#: src/identity/plugin_rest_identity.c:964
4780#, fuzzy 5005#, fuzzy
4781msgid "Identity REST API initialized\n" 5006msgid "Identity REST API initialized\n"
4782msgstr " Anslutning misslyckades\n" 5007msgstr " Anslutning misslyckades\n"
4783 5008
4784#: src/identity-provider/gnunet-identity-token.c:66
4785#, fuzzy
4786msgid "Option `-t' is required\n"
4787msgstr "%s: flagga \"%s\" är tvetydig\n"
4788
4789#: src/identity-provider/gnunet-identity-token.c:77
4790#, fuzzy, c-format
4791msgid "Token `%s' is malformed\n"
4792msgstr "Ogiltigt argument: \"%s\"\n"
4793
4794#: src/identity-provider/gnunet-identity-token.c:166
4795msgid "GNUid token"
4796msgstr ""
4797
4798#: src/identity-provider/gnunet-identity-token.c:171
4799msgid "Print token contents"
4800msgstr ""
4801
4802#: src/identity-provider/plugin_rest_identity_provider.c:1166
4803#, fuzzy
4804msgid "Identity Token REST API initialized\n"
4805msgstr " Anslutning misslyckades\n"
4806
4807#: src/json/json.c:119 5009#: src/json/json.c:119
4808#, fuzzy, c-format 5010#, fuzzy, c-format
4809msgid "Failed to parse JSON in option `%s': %s (%s)\n" 5011msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4904,12 +5106,66 @@ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
4904msgid "flat plugin running\n" 5106msgid "flat plugin running\n"
4905msgstr "" 5107msgstr ""
4906 5108
4907#: src/namecache/plugin_namecache_postgres.c:90 5109#: src/namestore/gnunet-namestore-fcfsd.c:508
4908#: src/namestore/plugin_namestore_postgres.c:97 5110#, fuzzy, c-format
4909#, fuzzy 5111msgid "Unsupported form value `%s'\n"
4910msgid "Failed to create indices\n" 5112msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
5113
5114#: src/namestore/gnunet-namestore-fcfsd.c:535
5115#, fuzzy, c-format
5116msgid "Failed to create record for domain `%s': %s\n"
5117msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
5118
5119#: src/namestore/gnunet-namestore-fcfsd.c:555
5120msgid "Error when mapping zone to name\n"
5121msgstr ""
5122
5123#: src/namestore/gnunet-namestore-fcfsd.c:585
5124#, c-format
5125msgid "Found existing name `%s' for the given key\n"
5126msgstr ""
5127
5128#: src/namestore/gnunet-namestore-fcfsd.c:662
5129#, c-format
5130msgid "Found %u existing records for domain `%s'\n"
5131msgstr ""
5132
5133#: src/namestore/gnunet-namestore-fcfsd.c:718
5134#, fuzzy, c-format
5135msgid "Failed to create page for `%s'\n"
4911msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" 5136msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
4912 5137
5138#: src/namestore/gnunet-namestore-fcfsd.c:734
5139#, fuzzy, c-format
5140msgid "Failed to setup post processor for `%s'\n"
5141msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5142
5143#: src/namestore/gnunet-namestore-fcfsd.c:770
5144msgid "Domain name must not contain `.'\n"
5145msgstr ""
5146
5147#: src/namestore/gnunet-namestore-fcfsd.c:778
5148msgid "Domain name must not contain `+'\n"
5149msgstr ""
5150
5151#: src/namestore/gnunet-namestore-fcfsd.c:974
5152msgid "No ego configured for `fcfsd` subsystem\n"
5153msgstr ""
5154
5155#: src/namestore/gnunet-namestore-fcfsd.c:1000
5156#, fuzzy
5157msgid "Failed to start HTTP server\n"
5158msgstr "Misslyckades att starta samling.\n"
5159
5160#: src/namestore/gnunet-namestore-fcfsd.c:1042
5161#, fuzzy
5162msgid "Failed to connect to identity\n"
5163msgstr "Misslyckades att ansluta till gnunetd.\n"
5164
5165#: src/namestore/gnunet-namestore-fcfsd.c:1074
5166msgid "GNU Name System First Come First Serve name registration service"
5167msgstr ""
5168
4913#: src/namestore/gnunet-namestore.c:301 5169#: src/namestore/gnunet-namestore.c:301
4914#, fuzzy, c-format 5170#, fuzzy, c-format
4915msgid "Adding record failed: %s\n" 5171msgid "Adding record failed: %s\n"
@@ -4918,7 +5174,7 @@ msgstr ""
4918"Fel vid uppladdning av fil: %s\n" 5174"Fel vid uppladdning av fil: %s\n"
4919 5175
4920#: src/namestore/gnunet-namestore.c:330 5176#: src/namestore/gnunet-namestore.c:330
4921#: src/namestore/plugin_rest_namestore.c:562 5177#: src/namestore/plugin_rest_namestore.c:567
4922#, fuzzy, c-format 5178#, fuzzy, c-format
4923msgid "Deleting record failed, record does not exist%s%s\n" 5179msgid "Deleting record failed, record does not exist%s%s\n"
4924msgstr "" 5180msgstr ""
@@ -4926,7 +5182,7 @@ msgstr ""
4926"Fel vid uppladdning av fil: %s\n" 5182"Fel vid uppladdning av fil: %s\n"
4927 5183
4928#: src/namestore/gnunet-namestore.c:337 5184#: src/namestore/gnunet-namestore.c:337
4929#: src/namestore/plugin_rest_namestore.c:571 5185#: src/namestore/plugin_rest_namestore.c:576
4930#, fuzzy, c-format 5186#, fuzzy, c-format
4931msgid "Deleting record failed%s%s\n" 5187msgid "Deleting record failed%s%s\n"
4932msgstr "" 5188msgstr ""
@@ -4946,7 +5202,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
4946msgstr "" 5202msgstr ""
4947 5203
4948#: src/namestore/gnunet-namestore.c:698 5204#: src/namestore/gnunet-namestore.c:698
4949#: src/namestore/plugin_rest_namestore.c:597 5205#: src/namestore/plugin_rest_namestore.c:602
4950#, c-format 5206#, c-format
4951msgid "There are no records under label `%s' that could be deleted.\n" 5207msgid "There are no records under label `%s' that could be deleted.\n"
4952msgstr "" 5208msgstr ""
@@ -4957,24 +5213,11 @@ msgid ""
4957"There are no records under label `%s' that match the request for deletion.\n" 5213"There are no records under label `%s' that match the request for deletion.\n"
4958msgstr "" 5214msgstr ""
4959 5215
4960#: src/namestore/gnunet-namestore.c:776
4961#: src/namestore/plugin_rest_namestore.c:1004
4962#, fuzzy, c-format
4963msgid "Ego `%s' not known to identity service\n"
4964msgstr "\"%s\": okänd tjänst: %s\n"
4965
4966#: src/namestore/gnunet-namestore.c:791 5216#: src/namestore/gnunet-namestore.c:791
4967#, c-format 5217#, c-format
4968msgid "No options given\n" 5218msgid "No options given\n"
4969msgstr "" 5219msgstr ""
4970 5220
4971#: src/namestore/gnunet-namestore.c:802
4972#: src/namestore/gnunet-namestore-fcfsd.c:1034
4973#: src/namestore/plugin_rest_namestore.c:1017
4974#, fuzzy
4975msgid "Failed to connect to namestore\n"
4976msgstr "Misslyckades att ansluta till gnunetd.\n"
4977
4978#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819 5221#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
4979#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861 5222#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
4980#: src/namestore/gnunet-namestore.c:915 5223#: src/namestore/gnunet-namestore.c:915
@@ -4988,14 +5231,14 @@ msgid "add"
4988msgstr "" 5231msgstr ""
4989 5232
4990#: src/namestore/gnunet-namestore.c:829 5233#: src/namestore/gnunet-namestore.c:829
4991#: src/namestore/plugin_rest_namestore.c:671 5234#: src/namestore/plugin_rest_namestore.c:676
4992#, fuzzy, c-format 5235#, fuzzy, c-format
4993msgid "Unsupported type `%s'\n" 5236msgid "Unsupported type `%s'\n"
4994msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" 5237msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
4995 5238
4996#: src/namestore/gnunet-namestore.c:851 5239#: src/namestore/gnunet-namestore.c:851
4997#: src/namestore/plugin_rest_namestore.c:689 5240#: src/namestore/plugin_rest_namestore.c:694
4998#: src/namestore/plugin_rest_namestore.c:729 5241#: src/namestore/plugin_rest_namestore.c:734
4999#, fuzzy, c-format 5242#, fuzzy, c-format
5000msgid "Value `%s' invalid for record type `%s'\n" 5243msgid "Value `%s' invalid for record type `%s'\n"
5001msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n" 5244msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n"
@@ -5014,8 +5257,7 @@ msgstr ""
5014msgid "Invalid public key for reverse lookup `%s'\n" 5257msgid "Invalid public key for reverse lookup `%s'\n"
5015msgstr "Ogiltigt argument: \"%s\"\n" 5258msgstr "Ogiltigt argument: \"%s\"\n"
5016 5259
5017#: src/namestore/gnunet-namestore.c:979 5260#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
5018#: src/peerinfo-tool/gnunet-peerinfo.c:775
5019#, fuzzy, c-format 5261#, fuzzy, c-format
5020msgid "Invalid URI `%s'\n" 5262msgid "Invalid URI `%s'\n"
5021msgstr "Ogiltiga argument: " 5263msgstr "Ogiltiga argument: "
@@ -5026,13 +5268,13 @@ msgid "Invalid nick `%s'\n"
5026msgstr "Ogiltiga argument: " 5268msgstr "Ogiltiga argument: "
5027 5269
5028#: src/namestore/gnunet-namestore.c:1051 5270#: src/namestore/gnunet-namestore.c:1051
5029#: src/namestore/plugin_rest_namestore.c:1047 5271#: src/namestore/plugin_rest_namestore.c:1052
5030#, fuzzy, c-format 5272#, fuzzy, c-format
5031msgid "No default ego configured in identity service\n" 5273msgid "No default ego configured in identity service\n"
5032msgstr "\"%s\": okänd tjänst: %s\n" 5274msgstr "\"%s\": okänd tjänst: %s\n"
5033 5275
5034#: src/namestore/gnunet-namestore.c:1108 5276#: src/namestore/gnunet-namestore.c:1108
5035#: src/namestore/plugin_rest_namestore.c:1143 5277#: src/namestore/plugin_rest_namestore.c:1148
5036#, fuzzy, c-format 5278#, fuzzy, c-format
5037msgid "Cannot connect to identity service\n" 5279msgid "Cannot connect to identity service\n"
5038msgstr "Kunde inte ansluta till gnunetd.\n" 5280msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -5096,67 +5338,7 @@ msgstr ""
5096msgid "name of the ego controlling the zone" 5338msgid "name of the ego controlling the zone"
5097msgstr "Visa värde av alternativet" 5339msgstr "Visa värde av alternativet"
5098 5340
5099#: src/namestore/gnunet-namestore-fcfsd.c:508 5341#: src/namestore/gnunet-service-namestore.c:615
5100#, fuzzy, c-format
5101msgid "Unsupported form value `%s'\n"
5102msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
5103
5104#: src/namestore/gnunet-namestore-fcfsd.c:535
5105#, fuzzy, c-format
5106msgid "Failed to create record for domain `%s': %s\n"
5107msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
5108
5109#: src/namestore/gnunet-namestore-fcfsd.c:555
5110msgid "Error when mapping zone to name\n"
5111msgstr ""
5112
5113#: src/namestore/gnunet-namestore-fcfsd.c:585
5114#, c-format
5115msgid "Found existing name `%s' for the given key\n"
5116msgstr ""
5117
5118#: src/namestore/gnunet-namestore-fcfsd.c:662
5119#, c-format
5120msgid "Found %u existing records for domain `%s'\n"
5121msgstr ""
5122
5123#: src/namestore/gnunet-namestore-fcfsd.c:718
5124#, fuzzy, c-format
5125msgid "Failed to create page for `%s'\n"
5126msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
5127
5128#: src/namestore/gnunet-namestore-fcfsd.c:734
5129#, fuzzy, c-format
5130msgid "Failed to setup post processor for `%s'\n"
5131msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5132
5133#: src/namestore/gnunet-namestore-fcfsd.c:770
5134msgid "Domain name must not contain `.'\n"
5135msgstr ""
5136
5137#: src/namestore/gnunet-namestore-fcfsd.c:778
5138msgid "Domain name must not contain `+'\n"
5139msgstr ""
5140
5141#: src/namestore/gnunet-namestore-fcfsd.c:974
5142msgid "No ego configured for `fcfsd` subsystem\n"
5143msgstr ""
5144
5145#: src/namestore/gnunet-namestore-fcfsd.c:1000
5146#, fuzzy
5147msgid "Failed to start HTTP server\n"
5148msgstr "Misslyckades att starta samling.\n"
5149
5150#: src/namestore/gnunet-namestore-fcfsd.c:1042
5151#, fuzzy
5152msgid "Failed to connect to identity\n"
5153msgstr "Misslyckades att ansluta till gnunetd.\n"
5154
5155#: src/namestore/gnunet-namestore-fcfsd.c:1074
5156msgid "GNU Name System First Come First Serve name registration service"
5157msgstr ""
5158
5159#: src/namestore/gnunet-service-namestore.c:612
5160#, fuzzy, c-format 5342#, fuzzy, c-format
5161msgid "Failed to replicate block in namecache: %s\n" 5343msgid "Failed to replicate block in namecache: %s\n"
5162msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 5344msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
@@ -5169,7 +5351,7 @@ msgstr ""
5169msgid "flat file database running\n" 5351msgid "flat file database running\n"
5170msgstr "" 5352msgstr ""
5171 5353
5172#: src/namestore/plugin_rest_namestore.c:1188 5354#: src/namestore/plugin_rest_namestore.c:1193
5173#, fuzzy 5355#, fuzzy
5174msgid "Namestore REST API initialized\n" 5356msgid "Namestore REST API initialized\n"
5175msgstr " Anslutning misslyckades\n" 5357msgstr " Anslutning misslyckades\n"
@@ -5460,11 +5642,6 @@ msgstr ""
5460msgid "`upnpc' command not found\n" 5642msgid "`upnpc' command not found\n"
5461msgstr "" 5643msgstr ""
5462 5644
5463#: src/nse/gnunet-nse.c:122
5464#, fuzzy
5465msgid "Show network size estimates from NSE service."
5466msgstr "# byte mottogs via TCP"
5467
5468#: src/nse/gnunet-nse-profiler.c:842 5645#: src/nse/gnunet-nse-profiler.c:842
5469#, fuzzy 5646#, fuzzy
5470msgid "limit to the number of connections to NSE services, 0 for none" 5647msgid "limit to the number of connections to NSE services, 0 for none"
@@ -5491,66 +5668,16 @@ msgstr ""
5491msgid "Measure quality and performance of the NSE service." 5668msgid "Measure quality and performance of the NSE service."
5492msgstr "Kan inte tillgå tjänsten" 5669msgstr "Kan inte tillgå tjänsten"
5493 5670
5671#: src/nse/gnunet-nse.c:122
5672#, fuzzy
5673msgid "Show network size estimates from NSE service."
5674msgstr "# byte mottogs via TCP"
5675
5494#: src/nse/gnunet-service-nse.c:1534 5676#: src/nse/gnunet-service-nse.c:1534
5495#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 5677#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
5496msgid "Value is too large.\n" 5678msgid "Value is too large.\n"
5497msgstr "" 5679msgstr ""
5498 5680
5499#: src/peerinfo/gnunet-service-peerinfo.c:178
5500#, fuzzy, c-format
5501msgid "Removing expired address of transport `%s'\n"
5502msgstr "Tillgängliga transport(er): %s\n"
5503
5504#: src/peerinfo/gnunet-service-peerinfo.c:310
5505#, fuzzy, c-format
5506msgid "Failed to parse HELLO in file `%s': %s\n"
5507msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5508
5509#: src/peerinfo/gnunet-service-peerinfo.c:331
5510#: src/peerinfo/gnunet-service-peerinfo.c:362
5511#, fuzzy, c-format
5512msgid "Failed to parse HELLO in file `%s'\n"
5513msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5514
5515#: src/peerinfo/gnunet-service-peerinfo.c:446
5516msgid "# peers known"
5517msgstr ""
5518
5519#: src/peerinfo/gnunet-service-peerinfo.c:489
5520#, c-format
5521msgid ""
5522"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5523msgstr ""
5524
5525#: src/peerinfo/gnunet-service-peerinfo.c:655
5526#, fuzzy, c-format
5527msgid "Scanning directory `%s'\n"
5528msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5529
5530#: src/peerinfo/gnunet-service-peerinfo.c:663
5531#, c-format
5532msgid "Still no peers found in `%s'!\n"
5533msgstr ""
5534
5535#: src/peerinfo/gnunet-service-peerinfo.c:1076
5536#, fuzzy, c-format
5537msgid "Cleaning up directory `%s'\n"
5538msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5539
5540#: src/peerinfo/gnunet-service-peerinfo.c:1405
5541#, c-format
5542msgid "Importing HELLOs from `%s'\n"
5543msgstr ""
5544
5545#: src/peerinfo/gnunet-service-peerinfo.c:1418
5546msgid "Skipping import of included HELLOs\n"
5547msgstr ""
5548
5549#: src/peerinfo/peerinfo_api.c:220
5550#, fuzzy
5551msgid "Failed to receive response from `PEERINFO' service."
5552msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
5553
5554#: src/peerinfo-tool/gnunet-peerinfo.c:239 5681#: src/peerinfo-tool/gnunet-peerinfo.c:239
5555#, fuzzy, c-format 5682#, fuzzy, c-format
5556msgid "%sPeer `%s'\n" 5683msgid "%sPeer `%s'\n"
@@ -5641,6 +5768,61 @@ msgstr "Testar transport(er) %s\n"
5641msgid "Failed to load transport plugin for `%s'\n" 5768msgid "Failed to load transport plugin for `%s'\n"
5642msgstr "Kunde inte slå upp \"%s\": %s\n" 5769msgstr "Kunde inte slå upp \"%s\": %s\n"
5643 5770
5771#: src/peerinfo/gnunet-service-peerinfo.c:178
5772#, fuzzy, c-format
5773msgid "Removing expired address of transport `%s'\n"
5774msgstr "Tillgängliga transport(er): %s\n"
5775
5776#: src/peerinfo/gnunet-service-peerinfo.c:310
5777#, fuzzy, c-format
5778msgid "Failed to parse HELLO in file `%s': %s\n"
5779msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5780
5781#: src/peerinfo/gnunet-service-peerinfo.c:331
5782#: src/peerinfo/gnunet-service-peerinfo.c:362
5783#, fuzzy, c-format
5784msgid "Failed to parse HELLO in file `%s'\n"
5785msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5786
5787#: src/peerinfo/gnunet-service-peerinfo.c:446
5788msgid "# peers known"
5789msgstr ""
5790
5791#: src/peerinfo/gnunet-service-peerinfo.c:489
5792#, c-format
5793msgid ""
5794"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5795msgstr ""
5796
5797#: src/peerinfo/gnunet-service-peerinfo.c:655
5798#, fuzzy, c-format
5799msgid "Scanning directory `%s'\n"
5800msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5801
5802#: src/peerinfo/gnunet-service-peerinfo.c:663
5803#, c-format
5804msgid "Still no peers found in `%s'!\n"
5805msgstr ""
5806
5807#: src/peerinfo/gnunet-service-peerinfo.c:1076
5808#, fuzzy, c-format
5809msgid "Cleaning up directory `%s'\n"
5810msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
5811
5812#: src/peerinfo/gnunet-service-peerinfo.c:1405
5813#, c-format
5814msgid "Importing HELLOs from `%s'\n"
5815msgstr ""
5816
5817#: src/peerinfo/gnunet-service-peerinfo.c:1418
5818msgid "Skipping import of included HELLOs\n"
5819msgstr ""
5820
5821#: src/peerinfo/peerinfo_api.c:220
5822#, fuzzy
5823msgid "Failed to receive response from `PEERINFO' service."
5824msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
5825
5644#: src/peerstore/gnunet-peerstore.c:91 5826#: src/peerstore/gnunet-peerstore.c:91
5645msgid "peerstore" 5827msgid "peerstore"
5646msgstr "" 5828msgstr ""
@@ -5690,15 +5872,10 @@ msgstr "Fel vid skapandet av användare"
5690msgid "Unable to create indices: %s.\n" 5872msgid "Unable to create indices: %s.\n"
5691msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" 5873msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
5692 5874
5693#: src/postgres/postgres.c:67 5875#: src/pq/pq_prepare.c:80
5694#, fuzzy, c-format 5876#, fuzzy, c-format
5695msgid "`%s:%s' failed at %s:%d with error: %s\n" 5877msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
5696msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" 5878msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n"
5697
5698#: src/postgres/postgres.c:192
5699#, fuzzy, c-format
5700msgid "Unable to connect to Postgres database '%s': %s\n"
5701msgstr "Kunde inte spara konfigurationsfil \"%s\":"
5702 5879
5703#: src/psycstore/gnunet-service-psycstore.c:249 5880#: src/psycstore/gnunet-service-psycstore.c:249
5704#, fuzzy 5881#, fuzzy
@@ -5878,61 +6055,61 @@ msgstr "GNUnet-konfiguration"
5878msgid "Daemon to announce regular expressions for the peer using cadet." 6055msgid "Daemon to announce regular expressions for the peer using cadet."
5879msgstr "" 6056msgstr ""
5880 6057
5881#: src/regex/gnunet-regex-profiler.c:1314 6058#: src/regex/gnunet-regex-profiler.c:1386
5882#, fuzzy 6059#, fuzzy
5883msgid "No configuration file given. Exiting\n" 6060msgid "No configuration file given. Exiting\n"
5884msgstr "använd konfigurationsfil FILNAMN" 6061msgstr "använd konfigurationsfil FILNAMN"
5885 6062
5886#: src/regex/gnunet-regex-profiler.c:1355 6063#: src/regex/gnunet-regex-profiler.c:1427
5887#: src/regex/gnunet-regex-simulation-profiler.c:630 6064#: src/regex/gnunet-regex-simulation-profiler.c:630
5888#, c-format 6065#, c-format
5889msgid "No policy directory specified on command line. Exiting.\n" 6066msgid "No policy directory specified on command line. Exiting.\n"
5890msgstr "" 6067msgstr ""
5891 6068
5892#: src/regex/gnunet-regex-profiler.c:1361 6069#: src/regex/gnunet-regex-profiler.c:1433
5893#: src/regex/gnunet-regex-simulation-profiler.c:638 6070#: src/regex/gnunet-regex-simulation-profiler.c:638
5894#, c-format 6071#, c-format
5895msgid "Specified policies directory does not exist. Exiting.\n" 6072msgid "Specified policies directory does not exist. Exiting.\n"
5896msgstr "" 6073msgstr ""
5897 6074
5898#: src/regex/gnunet-regex-profiler.c:1368 6075#: src/regex/gnunet-regex-profiler.c:1440
5899#, fuzzy, c-format 6076#, fuzzy, c-format
5900msgid "No files found in `%s'\n" 6077msgid "No files found in `%s'\n"
5901msgstr "%d filer hittades i katalog.\n" 6078msgstr "%d filer hittades i katalog.\n"
5902 6079
5903#: src/regex/gnunet-regex-profiler.c:1377 6080#: src/regex/gnunet-regex-profiler.c:1449
5904msgid "No search strings file given. Exiting.\n" 6081msgid "No search strings file given. Exiting.\n"
5905msgstr "" 6082msgstr ""
5906 6083
5907#: src/regex/gnunet-regex-profiler.c:1397 6084#: src/regex/gnunet-regex-profiler.c:1469
5908#, fuzzy 6085#, fuzzy
5909msgid "Error loading search strings. Exiting.\n" 6086msgid "Error loading search strings. Exiting.\n"
5910msgstr "Fel vid lämning av DHT.\n" 6087msgstr "Fel vid lämning av DHT.\n"
5911 6088
5912#: src/regex/gnunet-regex-profiler.c:1485 6089#: src/regex/gnunet-regex-profiler.c:1557
5913#, fuzzy 6090#, fuzzy
5914msgid "name of the file for writing statistics" 6091msgid "name of the file for writing statistics"
5915msgstr "Visa värde av alternativet" 6092msgstr "Visa värde av alternativet"
5916 6093
5917#: src/regex/gnunet-regex-profiler.c:1491 6094#: src/regex/gnunet-regex-profiler.c:1563
5918msgid "wait TIMEOUT before ending the experiment" 6095msgid "wait TIMEOUT before ending the experiment"
5919msgstr "" 6096msgstr ""
5920 6097
5921#: src/regex/gnunet-regex-profiler.c:1497 6098#: src/regex/gnunet-regex-profiler.c:1569
5922msgid "directory with policy files" 6099msgid "directory with policy files"
5923msgstr "" 6100msgstr ""
5924 6101
5925#: src/regex/gnunet-regex-profiler.c:1504 6102#: src/regex/gnunet-regex-profiler.c:1576
5926#, fuzzy 6103#, fuzzy
5927msgid "name of file with input strings" 6104msgid "name of file with input strings"
5928msgstr "Visa värde av alternativet" 6105msgstr "Visa värde av alternativet"
5929 6106
5930#: src/regex/gnunet-regex-profiler.c:1510 6107#: src/regex/gnunet-regex-profiler.c:1582
5931#, fuzzy 6108#, fuzzy
5932msgid "name of file with hosts' names" 6109msgid "name of file with hosts' names"
5933msgstr "Visa värde av alternativet" 6110msgstr "Visa värde av alternativet"
5934 6111
5935#: src/regex/gnunet-regex-profiler.c:1523 6112#: src/regex/gnunet-regex-profiler.c:1595
5936msgid "Profiler for regex" 6113msgid "Profiler for regex"
5937msgstr "" 6114msgstr ""
5938 6115
@@ -6166,10 +6343,10 @@ msgstr ""
6166msgid "Calculate the Vectorproduct with a GNUnet peer." 6343msgid "Calculate the Vectorproduct with a GNUnet peer."
6167msgstr "" 6344msgstr ""
6168 6345
6169#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 6346#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
6170#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6171#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
6172#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 6347#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
6348#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
6349#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6173#, fuzzy 6350#, fuzzy
6174msgid "Connect to CADET failed\n" 6351msgid "Connect to CADET failed\n"
6175msgstr " Anslutning misslyckades (fel?)\n" 6352msgstr " Anslutning misslyckades (fel?)\n"
@@ -6194,7 +6371,7 @@ msgstr ""
6194msgid "also profile decryption" 6371msgid "also profile decryption"
6195msgstr "" 6372msgstr ""
6196 6373
6197#: src/set/gnunet-service-set.c:1948 6374#: src/set/gnunet-service-set.c:1989
6198#, fuzzy 6375#, fuzzy
6199msgid "Could not connect to CADET service\n" 6376msgid "Could not connect to CADET service\n"
6200msgstr "Kunde inte ansluta till gnunetd.\n" 6377msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -6254,116 +6431,116 @@ msgstr ""
6254msgid "say good-bye and leave somebody else's place" 6431msgid "say good-bye and leave somebody else's place"
6255msgstr "" 6432msgstr ""
6256 6433
6257#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 6434#: src/social/gnunet-social.c:1227
6258msgid "create a place" 6435msgid "create a place"
6259msgstr "" 6436msgstr ""
6260 6437
6261#: src/social/gnunet-social.c:1237 6438#: src/social/gnunet-social.c:1232
6262msgid "destroy a place we were hosting" 6439msgid "destroy a place we were hosting"
6263msgstr "" 6440msgstr ""
6264 6441
6265#: src/social/gnunet-social.c:1242 6442#: src/social/gnunet-social.c:1237
6266msgid "enter somebody else's place" 6443msgid "enter somebody else's place"
6267msgstr "" 6444msgstr ""
6268 6445
6269#: src/social/gnunet-social.c:1248 6446#: src/social/gnunet-social.c:1243
6270msgid "find state matching name prefix" 6447msgid "find state matching name prefix"
6271msgstr "" 6448msgstr ""
6272 6449
6273#: src/social/gnunet-social.c:1253 6450#: src/social/gnunet-social.c:1248
6274msgid "replay history of messages up to the given --limit" 6451msgid "replay history of messages up to the given --limit"
6275msgstr "" 6452msgstr ""
6276 6453
6277#: src/social/gnunet-social.c:1258 6454#: src/social/gnunet-social.c:1253
6278msgid "reconnect to a previously created place" 6455msgid "reconnect to a previously created place"
6279msgstr "" 6456msgstr ""
6280 6457
6281#: src/social/gnunet-social.c:1263 6458#: src/social/gnunet-social.c:1258
6282msgid "publish something to a place we are hosting" 6459msgid "publish something to a place we are hosting"
6283msgstr "" 6460msgstr ""
6284 6461
6285#: src/social/gnunet-social.c:1268 6462#: src/social/gnunet-social.c:1263
6286msgid "reconnect to a previously entered place" 6463msgid "reconnect to a previously entered place"
6287msgstr "" 6464msgstr ""
6288 6465
6289#: src/social/gnunet-social.c:1273 6466#: src/social/gnunet-social.c:1268
6290msgid "search for state matching exact name" 6467msgid "search for state matching exact name"
6291msgstr "" 6468msgstr ""
6292 6469
6293#: src/social/gnunet-social.c:1278 6470#: src/social/gnunet-social.c:1273
6294msgid "submit something to somebody's place" 6471msgid "submit something to somebody's place"
6295msgstr "" 6472msgstr ""
6296 6473
6297#: src/social/gnunet-social.c:1283 6474#: src/social/gnunet-social.c:1278
6298msgid "list of egos and subscribed places" 6475msgid "list of egos and subscribed places"
6299msgstr "" 6476msgstr ""
6300 6477
6301#: src/social/gnunet-social.c:1288 6478#: src/social/gnunet-social.c:1283
6302msgid "extract and replay history between message IDs --start and --until" 6479msgid "extract and replay history between message IDs --start and --until"
6303msgstr "" 6480msgstr ""
6304 6481
6305#: src/social/gnunet-social.c:1297 6482#: src/social/gnunet-social.c:1292
6306msgid "application ID to use when connecting" 6483msgid "application ID to use when connecting"
6307msgstr "" 6484msgstr ""
6308 6485
6309#: src/social/gnunet-social.c:1303 6486#: src/social/gnunet-social.c:1298
6310msgid "message body or state value" 6487msgid "message body or state value"
6311msgstr "" 6488msgstr ""
6312 6489
6313#: src/social/gnunet-social.c:1309 6490#: src/social/gnunet-social.c:1304
6314#, fuzzy 6491#, fuzzy
6315msgid "name or public key of ego" 6492msgid "name or public key of ego"
6316msgstr "Ogiltigt argument: \"%s\"\n" 6493msgstr "Ogiltigt argument: \"%s\"\n"
6317 6494
6318#: src/social/gnunet-social.c:1314 6495#: src/social/gnunet-social.c:1309
6319#, fuzzy 6496#, fuzzy
6320msgid "wait for incoming messages" 6497msgid "wait for incoming messages"
6321msgstr "Misslyckades att leverera \"%s\" meddelande.\n" 6498msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
6322 6499
6323#: src/social/gnunet-social.c:1320 6500#: src/social/gnunet-social.c:1315
6324#, fuzzy 6501#, fuzzy
6325msgid "GNS name" 6502msgid "GNS name"
6326msgstr "Visa _namn" 6503msgstr "Visa _namn"
6327 6504
6328#: src/social/gnunet-social.c:1326 6505#: src/social/gnunet-social.c:1321
6329msgid "peer ID for --guest-enter" 6506msgid "peer ID for --guest-enter"
6330msgstr "" 6507msgstr ""
6331 6508
6332#: src/social/gnunet-social.c:1332 6509#: src/social/gnunet-social.c:1327
6333msgid "name (key) to query from state" 6510msgid "name (key) to query from state"
6334msgstr "" 6511msgstr ""
6335 6512
6336#: src/social/gnunet-social.c:1338 6513#: src/social/gnunet-social.c:1333
6337#, fuzzy 6514#, fuzzy
6338msgid "method name" 6515msgid "method name"
6339msgstr "Visa _namn" 6516msgstr "Visa _namn"
6340 6517
6341#: src/social/gnunet-social.c:1344 6518#: src/social/gnunet-social.c:1339
6342#, fuzzy 6519#, fuzzy
6343msgid "number of messages to replay from history" 6520msgid "number of messages to replay from history"
6344msgstr "antal meddelanden att använda per iteration" 6521msgstr "antal meddelanden att använda per iteration"
6345 6522
6346#: src/social/gnunet-social.c:1350 6523#: src/social/gnunet-social.c:1345
6347msgid "key address of place" 6524msgid "key address of place"
6348msgstr "" 6525msgstr ""
6349 6526
6350#: src/social/gnunet-social.c:1356 6527#: src/social/gnunet-social.c:1351
6351msgid "start message ID for history replay" 6528msgid "start message ID for history replay"
6352msgstr "" 6529msgstr ""
6353 6530
6354#: src/social/gnunet-social.c:1361 6531#: src/social/gnunet-social.c:1356
6355msgid "respond to entry requests by admitting all guests" 6532msgid "respond to entry requests by admitting all guests"
6356msgstr "" 6533msgstr ""
6357 6534
6358#: src/social/gnunet-social.c:1367 6535#: src/social/gnunet-social.c:1362
6359msgid "end message ID for history replay" 6536msgid "end message ID for history replay"
6360msgstr "" 6537msgstr ""
6361 6538
6362#: src/social/gnunet-social.c:1372 6539#: src/social/gnunet-social.c:1367
6363msgid "respond to entry requests by refusing all guests" 6540msgid "respond to entry requests by refusing all guests"
6364msgstr "" 6541msgstr ""
6365 6542
6366#: src/social/gnunet-social.c:1382 6543#: src/social/gnunet-social.c:1377
6367msgid "" 6544msgid ""
6368"gnunet-social - Interact with the social service: enter/leave, send/receive " 6545"gnunet-social - Interact with the social service: enter/leave, send/receive "
6369"messages, access history and state.\n" 6546"messages, access history and state.\n"
@@ -6556,7 +6733,7 @@ msgid ""
6556msgstr "" 6733msgstr ""
6557 6734
6558#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 6735#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
6559#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 6736#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
6560#, c-format 6737#, c-format
6561msgid "Incorrect hostkey file format: %s\n" 6738msgid "Incorrect hostkey file format: %s\n"
6562msgstr "" 6739msgstr ""
@@ -6626,16 +6803,6 @@ msgstr ""
6626msgid "%.s Unknown result code." 6803msgid "%.s Unknown result code."
6627msgstr "" 6804msgstr ""
6628 6805
6629#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6630#, fuzzy
6631msgid "Waiting for child to exit.\n"
6632msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n"
6633
6634#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6635#, fuzzy, c-format
6636msgid "Spawning process `%s'\n"
6637msgstr "Startade samling \"%s\".\n"
6638
6639#: src/testbed/gnunet-testbed-profiler.c:290 6806#: src/testbed/gnunet-testbed-profiler.c:290
6640msgid "tolerate COUNT number of continious timeout failures" 6807msgid "tolerate COUNT number of continious timeout failures"
6641msgstr "" 6808msgstr ""
@@ -6647,6 +6814,16 @@ msgid ""
6647"signal is received" 6814"signal is received"
6648msgstr "" 6815msgstr ""
6649 6816
6817#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6818#, fuzzy
6819msgid "Waiting for child to exit.\n"
6820msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n"
6821
6822#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6823#, fuzzy, c-format
6824msgid "Spawning process `%s'\n"
6825msgstr "Startade samling \"%s\".\n"
6826
6650#: src/testbed/testbed_api.c:410 6827#: src/testbed/testbed_api.c:410
6651#, fuzzy, c-format 6828#, fuzzy, c-format
6652msgid "Adding host %u failed with error: %s\n" 6829msgid "Adding host %u failed with error: %s\n"
@@ -6943,10 +7120,6 @@ msgstr "# krypterade PONG-meddelanden mottagna"
6943msgid "GNUnet topology control" 7120msgid "GNUnet topology control"
6944msgstr "" 7121msgstr ""
6945 7122
6946#: src/transport/gnunet-service-transport_ats.c:141
6947msgid "# Addresses given to ATS"
6948msgstr ""
6949
6950#: src/transport/gnunet-service-transport.c:448 7123#: src/transport/gnunet-service-transport.c:448
6951msgid "# messages dropped due to slow client" 7124msgid "# messages dropped due to slow client"
6952msgstr "" 7125msgstr ""
@@ -6995,6 +7168,10 @@ msgstr ""
6995msgid "Transport service is lacking key configuration settings. Exiting.\n" 7168msgid "Transport service is lacking key configuration settings. Exiting.\n"
6996msgstr "GNUnet-konfiguration" 7169msgstr "GNUnet-konfiguration"
6997 7170
7171#: src/transport/gnunet-service-transport_ats.c:141
7172msgid "# Addresses given to ATS"
7173msgstr ""
7174
6998#: src/transport/gnunet-service-transport_hello.c:195 7175#: src/transport/gnunet-service-transport_hello.c:195
6999msgid "# refreshed my HELLO" 7176msgid "# refreshed my HELLO"
7000msgstr "" 7177msgstr ""
@@ -7326,6 +7503,46 @@ msgstr ""
7326msgid "# validations succeeded" 7503msgid "# validations succeeded"
7327msgstr "" 7504msgstr ""
7328 7505
7506#: src/transport/gnunet-transport-profiler.c:219
7507#, c-format
7508msgid "%llu B in %llu ms == %.2f KB/s!\n"
7509msgstr ""
7510
7511#: src/transport/gnunet-transport-profiler.c:617
7512msgid "send data to peer"
7513msgstr ""
7514
7515#: src/transport/gnunet-transport-profiler.c:621
7516#, fuzzy
7517msgid "receive data from peer"
7518msgstr "# byte mottagna av typen %d"
7519
7520#: src/transport/gnunet-transport-profiler.c:626
7521#, fuzzy
7522msgid "iterations"
7523msgstr "Visa alla alternativ"
7524
7525#: src/transport/gnunet-transport-profiler.c:631
7526#, fuzzy
7527msgid "number of messages to send"
7528msgstr "antal meddelanden att använda per iteration"
7529
7530#: src/transport/gnunet-transport-profiler.c:636
7531#, fuzzy
7532msgid "message size to use"
7533msgstr "meddelandestorlek"
7534
7535#: src/transport/gnunet-transport-profiler.c:641
7536#: src/transport/gnunet-transport.c:1462
7537msgid "peer identity"
7538msgstr ""
7539
7540#: src/transport/gnunet-transport-profiler.c:652
7541#: src/transport/gnunet-transport.c:1482
7542#, fuzzy
7543msgid "Direct access to transport service."
7544msgstr "Misslyckades att ansluta till gnunetd.\n"
7545
7329#: src/transport/gnunet-transport.c:413 7546#: src/transport/gnunet-transport.c:413
7330#, fuzzy, c-format 7547#, fuzzy, c-format
7331msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" 7548msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7465,11 +7682,6 @@ msgstr "Skriv ut information om GNUnets motparter."
7465msgid "do not resolve hostnames" 7682msgid "do not resolve hostnames"
7466msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 7683msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
7467 7684
7468#: src/transport/gnunet-transport.c:1462
7469#: src/transport/gnunet-transport-profiler.c:641
7470msgid "peer identity"
7471msgstr ""
7472
7473#: src/transport/gnunet-transport.c:1466 7685#: src/transport/gnunet-transport.c:1466
7474msgid "monitor plugin sessions" 7686msgid "monitor plugin sessions"
7475msgstr "" 7687msgstr ""
@@ -7478,44 +7690,9 @@ msgstr ""
7478msgid "send data for benchmarking to the other peer (until CTRL-C)" 7690msgid "send data for benchmarking to the other peer (until CTRL-C)"
7479msgstr "" 7691msgstr ""
7480 7692
7481#: src/transport/gnunet-transport.c:1482
7482#: src/transport/gnunet-transport-profiler.c:652
7483#, fuzzy
7484msgid "Direct access to transport service."
7485msgstr "Misslyckades att ansluta till gnunetd.\n"
7486
7487#: src/transport/gnunet-transport-profiler.c:219
7488#, c-format
7489msgid "%llu B in %llu ms == %.2f KB/s!\n"
7490msgstr ""
7491
7492#: src/transport/gnunet-transport-profiler.c:617
7493msgid "send data to peer"
7494msgstr ""
7495
7496#: src/transport/gnunet-transport-profiler.c:621
7497#, fuzzy
7498msgid "receive data from peer"
7499msgstr "# byte mottagna av typen %d"
7500
7501#: src/transport/gnunet-transport-profiler.c:626
7502#, fuzzy
7503msgid "iterations"
7504msgstr "Visa alla alternativ"
7505
7506#: src/transport/gnunet-transport-profiler.c:631
7507#, fuzzy
7508msgid "number of messages to send"
7509msgstr "antal meddelanden att använda per iteration"
7510
7511#: src/transport/gnunet-transport-profiler.c:636
7512#, fuzzy
7513msgid "message size to use"
7514msgstr "meddelandestorlek"
7515
7516#: src/transport/plugin_transport_http_client.c:1474 7693#: src/transport/plugin_transport_http_client.c:1474
7517#: src/transport/plugin_transport_http_server.c:2249 7694#: src/transport/plugin_transport_http_server.c:2312
7518#: src/transport/plugin_transport_http_server.c:3463 7695#: src/transport/plugin_transport_http_server.c:3526
7519#: src/transport/plugin_transport_tcp.c:3890 7696#: src/transport/plugin_transport_tcp.c:3890
7520#: src/transport/plugin_transport_tcp.c:3897 7697#: src/transport/plugin_transport_tcp.c:3897
7521msgid "TCP_STEALTH not supported on this platform.\n" 7698msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7527,13 +7704,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
7527msgstr "" 7704msgstr ""
7528 7705
7529#: src/transport/plugin_transport_http_client.c:2164 7706#: src/transport/plugin_transport_http_client.c:2164
7530#: src/transport/plugin_transport_http_server.c:3178 7707#: src/transport/plugin_transport_http_server.c:3241
7531#, fuzzy, c-format 7708#, fuzzy, c-format
7532msgid "Shutting down plugin `%s'\n" 7709msgid "Shutting down plugin `%s'\n"
7533msgstr "Testar transport(er) %s\n" 7710msgstr "Testar transport(er) %s\n"
7534 7711
7535#: src/transport/plugin_transport_http_client.c:2181 7712#: src/transport/plugin_transport_http_client.c:2181
7536#: src/transport/plugin_transport_http_server.c:3248 7713#: src/transport/plugin_transport_http_server.c:3311
7537#, fuzzy, c-format 7714#, fuzzy, c-format
7538msgid "Shutdown for plugin `%s' complete\n" 7715msgid "Shutdown for plugin `%s' complete\n"
7539msgstr "" 7716msgstr ""
@@ -7544,108 +7721,108 @@ msgstr ""
7544msgid "Maximum number of requests is %u\n" 7721msgid "Maximum number of requests is %u\n"
7545msgstr "Maximalt antal chattklienter uppnått.\n" 7722msgstr "Maximalt antal chattklienter uppnått.\n"
7546 7723
7547#: src/transport/plugin_transport_http_server.c:1727 7724#: src/transport/plugin_transport_http_server.c:1756
7548#, c-format 7725#, c-format
7549msgid "" 7726msgid ""
7550"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " 7727"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
7551"size %u\n" 7728"size %u\n"
7552msgstr "" 7729msgstr ""
7553 7730
7554#: src/transport/plugin_transport_http_server.c:1967 7731#: src/transport/plugin_transport_http_server.c:2028
7555#, c-format 7732#, c-format
7556msgid "Accepting connection (%u of %u) from `%s'\n" 7733msgid "Accepting connection (%u of %u) from `%s'\n"
7557msgstr "" 7734msgstr ""
7558 7735
7559#: src/transport/plugin_transport_http_server.c:1975 7736#: src/transport/plugin_transport_http_server.c:2036
7560#, c-format 7737#, c-format
7561msgid "" 7738msgid ""
7562"Server reached maximum number connections (%u), rejecting new connection\n" 7739"Server reached maximum number connections (%u), rejecting new connection\n"
7563msgstr "" 7740msgstr ""
7564 7741
7565#: src/transport/plugin_transport_http_server.c:2125 7742#: src/transport/plugin_transport_http_server.c:2186
7566msgid "" 7743msgid ""
7567"Could not create a new TLS certificate, program `gnunet-transport-" 7744"Could not create a new TLS certificate, program `gnunet-transport-"
7568"certificate-creation' could not be started!\n" 7745"certificate-creation' could not be started!\n"
7569msgstr "" 7746msgstr ""
7570 7747
7571#: src/transport/plugin_transport_http_server.c:2148 7748#: src/transport/plugin_transport_http_server.c:2209
7572#, c-format 7749#, c-format
7573msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" 7750msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
7574msgstr "" 7751msgstr ""
7575 7752
7576#: src/transport/plugin_transport_http_server.c:2275 7753#: src/transport/plugin_transport_http_server.c:2338
7577msgid "Could not load or create server certificate! Loading plugin failed!\n" 7754msgid "Could not load or create server certificate! Loading plugin failed!\n"
7578msgstr "" 7755msgstr ""
7579 7756
7580#: src/transport/plugin_transport_http_server.c:2587 7757#: src/transport/plugin_transport_http_server.c:2650
7581#, fuzzy 7758#, fuzzy
7582msgid "Require valid port number for service in configuration!\n" 7759msgid "Require valid port number for service in configuration!\n"
7583msgstr "Inga applikationer definierade i konfiguration!\n" 7760msgstr "Inga applikationer definierade i konfiguration!\n"
7584 7761
7585#: src/transport/plugin_transport_http_server.c:2752 7762#: src/transport/plugin_transport_http_server.c:2815
7586#, c-format 7763#, c-format
7587msgid "Found %u addresses to report to NAT service\n" 7764msgid "Found %u addresses to report to NAT service\n"
7588msgstr "" 7765msgstr ""
7589 7766
7590#: src/transport/plugin_transport_http_server.c:2838 7767#: src/transport/plugin_transport_http_server.c:2901
7591#: src/transport/plugin_transport_udp.c:3622 7768#: src/transport/plugin_transport_udp.c:3622
7592msgid "Disabling IPv6 since it is not supported on this system!\n" 7769msgid "Disabling IPv6 since it is not supported on this system!\n"
7593msgstr "" 7770msgstr ""
7594 7771
7595#: src/transport/plugin_transport_http_server.c:2944 7772#: src/transport/plugin_transport_http_server.c:3007
7596#, c-format 7773#, c-format
7597msgid "IPv4 support is %s\n" 7774msgid "IPv4 support is %s\n"
7598msgstr "" 7775msgstr ""
7599 7776
7600#: src/transport/plugin_transport_http_server.c:2959 7777#: src/transport/plugin_transport_http_server.c:3022
7601#, c-format 7778#, c-format
7602msgid "IPv6 support is %s\n" 7779msgid "IPv6 support is %s\n"
7603msgstr "" 7780msgstr ""
7604 7781
7605#: src/transport/plugin_transport_http_server.c:2965 7782#: src/transport/plugin_transport_http_server.c:3028
7606msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" 7783msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
7607msgstr "" 7784msgstr ""
7608 7785
7609#: src/transport/plugin_transport_http_server.c:2976 7786#: src/transport/plugin_transport_http_server.c:3039
7610#, fuzzy 7787#, fuzzy
7611msgid "Port is required! Fix in configuration\n" 7788msgid "Port is required! Fix in configuration\n"
7612msgstr " gconfig\tGTK-konfiguration\n" 7789msgstr " gconfig\tGTK-konfiguration\n"
7613 7790
7614#: src/transport/plugin_transport_http_server.c:2982 7791#: src/transport/plugin_transport_http_server.c:3045
7615#, fuzzy, c-format 7792#, fuzzy, c-format
7616msgid "Using port %u\n" 7793msgid "Using port %u\n"
7617msgstr "Testar transport(er) %s\n" 7794msgstr "Testar transport(er) %s\n"
7618 7795
7619#: src/transport/plugin_transport_http_server.c:3001 7796#: src/transport/plugin_transport_http_server.c:3064
7620#, fuzzy, c-format 7797#, fuzzy, c-format
7621msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" 7798msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
7622msgstr "" 7799msgstr ""
7623"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s" 7800"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s"
7624"\".\n" 7801"\".\n"
7625 7802
7626#: src/transport/plugin_transport_http_server.c:3036 7803#: src/transport/plugin_transport_http_server.c:3099
7627#, fuzzy, c-format 7804#, fuzzy, c-format
7628msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" 7805msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
7629msgstr "" 7806msgstr ""
7630"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s" 7807"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s"
7631"\".\n" 7808"\".\n"
7632 7809
7633#: src/transport/plugin_transport_http_server.c:3111 7810#: src/transport/plugin_transport_http_server.c:3174
7634#, fuzzy, c-format 7811#, fuzzy, c-format
7635msgid "Using external hostname `%s'\n" 7812msgid "Using external hostname `%s'\n"
7636msgstr "Startade samling \"%s\".\n" 7813msgstr "Startade samling \"%s\".\n"
7637 7814
7638#: src/transport/plugin_transport_http_server.c:3132 7815#: src/transport/plugin_transport_http_server.c:3195
7639#, fuzzy, c-format 7816#, fuzzy, c-format
7640msgid "Notifying transport only about hostname `%s'\n" 7817msgid "Notifying transport only about hostname `%s'\n"
7641msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 7818msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
7642 7819
7643#: src/transport/plugin_transport_http_server.c:3149 7820#: src/transport/plugin_transport_http_server.c:3212
7644#, fuzzy, c-format 7821#, fuzzy, c-format
7645msgid "Maximum number of connections is %u\n" 7822msgid "Maximum number of connections is %u\n"
7646msgstr "Maximalt antal chattklienter uppnått.\n" 7823msgstr "Maximalt antal chattklienter uppnått.\n"
7647 7824
7648#: src/transport/plugin_transport_http_server.c:3475 7825#: src/transport/plugin_transport_http_server.c:3538
7649#, fuzzy 7826#, fuzzy
7650msgid "Unable to compile URL regex\n" 7827msgid "Unable to compile URL regex\n"
7651msgstr "Kunde inte initiera SQLite.\n" 7828msgstr "Kunde inte initiera SQLite.\n"
@@ -7800,21 +7977,6 @@ msgstr ""
7800msgid "TCP transport advertises itself as being on port %llu\n" 7977msgid "TCP transport advertises itself as being on port %llu\n"
7801msgstr "" 7978msgstr ""
7802 7979
7803#: src/transport/plugin_transport_udp_broadcasting.c:168
7804#, fuzzy
7805msgid "# Multicast HELLO beacons received via UDP"
7806msgstr "# krypterade PONG-meddelanden mottagna"
7807
7808#: src/transport/plugin_transport_udp_broadcasting.c:548
7809msgid ""
7810"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7811msgstr ""
7812
7813#: src/transport/plugin_transport_udp_broadcasting.c:565
7814#, c-format
7815msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7816msgstr ""
7817
7818#: src/transport/plugin_transport_udp.c:3366 7980#: src/transport/plugin_transport_udp.c:3366
7819#, c-format 7981#, c-format
7820msgid "" 7982msgid ""
@@ -7863,6 +8025,21 @@ msgstr "\"%s\" är inte tillgänglig."
7863msgid "Failed to create UDP network sockets\n" 8025msgid "Failed to create UDP network sockets\n"
7864msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" 8026msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
7865 8027
8028#: src/transport/plugin_transport_udp_broadcasting.c:168
8029#, fuzzy
8030msgid "# Multicast HELLO beacons received via UDP"
8031msgstr "# krypterade PONG-meddelanden mottagna"
8032
8033#: src/transport/plugin_transport_udp_broadcasting.c:548
8034msgid ""
8035"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
8036msgstr ""
8037
8038#: src/transport/plugin_transport_udp_broadcasting.c:565
8039#, c-format
8040msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
8041msgstr ""
8042
7866#: src/transport/plugin_transport_unix.c:1403 8043#: src/transport/plugin_transport_unix.c:1403
7867#, fuzzy, c-format 8044#, fuzzy, c-format
7868msgid "Cannot create path to `%s'\n" 8045msgid "Cannot create path to `%s'\n"
@@ -7978,7 +8155,7 @@ msgid ""
7978"`GNUNET_SERVER_receive_done' after %s\n" 8155"`GNUNET_SERVER_receive_done' after %s\n"
7979msgstr "" 8156msgstr ""
7980 8157
7981#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 8158#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
7982#, fuzzy, c-format 8159#, fuzzy, c-format
7983msgid "Unknown address family %d\n" 8160msgid "Unknown address family %d\n"
7984msgstr "Okänd operation \"%s\"\n" 8161msgstr "Okänd operation \"%s\"\n"
@@ -8023,51 +8200,51 @@ msgstr "Fel vid %s:%d.\n"
8023msgid "Service `%s' runs at %s\n" 8200msgid "Service `%s' runs at %s\n"
8024msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" 8201msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
8025 8202
8026#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 8203#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
8027msgid "Service process failed to initialize\n" 8204msgid "Service process failed to initialize\n"
8028msgstr "" 8205msgstr ""
8029 8206
8030#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 8207#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
8031msgid "Service process could not initialize server function\n" 8208msgid "Service process could not initialize server function\n"
8032msgstr "" 8209msgstr ""
8033 8210
8034#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 8211#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
8035msgid "Service process failed to report status\n" 8212msgid "Service process failed to report status\n"
8036msgstr "" 8213msgstr ""
8037 8214
8038#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 8215#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
8039#: src/util/service.c:1379 8216#: src/util/service.c:1378
8040#, fuzzy, c-format 8217#, fuzzy, c-format
8041msgid "Cannot obtain information about user `%s': %s\n" 8218msgid "Cannot obtain information about user `%s': %s\n"
8042msgstr "Kan inte öppna konfigurationsfil \"%s\".\n" 8219msgstr "Kan inte öppna konfigurationsfil \"%s\".\n"
8043 8220
8044#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 8221#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
8045msgid "No such user" 8222msgid "No such user"
8046msgstr "" 8223msgstr ""
8047 8224
8048#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 8225#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
8049#, c-format 8226#, c-format
8050msgid "Cannot change user/group to `%s': %s\n" 8227msgid "Cannot change user/group to `%s': %s\n"
8051msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n" 8228msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n"
8052 8229
8053#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 8230#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
8054msgid "do daemonize (detach from terminal)" 8231msgid "do daemonize (detach from terminal)"
8055msgstr "" 8232msgstr ""
8056 8233
8057#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 8234#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
8058#: src/util/service.c:1791 8235#: src/util/service.c:1790
8059#, fuzzy, c-format 8236#, fuzzy, c-format
8060msgid "Malformed configuration file `%s', exit ...\n" 8237msgid "Malformed configuration file `%s', exit ...\n"
8061msgstr "Kunde inte spara konfigurationsfil \"%s\":" 8238msgstr "Kunde inte spara konfigurationsfil \"%s\":"
8062 8239
8063#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 8240#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
8064#: src/util/service.c:1802 8241#: src/util/service.c:1801
8065#, fuzzy 8242#, fuzzy
8066msgid "Malformed configuration, exit ...\n" 8243msgid "Malformed configuration, exit ...\n"
8067msgstr "Kunde inte spara konfigurationsfil \"%s\":" 8244msgstr "Kunde inte spara konfigurationsfil \"%s\":"
8068 8245
8069#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 8246#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
8070#: src/util/service.c:1808 8247#: src/util/service.c:1807
8071#, fuzzy, c-format 8248#, fuzzy, c-format
8072msgid "Could not access configuration file `%s'\n" 8249msgid "Could not access configuration file `%s'\n"
8073msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" 8250msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
@@ -8112,86 +8289,86 @@ msgstr ""
8112msgid "Need a non-empty hostname for service `%s'.\n" 8289msgid "Need a non-empty hostname for service `%s'.\n"
8113msgstr "" 8290msgstr ""
8114 8291
8115#: src/util/common_logging.c:256 src/util/common_logging.c:1129 8292#: src/util/common_logging.c:259 src/util/common_logging.c:1132
8116msgid "DEBUG" 8293msgid "DEBUG"
8117msgstr "FELSÖKNING" 8294msgstr "FELSÖKNING"
8118 8295
8119#: src/util/common_logging.c:258 src/util/common_logging.c:1127 8296#: src/util/common_logging.c:261 src/util/common_logging.c:1130
8120msgid "INFO" 8297msgid "INFO"
8121msgstr "INFO" 8298msgstr "INFO"
8122 8299
8123#: src/util/common_logging.c:260 src/util/common_logging.c:1125 8300#: src/util/common_logging.c:263 src/util/common_logging.c:1128
8124msgid "MESSAGE" 8301msgid "MESSAGE"
8125msgstr "MEDDELANDE" 8302msgstr "MEDDELANDE"
8126 8303
8127#: src/util/common_logging.c:262 src/util/common_logging.c:1123 8304#: src/util/common_logging.c:265 src/util/common_logging.c:1126
8128msgid "WARNING" 8305msgid "WARNING"
8129msgstr "VARNING" 8306msgstr "VARNING"
8130 8307
8131#: src/util/common_logging.c:264 src/util/common_logging.c:1121 8308#: src/util/common_logging.c:267 src/util/common_logging.c:1124
8132msgid "ERROR" 8309msgid "ERROR"
8133msgstr "FEL" 8310msgstr "FEL"
8134 8311
8135#: src/util/common_logging.c:266 src/util/common_logging.c:1131 8312#: src/util/common_logging.c:269 src/util/common_logging.c:1134
8136msgid "NONE" 8313msgid "NONE"
8137msgstr "" 8314msgstr ""
8138 8315
8139#: src/util/common_logging.c:879 8316#: src/util/common_logging.c:882
8140#, c-format 8317#, c-format
8141msgid "Message `%.*s' repeated %u times in the last %s\n" 8318msgid "Message `%.*s' repeated %u times in the last %s\n"
8142msgstr "" 8319msgstr ""
8143 8320
8144#: src/util/common_logging.c:1132 8321#: src/util/common_logging.c:1135
8145msgid "INVALID" 8322msgid "INVALID"
8146msgstr "" 8323msgstr ""
8147 8324
8148#: src/util/common_logging.c:1302 8325#: src/util/common_logging.c:1326
8149msgid "unknown address" 8326msgid "unknown address"
8150msgstr "" 8327msgstr ""
8151 8328
8152#: src/util/common_logging.c:1344 8329#: src/util/common_logging.c:1368
8153msgid "invalid address" 8330msgid "invalid address"
8154msgstr "" 8331msgstr ""
8155 8332
8156#: src/util/common_logging.c:1362 8333#: src/util/common_logging.c:1386
8157#, fuzzy, c-format 8334#, fuzzy, c-format
8158msgid "Configuration fails to specify option `%s' in section `%s'!\n" 8335msgid "Configuration fails to specify option `%s' in section `%s'!\n"
8159msgstr "Konfigurationsfil \"%s\" skapad.\n" 8336msgstr "Konfigurationsfil \"%s\" skapad.\n"
8160 8337
8161#: src/util/common_logging.c:1383 8338#: src/util/common_logging.c:1407
8162#, fuzzy, c-format 8339#, fuzzy, c-format
8163msgid "" 8340msgid ""
8164"Configuration specifies invalid value for option `%s' in section `%s': %s\n" 8341"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
8165msgstr "Konfigurationsfil \"%s\" hittades inte. Kör \"gnunet-setup -d\"!\n" 8342msgstr "Konfigurationsfil \"%s\" hittades inte. Kör \"gnunet-setup -d\"!\n"
8166 8343
8167#: src/util/configuration.c:286 8344#: src/util/configuration.c:296
8168#, fuzzy, c-format 8345#, fuzzy, c-format
8169msgid "Syntax error while deserializing in line %u\n" 8346msgid "Syntax error while deserializing in line %u\n"
8170msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n" 8347msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n"
8171 8348
8172#: src/util/configuration.c:344 8349#: src/util/configuration.c:355
8173#, fuzzy, c-format 8350#, fuzzy, c-format
8174msgid "Error while reading file `%s'\n" 8351msgid "Error while reading file `%s'\n"
8175msgstr "Fel vid nedladdning: %s\n" 8352msgstr "Fel vid nedladdning: %s\n"
8176 8353
8177#: src/util/configuration.c:1017 8354#: src/util/configuration.c:1034
8178#, c-format 8355#, c-format
8179msgid "" 8356msgid ""
8180"Configuration value '%s' for '%s' in section '%s' is not in set of legal " 8357"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
8181"choices\n" 8358"choices\n"
8182msgstr "" 8359msgstr ""
8183 8360
8184#: src/util/configuration.c:1136 8361#: src/util/configuration.c:1153
8185#, c-format 8362#, c-format
8186msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" 8363msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
8187msgstr "" 8364msgstr ""
8188 8365
8189#: src/util/configuration.c:1169 8366#: src/util/configuration.c:1186
8190#, fuzzy, c-format 8367#, fuzzy, c-format
8191msgid "Missing closing `%s' in option `%s'\n" 8368msgid "Missing closing `%s' in option `%s'\n"
8192msgstr "Konfigurationsfil \"%s\" skapad.\n" 8369msgstr "Konfigurationsfil \"%s\" skapad.\n"
8193 8370
8194#: src/util/configuration.c:1237 8371#: src/util/configuration.c:1254
8195#, c-format 8372#, c-format
8196msgid "" 8373msgid ""
8197"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " 8374"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8225,32 +8402,32 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
8225msgid "EdDSA signature verification failed at %s:%d: %s\n" 8402msgid "EdDSA signature verification failed at %s:%d: %s\n"
8226msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" 8403msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
8227 8404
8228#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 8405#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
8229#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 8406#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
8230#, fuzzy, c-format 8407#, fuzzy, c-format
8231msgid "Could not acquire lock on file `%s': %s...\n" 8408msgid "Could not acquire lock on file `%s': %s...\n"
8232msgstr "Kunde inte slå upp \"%s\": %s\n" 8409msgstr "Kunde inte slå upp \"%s\": %s\n"
8233 8410
8234#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 8411#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
8235#, fuzzy 8412#, fuzzy
8236msgid "Creating a new private key. This may take a while.\n" 8413msgid "Creating a new private key. This may take a while.\n"
8237msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n" 8414msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n"
8238 8415
8239#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 8416#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
8240msgid "This may be ok if someone is currently generating a private key.\n" 8417msgid "This may be ok if someone is currently generating a private key.\n"
8241msgstr "" 8418msgstr ""
8242 8419
8243#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 8420#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
8244#, c-format 8421#, c-format
8245msgid "" 8422msgid ""
8246"When trying to read key file `%s' I found %u bytes but I need at least %u.\n" 8423"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
8247msgstr "" 8424msgstr ""
8248 8425
8249#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 8426#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
8250msgid "This may be ok if someone is currently generating a key.\n" 8427msgid "This may be ok if someone is currently generating a key.\n"
8251msgstr "" 8428msgstr ""
8252 8429
8253#: src/util/crypto_ecc_setup.c:413 8430#: src/util/crypto_ecc_setup.c:415
8254#, fuzzy 8431#, fuzzy
8255msgid "Could not load peer's private key\n" 8432msgid "Could not load peer's private key\n"
8256msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" 8433msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
@@ -8444,82 +8621,86 @@ msgstr ""
8444msgid "Manipulate GNUnet configuration files" 8621msgid "Manipulate GNUnet configuration files"
8445msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" 8622msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
8446 8623
8447#: src/util/gnunet-ecc.c:84 8624#: src/util/gnunet-ecc.c:89
8448#, fuzzy, c-format 8625#, fuzzy, c-format
8449msgid "Failed to open `%s': %s\n" 8626msgid "Failed to open `%s': %s\n"
8450msgstr "Misslyckades att leverera \"%s\" meddelande.\n" 8627msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
8451 8628
8452#: src/util/gnunet-ecc.c:120 8629#: src/util/gnunet-ecc.c:125
8453#, c-format 8630#, c-format
8454msgid "Generating %u keys like %s, please wait" 8631msgid "Generating %u keys like %s, please wait"
8455msgstr "" 8632msgstr ""
8456 8633
8457#: src/util/gnunet-ecc.c:133 8634#: src/util/gnunet-ecc.c:138
8458#, c-format 8635#, c-format
8459msgid "Generating %u keys, please wait" 8636msgid "Generating %u keys, please wait"
8460msgstr "" 8637msgstr ""
8461 8638
8462#: src/util/gnunet-ecc.c:174 8639#: src/util/gnunet-ecc.c:179
8463#, fuzzy, c-format 8640#, fuzzy, c-format
8464msgid "" 8641msgid ""
8465"\n" 8642"\n"
8466"Failed to write to `%s': %s\n" 8643"Failed to write to `%s': %s\n"
8467msgstr "Fel vid %s:%d.\n" 8644msgstr "Fel vid %s:%d.\n"
8468 8645
8469#: src/util/gnunet-ecc.c:184 8646#: src/util/gnunet-ecc.c:189
8470#, fuzzy, c-format 8647#, fuzzy, c-format
8471msgid "" 8648msgid ""
8472"\n" 8649"\n"
8473"Finished!\n" 8650"Finished!\n"
8474msgstr "Slutför" 8651msgstr "Slutför"
8475 8652
8476#: src/util/gnunet-ecc.c:187 8653#: src/util/gnunet-ecc.c:192
8477#, c-format 8654#, c-format
8478msgid "" 8655msgid ""
8479"\n" 8656"\n"
8480"Error, %u keys not generated\n" 8657"Error, %u keys not generated\n"
8481msgstr "" 8658msgstr ""
8482 8659
8483#: src/util/gnunet-ecc.c:280 8660#: src/util/gnunet-ecc.c:283
8484#, fuzzy, c-format 8661#, fuzzy, c-format
8485msgid "Hostkeys file `%s' not found\n" 8662msgid "Hostkeys file `%s' not found\n"
8486msgstr "\"%s\" misslyckades: tabell hittades inte!\n" 8663msgstr "\"%s\" misslyckades: tabell hittades inte!\n"
8487 8664
8488#: src/util/gnunet-ecc.c:291 8665#: src/util/gnunet-ecc.c:294
8489#, fuzzy, c-format 8666#, fuzzy, c-format
8490msgid "Hostkeys file `%s' is empty\n" 8667msgid "Hostkeys file `%s' is empty\n"
8491msgstr "antal meddelanden att använda per iteration" 8668msgstr "antal meddelanden att använda per iteration"
8492 8669
8493#: src/util/gnunet-ecc.c:313 8670#: src/util/gnunet-ecc.c:316
8494#, fuzzy, c-format 8671#, fuzzy, c-format
8495msgid "Could not read hostkey file: %s\n" 8672msgid "Could not read hostkey file: %s\n"
8496msgstr "Kunde inte skapa värdnyckel!\n" 8673msgstr "Kunde inte skapa värdnyckel!\n"
8497 8674
8498#: src/util/gnunet-ecc.c:364 8675#: src/util/gnunet-ecc.c:367
8499msgid "No hostkey file specified on command line\n" 8676msgid "No hostkey file specified on command line\n"
8500msgstr "" 8677msgstr ""
8501 8678
8502#: src/util/gnunet-ecc.c:416 8679#: src/util/gnunet-ecc.c:425
8503msgid "list keys included in a file (for testing)" 8680msgid "list keys included in a file (for testing)"
8504msgstr "" 8681msgstr ""
8505 8682
8506#: src/util/gnunet-ecc.c:421 8683#: src/util/gnunet-ecc.c:430
8507msgid "number of keys to list included in a file (for testing)" 8684msgid "number of keys to list included in a file (for testing)"
8508msgstr "" 8685msgstr ""
8509 8686
8510#: src/util/gnunet-ecc.c:426 8687#: src/util/gnunet-ecc.c:435
8511msgid "create COUNT public-private key pairs (for testing)" 8688msgid "create COUNT public-private key pairs (for testing)"
8512msgstr "" 8689msgstr ""
8513 8690
8514#: src/util/gnunet-ecc.c:430 8691#: src/util/gnunet-ecc.c:439
8515msgid "print the public key in ASCII format" 8692msgid "print the public key in ASCII format"
8516msgstr "" 8693msgstr ""
8517 8694
8518#: src/util/gnunet-ecc.c:434 8695#: src/util/gnunet-ecc.c:443
8696msgid "print the public key in HEX format"
8697msgstr ""
8698
8699#: src/util/gnunet-ecc.c:447
8519msgid "print examples of ECC operations (used for compatibility testing)" 8700msgid "print examples of ECC operations (used for compatibility testing)"
8520msgstr "" 8701msgstr ""
8521 8702
8522#: src/util/gnunet-ecc.c:449 8703#: src/util/gnunet-ecc.c:463
8523#, fuzzy 8704#, fuzzy
8524msgid "Manipulate GNUnet private ECC key files" 8705msgid "Manipulate GNUnet private ECC key files"
8525msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" 8706msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
@@ -8613,7 +8794,7 @@ msgstr "Fel vid skapandet av användare"
8613msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8794msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8614msgstr "" 8795msgstr ""
8615 8796
8616#: src/util/network.c:1793 src/util/network.c:1969 8797#: src/util/network.c:1793 src/util/network.c:1977
8617#, c-format 8798#, c-format
8618msgid "" 8799msgid ""
8619"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8800"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8667,7 +8848,7 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
8667msgid "Could not determine plugin installation path.\n" 8848msgid "Could not determine plugin installation path.\n"
8668msgstr "Kunde inte fastställa min publika IPv6-adress.\n" 8849msgstr "Kunde inte fastställa min publika IPv6-adress.\n"
8669 8850
8670#: src/util/resolver_api.c:204 8851#: src/util/resolver_api.c:203
8671#, c-format 8852#, c-format
8672msgid "" 8853msgid ""
8673"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" 8854"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8682,32 +8863,32 @@ msgstr ""
8682"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s" 8863"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s"
8683"\".\n" 8864"\".\n"
8684 8865
8685#: src/util/resolver_api.c:815 8866#: src/util/resolver_api.c:826
8686#, fuzzy, c-format 8867#, fuzzy, c-format
8687msgid "Timeout trying to resolve hostname `%s'.\n" 8868msgid "Timeout trying to resolve hostname `%s'.\n"
8688msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 8869msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
8689 8870
8690#: src/util/resolver_api.c:827 8871#: src/util/resolver_api.c:839
8691#, c-format 8872#, c-format
8692msgid "Timeout trying to resolve IP address `%s'.\n" 8873msgid "Timeout trying to resolve IP address `%s'.\n"
8693msgstr "" 8874msgstr ""
8694 8875
8695#: src/util/resolver_api.c:1004 8876#: src/util/resolver_api.c:1023
8696msgid "Resolver not configured correctly.\n" 8877msgid "Resolver not configured correctly.\n"
8697msgstr "" 8878msgstr ""
8698 8879
8699#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 8880#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
8700#: src/util/resolver_api.c:1121 8881#: src/util/resolver_api.c:1146
8701#, fuzzy, c-format 8882#, fuzzy, c-format
8702msgid "Could not resolve our FQDN: %s\n" 8883msgid "Could not resolve our FQDN: %s\n"
8703msgstr "Kunde inte slå upp \"%s\": %s\n" 8884msgstr "Kunde inte slå upp \"%s\": %s\n"
8704 8885
8705#: src/util/service.c:1306 8886#: src/util/service.c:1305
8706msgid "" 8887msgid ""
8707"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8888"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8708msgstr "" 8889msgstr ""
8709 8890
8710#: src/util/service.c:2082 8891#: src/util/service.c:2081
8711#, c-format 8892#, c-format
8712msgid "" 8893msgid ""
8713"Processing code for message of type %u did not call " 8894"Processing code for message of type %u did not call "
@@ -8784,63 +8965,63 @@ msgstr " dagar"
8784msgid "end of time" 8965msgid "end of time"
8785msgstr "" 8966msgstr ""
8786 8967
8787#: src/util/strings.c:1269 8968#: src/util/strings.c:1270
8788msgid "IPv6 address did not start with `['\n" 8969msgid "IPv6 address did not start with `['\n"
8789msgstr "" 8970msgstr ""
8790 8971
8791#: src/util/strings.c:1277 8972#: src/util/strings.c:1278
8792msgid "IPv6 address did contain ':' to separate port number\n" 8973msgid "IPv6 address did contain ':' to separate port number\n"
8793msgstr "" 8974msgstr ""
8794 8975
8795#: src/util/strings.c:1283 8976#: src/util/strings.c:1284
8796msgid "IPv6 address did contain ']' before ':' to separate port number\n" 8977msgid "IPv6 address did contain ']' before ':' to separate port number\n"
8797msgstr "" 8978msgstr ""
8798 8979
8799#: src/util/strings.c:1290 8980#: src/util/strings.c:1291
8800msgid "IPv6 address did contain a valid port number after the last ':'\n" 8981msgid "IPv6 address did contain a valid port number after the last ':'\n"
8801msgstr "" 8982msgstr ""
8802 8983
8803#: src/util/strings.c:1299 8984#: src/util/strings.c:1300
8804#, fuzzy, c-format 8985#, fuzzy, c-format
8805msgid "Invalid IPv6 address `%s': %s\n" 8986msgid "Invalid IPv6 address `%s': %s\n"
8806msgstr "Ogiltigt svar på \"%s\".\n" 8987msgstr "Ogiltigt svar på \"%s\".\n"
8807 8988
8808#: src/util/strings.c:1571 src/util/strings.c:1587 8989#: src/util/strings.c:1572 src/util/strings.c:1588
8809msgid "Port not in range\n" 8990msgid "Port not in range\n"
8810msgstr "" 8991msgstr ""
8811 8992
8812#: src/util/strings.c:1596 8993#: src/util/strings.c:1597
8813#, fuzzy, c-format 8994#, fuzzy, c-format
8814msgid "Malformed port policy `%s'\n" 8995msgid "Malformed port policy `%s'\n"
8815msgstr "Misslyckades att starta samling.\n" 8996msgstr "Misslyckades att starta samling.\n"
8816 8997
8817#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 8998#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
8818#: src/util/strings.c:1779 8999#: src/util/strings.c:1780
8819#, c-format 9000#, c-format
8820msgid "Invalid format for IP: `%s'\n" 9001msgid "Invalid format for IP: `%s'\n"
8821msgstr "Ogiltigt format för IP: \"%s\"\n" 9002msgstr "Ogiltigt format för IP: \"%s\"\n"
8822 9003
8823#: src/util/strings.c:1736 9004#: src/util/strings.c:1737
8824#, c-format 9005#, c-format
8825msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." 9006msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
8826msgstr "Ogiltig nätverksnotation (\"/%d\" är inte giltig i IPv4 CIDR)." 9007msgstr "Ogiltig nätverksnotation (\"/%d\" är inte giltig i IPv4 CIDR)."
8827 9008
8828#: src/util/strings.c:1788 9009#: src/util/strings.c:1789
8829#, fuzzy, c-format 9010#, fuzzy, c-format
8830msgid "Invalid format: `%s'\n" 9011msgid "Invalid format: `%s'\n"
8831msgstr "Ogiltigt format för IP: \"%s\"\n" 9012msgstr "Ogiltigt format för IP: \"%s\"\n"
8832 9013
8833#: src/util/strings.c:1840 9014#: src/util/strings.c:1841
8834#, c-format 9015#, c-format
8835msgid "Invalid network notation (does not end with ';': `%s')\n" 9016msgid "Invalid network notation (does not end with ';': `%s')\n"
8836msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n" 9017msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n"
8837 9018
8838#: src/util/strings.c:1890 9019#: src/util/strings.c:1891
8839#, fuzzy, c-format 9020#, fuzzy, c-format
8840msgid "Wrong format `%s' for netmask\n" 9021msgid "Wrong format `%s' for netmask\n"
8841msgstr "Fel format \"%s\" för nätmask: %s\n" 9022msgstr "Fel format \"%s\" för nätmask: %s\n"
8842 9023
8843#: src/util/strings.c:1921 9024#: src/util/strings.c:1922
8844#, fuzzy, c-format 9025#, fuzzy, c-format
8845msgid "Wrong format `%s' for network\n" 9026msgid "Wrong format `%s' for network\n"
8846msgstr "Fel format \"%s\" för nätverk: %s\n" 9027msgstr "Fel format \"%s\" för nätverk: %s\n"
@@ -9023,28 +9204,44 @@ msgstr "# byte mottagna via UDP"
9023msgid "Setup tunnels via VPN." 9204msgid "Setup tunnels via VPN."
9024msgstr "" 9205msgstr ""
9025 9206
9026#: src/zonemaster/gnunet-service-zonemaster.c:705 9207#: src/zonemaster/gnunet-service-zonemaster.c:706
9027#, fuzzy 9208#, fuzzy
9028msgid "Failed to connect to the namestore!\n" 9209msgid "Failed to connect to the namestore!\n"
9029msgstr "Misslyckades att ansluta till gnunetd.\n" 9210msgstr "Misslyckades att ansluta till gnunetd.\n"
9030 9211
9031#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 9212#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
9032#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 9213#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
9033#, fuzzy, c-format 9214#, fuzzy, c-format
9034msgid "Assertion failed at %s:%d.\n" 9215msgid "Assertion failed at %s:%d.\n"
9035msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" 9216msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
9036 9217
9037#: src/include/gnunet_common.h:711 9218#: src/include/gnunet_common.h:726
9038#, c-format 9219#, c-format
9039msgid "External protocol violation detected at %s:%d.\n" 9220msgid "External protocol violation detected at %s:%d.\n"
9040msgstr "" 9221msgstr ""
9041 9222
9042#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 9223#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
9043#, c-format 9224#, c-format
9044msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" 9225msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9045msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" 9226msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
9046 9227
9047#, fuzzy 9228#, fuzzy
9229#~ msgid "Token `%s' is malformed\n"
9230#~ msgstr "Ogiltigt argument: \"%s\"\n"
9231
9232#, fuzzy
9233#~ msgid "Failed to create indices\n"
9234#~ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
9235
9236#, fuzzy
9237#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
9238#~ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
9239
9240#, fuzzy
9241#~ msgid "Unable to connect to Postgres database '%s': %s\n"
9242#~ msgstr "Kunde inte spara konfigurationsfil \"%s\":"
9243
9244#, fuzzy
9048#~ msgid "Misconfiguration (can not connect to the ARM service)" 9245#~ msgid "Misconfiguration (can not connect to the ARM service)"
9049#~ msgstr "Misslyckades att ansluta till gnunetd.\n" 9246#~ msgstr "Misslyckades att ansluta till gnunetd.\n"
9050 9247
@@ -9153,10 +9350,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
9153#~ msgstr "# klartext PONG-meddelanden mottagna" 9350#~ msgstr "# klartext PONG-meddelanden mottagna"
9154 9351
9155#, fuzzy 9352#, fuzzy
9156#~ msgid "# bytes sent to datastore"
9157#~ msgstr "# byte krypterade"
9158
9159#, fuzzy
9160#~ msgid "Failed to receive status response from database." 9353#~ msgid "Failed to receive status response from database."
9161#~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" 9354#~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
9162 9355
@@ -9446,10 +9639,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
9446#~ msgstr "Misslyckades att initiera tjänsten \"%s\".\n" 9639#~ msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
9447 9640
9448#, fuzzy 9641#, fuzzy
9449#~ msgid "Error reading sensor version\n"
9450#~ msgstr "Fel vid skapandet av användare"
9451
9452#, fuzzy
9453#~ msgid "Error reading sensor category\n" 9642#~ msgid "Error reading sensor category\n"
9454#~ msgstr "Fel vid skapandet av användare" 9643#~ msgstr "Fel vid skapandet av användare"
9455 9644
@@ -10005,10 +10194,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
10005#~ msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" 10194#~ msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
10006 10195
10007#, fuzzy 10196#, fuzzy
10008#~ msgid "Failed to remove records from database"
10009#~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
10010
10011#, fuzzy
10012#~ msgid "Failed to access database" 10197#~ msgid "Failed to access database"
10013#~ msgstr "Misslyckades att leverera \"%s\" meddelande.\n" 10198#~ msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
10014 10199
diff --git a/po/vi.po b/po/vi.po
index a9f00a20d..05b1f1381 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
8msgstr "" 8msgstr ""
9"Project-Id-Version: gnunet 0.8.0a\n" 9"Project-Id-Version: gnunet 0.8.0a\n"
10"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 10"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
11"POT-Creation-Date: 2017-03-31 19:22-0500\n" 11"POT-Creation-Date: 2017-10-20 15:14+0000\n"
12"PO-Revision-Date: 2008-09-10 22:05+0930\n" 12"PO-Revision-Date: 2008-09-10 22:05+0930\n"
13"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n" 13"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
14"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n" 14"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -280,7 +280,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
280msgstr "" 280msgstr ""
281 281
282#: src/arm/gnunet-service-arm.c:513 282#: src/arm/gnunet-service-arm.c:513
283#: src/transport/plugin_transport_http_server.c:2621 283#: src/transport/plugin_transport_http_server.c:2684
284#: src/transport/plugin_transport_tcp.c:1259 284#: src/transport/plugin_transport_tcp.c:1259
285#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 285#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
286#, fuzzy, c-format 286#, fuzzy, c-format
@@ -288,7 +288,7 @@ msgid "Failed to resolve `%s': %s\n"
288msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 288msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
289 289
290#: src/arm/gnunet-service-arm.c:532 290#: src/arm/gnunet-service-arm.c:532
291#: src/transport/plugin_transport_http_server.c:2639 291#: src/transport/plugin_transport_http_server.c:2702
292#: src/transport/plugin_transport_tcp.c:1278 292#: src/transport/plugin_transport_tcp.c:1278
293#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 293#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
294#, fuzzy, c-format 294#, fuzzy, c-format
@@ -362,134 +362,15 @@ msgstr ""
362msgid "Initiating shutdown as requested by client.\n" 362msgid "Initiating shutdown as requested by client.\n"
363msgstr "" 363msgstr ""
364 364
365#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 365#: src/ats-tests/ats-testing-log.c:837
366#, c-format
367msgid ""
368"Could not load quota for network `%s': `%s', assigning default bandwidth "
369"%llu\n"
370msgstr ""
371
372#: src/ats/gnunet-ats-solver-eval.c:2799
373#, c-format
374msgid ""
375"No outbound quota configured for network `%s', assigning default bandwidth "
376"%llu\n"
377msgstr ""
378
379#: src/ats/gnunet-ats-solver-eval.c:2840
380#, c-format
381msgid ""
382"No outbound quota configure for network `%s', assigning default bandwidth "
383"%llu\n"
384msgstr ""
385
386#: src/ats/gnunet-ats-solver-eval.c:3294
387#: src/ats-tests/gnunet-solver-eval.c:939
388msgid "solver to use"
389msgstr ""
390
391#: src/ats/gnunet-ats-solver-eval.c:3299
392#: src/ats-tests/gnunet-solver-eval.c:945
393#: src/ats-tests/gnunet-solver-eval.c:950
394msgid "experiment to use"
395msgstr ""
396
397#: src/ats/gnunet-ats-solver-eval.c:3306
398#, fuzzy 366#, fuzzy
399msgid "print logging" 367msgid "Stop logging\n"
400msgstr "Theo dõi" 368msgstr "Theo dõi"
401 369
402#: src/ats/gnunet-ats-solver-eval.c:3311 370#: src/ats-tests/ats-testing-log.c:892
403msgid "save logging to disk"
404msgstr ""
405
406#: src/ats/gnunet-ats-solver-eval.c:3316
407msgid "disable normalization"
408msgstr ""
409
410#: src/ats/gnunet-service-ats_plugins.c:304
411#, c-format
412msgid ""
413"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
414"%llu\n"
415msgstr ""
416
417#: src/ats/gnunet-service-ats_plugins.c:314
418#, c-format
419msgid "%s quota configured for network `%s' is %llu\n"
420msgstr ""
421
422#: src/ats/gnunet-service-ats_plugins.c:359
423#, c-format
424msgid ""
425"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
426msgstr ""
427
428#: src/ats/gnunet-service-ats_plugins.c:451
429#, fuzzy, c-format
430msgid "Failed to initialize solver `%s'!\n"
431msgstr "Không thể sơ khởi SQLite: %s.\n"
432
433#: src/ats/plugin_ats_mlp.c:1274
434msgid "Problem size too large, cannot allocate memory!\n"
435msgstr ""
436
437#: src/ats/plugin_ats_mlp.c:1869
438#, fuzzy, c-format
439msgid "Adding address for peer `%s' multiple times\n"
440msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
441
442#: src/ats/plugin_ats_mlp.c:1913
443#, fuzzy, c-format
444msgid "Updating address property for peer `%s' %p not added before\n"
445msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
446
447#: src/ats/plugin_ats_mlp.c:2475
448msgid ""
449"MLP solver is not optimizing for anything, changing to feasibility check\n"
450msgstr ""
451
452#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
453#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
454#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
455#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
456#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
457#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
458#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
459#, fuzzy, c-format
460msgid "Invalid %s configuration %f \n"
461msgstr "Không thể lưu tập tin cấu hình « %s »:"
462
463#: src/ats/plugin_ats_mlp.c:2670
464#, c-format
465msgid ""
466"Adjusting inconsistent outbound quota configuration for network `%s', is "
467"%llu must be at least %llu\n"
468msgstr ""
469
470#: src/ats/plugin_ats_mlp.c:2679
471#, c-format
472msgid ""
473"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
474"must be at least %llu\n"
475msgstr ""
476
477#: src/ats/plugin_ats_mlp.c:2689
478#, c-format
479msgid ""
480"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
481msgstr ""
482
483#: src/ats/plugin_ats_mlp.c:2698
484#, c-format
485msgid ""
486"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
487msgstr ""
488
489#: src/ats/plugin_ats_proportional.c:1164
490#, fuzzy, c-format 371#, fuzzy, c-format
491msgid "Invalid %s configuration %f\n" 372msgid "Start logging `%s'\n"
492msgstr "Không thể lÆ°u tập tin cấu hình « %s »:" 373msgstr "Äang bắt đầu tài vỠ« %s »\n"
493 374
494#: src/ats-tests/ats-testing.c:422 375#: src/ats-tests/ats-testing.c:422
495#, c-format 376#, c-format
@@ -501,16 +382,6 @@ msgstr ""
501msgid "Failed to connect master peer [%u] with slave [%u]\n" 382msgid "Failed to connect master peer [%u] with slave [%u]\n"
502msgstr "Lỗi kết nối đến gnunetd.\n" 383msgstr "Lỗi kết nối đến gnunetd.\n"
503 384
504#: src/ats-tests/ats-testing-log.c:837
505#, fuzzy
506msgid "Stop logging\n"
507msgstr "Theo dõi"
508
509#: src/ats-tests/ats-testing-log.c:892
510#, fuzzy, c-format
511msgid "Start logging `%s'\n"
512msgstr "Äang bắt đầu tài vỠ« %s »\n"
513
514#: src/ats-tests/gnunet-ats-sim.c:90 385#: src/ats-tests/gnunet-ats-sim.c:90
515#, c-format 386#, c-format
516msgid "" 387msgid ""
@@ -518,6 +389,15 @@ msgid ""
518"= %u KiB/s\n" 389"= %u KiB/s\n"
519msgstr "" 390msgstr ""
520 391
392#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
393msgid "solver to use"
394msgstr ""
395
396#: src/ats-tests/gnunet-solver-eval.c:945
397#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
398msgid "experiment to use"
399msgstr ""
400
521#: src/ats-tool/gnunet-ats.c:307 401#: src/ats-tool/gnunet-ats.c:307
522#, c-format 402#, c-format
523msgid "%u address resolutions had a timeout\n" 403msgid "%u address resolutions had a timeout\n"
@@ -640,6 +520,124 @@ msgstr ""
640msgid "Print information about ATS state" 520msgid "Print information about ATS state"
641msgstr "In ra thông tin vỠcác đồng đẳng GNUnet." 521msgstr "In ra thông tin vỠcác đồng đẳng GNUnet."
642 522
523#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
524#, c-format
525msgid ""
526"Could not load quota for network `%s': `%s', assigning default bandwidth "
527"%llu\n"
528msgstr ""
529
530#: src/ats/gnunet-ats-solver-eval.c:2799
531#, c-format
532msgid ""
533"No outbound quota configured for network `%s', assigning default bandwidth "
534"%llu\n"
535msgstr ""
536
537#: src/ats/gnunet-ats-solver-eval.c:2840
538#, c-format
539msgid ""
540"No outbound quota configure for network `%s', assigning default bandwidth "
541"%llu\n"
542msgstr ""
543
544#: src/ats/gnunet-ats-solver-eval.c:3306
545#, fuzzy
546msgid "print logging"
547msgstr "Theo dõi"
548
549#: src/ats/gnunet-ats-solver-eval.c:3311
550msgid "save logging to disk"
551msgstr ""
552
553#: src/ats/gnunet-ats-solver-eval.c:3316
554msgid "disable normalization"
555msgstr ""
556
557#: src/ats/gnunet-service-ats_plugins.c:304
558#, c-format
559msgid ""
560"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
561"%llu\n"
562msgstr ""
563
564#: src/ats/gnunet-service-ats_plugins.c:314
565#, c-format
566msgid "%s quota configured for network `%s' is %llu\n"
567msgstr ""
568
569#: src/ats/gnunet-service-ats_plugins.c:359
570#, c-format
571msgid ""
572"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
573msgstr ""
574
575#: src/ats/gnunet-service-ats_plugins.c:451
576#, fuzzy, c-format
577msgid "Failed to initialize solver `%s'!\n"
578msgstr "Không thể sơ khởi SQLite: %s.\n"
579
580#: src/ats/plugin_ats_mlp.c:1274
581msgid "Problem size too large, cannot allocate memory!\n"
582msgstr ""
583
584#: src/ats/plugin_ats_mlp.c:1869
585#, fuzzy, c-format
586msgid "Adding address for peer `%s' multiple times\n"
587msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
588
589#: src/ats/plugin_ats_mlp.c:1913
590#, fuzzy, c-format
591msgid "Updating address property for peer `%s' %p not added before\n"
592msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
593
594#: src/ats/plugin_ats_mlp.c:2475
595msgid ""
596"MLP solver is not optimizing for anything, changing to feasibility check\n"
597msgstr ""
598
599#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
600#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
601#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
602#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
603#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
604#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
605#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
606#, fuzzy, c-format
607msgid "Invalid %s configuration %f \n"
608msgstr "Không thể lưu tập tin cấu hình « %s »:"
609
610#: src/ats/plugin_ats_mlp.c:2670
611#, c-format
612msgid ""
613"Adjusting inconsistent outbound quota configuration for network `%s', is "
614"%llu must be at least %llu\n"
615msgstr ""
616
617#: src/ats/plugin_ats_mlp.c:2679
618#, c-format
619msgid ""
620"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
621"must be at least %llu\n"
622msgstr ""
623
624#: src/ats/plugin_ats_mlp.c:2689
625#, c-format
626msgid ""
627"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
628msgstr ""
629
630#: src/ats/plugin_ats_mlp.c:2698
631#, c-format
632msgid ""
633"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
634msgstr ""
635
636#: src/ats/plugin_ats_proportional.c:1164
637#, fuzzy, c-format
638msgid "Invalid %s configuration %f\n"
639msgstr "Không thể lưu tập tin cấu hình « %s »:"
640
643#: src/auction/gnunet-auction-create.c:163 641#: src/auction/gnunet-auction-create.c:163
644msgid "description of the item to be sold" 642msgid "description of the item to be sold"
645msgstr "" 643msgstr ""
@@ -788,6 +786,28 @@ msgstr ""
788msgid "Connection to conversation service lost, trying to reconnect\n" 786msgid "Connection to conversation service lost, trying to reconnect\n"
789msgstr "" 787msgstr ""
790 788
789#: src/conversation/gnunet-conversation-test.c:119
790#, c-format
791msgid ""
792"\n"
793"End of transmission. Have a GNU day.\n"
794msgstr ""
795
796#: src/conversation/gnunet-conversation-test.c:145
797#, c-format
798msgid ""
799"\n"
800"We are now playing your recording back. If you can hear it, your audio "
801"settings are working..."
802msgstr ""
803
804#: src/conversation/gnunet-conversation-test.c:210
805#, c-format
806msgid ""
807"We will now be recording you for %s. After that time, the recording will be "
808"played back to you..."
809msgstr ""
810
791#: src/conversation/gnunet-conversation.c:269 811#: src/conversation/gnunet-conversation.c:269
792#, c-format 812#, c-format
793msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" 813msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1045,30 +1065,8 @@ msgstr ""
1045msgid "Enables having a conversation with other GNUnet users." 1065msgid "Enables having a conversation with other GNUnet users."
1046msgstr "" 1066msgstr ""
1047 1067
1048#: src/conversation/gnunet-conversation-test.c:119
1049#, c-format
1050msgid ""
1051"\n"
1052"End of transmission. Have a GNU day.\n"
1053msgstr ""
1054
1055#: src/conversation/gnunet-conversation-test.c:145
1056#, c-format
1057msgid ""
1058"\n"
1059"We are now playing your recording back. If you can hear it, your audio "
1060"settings are working..."
1061msgstr ""
1062
1063#: src/conversation/gnunet-conversation-test.c:210
1064#, c-format
1065msgid ""
1066"We will now be recording you for %s. After that time, the recording will be "
1067"played back to you..."
1068msgstr ""
1069
1070#: src/conversation/gnunet_gst.c:622
1071#: src/conversation/gnunet-helper-audio-playback-gst.c:356 1068#: src/conversation/gnunet-helper-audio-playback-gst.c:356
1069#: src/conversation/gnunet_gst.c:622
1072#, c-format 1070#, c-format
1073msgid "Read error from STDIN: %d %s\n" 1071msgid "Read error from STDIN: %d %s\n"
1074msgstr "" 1072msgstr ""
@@ -1198,6 +1196,11 @@ msgstr "SMTP: « %s » bị lỗi: %s\n"
1198msgid "Failed to allocate %u bytes for second packet\n" 1196msgid "Failed to allocate %u bytes for second packet\n"
1199msgstr "Lá»—i tạo thÆ° mục tạm thá»i." 1197msgstr "Lá»—i tạo thÆ° mục tạm thá»i."
1200 1198
1199#: src/conversation/gnunet-service-conversation.c:1276
1200#, fuzzy, c-format
1201msgid "Could not open line, port %s already in use!\n"
1202msgstr "Không thể kết nối tới %s:%u: %s\n"
1203
1201#: src/conversation/microphone.c:119 1204#: src/conversation/microphone.c:119
1202#, fuzzy 1205#, fuzzy
1203msgid "Could not start record audio helper\n" 1206msgid "Could not start record audio helper\n"
@@ -1499,8 +1502,140 @@ msgstr "# các thông báo phát hiện dht được nhận"
1499msgid "# updates to my type map" 1502msgid "# updates to my type map"
1500msgstr "" 1503msgstr ""
1501 1504
1505#: src/credential/credential_misc.c:88
1506#, fuzzy, c-format
1507msgid "Unable to parse CRED record string `%s'\n"
1508msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
1509
1510#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
1511#: src/namestore/plugin_rest_namestore.c:1009
1512#, c-format
1513msgid "Ego `%s' not known to identity service\n"
1514msgstr ""
1515
1516#: src/credential/gnunet-credential.c:294
1517#: src/credential/gnunet-credential.c:446
1518#, fuzzy, c-format
1519msgid "Issuer public key `%s' is not well-formed\n"
1520msgstr "Äối số không hợp lệ cho « %s ».\n"
1521
1522#: src/credential/gnunet-credential.c:375
1523#: src/credential/gnunet-credential.c:435
1524#, fuzzy, c-format
1525msgid "Issuer public key not well-formed\n"
1526msgstr "Äối số không hợp lệ cho « %s ».\n"
1527
1528#: src/credential/gnunet-credential.c:386
1529#: src/credential/gnunet-credential.c:455
1530#, fuzzy, c-format
1531msgid "Failed to connect to CREDENTIAL\n"
1532msgstr "Lỗi kết nối đến gnunetd.\n"
1533
1534#: src/credential/gnunet-credential.c:392
1535#, c-format
1536msgid "You must provide issuer the attribute\n"
1537msgstr ""
1538
1539#: src/credential/gnunet-credential.c:399
1540#, c-format
1541msgid "ego required\n"
1542msgstr ""
1543
1544#: src/credential/gnunet-credential.c:415
1545#, c-format
1546msgid "Subject public key needed\n"
1547msgstr ""
1548
1549#: src/credential/gnunet-credential.c:426
1550#, fuzzy, c-format
1551msgid "Subject public key `%s' is not well-formed\n"
1552msgstr "Äối số không hợp lệ cho « %s ».\n"
1553
1554#: src/credential/gnunet-credential.c:461
1555#, c-format
1556msgid "You must provide issuer and subject attributes\n"
1557msgstr ""
1558
1559#: src/credential/gnunet-credential.c:511
1560#, c-format
1561msgid "Issuer ego required\n"
1562msgstr ""
1563
1564#: src/credential/gnunet-credential.c:523
1565#, c-format
1566msgid "Please specify name to lookup, subject key and issuer key!\n"
1567msgstr ""
1568
1569#: src/credential/gnunet-credential.c:543
1570msgid "create credential"
1571msgstr ""
1572
1573#: src/credential/gnunet-credential.c:547
1574msgid "verify credential against attribute"
1575msgstr ""
1576
1577#: src/credential/gnunet-credential.c:552
1578#, fuzzy
1579msgid "The public key of the subject to lookup the credential for"
1580msgstr "xác định mức ưu tiên của nội dung"
1581
1582#: src/credential/gnunet-credential.c:557
1583msgid "The name of the credential presented by the subject"
1584msgstr ""
1585
1586#: src/credential/gnunet-credential.c:562
1587#, fuzzy
1588msgid "The public key of the authority to verify the credential against"
1589msgstr "xác định mức ưu tiên của nội dung"
1590
1591#: src/credential/gnunet-credential.c:567
1592#, fuzzy
1593msgid "The ego to use"
1594msgstr "kích cỡ tin nhắn"
1595
1596#: src/credential/gnunet-credential.c:572
1597msgid "The issuer attribute to verify against or to issue"
1598msgstr ""
1599
1600#: src/credential/gnunet-credential.c:577
1601msgid "The time to live for the credential"
1602msgstr ""
1603
1604#: src/credential/gnunet-credential.c:581
1605msgid "collect credentials"
1606msgstr ""
1607
1608#: src/credential/gnunet-credential.c:595
1609#, fuzzy
1610msgid "GNUnet credential resolver tool"
1611msgstr "Bản ghi lỗi GNUnet"
1612
1613#: src/credential/gnunet-service-credential.c:1204
1614#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
1615#, fuzzy, c-format
1616msgid "Failed to connect to GNS\n"
1617msgstr "Lỗi kết nối đến gnunetd.\n"
1618
1619#: src/credential/gnunet-service-credential.c:1210
1620#: src/namestore/gnunet-namestore-fcfsd.c:1034
1621#: src/namestore/gnunet-namestore.c:802
1622#: src/namestore/plugin_rest_namestore.c:1022
1623#, fuzzy, c-format
1624msgid "Failed to connect to namestore\n"
1625msgstr "Không kết nối được đến trình ná»n gnunetd."
1626
1627#: src/credential/plugin_gnsrecord_credential.c:186
1628#, fuzzy, c-format
1629msgid "Unable to parse ATTR record string `%s'\n"
1630msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
1631
1632#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
1633#, fuzzy
1634msgid "GNS REST API initialized\n"
1635msgstr "Lỗi sơ khởi lõi.\n"
1636
1502#: src/datacache/datacache.c:119 src/datacache/datacache.c:294 1637#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
1503#: src/datastore/gnunet-service-datastore.c:775 1638#: src/datastore/gnunet-service-datastore.c:757
1504#, fuzzy 1639#, fuzzy
1505msgid "# bytes stored" 1640msgid "# bytes stored"
1506msgstr "# các byte trong kho dữ liệu" 1641msgstr "# các byte trong kho dữ liệu"
@@ -1546,13 +1681,12 @@ msgstr "kho dữ liệu sqlite"
1546 1681
1547#: src/datacache/plugin_datacache_sqlite.c:113 1682#: src/datacache/plugin_datacache_sqlite.c:113
1548#: src/datacache/plugin_datacache_sqlite.c:122 1683#: src/datacache/plugin_datacache_sqlite.c:122
1549#: src/datastore/plugin_datastore_mysql.c:980 1684#: src/datastore/plugin_datastore_mysql.c:892
1550#: src/datastore/plugin_datastore_sqlite.c:58 1685#: src/datastore/plugin_datastore_sqlite.c:58
1551#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 1686#: src/datastore/plugin_datastore_sqlite.c:66
1552#: src/mysql/mysql.c:42 src/mysql/mysql.c:49 1687#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
1553#: src/namecache/plugin_namecache_postgres.c:53 1688#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
1554#: src/namecache/plugin_namecache_sqlite.c:53 1689#: src/namecache/plugin_namecache_sqlite.c:53
1555#: src/namestore/plugin_namestore_postgres.c:53
1556#: src/namestore/plugin_namestore_sqlite.c:53 1690#: src/namestore/plugin_namestore_sqlite.c:53
1557#: src/peerstore/plugin_peerstore_sqlite.c:52 1691#: src/peerstore/plugin_peerstore_sqlite.c:52
1558#: src/psycstore/plugin_psycstore_mysql.c:62 1692#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1561,14 +1695,15 @@ msgstr "kho dữ liệu sqlite"
1561#: src/testbed/gnunet-daemon-testbed-underlay.c:56 1695#: src/testbed/gnunet-daemon-testbed-underlay.c:56
1562#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 1696#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
1563#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 1697#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
1564#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 1698#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
1565#: src/scalarproduct/scalarproduct.h:35 1699#: src/scalarproduct/scalarproduct.h:35
1566#, c-format 1700#, c-format
1567msgid "`%s' failed at %s:%d with error: %s\n" 1701msgid "`%s' failed at %s:%d with error: %s\n"
1568msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" 1702msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
1569 1703
1570#: src/datacache/plugin_datacache_sqlite.c:817 1704#: src/datacache/plugin_datacache_sqlite.c:817
1571#: src/datastore/plugin_datastore_sqlite.c:475 1705#: src/datastore/plugin_datastore_sqlite.c:456
1706#: src/identity-provider/plugin_identity_provider_sqlite.c:336
1572#: src/namecache/plugin_namecache_sqlite.c:296 1707#: src/namecache/plugin_namecache_sqlite.c:296
1573#: src/namestore/plugin_namestore_sqlite.c:355 1708#: src/namestore/plugin_namestore_sqlite.c:355
1574msgid "Tried to close sqlite without finalizing all prepared statements.\n" 1709msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1640,23 +1775,77 @@ msgstr ""
1640msgid "# GET requests executed" 1775msgid "# GET requests executed"
1641msgstr "# các yêu cầu dht được định tuyến" 1776msgstr "# các yêu cầu dht được định tuyến"
1642 1777
1643#: src/datastore/gnunet-datastore.c:113 1778#: src/datastore/gnunet-datastore.c:189
1779#, c-format
1780msgid "Dumped %<PRIu64> records\n"
1781msgstr ""
1782
1783#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
1784#, c-format
1785msgid "Short write to file: %zd bytes expecting %zd\n"
1786msgstr ""
1787
1788#: src/datastore/gnunet-datastore.c:261
1789#, fuzzy
1790msgid "Error queueing datastore GET operation\n"
1791msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng"
1792
1793#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
1794#, fuzzy, c-format
1795msgid "Unable to open dump file: %s\n"
1796msgstr "Không thể tạo miá»n tên.\n"
1797
1798#: src/datastore/gnunet-datastore.c:326
1644#, fuzzy, c-format 1799#, fuzzy, c-format
1645msgid "Failed to store item: %s, aborting\n" 1800msgid "Failed to store item: %s, aborting\n"
1646msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 1801msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
1647 1802
1648#: src/datastore/gnunet-datastore.c:209 1803#: src/datastore/gnunet-datastore.c:340
1649#, c-format 1804#, c-format
1650msgid "Cannot use the same configuration for source and destination\n" 1805msgid "Inserted %<PRIu64> records\n"
1651msgstr "" 1806msgstr ""
1652 1807
1653#: src/datastore/gnunet-datastore.c:256 1808#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
1654msgid "" 1809#, c-format
1655"specifies the configuration to use to access an alternative datastore; will " 1810msgid "Short read from file: %zd bytes expecting %zd\n"
1656"merge that datastore into our current datastore" 1811msgstr ""
1812
1813#: src/datastore/gnunet-datastore.c:389
1814#, fuzzy
1815msgid "Error queueing datastore PUT operation\n"
1816msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng"
1817
1818#: src/datastore/gnunet-datastore.c:432
1819msgid "Input file is not of a supported format\n"
1820msgstr ""
1821
1822#: src/datastore/gnunet-datastore.c:458
1823#, fuzzy
1824msgid "Failed connecting to the datastore.\n"
1825msgstr "Không kết nối được đến trình ná»n gnunetd."
1826
1827#: src/datastore/gnunet-datastore.c:470
1828#, c-format
1829msgid "Please choose at least one operation: %s, %s\n"
1830msgstr ""
1831
1832#: src/datastore/gnunet-datastore.c:493
1833#, fuzzy
1834msgid "Dump all records from the datastore"
1835msgstr ""
1836"\n"
1837"Không nhận được đáp ứng từ gnunetd.\n"
1838
1839#: src/datastore/gnunet-datastore.c:497
1840#, fuzzy
1841msgid "Insert records into the datastore"
1842msgstr "# các byte trong kho dữ liệu"
1843
1844#: src/datastore/gnunet-datastore.c:502
1845msgid "File to dump or insert"
1657msgstr "" 1846msgstr ""
1658 1847
1659#: src/datastore/gnunet-datastore.c:265 1848#: src/datastore/gnunet-datastore.c:511
1660#, fuzzy 1849#, fuzzy
1661msgid "Manipulate GNUnet datastore" 1850msgid "Manipulate GNUnet datastore"
1662msgstr "cập nhật một giá trị trong tập tin cấu hình" 1851msgstr "cập nhật một giá trị trong tập tin cấu hình"
@@ -1700,8 +1889,8 @@ msgstr ""
1700 1889
1701#: src/datastore/gnunet-service-datastore.c:634 1890#: src/datastore/gnunet-service-datastore.c:634
1702#: src/datastore/gnunet-service-datastore.c:689 1891#: src/datastore/gnunet-service-datastore.c:689
1703#: src/datastore/gnunet-service-datastore.c:977 1892#: src/datastore/gnunet-service-datastore.c:837
1704#: src/datastore/gnunet-service-datastore.c:1633 1893#: src/datastore/gnunet-service-datastore.c:1469
1705msgid "# reserved" 1894msgid "# reserved"
1706msgstr "" 1895msgstr ""
1707 1896
@@ -1709,152 +1898,153 @@ msgstr ""
1709msgid "Could not find matching reservation" 1898msgid "Could not find matching reservation"
1710msgstr "" 1899msgstr ""
1711 1900
1712#: src/datastore/gnunet-service-datastore.c:792 1901#: src/datastore/gnunet-service-datastore.c:773
1713#, c-format 1902#, c-format
1714msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" 1903msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
1715msgstr "" 1904msgstr ""
1716 1905
1717#: src/datastore/gnunet-service-datastore.c:1026 1906#: src/datastore/gnunet-service-datastore.c:876
1718#, fuzzy 1907#, fuzzy
1719msgid "# GET requests received" 1908msgid "# GET requests received"
1720msgstr "# các yêu cầu get (lấy) dht được nhận" 1909msgstr "# các yêu cầu get (lấy) dht được nhận"
1721 1910
1722#: src/datastore/gnunet-service-datastore.c:1058 1911#: src/datastore/gnunet-service-datastore.c:907
1723#, fuzzy 1912#, fuzzy
1724msgid "# GET KEY requests received" 1913msgid "# GET KEY requests received"
1725msgstr "# các yêu cầu get (lấy) dht được nhận" 1914msgstr "# các yêu cầu get (lấy) dht được nhận"
1726 1915
1727#: src/datastore/gnunet-service-datastore.c:1071 1916#: src/datastore/gnunet-service-datastore.c:920
1728#, fuzzy 1917#, fuzzy
1729msgid "# requests filtered by bloomfilter" 1918msgid "# requests filtered by bloomfilter"
1730msgstr "# các yêu cầu được lá»c theo bá»™ lá»c bloom" 1919msgstr "# các yêu cầu được lá»c theo bá»™ lá»c bloom"
1731 1920
1732#: src/datastore/gnunet-service-datastore.c:1108 1921#: src/datastore/gnunet-service-datastore.c:956
1733#, fuzzy 1922#, fuzzy
1734msgid "# GET REPLICATION requests received" 1923msgid "# GET REPLICATION requests received"
1735msgstr "# các yêu cầu get (lấy) dht được nhận" 1924msgstr "# các yêu cầu get (lấy) dht được nhận"
1736 1925
1737#: src/datastore/gnunet-service-datastore.c:1141 1926#: src/datastore/gnunet-service-datastore.c:989
1738#, fuzzy 1927#, fuzzy
1739msgid "# GET ZERO ANONYMITY requests received" 1928msgid "# GET ZERO ANONYMITY requests received"
1740msgstr "# các yêu cầu get (lấy) dht được nhận" 1929msgstr "# các yêu cầu get (lấy) dht được nhận"
1741 1930
1742#: src/datastore/gnunet-service-datastore.c:1190 1931#: src/datastore/gnunet-service-datastore.c:1036
1743msgid "Content not found" 1932msgid "Content not found"
1744msgstr "" 1933msgstr ""
1745 1934
1746#: src/datastore/gnunet-service-datastore.c:1199 1935#: src/datastore/gnunet-service-datastore.c:1043
1747msgid "# bytes removed (explicit request)" 1936msgid "# bytes removed (explicit request)"
1748msgstr "" 1937msgstr ""
1749 1938
1750#: src/datastore/gnunet-service-datastore.c:1246 1939#: src/datastore/gnunet-service-datastore.c:1088
1751#, fuzzy 1940#, fuzzy
1752msgid "# REMOVE requests received" 1941msgid "# REMOVE requests received"
1753msgstr "# các yêu cầu get (lấy) dht được nhận" 1942msgstr "# các yêu cầu get (lấy) dht được nhận"
1754 1943
1755#: src/datastore/gnunet-service-datastore.c:1301 1944#: src/datastore/gnunet-service-datastore.c:1137
1756#, c-format 1945#, c-format
1757msgid "" 1946msgid ""
1758"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" 1947"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
1759msgstr "" 1948msgstr ""
1760 1949
1761#: src/datastore/gnunet-service-datastore.c:1307 1950#: src/datastore/gnunet-service-datastore.c:1143
1762#: src/datastore/gnunet-service-datastore.c:1482 1951#: src/datastore/gnunet-service-datastore.c:1318
1763#, c-format 1952#, c-format
1764msgid "New payload: %lld\n" 1953msgid "New payload: %lld\n"
1765msgstr "" 1954msgstr ""
1766 1955
1767#: src/datastore/gnunet-service-datastore.c:1361 1956#: src/datastore/gnunet-service-datastore.c:1197
1768#, c-format 1957#, c-format
1769msgid "Loading `%s' datastore plugin\n" 1958msgid "Loading `%s' datastore plugin\n"
1770msgstr "" 1959msgstr ""
1771 1960
1772#: src/datastore/gnunet-service-datastore.c:1373 1961#: src/datastore/gnunet-service-datastore.c:1209
1773#, fuzzy, c-format 1962#, fuzzy, c-format
1774msgid "Failed to load datastore plugin for `%s'\n" 1963msgid "Failed to load datastore plugin for `%s'\n"
1775msgstr "Không thể nạp phần bổ sung truyá»n tải « %s »\n" 1964msgstr "Không thể nạp phần bổ sung truyá»n tải « %s »\n"
1776 1965
1777#: src/datastore/gnunet-service-datastore.c:1433 1966#: src/datastore/gnunet-service-datastore.c:1269
1778msgid "Bloomfilter construction complete.\n" 1967msgid "Bloomfilter construction complete.\n"
1779msgstr "" 1968msgstr ""
1780 1969
1781#: src/datastore/gnunet-service-datastore.c:1489 1970#: src/datastore/gnunet-service-datastore.c:1325
1782msgid "Rebuilding bloomfilter. Please be patient.\n" 1971msgid "Rebuilding bloomfilter. Please be patient.\n"
1783msgstr "" 1972msgstr ""
1784 1973
1785#: src/datastore/gnunet-service-datastore.c:1500 1974#: src/datastore/gnunet-service-datastore.c:1336
1786msgid "Plugin does not support get_keys function. Please fix!\n" 1975msgid "Plugin does not support get_keys function. Please fix!\n"
1787msgstr "" 1976msgstr ""
1788 1977
1789#: src/datastore/gnunet-service-datastore.c:1670 1978#: src/datastore/gnunet-service-datastore.c:1506
1790#, fuzzy, c-format 1979#, fuzzy, c-format
1791msgid "# bytes used in file-sharing datastore `%s'" 1980msgid "# bytes used in file-sharing datastore `%s'"
1792msgstr "# các byte được phép trong kho dữ liệu" 1981msgstr "# các byte được phép trong kho dữ liệu"
1793 1982
1794#: src/datastore/gnunet-service-datastore.c:1686 1983#: src/datastore/gnunet-service-datastore.c:1522
1795msgid "# quota" 1984msgid "# quota"
1796msgstr "" 1985msgstr ""
1797 1986
1798#: src/datastore/gnunet-service-datastore.c:1691 1987#: src/datastore/gnunet-service-datastore.c:1527
1799msgid "# cache size" 1988msgid "# cache size"
1800msgstr "" 1989msgstr ""
1801 1990
1802#: src/datastore/gnunet-service-datastore.c:1707 1991#: src/datastore/gnunet-service-datastore.c:1543
1803#, c-format 1992#, c-format
1804msgid "Could not use specified filename `%s' for bloomfilter.\n" 1993msgid "Could not use specified filename `%s' for bloomfilter.\n"
1805msgstr "" 1994msgstr ""
1806 1995
1807#: src/datastore/gnunet-service-datastore.c:1725 1996#: src/datastore/gnunet-service-datastore.c:1561
1808#: src/datastore/gnunet-service-datastore.c:1741 1997#: src/datastore/gnunet-service-datastore.c:1577
1809#, fuzzy, c-format 1998#, fuzzy, c-format
1810msgid "Failed to remove bogus bloomfilter file `%s'\n" 1999msgid "Failed to remove bogus bloomfilter file `%s'\n"
1811msgstr "Không thể lưu tập tin cấu hình « %s »:" 2000msgstr "Không thể lưu tập tin cấu hình « %s »:"
1812 2001
1813#: src/datastore/gnunet-service-datastore.c:1773 2002#: src/datastore/gnunet-service-datastore.c:1609
1814#, fuzzy 2003#, fuzzy
1815msgid "Failed to initialize bloomfilter.\n" 2004msgid "Failed to initialize bloomfilter.\n"
1816msgstr "Lỗi sơ khởi dịch vụ « %s ».\n" 2005msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
1817 2006
1818#: src/datastore/plugin_datastore_heap.c:769 2007#: src/datastore/plugin_datastore_heap.c:893
1819#, fuzzy 2008#, fuzzy
1820msgid "Heap database running\n" 2009msgid "Heap database running\n"
1821msgstr "kho dữ liệu sqlite" 2010msgstr "kho dữ liệu sqlite"
1822 2011
1823#: src/datastore/plugin_datastore_mysql.c:377 2012#: src/datastore/plugin_datastore_mysql.c:371
1824#: src/datastore/plugin_datastore_sqlite.c:590 2013#: src/datastore/plugin_datastore_mysql.c:423
2014#: src/datastore/plugin_datastore_mysql.c:1075
2015msgid "MySQL statement run failure"
2016msgstr ""
2017
2018#: src/datastore/plugin_datastore_mysql.c:410
2019#: src/datastore/plugin_datastore_sqlite.c:626
1825#, fuzzy 2020#, fuzzy
1826msgid "Data too large" 2021msgid "Data too large"
1827msgstr "số lần lặp lại" 2022msgstr "số lần lặp lại"
1828 2023
1829#: src/datastore/plugin_datastore_mysql.c:393 2024#: src/datastore/plugin_datastore_mysql.c:848
1830msgid "MySQL statement run failure"
1831msgstr ""
1832
1833#: src/datastore/plugin_datastore_mysql.c:936
1834#, fuzzy, c-format 2025#, fuzzy, c-format
1835msgid "`%s' for `%s' failed at %s:%d with error: %s\n" 2026msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
1836msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" 2027msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
1837 2028
1838#: src/datastore/plugin_datastore_mysql.c:1208 2029#: src/datastore/plugin_datastore_mysql.c:1180
1839#: src/psycstore/plugin_psycstore_mysql.c:1936 2030#: src/psycstore/plugin_psycstore_mysql.c:1936
1840msgid "Mysql database running\n" 2031msgid "Mysql database running\n"
1841msgstr "" 2032msgstr ""
1842 2033
1843#: src/datastore/plugin_datastore_postgres.c:345 2034#: src/datastore/plugin_datastore_postgres.c:274
2035#: src/datastore/plugin_datastore_postgres.c:891
1844msgid "Postgress exec failure" 2036msgid "Postgress exec failure"
1845msgstr "" 2037msgstr ""
1846 2038
1847#: src/datastore/plugin_datastore_postgres.c:866 2039#: src/datastore/plugin_datastore_postgres.c:852
1848#, fuzzy 2040#, fuzzy
1849msgid "Failed to drop table from database.\n" 2041msgid "Failed to drop table from database.\n"
1850msgstr "" 2042msgstr ""
1851"\n" 2043"\n"
1852"Không nhận được đáp ứng từ gnunetd.\n" 2044"Không nhận được đáp ứng từ gnunetd.\n"
1853 2045
1854#: src/datastore/plugin_datastore_postgres.c:903 2046#: src/datastore/plugin_datastore_postgres.c:950
1855#: src/namecache/plugin_namecache_postgres.c:398 2047#: src/psycstore/plugin_psycstore_postgres.c:1506
1856#: src/namestore/plugin_namestore_postgres.c:571
1857#: src/psycstore/plugin_psycstore_postgres.c:1721
1858msgid "Postgres database running\n" 2048msgid "Postgres database running\n"
1859msgstr "" 2049msgstr ""
1860 2050
@@ -1866,7 +2056,8 @@ msgstr ""
1866msgid "`%s' failed at %s:%u with error: %s" 2056msgid "`%s' failed at %s:%u with error: %s"
1867msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" 2057msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
1868 2058
1869#: src/datastore/plugin_datastore_sqlite.c:281 2059#: src/datastore/plugin_datastore_sqlite.c:271
2060#: src/identity-provider/plugin_identity_provider_sqlite.c:212
1870#: src/namecache/plugin_namecache_sqlite.c:194 2061#: src/namecache/plugin_namecache_sqlite.c:194
1871#: src/namestore/plugin_namestore_sqlite.c:222 2062#: src/namestore/plugin_namestore_sqlite.c:222
1872#: src/peerstore/plugin_peerstore_sqlite.c:535 2063#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1875,25 +2066,30 @@ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
1875msgid "Unable to initialize SQLite: %s.\n" 2066msgid "Unable to initialize SQLite: %s.\n"
1876msgstr "Không thể sơ khởi SQLite: %s.\n" 2067msgstr "Không thể sơ khởi SQLite: %s.\n"
1877 2068
1878#: src/datastore/plugin_datastore_sqlite.c:1234 2069#: src/datastore/plugin_datastore_sqlite.c:577
2070msgid "sqlite bind failure"
2071msgstr ""
2072
2073#: src/datastore/plugin_datastore_sqlite.c:1259
1879msgid "sqlite version to old to determine size, assuming zero\n" 2074msgid "sqlite version to old to determine size, assuming zero\n"
1880msgstr "" 2075msgstr ""
1881 2076
1882#: src/datastore/plugin_datastore_sqlite.c:1268 2077#: src/datastore/plugin_datastore_sqlite.c:1293
1883#, c-format 2078#, c-format
1884msgid "" 2079msgid ""
1885"Using sqlite page utilization to estimate payload (%llu pages of size %llu " 2080"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
1886"bytes)\n" 2081"bytes)\n"
1887msgstr "" 2082msgstr ""
1888 2083
1889#: src/datastore/plugin_datastore_sqlite.c:1312 2084#: src/datastore/plugin_datastore_sqlite.c:1337
2085#: src/identity-provider/plugin_identity_provider_sqlite.c:711
1890#: src/namecache/plugin_namecache_sqlite.c:603 2086#: src/namecache/plugin_namecache_sqlite.c:603
1891#: src/namestore/plugin_namestore_sqlite.c:802 2087#: src/namestore/plugin_namestore_sqlite.c:802
1892#, fuzzy 2088#, fuzzy
1893msgid "Sqlite database running\n" 2089msgid "Sqlite database running\n"
1894msgstr "kho dữ liệu sqlite" 2090msgstr "kho dữ liệu sqlite"
1895 2091
1896#: src/datastore/plugin_datastore_template.c:259 2092#: src/datastore/plugin_datastore_template.c:253
1897msgid "Template database running\n" 2093msgid "Template database running\n"
1898msgstr "" 2094msgstr ""
1899 2095
@@ -1955,53 +2151,6 @@ msgstr ""
1955msgid "Prints all packets that go through the DHT." 2151msgid "Prints all packets that go through the DHT."
1956msgstr "" 2152msgstr ""
1957 2153
1958#: src/dht/gnunet_dht_profiler.c:1161
1959#: src/testbed/gnunet-testbed-profiler.c:255
1960#, fuzzy, c-format
1961msgid "Exiting as the number of peers is %u\n"
1962msgstr "tăng sổ tối đa các kết nối TCP/IP"
1963
1964#: src/dht/gnunet_dht_profiler.c:1188
1965#, fuzzy
1966msgid "number of peers to start"
1967msgstr "số lần lặp lại"
1968
1969#: src/dht/gnunet_dht_profiler.c:1194
1970msgid ""
1971"maximum number of times we try to search for successor circle formation (0 "
1972"for R5N)"
1973msgstr ""
1974
1975#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
1976#: src/testbed/gnunet-testbed-profiler.c:305
1977msgid "name of the file with the login information for the testbed"
1978msgstr ""
1979
1980#: src/dht/gnunet_dht_profiler.c:1206
1981msgid "delay between rounds for collecting statistics (default: 30 sec)"
1982msgstr ""
1983
1984#: src/dht/gnunet_dht_profiler.c:1212
1985msgid "delay to start doing PUTs (default: 1 sec)"
1986msgstr ""
1987
1988#: src/dht/gnunet_dht_profiler.c:1218
1989msgid "delay to start doing GETs (default: 5 min)"
1990msgstr ""
1991
1992#: src/dht/gnunet_dht_profiler.c:1223
1993msgid "replication degree for DHT PUTs"
1994msgstr ""
1995
1996#: src/dht/gnunet_dht_profiler.c:1230
1997msgid "timeout for DHT PUT and GET requests (default: 1 min)"
1998msgstr ""
1999
2000#: src/dht/gnunet_dht_profiler.c:1248
2001#, fuzzy
2002msgid "Measure quality and performance of the DHT service."
2003msgstr "Không thể truy cập đến dịch vụ"
2004
2005#: src/dht/gnunet-dht-put.c:120 2154#: src/dht/gnunet-dht-put.c:120
2006#, fuzzy 2155#, fuzzy
2007msgid "PUT request sent with key" 2156msgid "PUT request sent with key"
@@ -2279,6 +2428,52 @@ msgstr ""
2279msgid "# DHT requests combined" 2428msgid "# DHT requests combined"
2280msgstr "# các yêu cầu get (lấy) dht được nhận" 2429msgstr "# các yêu cầu get (lấy) dht được nhận"
2281 2430
2431#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
2432#, fuzzy, c-format
2433msgid "Exiting as the number of peers is %u\n"
2434msgstr "tăng sổ tối đa các kết nối TCP/IP"
2435
2436#: src/dht/gnunet_dht_profiler.c:1188
2437#, fuzzy
2438msgid "number of peers to start"
2439msgstr "số lần lặp lại"
2440
2441#: src/dht/gnunet_dht_profiler.c:1194
2442msgid ""
2443"maximum number of times we try to search for successor circle formation (0 "
2444"for R5N)"
2445msgstr ""
2446
2447#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2448#: src/testbed/gnunet-testbed-profiler.c:305
2449msgid "name of the file with the login information for the testbed"
2450msgstr ""
2451
2452#: src/dht/gnunet_dht_profiler.c:1206
2453msgid "delay between rounds for collecting statistics (default: 30 sec)"
2454msgstr ""
2455
2456#: src/dht/gnunet_dht_profiler.c:1212
2457msgid "delay to start doing PUTs (default: 1 sec)"
2458msgstr ""
2459
2460#: src/dht/gnunet_dht_profiler.c:1218
2461msgid "delay to start doing GETs (default: 5 min)"
2462msgstr ""
2463
2464#: src/dht/gnunet_dht_profiler.c:1223
2465msgid "replication degree for DHT PUTs"
2466msgstr ""
2467
2468#: src/dht/gnunet_dht_profiler.c:1230
2469msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2470msgstr ""
2471
2472#: src/dht/gnunet_dht_profiler.c:1248
2473#, fuzzy
2474msgid "Measure quality and performance of the DHT service."
2475msgstr "Không thể truy cập đến dịch vụ"
2476
2282#: src/dht/plugin_block_dht.c:187 2477#: src/dht/plugin_block_dht.c:187
2283#, fuzzy, c-format 2478#, fuzzy, c-format
2284msgid "Block not of type %u\n" 2479msgid "Block not of type %u\n"
@@ -2612,7 +2807,7 @@ msgstr ""
2612msgid "No useful service enabled. Exiting.\n" 2807msgid "No useful service enabled. Exiting.\n"
2613msgstr "" 2808msgstr ""
2614 2809
2615#: src/exit/gnunet-daemon-exit.c:3969 2810#: src/exit/gnunet-daemon-exit.c:3970
2616msgid "Daemon to run to provide an IP exit node for the VPN" 2811msgid "Daemon to run to provide an IP exit node for the VPN"
2617msgstr "" 2812msgstr ""
2618 2813
@@ -3265,15 +3460,6 @@ msgid ""
3265"chk/...)" 3460"chk/...)"
3266msgstr "" 3461msgstr ""
3267 3462
3268#: src/fs/gnunet-fs.c:119
3269msgid "print a list of all indexed files"
3270msgstr ""
3271
3272#: src/fs/gnunet-fs.c:130
3273#, fuzzy
3274msgid "Special file-sharing operations"
3275msgstr "Tùy chá»n chia sẻ tập tin"
3276
3277#: src/fs/gnunet-fs-profiler.c:211 3463#: src/fs/gnunet-fs-profiler.c:211
3278msgid "run the experiment with COUNT peers" 3464msgid "run the experiment with COUNT peers"
3279msgstr "" 3465msgstr ""
@@ -3290,6 +3476,15 @@ msgstr ""
3290msgid "run a testbed to measure file-sharing performance" 3476msgid "run a testbed to measure file-sharing performance"
3291msgstr "" 3477msgstr ""
3292 3478
3479#: src/fs/gnunet-fs.c:119
3480msgid "print a list of all indexed files"
3481msgstr ""
3482
3483#: src/fs/gnunet-fs.c:130
3484#, fuzzy
3485msgid "Special file-sharing operations"
3486msgstr "Tùy chá»n chia sẻ tập tin"
3487
3293#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231 3488#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
3294#, c-format 3489#, c-format
3295msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" 3490msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4000,22 +4195,11 @@ msgstr ""
4000msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4195msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
4001msgstr "" 4196msgstr ""
4002 4197
4003#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 4198#: src/gns/gnunet-gns-helper-service-w32.c:602
4004#, c-format 4199msgid "Not ready to process requests, lacking ego data\n"
4005msgid "Invalid typename specified, assuming `ANY'\n"
4006msgstr ""
4007
4008#: src/gns/gnunet-gns.c:252
4009#, c-format
4010msgid "Please specify name to lookup!\n"
4011msgstr ""
4012
4013#: src/gns/gnunet-gns.c:276
4014#, c-format
4015msgid "Ego for `%s' not found, cannot perform lookup.\n"
4016msgstr "" 4200msgstr ""
4017 4201
4018#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701 4202#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
4019#: src/gns/plugin_rest_gns.c:422 4203#: src/gns/plugin_rest_gns.c:422
4020#, c-format 4204#, c-format
4021msgid "" 4205msgid ""
@@ -4023,59 +4207,12 @@ msgid ""
4023"gns-import.sh?\n" 4207"gns-import.sh?\n"
4024msgstr "" 4208msgstr ""
4025 4209
4026#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
4027#, fuzzy, c-format
4028msgid "Failed to connect to GNS\n"
4029msgstr "Lỗi kết nối đến gnunetd.\n"
4030
4031#: src/gns/gnunet-gns.c:374
4032#, c-format
4033msgid "Public key `%s' is not well-formed\n"
4034msgstr ""
4035
4036#: src/gns/gnunet-gns.c:428
4037msgid "Lookup a record for the given name"
4038msgstr ""
4039
4040#: src/gns/gnunet-gns.c:434
4041#, fuzzy
4042msgid "Specify the type of the record to lookup"
4043msgstr "xác định mức ưu tiên của nội dung"
4044
4045#: src/gns/gnunet-gns.c:440
4046#, fuzzy
4047msgid "Specify timeout for the lookup"
4048msgstr "xác định mức ưu tiên của nội dung"
4049
4050#: src/gns/gnunet-gns.c:445
4051msgid "No unneeded output"
4052msgstr ""
4053
4054#: src/gns/gnunet-gns.c:451
4055#, fuzzy
4056msgid "Specify the public key of the zone to lookup the record in"
4057msgstr "xác định mức ưu tiên của nội dung"
4058
4059#: src/gns/gnunet-gns.c:457
4060#, fuzzy
4061msgid "Specify the name of the ego of the zone to lookup the record in"
4062msgstr "xác định mức ưu tiên của nội dung"
4063
4064#: src/gns/gnunet-gns.c:476
4065#, fuzzy
4066msgid "GNUnet GNS resolver tool"
4067msgstr "Bản ghi lỗi GNUnet"
4068
4069#: src/gns/gnunet-gns-helper-service-w32.c:602
4070msgid "Not ready to process requests, lacking ego data\n"
4071msgstr ""
4072
4073#: src/gns/gnunet-gns-helper-service-w32.c:739 4210#: src/gns/gnunet-gns-helper-service-w32.c:739
4074#, fuzzy, c-format 4211#, fuzzy, c-format
4075msgid "Failed to connect to identity service\n" 4212msgid "Failed to connect to identity service\n"
4076msgstr "Lỗi kết nối đến gnunetd.\n" 4213msgstr "Lỗi kết nối đến gnunetd.\n"
4077 4214
4078#: src/gns/gnunet-gns-import.c:489 4215#: src/gns/gnunet-gns-import.c:452
4079msgid "This program will import some GNS authorities into your GNS namestore." 4216msgid "This program will import some GNS authorities into your GNS namestore."
4080msgstr "" 4217msgstr ""
4081 4218
@@ -4200,13 +4337,66 @@ msgstr ""
4200msgid "GNUnet GNS proxy" 4337msgid "GNUnet GNS proxy"
4201msgstr "" 4338msgstr ""
4202 4339
4340#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
4341#, c-format
4342msgid "Invalid typename specified, assuming `ANY'\n"
4343msgstr ""
4344
4345#: src/gns/gnunet-gns.c:252
4346#, c-format
4347msgid "Please specify name to lookup!\n"
4348msgstr ""
4349
4350#: src/gns/gnunet-gns.c:276
4351#, c-format
4352msgid "Ego for `%s' not found, cannot perform lookup.\n"
4353msgstr ""
4354
4355#: src/gns/gnunet-gns.c:374
4356#, c-format
4357msgid "Public key `%s' is not well-formed\n"
4358msgstr ""
4359
4360#: src/gns/gnunet-gns.c:428
4361msgid "Lookup a record for the given name"
4362msgstr ""
4363
4364#: src/gns/gnunet-gns.c:434
4365#, fuzzy
4366msgid "Specify the type of the record to lookup"
4367msgstr "xác định mức ưu tiên của nội dung"
4368
4369#: src/gns/gnunet-gns.c:440
4370#, fuzzy
4371msgid "Specify timeout for the lookup"
4372msgstr "xác định mức ưu tiên của nội dung"
4373
4374#: src/gns/gnunet-gns.c:445
4375msgid "No unneeded output"
4376msgstr ""
4377
4378#: src/gns/gnunet-gns.c:451
4379#, fuzzy
4380msgid "Specify the public key of the zone to lookup the record in"
4381msgstr "xác định mức ưu tiên của nội dung"
4382
4383#: src/gns/gnunet-gns.c:457
4384#, fuzzy
4385msgid "Specify the name of the ego of the zone to lookup the record in"
4386msgstr "xác định mức ưu tiên của nội dung"
4387
4388#: src/gns/gnunet-gns.c:476
4389#, fuzzy
4390msgid "GNUnet GNS resolver tool"
4391msgstr "Bản ghi lỗi GNUnet"
4392
4203#: src/gns/gnunet-service-gns.c:442 4393#: src/gns/gnunet-service-gns.c:442
4204#, fuzzy 4394#, fuzzy
4205msgid "Failed to connect to the namecache!\n" 4395msgid "Failed to connect to the namecache!\n"
4206msgstr "Không kết nối được đến trình ná»n gnunetd." 4396msgstr "Không kết nối được đến trình ná»n gnunetd."
4207 4397
4208#: src/gns/gnunet-service-gns.c:461 4398#: src/gns/gnunet-service-gns.c:461
4209#: src/zonemaster/gnunet-service-zonemaster.c:741 4399#: src/zonemaster/gnunet-service-zonemaster.c:742
4210#, fuzzy 4400#, fuzzy
4211msgid "Could not connect to DHT!\n" 4401msgid "Could not connect to DHT!\n"
4212msgstr "Không thể kết nối tới %s:%u: %s\n" 4402msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -4265,45 +4455,35 @@ msgstr ""
4265msgid "Hostname `%s' is not well-formed, resolution fails\n" 4455msgid "Hostname `%s' is not well-formed, resolution fails\n"
4266msgstr "" 4456msgstr ""
4267 4457
4268#: src/gns/plugin_gnsrecord_gns.c:203 4458#: src/gns/plugin_gnsrecord_gns.c:179
4269#, fuzzy, c-format 4459#, fuzzy, c-format
4270msgid "Unable to parse PKEY record `%s'\n" 4460msgid "Unable to parse PKEY record `%s'\n"
4271msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" 4461msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
4272 4462
4273#: src/gns/plugin_gnsrecord_gns.c:232 4463#: src/gns/plugin_gnsrecord_gns.c:208
4274#, fuzzy, c-format 4464#, fuzzy, c-format
4275msgid "Unable to parse GNS2DNS record `%s'\n" 4465msgid "Unable to parse GNS2DNS record `%s'\n"
4276msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" 4466msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
4277 4467
4278#: src/gns/plugin_gnsrecord_gns.c:253 4468#: src/gns/plugin_gnsrecord_gns.c:229
4279#, fuzzy, c-format 4469#, fuzzy, c-format
4280msgid "Failed to serialize GNS2DNS record with value `%s'\n" 4470msgid "Failed to serialize GNS2DNS record with value `%s'\n"
4281msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n" 4471msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
4282 4472
4283#: src/gns/plugin_gnsrecord_gns.c:276 4473#: src/gns/plugin_gnsrecord_gns.c:252
4284#, fuzzy, c-format 4474#, fuzzy, c-format
4285msgid "Unable to parse VPN record string `%s'\n" 4475msgid "Unable to parse VPN record string `%s'\n"
4286msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" 4476msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
4287 4477
4288#: src/gns/plugin_gnsrecord_gns.c:312 4478#: src/gns/plugin_gnsrecord_gns.c:288
4289#, fuzzy, c-format 4479#, fuzzy, c-format
4290msgid "Unable to parse BOX record string `%s'\n" 4480msgid "Unable to parse BOX record string `%s'\n"
4291msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" 4481msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
4292 4482
4293#: src/gns/plugin_gnsrecord_gns.c:360
4294#, fuzzy, c-format
4295msgid "Unable to parse REVERSE record string `%s'\n"
4296msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
4297
4298#: src/gns/plugin_rest_gns.c:384 4483#: src/gns/plugin_rest_gns.c:384
4299msgid "Ego for not found, cannot perform lookup.\n" 4484msgid "Ego for not found, cannot perform lookup.\n"
4300msgstr "" 4485msgstr ""
4301 4486
4302#: src/gns/plugin_rest_gns.c:668
4303#, fuzzy
4304msgid "GNS REST API initialized\n"
4305msgstr "Lỗi sơ khởi lõi.\n"
4306
4307#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4487#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4308#, fuzzy, c-format 4488#, fuzzy, c-format
4309msgid "Unable to parse IPv4 address `%s'\n" 4489msgid "Unable to parse IPv4 address `%s'\n"
@@ -4746,6 +4926,53 @@ msgstr "« %s » không sẵn sàng.\n"
4746msgid "Could not start hostlist HTTP server on port %u\n" 4926msgid "Could not start hostlist HTTP server on port %u\n"
4747msgstr "Cổng cho trình phục vụ HTTP danh sách máy chủ thống nhất" 4927msgstr "Cổng cho trình phục vụ HTTP danh sách máy chủ thống nhất"
4748 4928
4929#: src/identity-provider/gnunet-idp.c:348
4930#, fuzzy
4931msgid "Ego is required\n"
4932msgstr "Bị từ chối đặt tùy chá»n « %s » trong phần « %s » thành « %s ».\n"
4933
4934#: src/identity-provider/gnunet-idp.c:370
4935msgid "Add attribute"
4936msgstr ""
4937
4938#: src/identity-provider/gnunet-idp.c:376
4939msgid "Attribute value"
4940msgstr ""
4941
4942#: src/identity-provider/gnunet-idp.c:381
4943msgid "Ego"
4944msgstr ""
4945
4946#: src/identity-provider/gnunet-idp.c:386
4947msgid "Audience (relying party)"
4948msgstr ""
4949
4950#: src/identity-provider/gnunet-idp.c:390
4951msgid "List attributes for Ego"
4952msgstr ""
4953
4954#: src/identity-provider/gnunet-idp.c:395
4955msgid "Issue a ticket"
4956msgstr ""
4957
4958#: src/identity-provider/gnunet-idp.c:400
4959msgid "Consume a ticket"
4960msgstr ""
4961
4962#: src/identity-provider/gnunet-idp.c:405
4963msgid "Revoke a ticket"
4964msgstr ""
4965
4966#: src/identity-provider/identity_provider_api.c:429
4967#, fuzzy
4968msgid "failed to store record\n"
4969msgstr "Lỗi bắt đầu thu thập.\n"
4970
4971#: src/identity-provider/plugin_rest_identity_provider.c:1175
4972#, fuzzy
4973msgid "Identity Provider REST API initialized\n"
4974msgstr "Lỗi sơ khởi lõi.\n"
4975
4749#: src/identity/gnunet-identity.c:179 4976#: src/identity/gnunet-identity.c:179
4750#, fuzzy, c-format 4977#, fuzzy, c-format
4751msgid "Failed to create ego: %s\n" 4978msgid "Failed to create ego: %s\n"
@@ -4833,34 +5060,11 @@ msgstr "Không thể lưu tập tin cấu hình « %s »:"
4833msgid "Failed to create directory `%s' for storing egos\n" 5060msgid "Failed to create directory `%s' for storing egos\n"
4834msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" 5061msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
4835 5062
4836#: src/identity/plugin_rest_identity.c:967 5063#: src/identity/plugin_rest_identity.c:964
4837#, fuzzy 5064#, fuzzy
4838msgid "Identity REST API initialized\n" 5065msgid "Identity REST API initialized\n"
4839msgstr "Lỗi sơ khởi lõi.\n" 5066msgstr "Lỗi sơ khởi lõi.\n"
4840 5067
4841#: src/identity-provider/gnunet-identity-token.c:66
4842#, fuzzy
4843msgid "Option `-t' is required\n"
4844msgstr "Bị từ chối đặt tùy chá»n « %s » trong phần « %s » thành « %s ».\n"
4845
4846#: src/identity-provider/gnunet-identity-token.c:77
4847#, fuzzy, c-format
4848msgid "Token `%s' is malformed\n"
4849msgstr "Äối số không hợp lệ cho « %s ».\n"
4850
4851#: src/identity-provider/gnunet-identity-token.c:166
4852msgid "GNUid token"
4853msgstr ""
4854
4855#: src/identity-provider/gnunet-identity-token.c:171
4856msgid "Print token contents"
4857msgstr ""
4858
4859#: src/identity-provider/plugin_rest_identity_provider.c:1166
4860#, fuzzy
4861msgid "Identity Token REST API initialized\n"
4862msgstr "Lỗi sơ khởi lõi.\n"
4863
4864#: src/json/json.c:119 5068#: src/json/json.c:119
4865#, fuzzy, c-format 5069#, fuzzy, c-format
4866msgid "Failed to parse JSON in option `%s': %s (%s)\n" 5070msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4962,25 +5166,79 @@ msgstr "Không thể tạo miá»n tên.\n"
4962msgid "flat plugin running\n" 5166msgid "flat plugin running\n"
4963msgstr "kho dữ liệu sqlite" 5167msgstr "kho dữ liệu sqlite"
4964 5168
4965#: src/namecache/plugin_namecache_postgres.c:90 5169#: src/namestore/gnunet-namestore-fcfsd.c:508
4966#: src/namestore/plugin_namestore_postgres.c:97 5170#, fuzzy, c-format
4967#, fuzzy 5171msgid "Unsupported form value `%s'\n"
4968msgid "Failed to create indices\n" 5172msgstr "Lệnh không được há»— trợ « %s ». Äang hủy bá».\n"
5173
5174#: src/namestore/gnunet-namestore-fcfsd.c:535
5175#, fuzzy, c-format
5176msgid "Failed to create record for domain `%s': %s\n"
5177msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
5178
5179#: src/namestore/gnunet-namestore-fcfsd.c:555
5180msgid "Error when mapping zone to name\n"
5181msgstr ""
5182
5183#: src/namestore/gnunet-namestore-fcfsd.c:585
5184#, c-format
5185msgid "Found existing name `%s' for the given key\n"
5186msgstr ""
5187
5188#: src/namestore/gnunet-namestore-fcfsd.c:662
5189#, c-format
5190msgid "Found %u existing records for domain `%s'\n"
5191msgstr ""
5192
5193#: src/namestore/gnunet-namestore-fcfsd.c:718
5194#, fuzzy, c-format
5195msgid "Failed to create page for `%s'\n"
4969msgstr "Không thể tạo miá»n tên.\n" 5196msgstr "Không thể tạo miá»n tên.\n"
4970 5197
5198#: src/namestore/gnunet-namestore-fcfsd.c:734
5199#, fuzzy, c-format
5200msgid "Failed to setup post processor for `%s'\n"
5201msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
5202
5203#: src/namestore/gnunet-namestore-fcfsd.c:770
5204msgid "Domain name must not contain `.'\n"
5205msgstr ""
5206
5207#: src/namestore/gnunet-namestore-fcfsd.c:778
5208msgid "Domain name must not contain `+'\n"
5209msgstr ""
5210
5211#: src/namestore/gnunet-namestore-fcfsd.c:974
5212msgid "No ego configured for `fcfsd` subsystem\n"
5213msgstr ""
5214
5215#: src/namestore/gnunet-namestore-fcfsd.c:1000
5216#, fuzzy
5217msgid "Failed to start HTTP server\n"
5218msgstr "Lỗi bắt đầu thu thập.\n"
5219
5220#: src/namestore/gnunet-namestore-fcfsd.c:1042
5221#, fuzzy
5222msgid "Failed to connect to identity\n"
5223msgstr "Lỗi kết nối đến gnunetd.\n"
5224
5225#: src/namestore/gnunet-namestore-fcfsd.c:1074
5226msgid "GNU Name System First Come First Serve name registration service"
5227msgstr ""
5228
4971#: src/namestore/gnunet-namestore.c:301 5229#: src/namestore/gnunet-namestore.c:301
4972#, fuzzy, c-format 5230#, fuzzy, c-format
4973msgid "Adding record failed: %s\n" 5231msgid "Adding record failed: %s\n"
4974msgstr "Gặp lỗi khi tải lên tập tin: %s\n" 5232msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
4975 5233
4976#: src/namestore/gnunet-namestore.c:330 5234#: src/namestore/gnunet-namestore.c:330
4977#: src/namestore/plugin_rest_namestore.c:562 5235#: src/namestore/plugin_rest_namestore.c:567
4978#, fuzzy, c-format 5236#, fuzzy, c-format
4979msgid "Deleting record failed, record does not exist%s%s\n" 5237msgid "Deleting record failed, record does not exist%s%s\n"
4980msgstr "Gặp lỗi khi tải lên tập tin: %s\n" 5238msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
4981 5239
4982#: src/namestore/gnunet-namestore.c:337 5240#: src/namestore/gnunet-namestore.c:337
4983#: src/namestore/plugin_rest_namestore.c:571 5241#: src/namestore/plugin_rest_namestore.c:576
4984#, fuzzy, c-format 5242#, fuzzy, c-format
4985msgid "Deleting record failed%s%s\n" 5243msgid "Deleting record failed%s%s\n"
4986msgstr "Gặp lỗi khi tải lên tập tin: %s\n" 5244msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
@@ -4998,7 +5256,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
4998msgstr "" 5256msgstr ""
4999 5257
5000#: src/namestore/gnunet-namestore.c:698 5258#: src/namestore/gnunet-namestore.c:698
5001#: src/namestore/plugin_rest_namestore.c:597 5259#: src/namestore/plugin_rest_namestore.c:602
5002#, c-format 5260#, c-format
5003msgid "There are no records under label `%s' that could be deleted.\n" 5261msgid "There are no records under label `%s' that could be deleted.\n"
5004msgstr "" 5262msgstr ""
@@ -5009,24 +5267,11 @@ msgid ""
5009"There are no records under label `%s' that match the request for deletion.\n" 5267"There are no records under label `%s' that match the request for deletion.\n"
5010msgstr "" 5268msgstr ""
5011 5269
5012#: src/namestore/gnunet-namestore.c:776
5013#: src/namestore/plugin_rest_namestore.c:1004
5014#, c-format
5015msgid "Ego `%s' not known to identity service\n"
5016msgstr ""
5017
5018#: src/namestore/gnunet-namestore.c:791 5270#: src/namestore/gnunet-namestore.c:791
5019#, fuzzy, c-format 5271#, fuzzy, c-format
5020msgid "No options given\n" 5272msgid "No options given\n"
5021msgstr "chưa đưa ra tên" 5273msgstr "chưa đưa ra tên"
5022 5274
5023#: src/namestore/gnunet-namestore.c:802
5024#: src/namestore/gnunet-namestore-fcfsd.c:1034
5025#: src/namestore/plugin_rest_namestore.c:1017
5026#, fuzzy
5027msgid "Failed to connect to namestore\n"
5028msgstr "Không kết nối được đến trình ná»n gnunetd."
5029
5030#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819 5275#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
5031#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861 5276#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
5032#: src/namestore/gnunet-namestore.c:915 5277#: src/namestore/gnunet-namestore.c:915
@@ -5040,14 +5285,14 @@ msgid "add"
5040msgstr "" 5285msgstr ""
5041 5286
5042#: src/namestore/gnunet-namestore.c:829 5287#: src/namestore/gnunet-namestore.c:829
5043#: src/namestore/plugin_rest_namestore.c:671 5288#: src/namestore/plugin_rest_namestore.c:676
5044#, fuzzy, c-format 5289#, fuzzy, c-format
5045msgid "Unsupported type `%s'\n" 5290msgid "Unsupported type `%s'\n"
5046msgstr "Lệnh không được há»— trợ « %s ». Äang hủy bá».\n" 5291msgstr "Lệnh không được há»— trợ « %s ». Äang hủy bá».\n"
5047 5292
5048#: src/namestore/gnunet-namestore.c:851 5293#: src/namestore/gnunet-namestore.c:851
5049#: src/namestore/plugin_rest_namestore.c:689 5294#: src/namestore/plugin_rest_namestore.c:694
5050#: src/namestore/plugin_rest_namestore.c:729 5295#: src/namestore/plugin_rest_namestore.c:734
5051#, c-format 5296#, c-format
5052msgid "Value `%s' invalid for record type `%s'\n" 5297msgid "Value `%s' invalid for record type `%s'\n"
5053msgstr "" 5298msgstr ""
@@ -5066,8 +5311,7 @@ msgstr ""
5066msgid "Invalid public key for reverse lookup `%s'\n" 5311msgid "Invalid public key for reverse lookup `%s'\n"
5067msgstr "Äối số không hợp lệ cho « %s ».\n" 5312msgstr "Äối số không hợp lệ cho « %s ».\n"
5068 5313
5069#: src/namestore/gnunet-namestore.c:979 5314#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
5070#: src/peerinfo-tool/gnunet-peerinfo.c:775
5071#, fuzzy, c-format 5315#, fuzzy, c-format
5072msgid "Invalid URI `%s'\n" 5316msgid "Invalid URI `%s'\n"
5073msgstr "Dữ liệu nhập không hợp lệ.\n" 5317msgstr "Dữ liệu nhập không hợp lệ.\n"
@@ -5078,13 +5322,13 @@ msgid "Invalid nick `%s'\n"
5078msgstr "Dữ liệu nhập không hợp lệ.\n" 5322msgstr "Dữ liệu nhập không hợp lệ.\n"
5079 5323
5080#: src/namestore/gnunet-namestore.c:1051 5324#: src/namestore/gnunet-namestore.c:1051
5081#: src/namestore/plugin_rest_namestore.c:1047 5325#: src/namestore/plugin_rest_namestore.c:1052
5082#, c-format 5326#, c-format
5083msgid "No default ego configured in identity service\n" 5327msgid "No default ego configured in identity service\n"
5084msgstr "" 5328msgstr ""
5085 5329
5086#: src/namestore/gnunet-namestore.c:1108 5330#: src/namestore/gnunet-namestore.c:1108
5087#: src/namestore/plugin_rest_namestore.c:1143 5331#: src/namestore/plugin_rest_namestore.c:1148
5088#, fuzzy, c-format 5332#, fuzzy, c-format
5089msgid "Cannot connect to identity service\n" 5333msgid "Cannot connect to identity service\n"
5090msgstr "Không thể kết nối tới %s:%u: %s\n" 5334msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -5147,67 +5391,7 @@ msgstr ""
5147msgid "name of the ego controlling the zone" 5391msgid "name of the ego controlling the zone"
5148msgstr "" 5392msgstr ""
5149 5393
5150#: src/namestore/gnunet-namestore-fcfsd.c:508 5394#: src/namestore/gnunet-service-namestore.c:615
5151#, fuzzy, c-format
5152msgid "Unsupported form value `%s'\n"
5153msgstr "Lệnh không được há»— trợ « %s ». Äang hủy bá».\n"
5154
5155#: src/namestore/gnunet-namestore-fcfsd.c:535
5156#, fuzzy, c-format
5157msgid "Failed to create record for domain `%s': %s\n"
5158msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
5159
5160#: src/namestore/gnunet-namestore-fcfsd.c:555
5161msgid "Error when mapping zone to name\n"
5162msgstr ""
5163
5164#: src/namestore/gnunet-namestore-fcfsd.c:585
5165#, c-format
5166msgid "Found existing name `%s' for the given key\n"
5167msgstr ""
5168
5169#: src/namestore/gnunet-namestore-fcfsd.c:662
5170#, c-format
5171msgid "Found %u existing records for domain `%s'\n"
5172msgstr ""
5173
5174#: src/namestore/gnunet-namestore-fcfsd.c:718
5175#, fuzzy, c-format
5176msgid "Failed to create page for `%s'\n"
5177msgstr "Không thể tạo miá»n tên.\n"
5178
5179#: src/namestore/gnunet-namestore-fcfsd.c:734
5180#, fuzzy, c-format
5181msgid "Failed to setup post processor for `%s'\n"
5182msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
5183
5184#: src/namestore/gnunet-namestore-fcfsd.c:770
5185msgid "Domain name must not contain `.'\n"
5186msgstr ""
5187
5188#: src/namestore/gnunet-namestore-fcfsd.c:778
5189msgid "Domain name must not contain `+'\n"
5190msgstr ""
5191
5192#: src/namestore/gnunet-namestore-fcfsd.c:974
5193msgid "No ego configured for `fcfsd` subsystem\n"
5194msgstr ""
5195
5196#: src/namestore/gnunet-namestore-fcfsd.c:1000
5197#, fuzzy
5198msgid "Failed to start HTTP server\n"
5199msgstr "Lỗi bắt đầu thu thập.\n"
5200
5201#: src/namestore/gnunet-namestore-fcfsd.c:1042
5202#, fuzzy
5203msgid "Failed to connect to identity\n"
5204msgstr "Lỗi kết nối đến gnunetd.\n"
5205
5206#: src/namestore/gnunet-namestore-fcfsd.c:1074
5207msgid "GNU Name System First Come First Serve name registration service"
5208msgstr ""
5209
5210#: src/namestore/gnunet-service-namestore.c:612
5211#, fuzzy, c-format 5395#, fuzzy, c-format
5212msgid "Failed to replicate block in namecache: %s\n" 5396msgid "Failed to replicate block in namecache: %s\n"
5213msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n" 5397msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
@@ -5221,7 +5405,7 @@ msgstr ""
5221msgid "flat file database running\n" 5405msgid "flat file database running\n"
5222msgstr "kho dữ liệu sqlite" 5406msgstr "kho dữ liệu sqlite"
5223 5407
5224#: src/namestore/plugin_rest_namestore.c:1188 5408#: src/namestore/plugin_rest_namestore.c:1193
5225#, fuzzy 5409#, fuzzy
5226msgid "Namestore REST API initialized\n" 5410msgid "Namestore REST API initialized\n"
5227msgstr "Lỗi sơ khởi lõi.\n" 5411msgstr "Lỗi sơ khởi lõi.\n"
@@ -5508,11 +5692,6 @@ msgstr ""
5508msgid "`upnpc' command not found\n" 5692msgid "`upnpc' command not found\n"
5509msgstr "" 5693msgstr ""
5510 5694
5511#: src/nse/gnunet-nse.c:122
5512#, fuzzy
5513msgid "Show network size estimates from NSE service."
5514msgstr "# các yêu cầu get (lấy) dht được nhận"
5515
5516#: src/nse/gnunet-nse-profiler.c:842 5695#: src/nse/gnunet-nse-profiler.c:842
5517#, fuzzy 5696#, fuzzy
5518msgid "limit to the number of connections to NSE services, 0 for none" 5697msgid "limit to the number of connections to NSE services, 0 for none"
@@ -5539,71 +5718,17 @@ msgstr ""
5539msgid "Measure quality and performance of the NSE service." 5718msgid "Measure quality and performance of the NSE service."
5540msgstr "Không thể truy cập đến dịch vụ" 5719msgstr "Không thể truy cập đến dịch vụ"
5541 5720
5721#: src/nse/gnunet-nse.c:122
5722#, fuzzy
5723msgid "Show network size estimates from NSE service."
5724msgstr "# các yêu cầu get (lấy) dht được nhận"
5725
5542#: src/nse/gnunet-service-nse.c:1534 5726#: src/nse/gnunet-service-nse.c:1534
5543#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 5727#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
5544#, fuzzy 5728#, fuzzy
5545msgid "Value is too large.\n" 5729msgid "Value is too large.\n"
5546msgstr "Giá trị không nằm trong phạm vi được phép." 5730msgstr "Giá trị không nằm trong phạm vi được phép."
5547 5731
5548#: src/peerinfo/gnunet-service-peerinfo.c:178
5549#, fuzzy, c-format
5550msgid "Removing expired address of transport `%s'\n"
5551msgstr "Äã nạp truyá»n tải « %s »\n"
5552
5553#: src/peerinfo/gnunet-service-peerinfo.c:310
5554#, fuzzy, c-format
5555msgid "Failed to parse HELLO in file `%s': %s\n"
5556msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5557
5558#: src/peerinfo/gnunet-service-peerinfo.c:331
5559#: src/peerinfo/gnunet-service-peerinfo.c:362
5560#, fuzzy, c-format
5561msgid "Failed to parse HELLO in file `%s'\n"
5562msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5563
5564#: src/peerinfo/gnunet-service-peerinfo.c:446
5565msgid "# peers known"
5566msgstr ""
5567
5568#: src/peerinfo/gnunet-service-peerinfo.c:489
5569#, c-format
5570msgid ""
5571"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5572msgstr ""
5573"Tập tin « %s » trong thư mục « %s » không tùy theo quy ước đặt tên. Bị gỡ "
5574"bá».\n"
5575
5576#: src/peerinfo/gnunet-service-peerinfo.c:655
5577#, fuzzy, c-format
5578msgid "Scanning directory `%s'\n"
5579msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5580
5581#: src/peerinfo/gnunet-service-peerinfo.c:663
5582#, c-format
5583msgid "Still no peers found in `%s'!\n"
5584msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
5585
5586#: src/peerinfo/gnunet-service-peerinfo.c:1076
5587#, fuzzy, c-format
5588msgid "Cleaning up directory `%s'\n"
5589msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5590
5591#: src/peerinfo/gnunet-service-peerinfo.c:1405
5592#, c-format
5593msgid "Importing HELLOs from `%s'\n"
5594msgstr ""
5595
5596#: src/peerinfo/gnunet-service-peerinfo.c:1418
5597msgid "Skipping import of included HELLOs\n"
5598msgstr ""
5599
5600#: src/peerinfo/peerinfo_api.c:220
5601#, fuzzy
5602msgid "Failed to receive response from `PEERINFO' service."
5603msgstr ""
5604"\n"
5605"Không nhận được đáp ứng từ gnunetd.\n"
5606
5607#: src/peerinfo-tool/gnunet-peerinfo.c:239 5732#: src/peerinfo-tool/gnunet-peerinfo.c:239
5608#, fuzzy, c-format 5733#, fuzzy, c-format
5609msgid "%sPeer `%s'\n" 5734msgid "%sPeer `%s'\n"
@@ -5695,6 +5820,65 @@ msgstr "Äang nạp các truyá»n tải « %s »\n"
5695msgid "Failed to load transport plugin for `%s'\n" 5820msgid "Failed to load transport plugin for `%s'\n"
5696msgstr "Không thể nạp phần bổ sung truyá»n tải « %s »\n" 5821msgstr "Không thể nạp phần bổ sung truyá»n tải « %s »\n"
5697 5822
5823#: src/peerinfo/gnunet-service-peerinfo.c:178
5824#, fuzzy, c-format
5825msgid "Removing expired address of transport `%s'\n"
5826msgstr "Äã nạp truyá»n tải « %s »\n"
5827
5828#: src/peerinfo/gnunet-service-peerinfo.c:310
5829#, fuzzy, c-format
5830msgid "Failed to parse HELLO in file `%s': %s\n"
5831msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5832
5833#: src/peerinfo/gnunet-service-peerinfo.c:331
5834#: src/peerinfo/gnunet-service-peerinfo.c:362
5835#, fuzzy, c-format
5836msgid "Failed to parse HELLO in file `%s'\n"
5837msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5838
5839#: src/peerinfo/gnunet-service-peerinfo.c:446
5840msgid "# peers known"
5841msgstr ""
5842
5843#: src/peerinfo/gnunet-service-peerinfo.c:489
5844#, c-format
5845msgid ""
5846"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5847msgstr ""
5848"Tập tin « %s » trong thư mục « %s » không tùy theo quy ước đặt tên. Bị gỡ "
5849"bá».\n"
5850
5851#: src/peerinfo/gnunet-service-peerinfo.c:655
5852#, fuzzy, c-format
5853msgid "Scanning directory `%s'\n"
5854msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5855
5856#: src/peerinfo/gnunet-service-peerinfo.c:663
5857#, c-format
5858msgid "Still no peers found in `%s'!\n"
5859msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
5860
5861#: src/peerinfo/gnunet-service-peerinfo.c:1076
5862#, fuzzy, c-format
5863msgid "Cleaning up directory `%s'\n"
5864msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n"
5865
5866#: src/peerinfo/gnunet-service-peerinfo.c:1405
5867#, c-format
5868msgid "Importing HELLOs from `%s'\n"
5869msgstr ""
5870
5871#: src/peerinfo/gnunet-service-peerinfo.c:1418
5872msgid "Skipping import of included HELLOs\n"
5873msgstr ""
5874
5875#: src/peerinfo/peerinfo_api.c:220
5876#, fuzzy
5877msgid "Failed to receive response from `PEERINFO' service."
5878msgstr ""
5879"\n"
5880"Không nhận được đáp ứng từ gnunetd.\n"
5881
5698#: src/peerstore/gnunet-peerstore.c:91 5882#: src/peerstore/gnunet-peerstore.c:91
5699msgid "peerstore" 5883msgid "peerstore"
5700msgstr "" 5884msgstr ""
@@ -5744,15 +5928,10 @@ msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng"
5744msgid "Unable to create indices: %s.\n" 5928msgid "Unable to create indices: %s.\n"
5745msgstr "Không thể tạo miá»n tên.\n" 5929msgstr "Không thể tạo miá»n tên.\n"
5746 5930
5747#: src/postgres/postgres.c:67 5931#: src/pq/pq_prepare.c:80
5748#, fuzzy, c-format
5749msgid "`%s:%s' failed at %s:%d with error: %s\n"
5750msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
5751
5752#: src/postgres/postgres.c:192
5753#, fuzzy, c-format 5932#, fuzzy, c-format
5754msgid "Unable to connect to Postgres database '%s': %s\n" 5933msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
5755msgstr "Không thể lÆ°u tập tin cấu hình « %s »:" 5934msgstr "« %s » bá»»—i tại %s:%d »›i lá»—i: %s\n"
5756 5935
5757#: src/psycstore/gnunet-service-psycstore.c:249 5936#: src/psycstore/gnunet-service-psycstore.c:249
5758#, fuzzy 5937#, fuzzy
@@ -5932,61 +6111,61 @@ msgstr "Lưu cấu hình ngay bây giỠkhông?"
5932msgid "Daemon to announce regular expressions for the peer using cadet." 6111msgid "Daemon to announce regular expressions for the peer using cadet."
5933msgstr "" 6112msgstr ""
5934 6113
5935#: src/regex/gnunet-regex-profiler.c:1314 6114#: src/regex/gnunet-regex-profiler.c:1386
5936#, fuzzy 6115#, fuzzy
5937msgid "No configuration file given. Exiting\n" 6116msgid "No configuration file given. Exiting\n"
5938msgstr "dùng tập tin cấu hình TÊN_TẬP_TIN" 6117msgstr "dùng tập tin cấu hình TÊN_TẬP_TIN"
5939 6118
5940#: src/regex/gnunet-regex-profiler.c:1355 6119#: src/regex/gnunet-regex-profiler.c:1427
5941#: src/regex/gnunet-regex-simulation-profiler.c:630 6120#: src/regex/gnunet-regex-simulation-profiler.c:630
5942#, c-format 6121#, c-format
5943msgid "No policy directory specified on command line. Exiting.\n" 6122msgid "No policy directory specified on command line. Exiting.\n"
5944msgstr "" 6123msgstr ""
5945 6124
5946#: src/regex/gnunet-regex-profiler.c:1361 6125#: src/regex/gnunet-regex-profiler.c:1433
5947#: src/regex/gnunet-regex-simulation-profiler.c:638 6126#: src/regex/gnunet-regex-simulation-profiler.c:638
5948#, c-format 6127#, c-format
5949msgid "Specified policies directory does not exist. Exiting.\n" 6128msgid "Specified policies directory does not exist. Exiting.\n"
5950msgstr "" 6129msgstr ""
5951 6130
5952#: src/regex/gnunet-regex-profiler.c:1368 6131#: src/regex/gnunet-regex-profiler.c:1440
5953#, fuzzy, c-format 6132#, fuzzy, c-format
5954msgid "No files found in `%s'\n" 6133msgid "No files found in `%s'\n"
5955msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n" 6134msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
5956 6135
5957#: src/regex/gnunet-regex-profiler.c:1377 6136#: src/regex/gnunet-regex-profiler.c:1449
5958msgid "No search strings file given. Exiting.\n" 6137msgid "No search strings file given. Exiting.\n"
5959msgstr "" 6138msgstr ""
5960 6139
5961#: src/regex/gnunet-regex-profiler.c:1397 6140#: src/regex/gnunet-regex-profiler.c:1469
5962#, fuzzy 6141#, fuzzy
5963msgid "Error loading search strings. Exiting.\n" 6142msgid "Error loading search strings. Exiting.\n"
5964msgstr "Gặp lỗi khi tải xuống: %s\n" 6143msgstr "Gặp lỗi khi tải xuống: %s\n"
5965 6144
5966#: src/regex/gnunet-regex-profiler.c:1485 6145#: src/regex/gnunet-regex-profiler.c:1557
5967#, fuzzy 6146#, fuzzy
5968msgid "name of the file for writing statistics" 6147msgid "name of the file for writing statistics"
5969msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n" 6148msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n"
5970 6149
5971#: src/regex/gnunet-regex-profiler.c:1491 6150#: src/regex/gnunet-regex-profiler.c:1563
5972msgid "wait TIMEOUT before ending the experiment" 6151msgid "wait TIMEOUT before ending the experiment"
5973msgstr "" 6152msgstr ""
5974 6153
5975#: src/regex/gnunet-regex-profiler.c:1497 6154#: src/regex/gnunet-regex-profiler.c:1569
5976msgid "directory with policy files" 6155msgid "directory with policy files"
5977msgstr "" 6156msgstr ""
5978 6157
5979#: src/regex/gnunet-regex-profiler.c:1504 6158#: src/regex/gnunet-regex-profiler.c:1576
5980#, fuzzy 6159#, fuzzy
5981msgid "name of file with input strings" 6160msgid "name of file with input strings"
5982msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n" 6161msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n"
5983 6162
5984#: src/regex/gnunet-regex-profiler.c:1510 6163#: src/regex/gnunet-regex-profiler.c:1582
5985#, fuzzy 6164#, fuzzy
5986msgid "name of file with hosts' names" 6165msgid "name of file with hosts' names"
5987msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n" 6166msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n"
5988 6167
5989#: src/regex/gnunet-regex-profiler.c:1523 6168#: src/regex/gnunet-regex-profiler.c:1595
5990msgid "Profiler for regex" 6169msgid "Profiler for regex"
5991msgstr "" 6170msgstr ""
5992 6171
@@ -6219,10 +6398,10 @@ msgstr ""
6219msgid "Calculate the Vectorproduct with a GNUnet peer." 6398msgid "Calculate the Vectorproduct with a GNUnet peer."
6220msgstr "" 6399msgstr ""
6221 6400
6222#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 6401#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
6223#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6224#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
6225#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 6402#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
6403#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
6404#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
6226#, fuzzy 6405#, fuzzy
6227msgid "Connect to CADET failed\n" 6406msgid "Connect to CADET failed\n"
6228msgstr " Không kết nối được (lỗi ?)\n" 6407msgstr " Không kết nối được (lỗi ?)\n"
@@ -6247,7 +6426,7 @@ msgstr ""
6247msgid "also profile decryption" 6426msgid "also profile decryption"
6248msgstr "" 6427msgstr ""
6249 6428
6250#: src/set/gnunet-service-set.c:1948 6429#: src/set/gnunet-service-set.c:1989
6251#, fuzzy 6430#, fuzzy
6252msgid "Could not connect to CADET service\n" 6431msgid "Could not connect to CADET service\n"
6253msgstr "Không thể kết nối tới %s:%u: %s\n" 6432msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -6307,114 +6486,114 @@ msgstr ""
6307msgid "say good-bye and leave somebody else's place" 6486msgid "say good-bye and leave somebody else's place"
6308msgstr "" 6487msgstr ""
6309 6488
6310#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 6489#: src/social/gnunet-social.c:1227
6311msgid "create a place" 6490msgid "create a place"
6312msgstr "" 6491msgstr ""
6313 6492
6314#: src/social/gnunet-social.c:1237 6493#: src/social/gnunet-social.c:1232
6315msgid "destroy a place we were hosting" 6494msgid "destroy a place we were hosting"
6316msgstr "" 6495msgstr ""
6317 6496
6318#: src/social/gnunet-social.c:1242 6497#: src/social/gnunet-social.c:1237
6319msgid "enter somebody else's place" 6498msgid "enter somebody else's place"
6320msgstr "" 6499msgstr ""
6321 6500
6322#: src/social/gnunet-social.c:1248 6501#: src/social/gnunet-social.c:1243
6323msgid "find state matching name prefix" 6502msgid "find state matching name prefix"
6324msgstr "" 6503msgstr ""
6325 6504
6326#: src/social/gnunet-social.c:1253 6505#: src/social/gnunet-social.c:1248
6327msgid "replay history of messages up to the given --limit" 6506msgid "replay history of messages up to the given --limit"
6328msgstr "" 6507msgstr ""
6329 6508
6330#: src/social/gnunet-social.c:1258 6509#: src/social/gnunet-social.c:1253
6331msgid "reconnect to a previously created place" 6510msgid "reconnect to a previously created place"
6332msgstr "" 6511msgstr ""
6333 6512
6334#: src/social/gnunet-social.c:1263 6513#: src/social/gnunet-social.c:1258
6335msgid "publish something to a place we are hosting" 6514msgid "publish something to a place we are hosting"
6336msgstr "" 6515msgstr ""
6337 6516
6338#: src/social/gnunet-social.c:1268 6517#: src/social/gnunet-social.c:1263
6339msgid "reconnect to a previously entered place" 6518msgid "reconnect to a previously entered place"
6340msgstr "" 6519msgstr ""
6341 6520
6342#: src/social/gnunet-social.c:1273 6521#: src/social/gnunet-social.c:1268
6343msgid "search for state matching exact name" 6522msgid "search for state matching exact name"
6344msgstr "" 6523msgstr ""
6345 6524
6346#: src/social/gnunet-social.c:1278 6525#: src/social/gnunet-social.c:1273
6347msgid "submit something to somebody's place" 6526msgid "submit something to somebody's place"
6348msgstr "" 6527msgstr ""
6349 6528
6350#: src/social/gnunet-social.c:1283 6529#: src/social/gnunet-social.c:1278
6351msgid "list of egos and subscribed places" 6530msgid "list of egos and subscribed places"
6352msgstr "" 6531msgstr ""
6353 6532
6354#: src/social/gnunet-social.c:1288 6533#: src/social/gnunet-social.c:1283
6355msgid "extract and replay history between message IDs --start and --until" 6534msgid "extract and replay history between message IDs --start and --until"
6356msgstr "" 6535msgstr ""
6357 6536
6358#: src/social/gnunet-social.c:1297 6537#: src/social/gnunet-social.c:1292
6359msgid "application ID to use when connecting" 6538msgid "application ID to use when connecting"
6360msgstr "" 6539msgstr ""
6361 6540
6362#: src/social/gnunet-social.c:1303 6541#: src/social/gnunet-social.c:1298
6363msgid "message body or state value" 6542msgid "message body or state value"
6364msgstr "" 6543msgstr ""
6365 6544
6366#: src/social/gnunet-social.c:1309 6545#: src/social/gnunet-social.c:1304
6367#, fuzzy 6546#, fuzzy
6368msgid "name or public key of ego" 6547msgid "name or public key of ego"
6369msgstr "Äối số không hợp lệ cho « %s ».\n" 6548msgstr "Äối số không hợp lệ cho « %s ».\n"
6370 6549
6371#: src/social/gnunet-social.c:1314 6550#: src/social/gnunet-social.c:1309
6372#, fuzzy 6551#, fuzzy
6373msgid "wait for incoming messages" 6552msgid "wait for incoming messages"
6374msgstr "Lỗi gửi tin nhẳn.\n" 6553msgstr "Lỗi gửi tin nhẳn.\n"
6375 6554
6376#: src/social/gnunet-social.c:1320 6555#: src/social/gnunet-social.c:1315
6377msgid "GNS name" 6556msgid "GNS name"
6378msgstr "" 6557msgstr ""
6379 6558
6380#: src/social/gnunet-social.c:1326 6559#: src/social/gnunet-social.c:1321
6381msgid "peer ID for --guest-enter" 6560msgid "peer ID for --guest-enter"
6382msgstr "" 6561msgstr ""
6383 6562
6384#: src/social/gnunet-social.c:1332 6563#: src/social/gnunet-social.c:1327
6385msgid "name (key) to query from state" 6564msgid "name (key) to query from state"
6386msgstr "" 6565msgstr ""
6387 6566
6388#: src/social/gnunet-social.c:1338 6567#: src/social/gnunet-social.c:1333
6389msgid "method name" 6568msgid "method name"
6390msgstr "" 6569msgstr ""
6391 6570
6392#: src/social/gnunet-social.c:1344 6571#: src/social/gnunet-social.c:1339
6393#, fuzzy 6572#, fuzzy
6394msgid "number of messages to replay from history" 6573msgid "number of messages to replay from history"
6395msgstr "số tin nhắn cần dùng mỗi lần lặp" 6574msgstr "số tin nhắn cần dùng mỗi lần lặp"
6396 6575
6397#: src/social/gnunet-social.c:1350 6576#: src/social/gnunet-social.c:1345
6398msgid "key address of place" 6577msgid "key address of place"
6399msgstr "" 6578msgstr ""
6400 6579
6401#: src/social/gnunet-social.c:1356 6580#: src/social/gnunet-social.c:1351
6402msgid "start message ID for history replay" 6581msgid "start message ID for history replay"
6403msgstr "" 6582msgstr ""
6404 6583
6405#: src/social/gnunet-social.c:1361 6584#: src/social/gnunet-social.c:1356
6406msgid "respond to entry requests by admitting all guests" 6585msgid "respond to entry requests by admitting all guests"
6407msgstr "" 6586msgstr ""
6408 6587
6409#: src/social/gnunet-social.c:1367 6588#: src/social/gnunet-social.c:1362
6410msgid "end message ID for history replay" 6589msgid "end message ID for history replay"
6411msgstr "" 6590msgstr ""
6412 6591
6413#: src/social/gnunet-social.c:1372 6592#: src/social/gnunet-social.c:1367
6414msgid "respond to entry requests by refusing all guests" 6593msgid "respond to entry requests by refusing all guests"
6415msgstr "" 6594msgstr ""
6416 6595
6417#: src/social/gnunet-social.c:1382 6596#: src/social/gnunet-social.c:1377
6418msgid "" 6597msgid ""
6419"gnunet-social - Interact with the social service: enter/leave, send/receive " 6598"gnunet-social - Interact with the social service: enter/leave, send/receive "
6420"messages, access history and state.\n" 6599"messages, access history and state.\n"
@@ -6607,7 +6786,7 @@ msgid ""
6607msgstr "" 6786msgstr ""
6608 6787
6609#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 6788#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
6610#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 6789#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
6611#, c-format 6790#, c-format
6612msgid "Incorrect hostkey file format: %s\n" 6791msgid "Incorrect hostkey file format: %s\n"
6613msgstr "" 6792msgstr ""
@@ -6677,16 +6856,6 @@ msgstr "« %s » đang tắt.\n"
6677msgid "%.s Unknown result code." 6856msgid "%.s Unknown result code."
6678msgstr "" 6857msgstr ""
6679 6858
6680#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6681#, fuzzy
6682msgid "Waiting for child to exit.\n"
6683msgstr "Äang đợi các đồng đẳng kết nối"
6684
6685#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6686#, fuzzy, c-format
6687msgid "Spawning process `%s'\n"
6688msgstr "Äang bắt đầu tài vỠ« %s »\n"
6689
6690#: src/testbed/gnunet-testbed-profiler.c:290 6859#: src/testbed/gnunet-testbed-profiler.c:290
6691msgid "tolerate COUNT number of continious timeout failures" 6860msgid "tolerate COUNT number of continious timeout failures"
6692msgstr "" 6861msgstr ""
@@ -6698,6 +6867,16 @@ msgid ""
6698"signal is received" 6867"signal is received"
6699msgstr "" 6868msgstr ""
6700 6869
6870#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6871#, fuzzy
6872msgid "Waiting for child to exit.\n"
6873msgstr "Äang đợi các đồng đẳng kết nối"
6874
6875#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6876#, fuzzy, c-format
6877msgid "Spawning process `%s'\n"
6878msgstr "Äang bắt đầu tài vỠ« %s »\n"
6879
6701#: src/testbed/testbed_api.c:410 6880#: src/testbed/testbed_api.c:410
6702#, fuzzy, c-format 6881#, fuzzy, c-format
6703msgid "Adding host %u failed with error: %s\n" 6882msgid "Adding host %u failed with error: %s\n"
@@ -7000,10 +7179,6 @@ msgstr "# các thông báo PONG đã mật mã được nhận"
7000msgid "GNUnet topology control" 7179msgid "GNUnet topology control"
7001msgstr "" 7180msgstr ""
7002 7181
7003#: src/transport/gnunet-service-transport_ats.c:141
7004msgid "# Addresses given to ATS"
7005msgstr ""
7006
7007#: src/transport/gnunet-service-transport.c:448 7182#: src/transport/gnunet-service-transport.c:448
7008#, fuzzy 7183#, fuzzy
7009msgid "# messages dropped due to slow client" 7184msgid "# messages dropped due to slow client"
@@ -7053,6 +7228,10 @@ msgstr ""
7053msgid "Transport service is lacking key configuration settings. Exiting.\n" 7228msgid "Transport service is lacking key configuration settings. Exiting.\n"
7054msgstr "Lưu cấu hình ngay bây giỠkhông?" 7229msgstr "Lưu cấu hình ngay bây giỠkhông?"
7055 7230
7231#: src/transport/gnunet-service-transport_ats.c:141
7232msgid "# Addresses given to ATS"
7233msgstr ""
7234
7056#: src/transport/gnunet-service-transport_hello.c:195 7235#: src/transport/gnunet-service-transport_hello.c:195
7057msgid "# refreshed my HELLO" 7236msgid "# refreshed my HELLO"
7058msgstr "" 7237msgstr ""
@@ -7387,6 +7566,46 @@ msgstr ""
7387msgid "# validations succeeded" 7566msgid "# validations succeeded"
7388msgstr "" 7567msgstr ""
7389 7568
7569#: src/transport/gnunet-transport-profiler.c:219
7570#, c-format
7571msgid "%llu B in %llu ms == %.2f KB/s!\n"
7572msgstr ""
7573
7574#: src/transport/gnunet-transport-profiler.c:617
7575msgid "send data to peer"
7576msgstr ""
7577
7578#: src/transport/gnunet-transport-profiler.c:621
7579#, fuzzy
7580msgid "receive data from peer"
7581msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n"
7582
7583#: src/transport/gnunet-transport-profiler.c:626
7584#, fuzzy
7585msgid "iterations"
7586msgstr "Tùy chá»n chung"
7587
7588#: src/transport/gnunet-transport-profiler.c:631
7589#, fuzzy
7590msgid "number of messages to send"
7591msgstr "số tin nhắn cần dùng mỗi lần lặp"
7592
7593#: src/transport/gnunet-transport-profiler.c:636
7594#, fuzzy
7595msgid "message size to use"
7596msgstr "kích cỡ tin nhắn"
7597
7598#: src/transport/gnunet-transport-profiler.c:641
7599#: src/transport/gnunet-transport.c:1462
7600msgid "peer identity"
7601msgstr ""
7602
7603#: src/transport/gnunet-transport-profiler.c:652
7604#: src/transport/gnunet-transport.c:1482
7605#, fuzzy
7606msgid "Direct access to transport service."
7607msgstr "Lỗi kết nối đến gnunetd.\n"
7608
7390#: src/transport/gnunet-transport.c:413 7609#: src/transport/gnunet-transport.c:413
7391#, fuzzy, c-format 7610#, fuzzy, c-format
7392msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" 7611msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7526,11 +7745,6 @@ msgstr "In ra thông tin vỠcác đồng đẳng GNUnet."
7526msgid "do not resolve hostnames" 7745msgid "do not resolve hostnames"
7527msgstr "không quyết định các tên máy" 7746msgstr "không quyết định các tên máy"
7528 7747
7529#: src/transport/gnunet-transport.c:1462
7530#: src/transport/gnunet-transport-profiler.c:641
7531msgid "peer identity"
7532msgstr ""
7533
7534#: src/transport/gnunet-transport.c:1466 7748#: src/transport/gnunet-transport.c:1466
7535msgid "monitor plugin sessions" 7749msgid "monitor plugin sessions"
7536msgstr "" 7750msgstr ""
@@ -7539,44 +7753,9 @@ msgstr ""
7539msgid "send data for benchmarking to the other peer (until CTRL-C)" 7753msgid "send data for benchmarking to the other peer (until CTRL-C)"
7540msgstr "" 7754msgstr ""
7541 7755
7542#: src/transport/gnunet-transport.c:1482
7543#: src/transport/gnunet-transport-profiler.c:652
7544#, fuzzy
7545msgid "Direct access to transport service."
7546msgstr "Lỗi kết nối đến gnunetd.\n"
7547
7548#: src/transport/gnunet-transport-profiler.c:219
7549#, c-format
7550msgid "%llu B in %llu ms == %.2f KB/s!\n"
7551msgstr ""
7552
7553#: src/transport/gnunet-transport-profiler.c:617
7554msgid "send data to peer"
7555msgstr ""
7556
7557#: src/transport/gnunet-transport-profiler.c:621
7558#, fuzzy
7559msgid "receive data from peer"
7560msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n"
7561
7562#: src/transport/gnunet-transport-profiler.c:626
7563#, fuzzy
7564msgid "iterations"
7565msgstr "Tùy chá»n chung"
7566
7567#: src/transport/gnunet-transport-profiler.c:631
7568#, fuzzy
7569msgid "number of messages to send"
7570msgstr "số tin nhắn cần dùng mỗi lần lặp"
7571
7572#: src/transport/gnunet-transport-profiler.c:636
7573#, fuzzy
7574msgid "message size to use"
7575msgstr "kích cỡ tin nhắn"
7576
7577#: src/transport/plugin_transport_http_client.c:1474 7756#: src/transport/plugin_transport_http_client.c:1474
7578#: src/transport/plugin_transport_http_server.c:2249 7757#: src/transport/plugin_transport_http_server.c:2312
7579#: src/transport/plugin_transport_http_server.c:3463 7758#: src/transport/plugin_transport_http_server.c:3526
7580#: src/transport/plugin_transport_tcp.c:3890 7759#: src/transport/plugin_transport_tcp.c:3890
7581#: src/transport/plugin_transport_tcp.c:3897 7760#: src/transport/plugin_transport_tcp.c:3897
7582msgid "TCP_STEALTH not supported on this platform.\n" 7761msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7588,13 +7767,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
7588msgstr "" 7767msgstr ""
7589 7768
7590#: src/transport/plugin_transport_http_client.c:2164 7769#: src/transport/plugin_transport_http_client.c:2164
7591#: src/transport/plugin_transport_http_server.c:3178 7770#: src/transport/plugin_transport_http_server.c:3241
7592#, fuzzy, c-format 7771#, fuzzy, c-format
7593msgid "Shutting down plugin `%s'\n" 7772msgid "Shutting down plugin `%s'\n"
7594msgstr "Äang nạp các truyá»n tải « %s »\n" 7773msgstr "Äang nạp các truyá»n tải « %s »\n"
7595 7774
7596#: src/transport/plugin_transport_http_client.c:2181 7775#: src/transport/plugin_transport_http_client.c:2181
7597#: src/transport/plugin_transport_http_server.c:3248 7776#: src/transport/plugin_transport_http_server.c:3311
7598#, fuzzy, c-format 7777#, fuzzy, c-format
7599msgid "Shutdown for plugin `%s' complete\n" 7778msgid "Shutdown for plugin `%s' complete\n"
7600msgstr "Tải lên « %s » hoàn thành, địa chỉ URI là « %s ».\n" 7779msgstr "Tải lên « %s » hoàn thành, địa chỉ URI là « %s ».\n"
@@ -7604,106 +7783,106 @@ msgstr "Tải lên « %s » hoàn thành, địa chỉ URI là « %s ».\n"
7604msgid "Maximum number of requests is %u\n" 7783msgid "Maximum number of requests is %u\n"
7605msgstr "tăng sổ tối đa các kết nối TCP/IP" 7784msgstr "tăng sổ tối đa các kết nối TCP/IP"
7606 7785
7607#: src/transport/plugin_transport_http_server.c:1727 7786#: src/transport/plugin_transport_http_server.c:1756
7608#, c-format 7787#, c-format
7609msgid "" 7788msgid ""
7610"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " 7789"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
7611"size %u\n" 7790"size %u\n"
7612msgstr "" 7791msgstr ""
7613 7792
7614#: src/transport/plugin_transport_http_server.c:1967 7793#: src/transport/plugin_transport_http_server.c:2028
7615#, c-format 7794#, c-format
7616msgid "Accepting connection (%u of %u) from `%s'\n" 7795msgid "Accepting connection (%u of %u) from `%s'\n"
7617msgstr "" 7796msgstr ""
7618 7797
7619#: src/transport/plugin_transport_http_server.c:1975 7798#: src/transport/plugin_transport_http_server.c:2036
7620#, c-format 7799#, c-format
7621msgid "" 7800msgid ""
7622"Server reached maximum number connections (%u), rejecting new connection\n" 7801"Server reached maximum number connections (%u), rejecting new connection\n"
7623msgstr "" 7802msgstr ""
7624 7803
7625#: src/transport/plugin_transport_http_server.c:2125 7804#: src/transport/plugin_transport_http_server.c:2186
7626msgid "" 7805msgid ""
7627"Could not create a new TLS certificate, program `gnunet-transport-" 7806"Could not create a new TLS certificate, program `gnunet-transport-"
7628"certificate-creation' could not be started!\n" 7807"certificate-creation' could not be started!\n"
7629msgstr "" 7808msgstr ""
7630 7809
7631#: src/transport/plugin_transport_http_server.c:2148 7810#: src/transport/plugin_transport_http_server.c:2209
7632#, c-format 7811#, c-format
7633msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" 7812msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
7634msgstr "" 7813msgstr ""
7635 7814
7636#: src/transport/plugin_transport_http_server.c:2275 7815#: src/transport/plugin_transport_http_server.c:2338
7637msgid "Could not load or create server certificate! Loading plugin failed!\n" 7816msgid "Could not load or create server certificate! Loading plugin failed!\n"
7638msgstr "" 7817msgstr ""
7639 7818
7640#: src/transport/plugin_transport_http_server.c:2587 7819#: src/transport/plugin_transport_http_server.c:2650
7641#, fuzzy 7820#, fuzzy
7642msgid "Require valid port number for service in configuration!\n" 7821msgid "Require valid port number for service in configuration!\n"
7643msgstr "Lỗi lưu cấu hình." 7822msgstr "Lỗi lưu cấu hình."
7644 7823
7645#: src/transport/plugin_transport_http_server.c:2752 7824#: src/transport/plugin_transport_http_server.c:2815
7646#, c-format 7825#, c-format
7647msgid "Found %u addresses to report to NAT service\n" 7826msgid "Found %u addresses to report to NAT service\n"
7648msgstr "" 7827msgstr ""
7649 7828
7650#: src/transport/plugin_transport_http_server.c:2838 7829#: src/transport/plugin_transport_http_server.c:2901
7651#: src/transport/plugin_transport_udp.c:3622 7830#: src/transport/plugin_transport_udp.c:3622
7652msgid "Disabling IPv6 since it is not supported on this system!\n" 7831msgid "Disabling IPv6 since it is not supported on this system!\n"
7653msgstr "" 7832msgstr ""
7654 7833
7655#: src/transport/plugin_transport_http_server.c:2944 7834#: src/transport/plugin_transport_http_server.c:3007
7656#, c-format 7835#, c-format
7657msgid "IPv4 support is %s\n" 7836msgid "IPv4 support is %s\n"
7658msgstr "" 7837msgstr ""
7659 7838
7660#: src/transport/plugin_transport_http_server.c:2959 7839#: src/transport/plugin_transport_http_server.c:3022
7661#, c-format 7840#, c-format
7662msgid "IPv6 support is %s\n" 7841msgid "IPv6 support is %s\n"
7663msgstr "" 7842msgstr ""
7664 7843
7665#: src/transport/plugin_transport_http_server.c:2965 7844#: src/transport/plugin_transport_http_server.c:3028
7666msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" 7845msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
7667msgstr "" 7846msgstr ""
7668 7847
7669#: src/transport/plugin_transport_http_server.c:2976 7848#: src/transport/plugin_transport_http_server.c:3039
7670#, fuzzy 7849#, fuzzy
7671msgid "Port is required! Fix in configuration\n" 7850msgid "Port is required! Fix in configuration\n"
7672msgstr "" 7851msgstr ""
7673"\n" 7852"\n"
7674"Kết thúc cấu hình.\n" 7853"Kết thúc cấu hình.\n"
7675 7854
7676#: src/transport/plugin_transport_http_server.c:2982 7855#: src/transport/plugin_transport_http_server.c:3045
7677#, fuzzy, c-format 7856#, fuzzy, c-format
7678msgid "Using port %u\n" 7857msgid "Using port %u\n"
7679msgstr "Äang thá»­ nghiệm (các) truyá»n tải %s\n" 7858msgstr "Äang thá»­ nghiệm (các) truyá»n tải %s\n"
7680 7859
7681#: src/transport/plugin_transport_http_server.c:3001 7860#: src/transport/plugin_transport_http_server.c:3064
7682#, fuzzy, c-format 7861#, fuzzy, c-format
7683msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" 7862msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
7684msgstr "Äang thá»­ dùng tập tin « %s » cho cấu hình MySQL.\n" 7863msgstr "Äang thá»­ dùng tập tin « %s » cho cấu hình MySQL.\n"
7685 7864
7686#: src/transport/plugin_transport_http_server.c:3036 7865#: src/transport/plugin_transport_http_server.c:3099
7687#, fuzzy, c-format 7866#, fuzzy, c-format
7688msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" 7867msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
7689msgstr "Äang thá»­ dùng tập tin « %s » cho cấu hình MySQL.\n" 7868msgstr "Äang thá»­ dùng tập tin « %s » cho cấu hình MySQL.\n"
7690 7869
7691#: src/transport/plugin_transport_http_server.c:3111 7870#: src/transport/plugin_transport_http_server.c:3174
7692#, fuzzy, c-format 7871#, fuzzy, c-format
7693msgid "Using external hostname `%s'\n" 7872msgid "Using external hostname `%s'\n"
7694msgstr "Äang bắt đầu tài vỠ« %s »\n" 7873msgstr "Äang bắt đầu tài vỠ« %s »\n"
7695 7874
7696#: src/transport/plugin_transport_http_server.c:3132 7875#: src/transport/plugin_transport_http_server.c:3195
7697#, fuzzy, c-format 7876#, fuzzy, c-format
7698msgid "Notifying transport only about hostname `%s'\n" 7877msgid "Notifying transport only about hostname `%s'\n"
7699msgstr "không quyết định các tên máy" 7878msgstr "không quyết định các tên máy"
7700 7879
7701#: src/transport/plugin_transport_http_server.c:3149 7880#: src/transport/plugin_transport_http_server.c:3212
7702#, fuzzy, c-format 7881#, fuzzy, c-format
7703msgid "Maximum number of connections is %u\n" 7882msgid "Maximum number of connections is %u\n"
7704msgstr "tăng sổ tối đa các kết nối TCP/IP" 7883msgstr "tăng sổ tối đa các kết nối TCP/IP"
7705 7884
7706#: src/transport/plugin_transport_http_server.c:3475 7885#: src/transport/plugin_transport_http_server.c:3538
7707#, fuzzy 7886#, fuzzy
7708msgid "Unable to compile URL regex\n" 7887msgid "Unable to compile URL regex\n"
7709msgstr "Không thể sơ khởi SQLite: %s.\n" 7888msgstr "Không thể sơ khởi SQLite: %s.\n"
@@ -7852,21 +8031,6 @@ msgstr ""
7852msgid "TCP transport advertises itself as being on port %llu\n" 8031msgid "TCP transport advertises itself as being on port %llu\n"
7853msgstr "" 8032msgstr ""
7854 8033
7855#: src/transport/plugin_transport_udp_broadcasting.c:168
7856#, fuzzy
7857msgid "# Multicast HELLO beacons received via UDP"
7858msgstr "# các thông báo PONG đã mật mã được nhận"
7859
7860#: src/transport/plugin_transport_udp_broadcasting.c:548
7861msgid ""
7862"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7863msgstr ""
7864
7865#: src/transport/plugin_transport_udp_broadcasting.c:565
7866#, c-format
7867msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7868msgstr ""
7869
7870#: src/transport/plugin_transport_udp.c:3366 8034#: src/transport/plugin_transport_udp.c:3366
7871#, c-format 8035#, c-format
7872msgid "" 8036msgid ""
@@ -7915,6 +8079,21 @@ msgstr "« %s » không sẵn sàng.\n"
7915msgid "Failed to create UDP network sockets\n" 8079msgid "Failed to create UDP network sockets\n"
7916msgstr "Không thể tạo miá»n tên.\n" 8080msgstr "Không thể tạo miá»n tên.\n"
7917 8081
8082#: src/transport/plugin_transport_udp_broadcasting.c:168
8083#, fuzzy
8084msgid "# Multicast HELLO beacons received via UDP"
8085msgstr "# các thông báo PONG đã mật mã được nhận"
8086
8087#: src/transport/plugin_transport_udp_broadcasting.c:548
8088msgid ""
8089"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
8090msgstr ""
8091
8092#: src/transport/plugin_transport_udp_broadcasting.c:565
8093#, c-format
8094msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
8095msgstr ""
8096
7918#: src/transport/plugin_transport_unix.c:1403 8097#: src/transport/plugin_transport_unix.c:1403
7919#, fuzzy, c-format 8098#, fuzzy, c-format
7920msgid "Cannot create path to `%s'\n" 8099msgid "Cannot create path to `%s'\n"
@@ -8029,7 +8208,7 @@ msgid ""
8029"`GNUNET_SERVER_receive_done' after %s\n" 8208"`GNUNET_SERVER_receive_done' after %s\n"
8030msgstr "" 8209msgstr ""
8031 8210
8032#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 8211#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
8033#, fuzzy, c-format 8212#, fuzzy, c-format
8034msgid "Unknown address family %d\n" 8213msgid "Unknown address family %d\n"
8035msgstr "\tKhông rõ miá»n tên « %s »\n" 8214msgstr "\tKhông rõ miá»n tên « %s »\n"
@@ -8074,51 +8253,51 @@ msgstr "Lỗi chạy %s: %s %d\n"
8074msgid "Service `%s' runs at %s\n" 8253msgid "Service `%s' runs at %s\n"
8075msgstr "Äồng đẳng « %s » có mức tin cậy %8u\n" 8254msgstr "Äồng đẳng « %s » có mức tin cậy %8u\n"
8076 8255
8077#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 8256#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
8078msgid "Service process failed to initialize\n" 8257msgid "Service process failed to initialize\n"
8079msgstr "" 8258msgstr ""
8080 8259
8081#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 8260#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
8082msgid "Service process could not initialize server function\n" 8261msgid "Service process could not initialize server function\n"
8083msgstr "" 8262msgstr ""
8084 8263
8085#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 8264#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
8086msgid "Service process failed to report status\n" 8265msgid "Service process failed to report status\n"
8087msgstr "" 8266msgstr ""
8088 8267
8089#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 8268#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
8090#: src/util/service.c:1379 8269#: src/util/service.c:1378
8091#, c-format 8270#, c-format
8092msgid "Cannot obtain information about user `%s': %s\n" 8271msgid "Cannot obtain information about user `%s': %s\n"
8093msgstr "Không thể lấy thông tin vá» ngÆ°á»i dùng « %s »: %s\n" 8272msgstr "Không thể lấy thông tin vá» ngÆ°á»i dùng « %s »: %s\n"
8094 8273
8095#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 8274#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
8096msgid "No such user" 8275msgid "No such user"
8097msgstr "Không có ngÆ°á»i dùng nhÆ° vậy" 8276msgstr "Không có ngÆ°á»i dùng nhÆ° vậy"
8098 8277
8099#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 8278#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
8100#, c-format 8279#, c-format
8101msgid "Cannot change user/group to `%s': %s\n" 8280msgid "Cannot change user/group to `%s': %s\n"
8102msgstr "Không thể thay đổi ngÆ°á»i dùng/nhóm thành « %s »: %s\n" 8281msgstr "Không thể thay đổi ngÆ°á»i dùng/nhóm thành « %s »: %s\n"
8103 8282
8104#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 8283#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
8105msgid "do daemonize (detach from terminal)" 8284msgid "do daemonize (detach from terminal)"
8106msgstr "" 8285msgstr ""
8107 8286
8108#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 8287#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
8109#: src/util/service.c:1791 8288#: src/util/service.c:1790
8110#, fuzzy, c-format 8289#, fuzzy, c-format
8111msgid "Malformed configuration file `%s', exit ...\n" 8290msgid "Malformed configuration file `%s', exit ...\n"
8112msgstr "Không thể lưu tập tin cấu hình « %s »:" 8291msgstr "Không thể lưu tập tin cấu hình « %s »:"
8113 8292
8114#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 8293#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
8115#: src/util/service.c:1802 8294#: src/util/service.c:1801
8116#, fuzzy 8295#, fuzzy
8117msgid "Malformed configuration, exit ...\n" 8296msgid "Malformed configuration, exit ...\n"
8118msgstr "Không thể lưu tập tin cấu hình « %s »:" 8297msgstr "Không thể lưu tập tin cấu hình « %s »:"
8119 8298
8120#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 8299#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
8121#: src/util/service.c:1808 8300#: src/util/service.c:1807
8122#, fuzzy, c-format 8301#, fuzzy, c-format
8123msgid "Could not access configuration file `%s'\n" 8302msgid "Could not access configuration file `%s'\n"
8124msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n" 8303msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
@@ -8162,71 +8341,71 @@ msgstr ""
8162msgid "Need a non-empty hostname for service `%s'.\n" 8341msgid "Need a non-empty hostname for service `%s'.\n"
8163msgstr "" 8342msgstr ""
8164 8343
8165#: src/util/common_logging.c:256 src/util/common_logging.c:1129 8344#: src/util/common_logging.c:259 src/util/common_logging.c:1132
8166msgid "DEBUG" 8345msgid "DEBUG"
8167msgstr "Gá»  Lá»–I" 8346msgstr "Gá»  Lá»–I"
8168 8347
8169#: src/util/common_logging.c:258 src/util/common_logging.c:1127 8348#: src/util/common_logging.c:261 src/util/common_logging.c:1130
8170msgid "INFO" 8349msgid "INFO"
8171msgstr "TIN" 8350msgstr "TIN"
8172 8351
8173#: src/util/common_logging.c:260 src/util/common_logging.c:1125 8352#: src/util/common_logging.c:263 src/util/common_logging.c:1128
8174msgid "MESSAGE" 8353msgid "MESSAGE"
8175msgstr "" 8354msgstr ""
8176 8355
8177#: src/util/common_logging.c:262 src/util/common_logging.c:1123 8356#: src/util/common_logging.c:265 src/util/common_logging.c:1126
8178msgid "WARNING" 8357msgid "WARNING"
8179msgstr "CẢNH BÃO" 8358msgstr "CẢNH BÃO"
8180 8359
8181#: src/util/common_logging.c:264 src/util/common_logging.c:1121 8360#: src/util/common_logging.c:267 src/util/common_logging.c:1124
8182msgid "ERROR" 8361msgid "ERROR"
8183msgstr "Lá»–I" 8362msgstr "Lá»–I"
8184 8363
8185#: src/util/common_logging.c:266 src/util/common_logging.c:1131 8364#: src/util/common_logging.c:269 src/util/common_logging.c:1134
8186msgid "NONE" 8365msgid "NONE"
8187msgstr "" 8366msgstr ""
8188 8367
8189#: src/util/common_logging.c:879 8368#: src/util/common_logging.c:882
8190#, fuzzy, c-format 8369#, fuzzy, c-format
8191msgid "Message `%.*s' repeated %u times in the last %s\n" 8370msgid "Message `%.*s' repeated %u times in the last %s\n"
8192msgstr "Thông điệp « %.*s » đã lặp lại %u lần trong %llu giây trước\n" 8371msgstr "Thông điệp « %.*s » đã lặp lại %u lần trong %llu giây trước\n"
8193 8372
8194#: src/util/common_logging.c:1132 8373#: src/util/common_logging.c:1135
8195msgid "INVALID" 8374msgid "INVALID"
8196msgstr "" 8375msgstr ""
8197 8376
8198#: src/util/common_logging.c:1302 8377#: src/util/common_logging.c:1326
8199msgid "unknown address" 8378msgid "unknown address"
8200msgstr "" 8379msgstr ""
8201 8380
8202#: src/util/common_logging.c:1344 8381#: src/util/common_logging.c:1368
8203msgid "invalid address" 8382msgid "invalid address"
8204msgstr "" 8383msgstr ""
8205 8384
8206#: src/util/common_logging.c:1362 8385#: src/util/common_logging.c:1386
8207#, fuzzy, c-format 8386#, fuzzy, c-format
8208msgid "Configuration fails to specify option `%s' in section `%s'!\n" 8387msgid "Configuration fails to specify option `%s' in section `%s'!\n"
8209msgstr "" 8388msgstr ""
8210"Cấu hình không thá»a mãn các ràng buá»™c của tập tin đặc tả cấu hình « %s ».\n" 8389"Cấu hình không thá»a mãn các ràng buá»™c của tập tin đặc tả cấu hình « %s ».\n"
8211 8390
8212#: src/util/common_logging.c:1383 8391#: src/util/common_logging.c:1407
8213#, fuzzy, c-format 8392#, fuzzy, c-format
8214msgid "" 8393msgid ""
8215"Configuration specifies invalid value for option `%s' in section `%s': %s\n" 8394"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
8216msgstr "" 8395msgstr ""
8217"Cấu hình không thá»a mãn các ràng buá»™c của tập tin đặc tả cấu hình « %s ».\n" 8396"Cấu hình không thá»a mãn các ràng buá»™c của tập tin đặc tả cấu hình « %s ».\n"
8218 8397
8219#: src/util/configuration.c:286 8398#: src/util/configuration.c:296
8220#, fuzzy, c-format 8399#, fuzzy, c-format
8221msgid "Syntax error while deserializing in line %u\n" 8400msgid "Syntax error while deserializing in line %u\n"
8222msgstr "Gặp lỗi cú pháp trong tập tin cấu hình « %s » tại dòng %d.\n" 8401msgstr "Gặp lỗi cú pháp trong tập tin cấu hình « %s » tại dòng %d.\n"
8223 8402
8224#: src/util/configuration.c:344 8403#: src/util/configuration.c:355
8225#, fuzzy, c-format 8404#, fuzzy, c-format
8226msgid "Error while reading file `%s'\n" 8405msgid "Error while reading file `%s'\n"
8227msgstr "Gặp lỗi khi tải xuống: %s\n" 8406msgstr "Gặp lỗi khi tải xuống: %s\n"
8228 8407
8229#: src/util/configuration.c:1017 8408#: src/util/configuration.c:1034
8230#, c-format 8409#, c-format
8231msgid "" 8410msgid ""
8232"Configuration value '%s' for '%s' in section '%s' is not in set of legal " 8411"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8235,17 +8414,17 @@ msgstr ""
8235"Giá trị cấu hình « %s » cho « %s » trong phần « %s » không phải nằm trong " 8414"Giá trị cấu hình « %s » cho « %s » trong phần « %s » không phải nằm trong "
8236"tập hợp các sá»± chá»n được phép\n" 8415"tập hợp các sá»± chá»n được phép\n"
8237 8416
8238#: src/util/configuration.c:1136 8417#: src/util/configuration.c:1153
8239#, c-format 8418#, c-format
8240msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" 8419msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
8241msgstr "" 8420msgstr ""
8242 8421
8243#: src/util/configuration.c:1169 8422#: src/util/configuration.c:1186
8244#, fuzzy, c-format 8423#, fuzzy, c-format
8245msgid "Missing closing `%s' in option `%s'\n" 8424msgid "Missing closing `%s' in option `%s'\n"
8246msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n" 8425msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n"
8247 8426
8248#: src/util/configuration.c:1237 8427#: src/util/configuration.c:1254
8249#, c-format 8428#, c-format
8250msgid "" 8429msgid ""
8251"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " 8430"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -8279,32 +8458,32 @@ msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
8279msgid "EdDSA signature verification failed at %s:%d: %s\n" 8458msgid "EdDSA signature verification failed at %s:%d: %s\n"
8280msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n" 8459msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
8281 8460
8282#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 8461#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
8283#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 8462#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
8284#, fuzzy, c-format 8463#, fuzzy, c-format
8285msgid "Could not acquire lock on file `%s': %s...\n" 8464msgid "Could not acquire lock on file `%s': %s...\n"
8286msgstr "Lỗi mở tập tin theo dõi « %s »: %s\n" 8465msgstr "Lỗi mở tập tin theo dõi « %s »: %s\n"
8287 8466
8288#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 8467#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
8289#, fuzzy 8468#, fuzzy
8290msgid "Creating a new private key. This may take a while.\n" 8469msgid "Creating a new private key. This may take a while.\n"
8291msgstr "Äang tạo khoá máy má»›i (có thể hÆ¡i lâu).\n" 8470msgstr "Äang tạo khoá máy má»›i (có thể hÆ¡i lâu).\n"
8292 8471
8293#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 8472#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
8294msgid "This may be ok if someone is currently generating a private key.\n" 8473msgid "This may be ok if someone is currently generating a private key.\n"
8295msgstr "" 8474msgstr ""
8296 8475
8297#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 8476#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
8298#, c-format 8477#, c-format
8299msgid "" 8478msgid ""
8300"When trying to read key file `%s' I found %u bytes but I need at least %u.\n" 8479"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
8301msgstr "" 8480msgstr ""
8302 8481
8303#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 8482#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
8304msgid "This may be ok if someone is currently generating a key.\n" 8483msgid "This may be ok if someone is currently generating a key.\n"
8305msgstr "" 8484msgstr ""
8306 8485
8307#: src/util/crypto_ecc_setup.c:413 8486#: src/util/crypto_ecc_setup.c:415
8308#, fuzzy 8487#, fuzzy
8309msgid "Could not load peer's private key\n" 8488msgid "Could not load peer's private key\n"
8310msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n" 8489msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
@@ -8499,82 +8678,86 @@ msgstr ""
8499msgid "Manipulate GNUnet configuration files" 8678msgid "Manipulate GNUnet configuration files"
8500msgstr "cập nhật một giá trị trong tập tin cấu hình" 8679msgstr "cập nhật một giá trị trong tập tin cấu hình"
8501 8680
8502#: src/util/gnunet-ecc.c:84 8681#: src/util/gnunet-ecc.c:89
8503#, fuzzy, c-format 8682#, fuzzy, c-format
8504msgid "Failed to open `%s': %s\n" 8683msgid "Failed to open `%s': %s\n"
8505msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 8684msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
8506 8685
8507#: src/util/gnunet-ecc.c:120 8686#: src/util/gnunet-ecc.c:125
8508#, c-format 8687#, c-format
8509msgid "Generating %u keys like %s, please wait" 8688msgid "Generating %u keys like %s, please wait"
8510msgstr "" 8689msgstr ""
8511 8690
8512#: src/util/gnunet-ecc.c:133 8691#: src/util/gnunet-ecc.c:138
8513#, c-format 8692#, c-format
8514msgid "Generating %u keys, please wait" 8693msgid "Generating %u keys, please wait"
8515msgstr "" 8694msgstr ""
8516 8695
8517#: src/util/gnunet-ecc.c:174 8696#: src/util/gnunet-ecc.c:179
8518#, fuzzy, c-format 8697#, fuzzy, c-format
8519msgid "" 8698msgid ""
8520"\n" 8699"\n"
8521"Failed to write to `%s': %s\n" 8700"Failed to write to `%s': %s\n"
8522msgstr "Lỗi chạy %s: %s %d\n" 8701msgstr "Lỗi chạy %s: %s %d\n"
8523 8702
8524#: src/util/gnunet-ecc.c:184 8703#: src/util/gnunet-ecc.c:189
8525#, c-format 8704#, c-format
8526msgid "" 8705msgid ""
8527"\n" 8706"\n"
8528"Finished!\n" 8707"Finished!\n"
8529msgstr "" 8708msgstr ""
8530 8709
8531#: src/util/gnunet-ecc.c:187 8710#: src/util/gnunet-ecc.c:192
8532#, c-format 8711#, c-format
8533msgid "" 8712msgid ""
8534"\n" 8713"\n"
8535"Error, %u keys not generated\n" 8714"Error, %u keys not generated\n"
8536msgstr "" 8715msgstr ""
8537 8716
8538#: src/util/gnunet-ecc.c:280 8717#: src/util/gnunet-ecc.c:283
8539#, fuzzy, c-format 8718#, fuzzy, c-format
8540msgid "Hostkeys file `%s' not found\n" 8719msgid "Hostkeys file `%s' not found\n"
8541msgstr "Khoá phiên chạy từ đồng đẳng « %s » không thể được thẩm tra.\n" 8720msgstr "Khoá phiên chạy từ đồng đẳng « %s » không thể được thẩm tra.\n"
8542 8721
8543#: src/util/gnunet-ecc.c:291 8722#: src/util/gnunet-ecc.c:294
8544#, fuzzy, c-format 8723#, fuzzy, c-format
8545msgid "Hostkeys file `%s' is empty\n" 8724msgid "Hostkeys file `%s' is empty\n"
8546msgstr "Äịnh dạng của tập tin « %s » là không hợp lệ.\n" 8725msgstr "Äịnh dạng của tập tin « %s » là không hợp lệ.\n"
8547 8726
8548#: src/util/gnunet-ecc.c:313 8727#: src/util/gnunet-ecc.c:316
8549#, fuzzy, c-format 8728#, fuzzy, c-format
8550msgid "Could not read hostkey file: %s\n" 8729msgid "Could not read hostkey file: %s\n"
8551msgstr "Không thể Ä‘á»c danh sách bạn bè « %s »\n" 8730msgstr "Không thể Ä‘á»c danh sách bạn bè « %s »\n"
8552 8731
8553#: src/util/gnunet-ecc.c:364 8732#: src/util/gnunet-ecc.c:367
8554msgid "No hostkey file specified on command line\n" 8733msgid "No hostkey file specified on command line\n"
8555msgstr "" 8734msgstr ""
8556 8735
8557#: src/util/gnunet-ecc.c:416 8736#: src/util/gnunet-ecc.c:425
8558msgid "list keys included in a file (for testing)" 8737msgid "list keys included in a file (for testing)"
8559msgstr "" 8738msgstr ""
8560 8739
8561#: src/util/gnunet-ecc.c:421 8740#: src/util/gnunet-ecc.c:430
8562msgid "number of keys to list included in a file (for testing)" 8741msgid "number of keys to list included in a file (for testing)"
8563msgstr "" 8742msgstr ""
8564 8743
8565#: src/util/gnunet-ecc.c:426 8744#: src/util/gnunet-ecc.c:435
8566msgid "create COUNT public-private key pairs (for testing)" 8745msgid "create COUNT public-private key pairs (for testing)"
8567msgstr "" 8746msgstr ""
8568 8747
8569#: src/util/gnunet-ecc.c:430 8748#: src/util/gnunet-ecc.c:439
8570msgid "print the public key in ASCII format" 8749msgid "print the public key in ASCII format"
8571msgstr "" 8750msgstr ""
8572 8751
8573#: src/util/gnunet-ecc.c:434 8752#: src/util/gnunet-ecc.c:443
8753msgid "print the public key in HEX format"
8754msgstr ""
8755
8756#: src/util/gnunet-ecc.c:447
8574msgid "print examples of ECC operations (used for compatibility testing)" 8757msgid "print examples of ECC operations (used for compatibility testing)"
8575msgstr "" 8758msgstr ""
8576 8759
8577#: src/util/gnunet-ecc.c:449 8760#: src/util/gnunet-ecc.c:463
8578#, fuzzy 8761#, fuzzy
8579msgid "Manipulate GNUnet private ECC key files" 8762msgid "Manipulate GNUnet private ECC key files"
8580msgstr "cập nhật một giá trị trong tập tin cấu hình" 8763msgstr "cập nhật một giá trị trong tập tin cấu hình"
@@ -8668,7 +8851,7 @@ msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng"
8668msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8851msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8669msgstr "" 8852msgstr ""
8670 8853
8671#: src/util/network.c:1793 src/util/network.c:1969 8854#: src/util/network.c:1793 src/util/network.c:1977
8672#, c-format 8855#, c-format
8673msgid "" 8856msgid ""
8674"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8857"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8721,7 +8904,7 @@ msgstr "« %s » thất bại cho thư viện « %s » với lỗi: %s\n"
8721msgid "Could not determine plugin installation path.\n" 8904msgid "Could not determine plugin installation path.\n"
8722msgstr "Không thể truy cập đến thông tin vỠkhông gian tên.\n" 8905msgstr "Không thể truy cập đến thông tin vỠkhông gian tên.\n"
8723 8906
8724#: src/util/resolver_api.c:204 8907#: src/util/resolver_api.c:203
8725#, c-format 8908#, c-format
8726msgid "" 8909msgid ""
8727"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" 8910"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8734,32 +8917,32 @@ msgid ""
8734"resolution will be unavailable.\n" 8917"resolution will be unavailable.\n"
8735msgstr "" 8918msgstr ""
8736 8919
8737#: src/util/resolver_api.c:815 8920#: src/util/resolver_api.c:826
8738#, fuzzy, c-format 8921#, fuzzy, c-format
8739msgid "Timeout trying to resolve hostname `%s'.\n" 8922msgid "Timeout trying to resolve hostname `%s'.\n"
8740msgstr "không quyết định các tên máy" 8923msgstr "không quyết định các tên máy"
8741 8924
8742#: src/util/resolver_api.c:827 8925#: src/util/resolver_api.c:839
8743#, fuzzy, c-format 8926#, fuzzy, c-format
8744msgid "Timeout trying to resolve IP address `%s'.\n" 8927msgid "Timeout trying to resolve IP address `%s'.\n"
8745msgstr "GNUnet bây giỠsử dụng địa chỉ IP %s.\n" 8928msgstr "GNUnet bây giỠsử dụng địa chỉ IP %s.\n"
8746 8929
8747#: src/util/resolver_api.c:1004 8930#: src/util/resolver_api.c:1023
8748msgid "Resolver not configured correctly.\n" 8931msgid "Resolver not configured correctly.\n"
8749msgstr "" 8932msgstr ""
8750 8933
8751#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 8934#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
8752#: src/util/resolver_api.c:1121 8935#: src/util/resolver_api.c:1146
8753#, fuzzy, c-format 8936#, fuzzy, c-format
8754msgid "Could not resolve our FQDN: %s\n" 8937msgid "Could not resolve our FQDN: %s\n"
8755msgstr "Không thể giải quyết « %s » (%s): %s\n" 8938msgstr "Không thể giải quyết « %s » (%s): %s\n"
8756 8939
8757#: src/util/service.c:1306 8940#: src/util/service.c:1305
8758msgid "" 8941msgid ""
8759"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8942"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8760msgstr "" 8943msgstr ""
8761 8944
8762#: src/util/service.c:2082 8945#: src/util/service.c:2081
8763#, c-format 8946#, c-format
8764msgid "" 8947msgid ""
8765"Processing code for message of type %u did not call " 8948"Processing code for message of type %u did not call "
@@ -8837,63 +9020,63 @@ msgstr " ngày"
8837msgid "end of time" 9020msgid "end of time"
8838msgstr "" 9021msgstr ""
8839 9022
8840#: src/util/strings.c:1269 9023#: src/util/strings.c:1270
8841msgid "IPv6 address did not start with `['\n" 9024msgid "IPv6 address did not start with `['\n"
8842msgstr "" 9025msgstr ""
8843 9026
8844#: src/util/strings.c:1277 9027#: src/util/strings.c:1278
8845msgid "IPv6 address did contain ':' to separate port number\n" 9028msgid "IPv6 address did contain ':' to separate port number\n"
8846msgstr "" 9029msgstr ""
8847 9030
8848#: src/util/strings.c:1283 9031#: src/util/strings.c:1284
8849msgid "IPv6 address did contain ']' before ':' to separate port number\n" 9032msgid "IPv6 address did contain ']' before ':' to separate port number\n"
8850msgstr "" 9033msgstr ""
8851 9034
8852#: src/util/strings.c:1290 9035#: src/util/strings.c:1291
8853msgid "IPv6 address did contain a valid port number after the last ':'\n" 9036msgid "IPv6 address did contain a valid port number after the last ':'\n"
8854msgstr "" 9037msgstr ""
8855 9038
8856#: src/util/strings.c:1299 9039#: src/util/strings.c:1300
8857#, fuzzy, c-format 9040#, fuzzy, c-format
8858msgid "Invalid IPv6 address `%s': %s\n" 9041msgid "Invalid IPv6 address `%s': %s\n"
8859msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n" 9042msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n"
8860 9043
8861#: src/util/strings.c:1571 src/util/strings.c:1587 9044#: src/util/strings.c:1572 src/util/strings.c:1588
8862msgid "Port not in range\n" 9045msgid "Port not in range\n"
8863msgstr "" 9046msgstr ""
8864 9047
8865#: src/util/strings.c:1596 9048#: src/util/strings.c:1597
8866#, fuzzy, c-format 9049#, fuzzy, c-format
8867msgid "Malformed port policy `%s'\n" 9050msgid "Malformed port policy `%s'\n"
8868msgstr "Lỗi bắt đầu thu thập.\n" 9051msgstr "Lỗi bắt đầu thu thập.\n"
8869 9052
8870#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 9053#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
8871#: src/util/strings.c:1779 9054#: src/util/strings.c:1780
8872#, c-format 9055#, c-format
8873msgid "Invalid format for IP: `%s'\n" 9056msgid "Invalid format for IP: `%s'\n"
8874msgstr "Äịa chỉ IP định dạng sai: %s\n" 9057msgstr "Äịa chỉ IP định dạng sai: %s\n"
8875 9058
8876#: src/util/strings.c:1736 9059#: src/util/strings.c:1737
8877#, c-format 9060#, c-format
8878msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." 9061msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
8879msgstr "Ký hiệu mạng sai (« /%d » không hợp lệ trong CIDR IPv4)." 9062msgstr "Ký hiệu mạng sai (« /%d » không hợp lệ trong CIDR IPv4)."
8880 9063
8881#: src/util/strings.c:1788 9064#: src/util/strings.c:1789
8882#, fuzzy, c-format 9065#, fuzzy, c-format
8883msgid "Invalid format: `%s'\n" 9066msgid "Invalid format: `%s'\n"
8884msgstr "Äịa chỉ IP định dạng sai: %s\n" 9067msgstr "Äịa chỉ IP định dạng sai: %s\n"
8885 9068
8886#: src/util/strings.c:1840 9069#: src/util/strings.c:1841
8887#, c-format 9070#, c-format
8888msgid "Invalid network notation (does not end with ';': `%s')\n" 9071msgid "Invalid network notation (does not end with ';': `%s')\n"
8889msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n" 9072msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n"
8890 9073
8891#: src/util/strings.c:1890 9074#: src/util/strings.c:1891
8892#, fuzzy, c-format 9075#, fuzzy, c-format
8893msgid "Wrong format `%s' for netmask\n" 9076msgid "Wrong format `%s' for netmask\n"
8894msgstr "Mặt nạ mạng có định dạng sai « %s »: %s\n" 9077msgstr "Mặt nạ mạng có định dạng sai « %s »: %s\n"
8895 9078
8896#: src/util/strings.c:1921 9079#: src/util/strings.c:1922
8897#, fuzzy, c-format 9080#, fuzzy, c-format
8898msgid "Wrong format `%s' for network\n" 9081msgid "Wrong format `%s' for network\n"
8899msgstr "Mạng có định dạng sai « %s »: %s\n" 9082msgstr "Mạng có định dạng sai « %s »: %s\n"
@@ -9076,28 +9259,44 @@ msgstr "# các byte đã nhận qua UDP"
9076msgid "Setup tunnels via VPN." 9259msgid "Setup tunnels via VPN."
9077msgstr "" 9260msgstr ""
9078 9261
9079#: src/zonemaster/gnunet-service-zonemaster.c:705 9262#: src/zonemaster/gnunet-service-zonemaster.c:706
9080#, fuzzy 9263#, fuzzy
9081msgid "Failed to connect to the namestore!\n" 9264msgid "Failed to connect to the namestore!\n"
9082msgstr "Không kết nối được đến trình ná»n gnunetd." 9265msgstr "Không kết nối được đến trình ná»n gnunetd."
9083 9266
9084#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 9267#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
9085#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 9268#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
9086#, fuzzy, c-format 9269#, fuzzy, c-format
9087msgid "Assertion failed at %s:%d.\n" 9270msgid "Assertion failed at %s:%d.\n"
9088msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" 9271msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n"
9089 9272
9090#: src/include/gnunet_common.h:711 9273#: src/include/gnunet_common.h:726
9091#, fuzzy, c-format 9274#, fuzzy, c-format
9092msgid "External protocol violation detected at %s:%d.\n" 9275msgid "External protocol violation detected at %s:%d.\n"
9093msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n" 9276msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n"
9094 9277
9095#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 9278#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
9096#, c-format 9279#, c-format
9097msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" 9280msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9098msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n" 9281msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n"
9099 9282
9100#, fuzzy 9283#, fuzzy
9284#~ msgid "Token `%s' is malformed\n"
9285#~ msgstr "Äối số không hợp lệ cho « %s ».\n"
9286
9287#, fuzzy
9288#~ msgid "Failed to create indices\n"
9289#~ msgstr "Không thể tạo miá»n tên.\n"
9290
9291#, fuzzy
9292#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
9293#~ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
9294
9295#, fuzzy
9296#~ msgid "Unable to connect to Postgres database '%s': %s\n"
9297#~ msgstr "Không thể lưu tập tin cấu hình « %s »:"
9298
9299#, fuzzy
9101#~ msgid "Misconfiguration (can not connect to the ARM service)" 9300#~ msgid "Misconfiguration (can not connect to the ARM service)"
9102#~ msgstr "Lỗi kết nối đến gnunetd.\n" 9301#~ msgstr "Lỗi kết nối đến gnunetd.\n"
9103 9302
@@ -9206,10 +9405,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s
9206#~ msgstr "# các sá»± truyá»n PONG bị lá»—i" 9405#~ msgstr "# các sá»± truyá»n PONG bị lá»—i"
9207 9406
9208#, fuzzy 9407#, fuzzy
9209#~ msgid "# bytes sent to datastore"
9210#~ msgstr "# các byte trong kho dữ liệu"
9211
9212#, fuzzy
9213#~ msgid "Failed to receive status response from database." 9408#~ msgid "Failed to receive status response from database."
9214#~ msgstr "" 9409#~ msgstr ""
9215#~ "\n" 9410#~ "\n"
@@ -9526,10 +9721,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s
9526#~ msgstr "Lỗi sơ khởi dịch vụ « %s ».\n" 9721#~ msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
9527 9722
9528#, fuzzy 9723#, fuzzy
9529#~ msgid "Error reading sensor version\n"
9530#~ msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng"
9531
9532#, fuzzy
9533#~ msgid "Error reading sensor category\n" 9724#~ msgid "Error reading sensor category\n"
9534#~ msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng" 9725#~ msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng"
9535 9726
@@ -10134,12 +10325,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s
10134#~ "Không nhận được đáp ứng từ gnunetd.\n" 10325#~ "Không nhận được đáp ứng từ gnunetd.\n"
10135 10326
10136#, fuzzy 10327#, fuzzy
10137#~ msgid "Failed to remove records from database"
10138#~ msgstr ""
10139#~ "\n"
10140#~ "Không nhận được đáp ứng từ gnunetd.\n"
10141
10142#, fuzzy
10143#~ msgid "Failed to access database" 10328#~ msgid "Failed to access database"
10144#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 10329#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
10145 10330
diff --git a/po/zh_CN.po b/po/zh_CN.po
index fee065a9d..2539296c2 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: gnunet-0.8.1\n" 8"Project-Id-Version: gnunet-0.8.1\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2017-03-31 19:22-0500\n" 10"POT-Creation-Date: 2017-10-20 15:14+0000\n"
11"PO-Revision-Date: 2011-07-09 12:12+0800\n" 11"PO-Revision-Date: 2011-07-09 12:12+0800\n"
12"Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n" 12"Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n"
13"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" 13"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -267,7 +267,7 @@ msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
267msgstr "" 267msgstr ""
268 268
269#: src/arm/gnunet-service-arm.c:513 269#: src/arm/gnunet-service-arm.c:513
270#: src/transport/plugin_transport_http_server.c:2621 270#: src/transport/plugin_transport_http_server.c:2684
271#: src/transport/plugin_transport_tcp.c:1259 271#: src/transport/plugin_transport_tcp.c:1259
272#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782 272#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
273#, fuzzy, c-format 273#, fuzzy, c-format
@@ -275,7 +275,7 @@ msgid "Failed to resolve `%s': %s\n"
275msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" 275msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n"
276 276
277#: src/arm/gnunet-service-arm.c:532 277#: src/arm/gnunet-service-arm.c:532
278#: src/transport/plugin_transport_http_server.c:2639 278#: src/transport/plugin_transport_http_server.c:2702
279#: src/transport/plugin_transport_tcp.c:1278 279#: src/transport/plugin_transport_tcp.c:1278
280#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802 280#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
281#, fuzzy, c-format 281#, fuzzy, c-format
@@ -349,134 +349,14 @@ msgstr ""
349msgid "Initiating shutdown as requested by client.\n" 349msgid "Initiating shutdown as requested by client.\n"
350msgstr "" 350msgstr ""
351 351
352#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 352#: src/ats-tests/ats-testing-log.c:837
353#, c-format 353msgid "Stop logging\n"
354msgid ""
355"Could not load quota for network `%s': `%s', assigning default bandwidth "
356"%llu\n"
357msgstr ""
358
359#: src/ats/gnunet-ats-solver-eval.c:2799
360#, c-format
361msgid ""
362"No outbound quota configured for network `%s', assigning default bandwidth "
363"%llu\n"
364msgstr ""
365
366#: src/ats/gnunet-ats-solver-eval.c:2840
367#, c-format
368msgid ""
369"No outbound quota configure for network `%s', assigning default bandwidth "
370"%llu\n"
371msgstr ""
372
373#: src/ats/gnunet-ats-solver-eval.c:3294
374#: src/ats-tests/gnunet-solver-eval.c:939
375msgid "solver to use"
376msgstr ""
377
378#: src/ats/gnunet-ats-solver-eval.c:3299
379#: src/ats-tests/gnunet-solver-eval.c:945
380#: src/ats-tests/gnunet-solver-eval.c:950
381msgid "experiment to use"
382msgstr ""
383
384#: src/ats/gnunet-ats-solver-eval.c:3306
385#, fuzzy
386msgid "print logging"
387msgstr "未知的命令“%sâ€ã€‚\n"
388
389#: src/ats/gnunet-ats-solver-eval.c:3311
390msgid "save logging to disk"
391msgstr ""
392
393#: src/ats/gnunet-ats-solver-eval.c:3316
394msgid "disable normalization"
395msgstr ""
396
397#: src/ats/gnunet-service-ats_plugins.c:304
398#, c-format
399msgid ""
400"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
401"%llu\n"
402msgstr ""
403
404#: src/ats/gnunet-service-ats_plugins.c:314
405#, c-format
406msgid "%s quota configured for network `%s' is %llu\n"
407msgstr ""
408
409#: src/ats/gnunet-service-ats_plugins.c:359
410#, c-format
411msgid ""
412"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
413msgstr ""
414
415#: src/ats/gnunet-service-ats_plugins.c:451
416#, fuzzy, c-format
417msgid "Failed to initialize solver `%s'!\n"
418msgstr "无法åˆå§‹åŒ– SQLite:%s。\n"
419
420#: src/ats/plugin_ats_mlp.c:1274
421msgid "Problem size too large, cannot allocate memory!\n"
422msgstr ""
423
424#: src/ats/plugin_ats_mlp.c:1869
425#, c-format
426msgid "Adding address for peer `%s' multiple times\n"
427msgstr ""
428
429#: src/ats/plugin_ats_mlp.c:1913
430#, c-format
431msgid "Updating address property for peer `%s' %p not added before\n"
432msgstr ""
433
434#: src/ats/plugin_ats_mlp.c:2475
435msgid ""
436"MLP solver is not optimizing for anything, changing to feasibility check\n"
437msgstr ""
438
439#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
440#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
441#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
442#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
443#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
444#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
445#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
446#, fuzzy, c-format
447msgid "Invalid %s configuration %f \n"
448msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
449
450#: src/ats/plugin_ats_mlp.c:2670
451#, c-format
452msgid ""
453"Adjusting inconsistent outbound quota configuration for network `%s', is "
454"%llu must be at least %llu\n"
455msgstr ""
456
457#: src/ats/plugin_ats_mlp.c:2679
458#, c-format
459msgid ""
460"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
461"must be at least %llu\n"
462msgstr ""
463
464#: src/ats/plugin_ats_mlp.c:2689
465#, c-format
466msgid ""
467"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
468msgstr ""
469
470#: src/ats/plugin_ats_mlp.c:2698
471#, c-format
472msgid ""
473"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
474msgstr "" 354msgstr ""
475 355
476#: src/ats/plugin_ats_proportional.c:1164 356#: src/ats-tests/ats-testing-log.c:892
477#, fuzzy, c-format 357#, fuzzy, c-format
478msgid "Invalid %s configuration %f\n" 358msgid "Start logging `%s'\n"
479msgstr "解æžé…置文ä»â€œ%sâ€å¤±è´¥\n" 359msgstr "未知的命令“%sâ€ã€‚\n"
480 360
481#: src/ats-tests/ats-testing.c:422 361#: src/ats-tests/ats-testing.c:422
482#, c-format 362#, c-format
@@ -488,15 +368,6 @@ msgstr ""
488msgid "Failed to connect master peer [%u] with slave [%u]\n" 368msgid "Failed to connect master peer [%u] with slave [%u]\n"
489msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 369msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
490 370
491#: src/ats-tests/ats-testing-log.c:837
492msgid "Stop logging\n"
493msgstr ""
494
495#: src/ats-tests/ats-testing-log.c:892
496#, fuzzy, c-format
497msgid "Start logging `%s'\n"
498msgstr "未知的命令“%sâ€ã€‚\n"
499
500#: src/ats-tests/gnunet-ats-sim.c:90 371#: src/ats-tests/gnunet-ats-sim.c:90
501#, c-format 372#, c-format
502msgid "" 373msgid ""
@@ -504,6 +375,15 @@ msgid ""
504"= %u KiB/s\n" 375"= %u KiB/s\n"
505msgstr "" 376msgstr ""
506 377
378#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
379msgid "solver to use"
380msgstr ""
381
382#: src/ats-tests/gnunet-solver-eval.c:945
383#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
384msgid "experiment to use"
385msgstr ""
386
507#: src/ats-tool/gnunet-ats.c:307 387#: src/ats-tool/gnunet-ats.c:307
508#, c-format 388#, c-format
509msgid "%u address resolutions had a timeout\n" 389msgid "%u address resolutions had a timeout\n"
@@ -625,6 +505,124 @@ msgstr ""
625msgid "Print information about ATS state" 505msgid "Print information about ATS state"
626msgstr "无法获å–有关用户“%sâ€çš„ä¿¡æ¯ï¼š%s\n" 506msgstr "无法获å–有关用户“%sâ€çš„ä¿¡æ¯ï¼š%s\n"
627 507
508#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
509#, c-format
510msgid ""
511"Could not load quota for network `%s': `%s', assigning default bandwidth "
512"%llu\n"
513msgstr ""
514
515#: src/ats/gnunet-ats-solver-eval.c:2799
516#, c-format
517msgid ""
518"No outbound quota configured for network `%s', assigning default bandwidth "
519"%llu\n"
520msgstr ""
521
522#: src/ats/gnunet-ats-solver-eval.c:2840
523#, c-format
524msgid ""
525"No outbound quota configure for network `%s', assigning default bandwidth "
526"%llu\n"
527msgstr ""
528
529#: src/ats/gnunet-ats-solver-eval.c:3306
530#, fuzzy
531msgid "print logging"
532msgstr "未知的命令“%sâ€ã€‚\n"
533
534#: src/ats/gnunet-ats-solver-eval.c:3311
535msgid "save logging to disk"
536msgstr ""
537
538#: src/ats/gnunet-ats-solver-eval.c:3316
539msgid "disable normalization"
540msgstr ""
541
542#: src/ats/gnunet-service-ats_plugins.c:304
543#, c-format
544msgid ""
545"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
546"%llu\n"
547msgstr ""
548
549#: src/ats/gnunet-service-ats_plugins.c:314
550#, c-format
551msgid "%s quota configured for network `%s' is %llu\n"
552msgstr ""
553
554#: src/ats/gnunet-service-ats_plugins.c:359
555#, c-format
556msgid ""
557"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
558msgstr ""
559
560#: src/ats/gnunet-service-ats_plugins.c:451
561#, fuzzy, c-format
562msgid "Failed to initialize solver `%s'!\n"
563msgstr "无法åˆå§‹åŒ– SQLite:%s。\n"
564
565#: src/ats/plugin_ats_mlp.c:1274
566msgid "Problem size too large, cannot allocate memory!\n"
567msgstr ""
568
569#: src/ats/plugin_ats_mlp.c:1869
570#, c-format
571msgid "Adding address for peer `%s' multiple times\n"
572msgstr ""
573
574#: src/ats/plugin_ats_mlp.c:1913
575#, c-format
576msgid "Updating address property for peer `%s' %p not added before\n"
577msgstr ""
578
579#: src/ats/plugin_ats_mlp.c:2475
580msgid ""
581"MLP solver is not optimizing for anything, changing to feasibility check\n"
582msgstr ""
583
584#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
585#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
586#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
587#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
588#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
589#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
590#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
591#, fuzzy, c-format
592msgid "Invalid %s configuration %f \n"
593msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
594
595#: src/ats/plugin_ats_mlp.c:2670
596#, c-format
597msgid ""
598"Adjusting inconsistent outbound quota configuration for network `%s', is "
599"%llu must be at least %llu\n"
600msgstr ""
601
602#: src/ats/plugin_ats_mlp.c:2679
603#, c-format
604msgid ""
605"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
606"must be at least %llu\n"
607msgstr ""
608
609#: src/ats/plugin_ats_mlp.c:2689
610#, c-format
611msgid ""
612"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
613msgstr ""
614
615#: src/ats/plugin_ats_mlp.c:2698
616#, c-format
617msgid ""
618"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
619msgstr ""
620
621#: src/ats/plugin_ats_proportional.c:1164
622#, fuzzy, c-format
623msgid "Invalid %s configuration %f\n"
624msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
625
628#: src/auction/gnunet-auction-create.c:163 626#: src/auction/gnunet-auction-create.c:163
629msgid "description of the item to be sold" 627msgid "description of the item to be sold"
630msgstr "" 628msgstr ""
@@ -770,6 +768,28 @@ msgstr ""
770msgid "Connection to conversation service lost, trying to reconnect\n" 768msgid "Connection to conversation service lost, trying to reconnect\n"
771msgstr "" 769msgstr ""
772 770
771#: src/conversation/gnunet-conversation-test.c:119
772#, c-format
773msgid ""
774"\n"
775"End of transmission. Have a GNU day.\n"
776msgstr ""
777
778#: src/conversation/gnunet-conversation-test.c:145
779#, c-format
780msgid ""
781"\n"
782"We are now playing your recording back. If you can hear it, your audio "
783"settings are working..."
784msgstr ""
785
786#: src/conversation/gnunet-conversation-test.c:210
787#, c-format
788msgid ""
789"We will now be recording you for %s. After that time, the recording will be "
790"played back to you..."
791msgstr ""
792
773#: src/conversation/gnunet-conversation.c:269 793#: src/conversation/gnunet-conversation.c:269
774#, c-format 794#, c-format
775msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" 795msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1026,30 +1046,8 @@ msgstr ""
1026msgid "Enables having a conversation with other GNUnet users." 1046msgid "Enables having a conversation with other GNUnet users."
1027msgstr "" 1047msgstr ""
1028 1048
1029#: src/conversation/gnunet-conversation-test.c:119
1030#, c-format
1031msgid ""
1032"\n"
1033"End of transmission. Have a GNU day.\n"
1034msgstr ""
1035
1036#: src/conversation/gnunet-conversation-test.c:145
1037#, c-format
1038msgid ""
1039"\n"
1040"We are now playing your recording back. If you can hear it, your audio "
1041"settings are working..."
1042msgstr ""
1043
1044#: src/conversation/gnunet-conversation-test.c:210
1045#, c-format
1046msgid ""
1047"We will now be recording you for %s. After that time, the recording will be "
1048"played back to you..."
1049msgstr ""
1050
1051#: src/conversation/gnunet_gst.c:622
1052#: src/conversation/gnunet-helper-audio-playback-gst.c:356 1049#: src/conversation/gnunet-helper-audio-playback-gst.c:356
1050#: src/conversation/gnunet_gst.c:622
1053#, c-format 1051#, c-format
1054msgid "Read error from STDIN: %d %s\n" 1052msgid "Read error from STDIN: %d %s\n"
1055msgstr "" 1053msgstr ""
@@ -1175,6 +1173,11 @@ msgstr "“%sâ€è¯´ï¼š%s\n"
1175msgid "Failed to allocate %u bytes for second packet\n" 1173msgid "Failed to allocate %u bytes for second packet\n"
1176msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 1174msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
1177 1175
1176#: src/conversation/gnunet-service-conversation.c:1276
1177#, fuzzy, c-format
1178msgid "Could not open line, port %s already in use!\n"
1179msgstr "无法连接到 %s:%u:%s\n"
1180
1178#: src/conversation/microphone.c:119 1181#: src/conversation/microphone.c:119
1179#, fuzzy 1182#, fuzzy
1180msgid "Could not start record audio helper\n" 1183msgid "Could not start record audio helper\n"
@@ -1448,8 +1451,137 @@ msgstr ""
1448msgid "# updates to my type map" 1451msgid "# updates to my type map"
1449msgstr "" 1452msgstr ""
1450 1453
1454#: src/credential/credential_misc.c:88
1455#, fuzzy, c-format
1456msgid "Unable to parse CRED record string `%s'\n"
1457msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
1458
1459#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
1460#: src/namestore/plugin_rest_namestore.c:1009
1461#, c-format
1462msgid "Ego `%s' not known to identity service\n"
1463msgstr ""
1464
1465#: src/credential/gnunet-credential.c:294
1466#: src/credential/gnunet-credential.c:446
1467#, fuzzy, c-format
1468msgid "Issuer public key `%s' is not well-formed\n"
1469msgstr "“%sâ€çš„å‚数无效。\n"
1470
1471#: src/credential/gnunet-credential.c:375
1472#: src/credential/gnunet-credential.c:435
1473#, fuzzy, c-format
1474msgid "Issuer public key not well-formed\n"
1475msgstr "“%sâ€çš„å‚数无效。\n"
1476
1477#: src/credential/gnunet-credential.c:386
1478#: src/credential/gnunet-credential.c:455
1479#, fuzzy, c-format
1480msgid "Failed to connect to CREDENTIAL\n"
1481msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
1482
1483#: src/credential/gnunet-credential.c:392
1484#, c-format
1485msgid "You must provide issuer the attribute\n"
1486msgstr ""
1487
1488#: src/credential/gnunet-credential.c:399
1489#, c-format
1490msgid "ego required\n"
1491msgstr ""
1492
1493#: src/credential/gnunet-credential.c:415
1494#, c-format
1495msgid "Subject public key needed\n"
1496msgstr ""
1497
1498#: src/credential/gnunet-credential.c:426
1499#, fuzzy, c-format
1500msgid "Subject public key `%s' is not well-formed\n"
1501msgstr "“%sâ€çš„å‚数无效。\n"
1502
1503#: src/credential/gnunet-credential.c:461
1504#, c-format
1505msgid "You must provide issuer and subject attributes\n"
1506msgstr ""
1507
1508#: src/credential/gnunet-credential.c:511
1509#, c-format
1510msgid "Issuer ego required\n"
1511msgstr ""
1512
1513#: src/credential/gnunet-credential.c:523
1514#, c-format
1515msgid "Please specify name to lookup, subject key and issuer key!\n"
1516msgstr ""
1517
1518#: src/credential/gnunet-credential.c:543
1519msgid "create credential"
1520msgstr ""
1521
1522#: src/credential/gnunet-credential.c:547
1523msgid "verify credential against attribute"
1524msgstr ""
1525
1526#: src/credential/gnunet-credential.c:552
1527msgid "The public key of the subject to lookup the credential for"
1528msgstr ""
1529
1530#: src/credential/gnunet-credential.c:557
1531msgid "The name of the credential presented by the subject"
1532msgstr ""
1533
1534#: src/credential/gnunet-credential.c:562
1535msgid "The public key of the authority to verify the credential against"
1536msgstr ""
1537
1538#: src/credential/gnunet-credential.c:567
1539#, fuzzy
1540msgid "The ego to use"
1541msgstr "消æ¯å°ºå¯¸"
1542
1543#: src/credential/gnunet-credential.c:572
1544msgid "The issuer attribute to verify against or to issue"
1545msgstr ""
1546
1547#: src/credential/gnunet-credential.c:577
1548msgid "The time to live for the credential"
1549msgstr ""
1550
1551#: src/credential/gnunet-credential.c:581
1552msgid "collect credentials"
1553msgstr ""
1554
1555#: src/credential/gnunet-credential.c:595
1556#, fuzzy
1557msgid "GNUnet credential resolver tool"
1558msgstr "GNUnet 错误日志"
1559
1560#: src/credential/gnunet-service-credential.c:1204
1561#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
1562#, fuzzy, c-format
1563msgid "Failed to connect to GNS\n"
1564msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
1565
1566#: src/credential/gnunet-service-credential.c:1210
1567#: src/namestore/gnunet-namestore-fcfsd.c:1034
1568#: src/namestore/gnunet-namestore.c:802
1569#: src/namestore/plugin_rest_namestore.c:1022
1570#, fuzzy, c-format
1571msgid "Failed to connect to namestore\n"
1572msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
1573
1574#: src/credential/plugin_gnsrecord_credential.c:186
1575#, fuzzy, c-format
1576msgid "Unable to parse ATTR record string `%s'\n"
1577msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
1578
1579#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
1580msgid "GNS REST API initialized\n"
1581msgstr ""
1582
1451#: src/datacache/datacache.c:119 src/datacache/datacache.c:294 1583#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
1452#: src/datastore/gnunet-service-datastore.c:775 1584#: src/datastore/gnunet-service-datastore.c:757
1453msgid "# bytes stored" 1585msgid "# bytes stored"
1454msgstr "" 1586msgstr ""
1455 1587
@@ -1490,13 +1622,12 @@ msgstr "sqlite æ•°æ®ä»“库"
1490 1622
1491#: src/datacache/plugin_datacache_sqlite.c:113 1623#: src/datacache/plugin_datacache_sqlite.c:113
1492#: src/datacache/plugin_datacache_sqlite.c:122 1624#: src/datacache/plugin_datacache_sqlite.c:122
1493#: src/datastore/plugin_datastore_mysql.c:980 1625#: src/datastore/plugin_datastore_mysql.c:892
1494#: src/datastore/plugin_datastore_sqlite.c:58 1626#: src/datastore/plugin_datastore_sqlite.c:58
1495#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92 1627#: src/datastore/plugin_datastore_sqlite.c:66
1496#: src/mysql/mysql.c:42 src/mysql/mysql.c:49 1628#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
1497#: src/namecache/plugin_namecache_postgres.c:53 1629#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
1498#: src/namecache/plugin_namecache_sqlite.c:53 1630#: src/namecache/plugin_namecache_sqlite.c:53
1499#: src/namestore/plugin_namestore_postgres.c:53
1500#: src/namestore/plugin_namestore_sqlite.c:53 1631#: src/namestore/plugin_namestore_sqlite.c:53
1501#: src/peerstore/plugin_peerstore_sqlite.c:52 1632#: src/peerstore/plugin_peerstore_sqlite.c:52
1502#: src/psycstore/plugin_psycstore_mysql.c:62 1633#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1505,14 +1636,15 @@ msgstr "sqlite æ•°æ®ä»“库"
1505#: src/testbed/gnunet-daemon-testbed-underlay.c:56 1636#: src/testbed/gnunet-daemon-testbed-underlay.c:56
1506#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52 1637#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
1507#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39 1638#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
1508#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729 1639#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
1509#: src/scalarproduct/scalarproduct.h:35 1640#: src/scalarproduct/scalarproduct.h:35
1510#, fuzzy, c-format 1641#, fuzzy, c-format
1511msgid "`%s' failed at %s:%d with error: %s\n" 1642msgid "`%s' failed at %s:%d with error: %s\n"
1512msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" 1643msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n"
1513 1644
1514#: src/datacache/plugin_datacache_sqlite.c:817 1645#: src/datacache/plugin_datacache_sqlite.c:817
1515#: src/datastore/plugin_datastore_sqlite.c:475 1646#: src/datastore/plugin_datastore_sqlite.c:456
1647#: src/identity-provider/plugin_identity_provider_sqlite.c:336
1516#: src/namecache/plugin_namecache_sqlite.c:296 1648#: src/namecache/plugin_namecache_sqlite.c:296
1517#: src/namestore/plugin_namestore_sqlite.c:355 1649#: src/namestore/plugin_namestore_sqlite.c:355
1518msgid "Tried to close sqlite without finalizing all prepared statements.\n" 1650msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1576,23 +1708,74 @@ msgstr ""
1576msgid "# GET requests executed" 1708msgid "# GET requests executed"
1577msgstr "" 1709msgstr ""
1578 1710
1579#: src/datastore/gnunet-datastore.c:113 1711#: src/datastore/gnunet-datastore.c:189
1712#, c-format
1713msgid "Dumped %<PRIu64> records\n"
1714msgstr ""
1715
1716#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
1717#, c-format
1718msgid "Short write to file: %zd bytes expecting %zd\n"
1719msgstr ""
1720
1721#: src/datastore/gnunet-datastore.c:261
1722#, fuzzy
1723msgid "Error queueing datastore GET operation\n"
1724msgstr "创建用户出错"
1725
1726#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
1727#, fuzzy, c-format
1728msgid "Unable to open dump file: %s\n"
1729msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
1730
1731#: src/datastore/gnunet-datastore.c:326
1580#, fuzzy, c-format 1732#, fuzzy, c-format
1581msgid "Failed to store item: %s, aborting\n" 1733msgid "Failed to store item: %s, aborting\n"
1582msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" 1734msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n"
1583 1735
1584#: src/datastore/gnunet-datastore.c:209 1736#: src/datastore/gnunet-datastore.c:340
1585#, c-format 1737#, c-format
1586msgid "Cannot use the same configuration for source and destination\n" 1738msgid "Inserted %<PRIu64> records\n"
1587msgstr "" 1739msgstr ""
1588 1740
1589#: src/datastore/gnunet-datastore.c:256 1741#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
1590msgid "" 1742#, c-format
1591"specifies the configuration to use to access an alternative datastore; will " 1743msgid "Short read from file: %zd bytes expecting %zd\n"
1592"merge that datastore into our current datastore" 1744msgstr ""
1745
1746#: src/datastore/gnunet-datastore.c:389
1747#, fuzzy
1748msgid "Error queueing datastore PUT operation\n"
1749msgstr "创建用户出错"
1750
1751#: src/datastore/gnunet-datastore.c:432
1752msgid "Input file is not of a supported format\n"
1753msgstr ""
1754
1755#: src/datastore/gnunet-datastore.c:458
1756#, fuzzy
1757msgid "Failed connecting to the datastore.\n"
1758msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
1759
1760#: src/datastore/gnunet-datastore.c:470
1761#, c-format
1762msgid "Please choose at least one operation: %s, %s\n"
1763msgstr ""
1764
1765#: src/datastore/gnunet-datastore.c:493
1766#, fuzzy
1767msgid "Dump all records from the datastore"
1768msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
1769
1770#: src/datastore/gnunet-datastore.c:497
1771msgid "Insert records into the datastore"
1772msgstr ""
1773
1774#: src/datastore/gnunet-datastore.c:502
1775msgid "File to dump or insert"
1593msgstr "" 1776msgstr ""
1594 1777
1595#: src/datastore/gnunet-datastore.c:265 1778#: src/datastore/gnunet-datastore.c:511
1596#, fuzzy 1779#, fuzzy
1597msgid "Manipulate GNUnet datastore" 1780msgid "Manipulate GNUnet datastore"
1598msgstr "更改é…置文件中的一个值" 1781msgstr "更改é…置文件中的一个值"
@@ -1635,8 +1818,8 @@ msgstr ""
1635 1818
1636#: src/datastore/gnunet-service-datastore.c:634 1819#: src/datastore/gnunet-service-datastore.c:634
1637#: src/datastore/gnunet-service-datastore.c:689 1820#: src/datastore/gnunet-service-datastore.c:689
1638#: src/datastore/gnunet-service-datastore.c:977 1821#: src/datastore/gnunet-service-datastore.c:837
1639#: src/datastore/gnunet-service-datastore.c:1633 1822#: src/datastore/gnunet-service-datastore.c:1469
1640msgid "# reserved" 1823msgid "# reserved"
1641msgstr "" 1824msgstr ""
1642 1825
@@ -1644,144 +1827,145 @@ msgstr ""
1644msgid "Could not find matching reservation" 1827msgid "Could not find matching reservation"
1645msgstr "" 1828msgstr ""
1646 1829
1647#: src/datastore/gnunet-service-datastore.c:792 1830#: src/datastore/gnunet-service-datastore.c:773
1648#, c-format 1831#, c-format
1649msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" 1832msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
1650msgstr "" 1833msgstr ""
1651 1834
1652#: src/datastore/gnunet-service-datastore.c:1026 1835#: src/datastore/gnunet-service-datastore.c:876
1653msgid "# GET requests received" 1836msgid "# GET requests received"
1654msgstr "" 1837msgstr ""
1655 1838
1656#: src/datastore/gnunet-service-datastore.c:1058 1839#: src/datastore/gnunet-service-datastore.c:907
1657msgid "# GET KEY requests received" 1840msgid "# GET KEY requests received"
1658msgstr "" 1841msgstr ""
1659 1842
1660#: src/datastore/gnunet-service-datastore.c:1071 1843#: src/datastore/gnunet-service-datastore.c:920
1661msgid "# requests filtered by bloomfilter" 1844msgid "# requests filtered by bloomfilter"
1662msgstr "" 1845msgstr ""
1663 1846
1664#: src/datastore/gnunet-service-datastore.c:1108 1847#: src/datastore/gnunet-service-datastore.c:956
1665msgid "# GET REPLICATION requests received" 1848msgid "# GET REPLICATION requests received"
1666msgstr "" 1849msgstr ""
1667 1850
1668#: src/datastore/gnunet-service-datastore.c:1141 1851#: src/datastore/gnunet-service-datastore.c:989
1669msgid "# GET ZERO ANONYMITY requests received" 1852msgid "# GET ZERO ANONYMITY requests received"
1670msgstr "" 1853msgstr ""
1671 1854
1672#: src/datastore/gnunet-service-datastore.c:1190 1855#: src/datastore/gnunet-service-datastore.c:1036
1673msgid "Content not found" 1856msgid "Content not found"
1674msgstr "" 1857msgstr ""
1675 1858
1676#: src/datastore/gnunet-service-datastore.c:1199 1859#: src/datastore/gnunet-service-datastore.c:1043
1677msgid "# bytes removed (explicit request)" 1860msgid "# bytes removed (explicit request)"
1678msgstr "" 1861msgstr ""
1679 1862
1680#: src/datastore/gnunet-service-datastore.c:1246 1863#: src/datastore/gnunet-service-datastore.c:1088
1681msgid "# REMOVE requests received" 1864msgid "# REMOVE requests received"
1682msgstr "" 1865msgstr ""
1683 1866
1684#: src/datastore/gnunet-service-datastore.c:1301 1867#: src/datastore/gnunet-service-datastore.c:1137
1685#, c-format 1868#, c-format
1686msgid "" 1869msgid ""
1687"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" 1870"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
1688msgstr "" 1871msgstr ""
1689 1872
1690#: src/datastore/gnunet-service-datastore.c:1307 1873#: src/datastore/gnunet-service-datastore.c:1143
1691#: src/datastore/gnunet-service-datastore.c:1482 1874#: src/datastore/gnunet-service-datastore.c:1318
1692#, c-format 1875#, c-format
1693msgid "New payload: %lld\n" 1876msgid "New payload: %lld\n"
1694msgstr "" 1877msgstr ""
1695 1878
1696#: src/datastore/gnunet-service-datastore.c:1361 1879#: src/datastore/gnunet-service-datastore.c:1197
1697#, c-format 1880#, c-format
1698msgid "Loading `%s' datastore plugin\n" 1881msgid "Loading `%s' datastore plugin\n"
1699msgstr "" 1882msgstr ""
1700 1883
1701#: src/datastore/gnunet-service-datastore.c:1373 1884#: src/datastore/gnunet-service-datastore.c:1209
1702#, fuzzy, c-format 1885#, fuzzy, c-format
1703msgid "Failed to load datastore plugin for `%s'\n" 1886msgid "Failed to load datastore plugin for `%s'\n"
1704msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 1887msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
1705 1888
1706#: src/datastore/gnunet-service-datastore.c:1433 1889#: src/datastore/gnunet-service-datastore.c:1269
1707msgid "Bloomfilter construction complete.\n" 1890msgid "Bloomfilter construction complete.\n"
1708msgstr "" 1891msgstr ""
1709 1892
1710#: src/datastore/gnunet-service-datastore.c:1489 1893#: src/datastore/gnunet-service-datastore.c:1325
1711msgid "Rebuilding bloomfilter. Please be patient.\n" 1894msgid "Rebuilding bloomfilter. Please be patient.\n"
1712msgstr "" 1895msgstr ""
1713 1896
1714#: src/datastore/gnunet-service-datastore.c:1500 1897#: src/datastore/gnunet-service-datastore.c:1336
1715msgid "Plugin does not support get_keys function. Please fix!\n" 1898msgid "Plugin does not support get_keys function. Please fix!\n"
1716msgstr "" 1899msgstr ""
1717 1900
1718#: src/datastore/gnunet-service-datastore.c:1670 1901#: src/datastore/gnunet-service-datastore.c:1506
1719#, c-format 1902#, c-format
1720msgid "# bytes used in file-sharing datastore `%s'" 1903msgid "# bytes used in file-sharing datastore `%s'"
1721msgstr "" 1904msgstr ""
1722 1905
1723#: src/datastore/gnunet-service-datastore.c:1686 1906#: src/datastore/gnunet-service-datastore.c:1522
1724msgid "# quota" 1907msgid "# quota"
1725msgstr "" 1908msgstr ""
1726 1909
1727#: src/datastore/gnunet-service-datastore.c:1691 1910#: src/datastore/gnunet-service-datastore.c:1527
1728msgid "# cache size" 1911msgid "# cache size"
1729msgstr "" 1912msgstr ""
1730 1913
1731#: src/datastore/gnunet-service-datastore.c:1707 1914#: src/datastore/gnunet-service-datastore.c:1543
1732#, c-format 1915#, c-format
1733msgid "Could not use specified filename `%s' for bloomfilter.\n" 1916msgid "Could not use specified filename `%s' for bloomfilter.\n"
1734msgstr "" 1917msgstr ""
1735 1918
1736#: src/datastore/gnunet-service-datastore.c:1725 1919#: src/datastore/gnunet-service-datastore.c:1561
1737#: src/datastore/gnunet-service-datastore.c:1741 1920#: src/datastore/gnunet-service-datastore.c:1577
1738#, fuzzy, c-format 1921#, fuzzy, c-format
1739msgid "Failed to remove bogus bloomfilter file `%s'\n" 1922msgid "Failed to remove bogus bloomfilter file `%s'\n"
1740msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 1923msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
1741 1924
1742#: src/datastore/gnunet-service-datastore.c:1773 1925#: src/datastore/gnunet-service-datastore.c:1609
1743#, fuzzy 1926#, fuzzy
1744msgid "Failed to initialize bloomfilter.\n" 1927msgid "Failed to initialize bloomfilter.\n"
1745msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 1928msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
1746 1929
1747#: src/datastore/plugin_datastore_heap.c:769 1930#: src/datastore/plugin_datastore_heap.c:893
1748#, fuzzy 1931#, fuzzy
1749msgid "Heap database running\n" 1932msgid "Heap database running\n"
1750msgstr "sqlite æ•°æ®ä»“库" 1933msgstr "sqlite æ•°æ®ä»“库"
1751 1934
1752#: src/datastore/plugin_datastore_mysql.c:377 1935#: src/datastore/plugin_datastore_mysql.c:371
1753#: src/datastore/plugin_datastore_sqlite.c:590 1936#: src/datastore/plugin_datastore_mysql.c:423
1937#: src/datastore/plugin_datastore_mysql.c:1075
1938msgid "MySQL statement run failure"
1939msgstr ""
1940
1941#: src/datastore/plugin_datastore_mysql.c:410
1942#: src/datastore/plugin_datastore_sqlite.c:626
1754#, fuzzy 1943#, fuzzy
1755msgid "Data too large" 1944msgid "Data too large"
1756msgstr "迭代次数" 1945msgstr "迭代次数"
1757 1946
1758#: src/datastore/plugin_datastore_mysql.c:393 1947#: src/datastore/plugin_datastore_mysql.c:848
1759msgid "MySQL statement run failure"
1760msgstr ""
1761
1762#: src/datastore/plugin_datastore_mysql.c:936
1763#, fuzzy, c-format 1948#, fuzzy, c-format
1764msgid "`%s' for `%s' failed at %s:%d with error: %s\n" 1949msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
1765msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" 1950msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n"
1766 1951
1767#: src/datastore/plugin_datastore_mysql.c:1208 1952#: src/datastore/plugin_datastore_mysql.c:1180
1768#: src/psycstore/plugin_psycstore_mysql.c:1936 1953#: src/psycstore/plugin_psycstore_mysql.c:1936
1769msgid "Mysql database running\n" 1954msgid "Mysql database running\n"
1770msgstr "" 1955msgstr ""
1771 1956
1772#: src/datastore/plugin_datastore_postgres.c:345 1957#: src/datastore/plugin_datastore_postgres.c:274
1958#: src/datastore/plugin_datastore_postgres.c:891
1773msgid "Postgress exec failure" 1959msgid "Postgress exec failure"
1774msgstr "" 1960msgstr ""
1775 1961
1776#: src/datastore/plugin_datastore_postgres.c:866 1962#: src/datastore/plugin_datastore_postgres.c:852
1777#, fuzzy 1963#, fuzzy
1778msgid "Failed to drop table from database.\n" 1964msgid "Failed to drop table from database.\n"
1779msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" 1965msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
1780 1966
1781#: src/datastore/plugin_datastore_postgres.c:903 1967#: src/datastore/plugin_datastore_postgres.c:950
1782#: src/namecache/plugin_namecache_postgres.c:398 1968#: src/psycstore/plugin_psycstore_postgres.c:1506
1783#: src/namestore/plugin_namestore_postgres.c:571
1784#: src/psycstore/plugin_psycstore_postgres.c:1721
1785msgid "Postgres database running\n" 1969msgid "Postgres database running\n"
1786msgstr "" 1970msgstr ""
1787 1971
@@ -1793,7 +1977,8 @@ msgstr ""
1793msgid "`%s' failed at %s:%u with error: %s" 1977msgid "`%s' failed at %s:%u with error: %s"
1794msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" 1978msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n"
1795 1979
1796#: src/datastore/plugin_datastore_sqlite.c:281 1980#: src/datastore/plugin_datastore_sqlite.c:271
1981#: src/identity-provider/plugin_identity_provider_sqlite.c:212
1797#: src/namecache/plugin_namecache_sqlite.c:194 1982#: src/namecache/plugin_namecache_sqlite.c:194
1798#: src/namestore/plugin_namestore_sqlite.c:222 1983#: src/namestore/plugin_namestore_sqlite.c:222
1799#: src/peerstore/plugin_peerstore_sqlite.c:535 1984#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1802,25 +1987,30 @@ msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n"
1802msgid "Unable to initialize SQLite: %s.\n" 1987msgid "Unable to initialize SQLite: %s.\n"
1803msgstr "无法åˆå§‹åŒ– SQLite:%s。\n" 1988msgstr "无法åˆå§‹åŒ– SQLite:%s。\n"
1804 1989
1805#: src/datastore/plugin_datastore_sqlite.c:1234 1990#: src/datastore/plugin_datastore_sqlite.c:577
1991msgid "sqlite bind failure"
1992msgstr ""
1993
1994#: src/datastore/plugin_datastore_sqlite.c:1259
1806msgid "sqlite version to old to determine size, assuming zero\n" 1995msgid "sqlite version to old to determine size, assuming zero\n"
1807msgstr "" 1996msgstr ""
1808 1997
1809#: src/datastore/plugin_datastore_sqlite.c:1268 1998#: src/datastore/plugin_datastore_sqlite.c:1293
1810#, c-format 1999#, c-format
1811msgid "" 2000msgid ""
1812"Using sqlite page utilization to estimate payload (%llu pages of size %llu " 2001"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
1813"bytes)\n" 2002"bytes)\n"
1814msgstr "" 2003msgstr ""
1815 2004
1816#: src/datastore/plugin_datastore_sqlite.c:1312 2005#: src/datastore/plugin_datastore_sqlite.c:1337
2006#: src/identity-provider/plugin_identity_provider_sqlite.c:711
1817#: src/namecache/plugin_namecache_sqlite.c:603 2007#: src/namecache/plugin_namecache_sqlite.c:603
1818#: src/namestore/plugin_namestore_sqlite.c:802 2008#: src/namestore/plugin_namestore_sqlite.c:802
1819#, fuzzy 2009#, fuzzy
1820msgid "Sqlite database running\n" 2010msgid "Sqlite database running\n"
1821msgstr "sqlite æ•°æ®ä»“库" 2011msgstr "sqlite æ•°æ®ä»“库"
1822 2012
1823#: src/datastore/plugin_datastore_template.c:259 2013#: src/datastore/plugin_datastore_template.c:253
1824msgid "Template database running\n" 2014msgid "Template database running\n"
1825msgstr "" 2015msgstr ""
1826 2016
@@ -1882,53 +2072,6 @@ msgstr ""
1882msgid "Prints all packets that go through the DHT." 2072msgid "Prints all packets that go through the DHT."
1883msgstr "" 2073msgstr ""
1884 2074
1885#: src/dht/gnunet_dht_profiler.c:1161
1886#: src/testbed/gnunet-testbed-profiler.c:255
1887#, fuzzy, c-format
1888msgid "Exiting as the number of peers is %u\n"
1889msgstr "增加 TCP/IP 的最大连接数"
1890
1891#: src/dht/gnunet_dht_profiler.c:1188
1892#, fuzzy
1893msgid "number of peers to start"
1894msgstr "迭代次数"
1895
1896#: src/dht/gnunet_dht_profiler.c:1194
1897msgid ""
1898"maximum number of times we try to search for successor circle formation (0 "
1899"for R5N)"
1900msgstr ""
1901
1902#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
1903#: src/testbed/gnunet-testbed-profiler.c:305
1904msgid "name of the file with the login information for the testbed"
1905msgstr ""
1906
1907#: src/dht/gnunet_dht_profiler.c:1206
1908msgid "delay between rounds for collecting statistics (default: 30 sec)"
1909msgstr ""
1910
1911#: src/dht/gnunet_dht_profiler.c:1212
1912msgid "delay to start doing PUTs (default: 1 sec)"
1913msgstr ""
1914
1915#: src/dht/gnunet_dht_profiler.c:1218
1916msgid "delay to start doing GETs (default: 5 min)"
1917msgstr ""
1918
1919#: src/dht/gnunet_dht_profiler.c:1223
1920msgid "replication degree for DHT PUTs"
1921msgstr ""
1922
1923#: src/dht/gnunet_dht_profiler.c:1230
1924msgid "timeout for DHT PUT and GET requests (default: 1 min)"
1925msgstr ""
1926
1927#: src/dht/gnunet_dht_profiler.c:1248
1928#, fuzzy
1929msgid "Measure quality and performance of the DHT service."
1930msgstr "无法访问该æœåŠ¡"
1931
1932#: src/dht/gnunet-dht-put.c:120 2075#: src/dht/gnunet-dht-put.c:120
1933msgid "PUT request sent with key" 2076msgid "PUT request sent with key"
1934msgstr "" 2077msgstr ""
@@ -2178,6 +2321,52 @@ msgstr ""
2178msgid "# DHT requests combined" 2321msgid "# DHT requests combined"
2179msgstr "" 2322msgstr ""
2180 2323
2324#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
2325#, fuzzy, c-format
2326msgid "Exiting as the number of peers is %u\n"
2327msgstr "增加 TCP/IP 的最大连接数"
2328
2329#: src/dht/gnunet_dht_profiler.c:1188
2330#, fuzzy
2331msgid "number of peers to start"
2332msgstr "迭代次数"
2333
2334#: src/dht/gnunet_dht_profiler.c:1194
2335msgid ""
2336"maximum number of times we try to search for successor circle formation (0 "
2337"for R5N)"
2338msgstr ""
2339
2340#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
2341#: src/testbed/gnunet-testbed-profiler.c:305
2342msgid "name of the file with the login information for the testbed"
2343msgstr ""
2344
2345#: src/dht/gnunet_dht_profiler.c:1206
2346msgid "delay between rounds for collecting statistics (default: 30 sec)"
2347msgstr ""
2348
2349#: src/dht/gnunet_dht_profiler.c:1212
2350msgid "delay to start doing PUTs (default: 1 sec)"
2351msgstr ""
2352
2353#: src/dht/gnunet_dht_profiler.c:1218
2354msgid "delay to start doing GETs (default: 5 min)"
2355msgstr ""
2356
2357#: src/dht/gnunet_dht_profiler.c:1223
2358msgid "replication degree for DHT PUTs"
2359msgstr ""
2360
2361#: src/dht/gnunet_dht_profiler.c:1230
2362msgid "timeout for DHT PUT and GET requests (default: 1 min)"
2363msgstr ""
2364
2365#: src/dht/gnunet_dht_profiler.c:1248
2366#, fuzzy
2367msgid "Measure quality and performance of the DHT service."
2368msgstr "无法访问该æœåŠ¡"
2369
2181#: src/dht/plugin_block_dht.c:187 2370#: src/dht/plugin_block_dht.c:187
2182#, c-format 2371#, c-format
2183msgid "Block not of type %u\n" 2372msgid "Block not of type %u\n"
@@ -2500,7 +2689,7 @@ msgstr ""
2500msgid "No useful service enabled. Exiting.\n" 2689msgid "No useful service enabled. Exiting.\n"
2501msgstr "" 2690msgstr ""
2502 2691
2503#: src/exit/gnunet-daemon-exit.c:3969 2692#: src/exit/gnunet-daemon-exit.c:3970
2504msgid "Daemon to run to provide an IP exit node for the VPN" 2693msgid "Daemon to run to provide an IP exit node for the VPN"
2505msgstr "" 2694msgstr ""
2506 2695
@@ -3132,14 +3321,6 @@ msgid ""
3132"chk/...)" 3321"chk/...)"
3133msgstr "" 3322msgstr ""
3134 3323
3135#: src/fs/gnunet-fs.c:119
3136msgid "print a list of all indexed files"
3137msgstr ""
3138
3139#: src/fs/gnunet-fs.c:130
3140msgid "Special file-sharing operations"
3141msgstr ""
3142
3143#: src/fs/gnunet-fs-profiler.c:211 3324#: src/fs/gnunet-fs-profiler.c:211
3144msgid "run the experiment with COUNT peers" 3325msgid "run the experiment with COUNT peers"
3145msgstr "" 3326msgstr ""
@@ -3156,6 +3337,14 @@ msgstr ""
3156msgid "run a testbed to measure file-sharing performance" 3337msgid "run a testbed to measure file-sharing performance"
3157msgstr "" 3338msgstr ""
3158 3339
3340#: src/fs/gnunet-fs.c:119
3341msgid "print a list of all indexed files"
3342msgstr ""
3343
3344#: src/fs/gnunet-fs.c:130
3345msgid "Special file-sharing operations"
3346msgstr ""
3347
3159#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231 3348#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
3160#, c-format 3349#, c-format
3161msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" 3350msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3810,22 +3999,11 @@ msgstr ""
3810msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 3999msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3811msgstr "" 4000msgstr ""
3812 4001
3813#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 4002#: src/gns/gnunet-gns-helper-service-w32.c:602
3814#, c-format 4003msgid "Not ready to process requests, lacking ego data\n"
3815msgid "Invalid typename specified, assuming `ANY'\n"
3816msgstr ""
3817
3818#: src/gns/gnunet-gns.c:252
3819#, c-format
3820msgid "Please specify name to lookup!\n"
3821msgstr ""
3822
3823#: src/gns/gnunet-gns.c:276
3824#, c-format
3825msgid "Ego for `%s' not found, cannot perform lookup.\n"
3826msgstr "" 4004msgstr ""
3827 4005
3828#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701 4006#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
3829#: src/gns/plugin_rest_gns.c:422 4007#: src/gns/plugin_rest_gns.c:422
3830#, c-format 4008#, c-format
3831msgid "" 4009msgid ""
@@ -3833,55 +4011,12 @@ msgid ""
3833"gns-import.sh?\n" 4011"gns-import.sh?\n"
3834msgstr "" 4012msgstr ""
3835 4013
3836#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
3837#, fuzzy, c-format
3838msgid "Failed to connect to GNS\n"
3839msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
3840
3841#: src/gns/gnunet-gns.c:374
3842#, c-format
3843msgid "Public key `%s' is not well-formed\n"
3844msgstr ""
3845
3846#: src/gns/gnunet-gns.c:428
3847msgid "Lookup a record for the given name"
3848msgstr ""
3849
3850#: src/gns/gnunet-gns.c:434
3851msgid "Specify the type of the record to lookup"
3852msgstr ""
3853
3854#: src/gns/gnunet-gns.c:440
3855msgid "Specify timeout for the lookup"
3856msgstr ""
3857
3858#: src/gns/gnunet-gns.c:445
3859msgid "No unneeded output"
3860msgstr ""
3861
3862#: src/gns/gnunet-gns.c:451
3863msgid "Specify the public key of the zone to lookup the record in"
3864msgstr ""
3865
3866#: src/gns/gnunet-gns.c:457
3867msgid "Specify the name of the ego of the zone to lookup the record in"
3868msgstr ""
3869
3870#: src/gns/gnunet-gns.c:476
3871#, fuzzy
3872msgid "GNUnet GNS resolver tool"
3873msgstr "GNUnet 错误日志"
3874
3875#: src/gns/gnunet-gns-helper-service-w32.c:602
3876msgid "Not ready to process requests, lacking ego data\n"
3877msgstr ""
3878
3879#: src/gns/gnunet-gns-helper-service-w32.c:739 4014#: src/gns/gnunet-gns-helper-service-w32.c:739
3880#, fuzzy, c-format 4015#, fuzzy, c-format
3881msgid "Failed to connect to identity service\n" 4016msgid "Failed to connect to identity service\n"
3882msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 4017msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
3883 4018
3884#: src/gns/gnunet-gns-import.c:489 4019#: src/gns/gnunet-gns-import.c:452
3885msgid "This program will import some GNS authorities into your GNS namestore." 4020msgid "This program will import some GNS authorities into your GNS namestore."
3886msgstr "" 4021msgstr ""
3887 4022
@@ -4006,13 +4141,62 @@ msgstr ""
4006msgid "GNUnet GNS proxy" 4141msgid "GNUnet GNS proxy"
4007msgstr "" 4142msgstr ""
4008 4143
4144#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
4145#, c-format
4146msgid "Invalid typename specified, assuming `ANY'\n"
4147msgstr ""
4148
4149#: src/gns/gnunet-gns.c:252
4150#, c-format
4151msgid "Please specify name to lookup!\n"
4152msgstr ""
4153
4154#: src/gns/gnunet-gns.c:276
4155#, c-format
4156msgid "Ego for `%s' not found, cannot perform lookup.\n"
4157msgstr ""
4158
4159#: src/gns/gnunet-gns.c:374
4160#, c-format
4161msgid "Public key `%s' is not well-formed\n"
4162msgstr ""
4163
4164#: src/gns/gnunet-gns.c:428
4165msgid "Lookup a record for the given name"
4166msgstr ""
4167
4168#: src/gns/gnunet-gns.c:434
4169msgid "Specify the type of the record to lookup"
4170msgstr ""
4171
4172#: src/gns/gnunet-gns.c:440
4173msgid "Specify timeout for the lookup"
4174msgstr ""
4175
4176#: src/gns/gnunet-gns.c:445
4177msgid "No unneeded output"
4178msgstr ""
4179
4180#: src/gns/gnunet-gns.c:451
4181msgid "Specify the public key of the zone to lookup the record in"
4182msgstr ""
4183
4184#: src/gns/gnunet-gns.c:457
4185msgid "Specify the name of the ego of the zone to lookup the record in"
4186msgstr ""
4187
4188#: src/gns/gnunet-gns.c:476
4189#, fuzzy
4190msgid "GNUnet GNS resolver tool"
4191msgstr "GNUnet 错误日志"
4192
4009#: src/gns/gnunet-service-gns.c:442 4193#: src/gns/gnunet-service-gns.c:442
4010#, fuzzy 4194#, fuzzy
4011msgid "Failed to connect to the namecache!\n" 4195msgid "Failed to connect to the namecache!\n"
4012msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 4196msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
4013 4197
4014#: src/gns/gnunet-service-gns.c:461 4198#: src/gns/gnunet-service-gns.c:461
4015#: src/zonemaster/gnunet-service-zonemaster.c:741 4199#: src/zonemaster/gnunet-service-zonemaster.c:742
4016#, fuzzy 4200#, fuzzy
4017msgid "Could not connect to DHT!\n" 4201msgid "Could not connect to DHT!\n"
4018msgstr "无法连接到 %s:%u:%s\n" 4202msgstr "无法连接到 %s:%u:%s\n"
@@ -4070,44 +4254,35 @@ msgstr ""
4070msgid "Hostname `%s' is not well-formed, resolution fails\n" 4254msgid "Hostname `%s' is not well-formed, resolution fails\n"
4071msgstr "" 4255msgstr ""
4072 4256
4073#: src/gns/plugin_gnsrecord_gns.c:203 4257#: src/gns/plugin_gnsrecord_gns.c:179
4074#, fuzzy, c-format 4258#, fuzzy, c-format
4075msgid "Unable to parse PKEY record `%s'\n" 4259msgid "Unable to parse PKEY record `%s'\n"
4076msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 4260msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4077 4261
4078#: src/gns/plugin_gnsrecord_gns.c:232 4262#: src/gns/plugin_gnsrecord_gns.c:208
4079#, fuzzy, c-format 4263#, fuzzy, c-format
4080msgid "Unable to parse GNS2DNS record `%s'\n" 4264msgid "Unable to parse GNS2DNS record `%s'\n"
4081msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 4265msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4082 4266
4083#: src/gns/plugin_gnsrecord_gns.c:253 4267#: src/gns/plugin_gnsrecord_gns.c:229
4084#, fuzzy, c-format 4268#, fuzzy, c-format
4085msgid "Failed to serialize GNS2DNS record with value `%s'\n" 4269msgid "Failed to serialize GNS2DNS record with value `%s'\n"
4086msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 4270msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4087 4271
4088#: src/gns/plugin_gnsrecord_gns.c:276 4272#: src/gns/plugin_gnsrecord_gns.c:252
4089#, fuzzy, c-format 4273#, fuzzy, c-format
4090msgid "Unable to parse VPN record string `%s'\n" 4274msgid "Unable to parse VPN record string `%s'\n"
4091msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 4275msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4092 4276
4093#: src/gns/plugin_gnsrecord_gns.c:312 4277#: src/gns/plugin_gnsrecord_gns.c:288
4094#, fuzzy, c-format 4278#, fuzzy, c-format
4095msgid "Unable to parse BOX record string `%s'\n" 4279msgid "Unable to parse BOX record string `%s'\n"
4096msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 4280msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4097 4281
4098#: src/gns/plugin_gnsrecord_gns.c:360
4099#, fuzzy, c-format
4100msgid "Unable to parse REVERSE record string `%s'\n"
4101msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4102
4103#: src/gns/plugin_rest_gns.c:384 4282#: src/gns/plugin_rest_gns.c:384
4104msgid "Ego for not found, cannot perform lookup.\n" 4283msgid "Ego for not found, cannot perform lookup.\n"
4105msgstr "" 4284msgstr ""
4106 4285
4107#: src/gns/plugin_rest_gns.c:668
4108msgid "GNS REST API initialized\n"
4109msgstr ""
4110
4111#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4286#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4112#, fuzzy, c-format 4287#, fuzzy, c-format
4113msgid "Unable to parse IPv4 address `%s'\n" 4288msgid "Unable to parse IPv4 address `%s'\n"
@@ -4532,6 +4707,52 @@ msgstr "“%sâ€ä¸å¯ç”¨ã€‚\n"
4532msgid "Could not start hostlist HTTP server on port %u\n" 4707msgid "Could not start hostlist HTTP server on port %u\n"
4533msgstr "" 4708msgstr ""
4534 4709
4710#: src/identity-provider/gnunet-idp.c:348
4711#, fuzzy
4712msgid "Ego is required\n"
4713msgstr "%s:选项“%sâ€æœ‰æ­§ä¹‰\n"
4714
4715#: src/identity-provider/gnunet-idp.c:370
4716msgid "Add attribute"
4717msgstr ""
4718
4719#: src/identity-provider/gnunet-idp.c:376
4720msgid "Attribute value"
4721msgstr ""
4722
4723#: src/identity-provider/gnunet-idp.c:381
4724msgid "Ego"
4725msgstr ""
4726
4727#: src/identity-provider/gnunet-idp.c:386
4728msgid "Audience (relying party)"
4729msgstr ""
4730
4731#: src/identity-provider/gnunet-idp.c:390
4732msgid "List attributes for Ego"
4733msgstr ""
4734
4735#: src/identity-provider/gnunet-idp.c:395
4736msgid "Issue a ticket"
4737msgstr ""
4738
4739#: src/identity-provider/gnunet-idp.c:400
4740msgid "Consume a ticket"
4741msgstr ""
4742
4743#: src/identity-provider/gnunet-idp.c:405
4744msgid "Revoke a ticket"
4745msgstr ""
4746
4747#: src/identity-provider/identity_provider_api.c:429
4748#, fuzzy
4749msgid "failed to store record\n"
4750msgstr "è¿è¡Œ %s失败:%s %d\n"
4751
4752#: src/identity-provider/plugin_rest_identity_provider.c:1175
4753msgid "Identity Provider REST API initialized\n"
4754msgstr ""
4755
4535#: src/identity/gnunet-identity.c:179 4756#: src/identity/gnunet-identity.c:179
4536#, fuzzy, c-format 4757#, fuzzy, c-format
4537msgid "Failed to create ego: %s\n" 4758msgid "Failed to create ego: %s\n"
@@ -4619,32 +4840,10 @@ msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4619msgid "Failed to create directory `%s' for storing egos\n" 4840msgid "Failed to create directory `%s' for storing egos\n"
4620msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 4841msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4621 4842
4622#: src/identity/plugin_rest_identity.c:967 4843#: src/identity/plugin_rest_identity.c:964
4623msgid "Identity REST API initialized\n" 4844msgid "Identity REST API initialized\n"
4624msgstr "" 4845msgstr ""
4625 4846
4626#: src/identity-provider/gnunet-identity-token.c:66
4627#, fuzzy
4628msgid "Option `-t' is required\n"
4629msgstr "%s:选项“%sâ€æœ‰æ­§ä¹‰\n"
4630
4631#: src/identity-provider/gnunet-identity-token.c:77
4632#, fuzzy, c-format
4633msgid "Token `%s' is malformed\n"
4634msgstr "“%sâ€çš„å‚数无效。\n"
4635
4636#: src/identity-provider/gnunet-identity-token.c:166
4637msgid "GNUid token"
4638msgstr ""
4639
4640#: src/identity-provider/gnunet-identity-token.c:171
4641msgid "Print token contents"
4642msgstr ""
4643
4644#: src/identity-provider/plugin_rest_identity_provider.c:1166
4645msgid "Identity Token REST API initialized\n"
4646msgstr ""
4647
4648#: src/json/json.c:119 4847#: src/json/json.c:119
4649#, fuzzy, c-format 4848#, fuzzy, c-format
4650msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4849msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4745,25 +4944,79 @@ msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
4745msgid "flat plugin running\n" 4944msgid "flat plugin running\n"
4746msgstr "sqlite æ•°æ®ä»“库" 4945msgstr "sqlite æ•°æ®ä»“库"
4747 4946
4748#: src/namecache/plugin_namecache_postgres.c:90 4947#: src/namestore/gnunet-namestore-fcfsd.c:508
4749#: src/namestore/plugin_namestore_postgres.c:97 4948#, fuzzy, c-format
4750#, fuzzy 4949msgid "Unsupported form value `%s'\n"
4751msgid "Failed to create indices\n" 4950msgstr "未知的命令“%sâ€ã€‚\n"
4951
4952#: src/namestore/gnunet-namestore-fcfsd.c:535
4953#, fuzzy, c-format
4954msgid "Failed to create record for domain `%s': %s\n"
4955msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4956
4957#: src/namestore/gnunet-namestore-fcfsd.c:555
4958msgid "Error when mapping zone to name\n"
4959msgstr ""
4960
4961#: src/namestore/gnunet-namestore-fcfsd.c:585
4962#, c-format
4963msgid "Found existing name `%s' for the given key\n"
4964msgstr ""
4965
4966#: src/namestore/gnunet-namestore-fcfsd.c:662
4967#, c-format
4968msgid "Found %u existing records for domain `%s'\n"
4969msgstr ""
4970
4971#: src/namestore/gnunet-namestore-fcfsd.c:718
4972#, fuzzy, c-format
4973msgid "Failed to create page for `%s'\n"
4752msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" 4974msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
4753 4975
4976#: src/namestore/gnunet-namestore-fcfsd.c:734
4977#, fuzzy, c-format
4978msgid "Failed to setup post processor for `%s'\n"
4979msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4980
4981#: src/namestore/gnunet-namestore-fcfsd.c:770
4982msgid "Domain name must not contain `.'\n"
4983msgstr ""
4984
4985#: src/namestore/gnunet-namestore-fcfsd.c:778
4986msgid "Domain name must not contain `+'\n"
4987msgstr ""
4988
4989#: src/namestore/gnunet-namestore-fcfsd.c:974
4990msgid "No ego configured for `fcfsd` subsystem\n"
4991msgstr ""
4992
4993#: src/namestore/gnunet-namestore-fcfsd.c:1000
4994#, fuzzy
4995msgid "Failed to start HTTP server\n"
4996msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
4997
4998#: src/namestore/gnunet-namestore-fcfsd.c:1042
4999#, fuzzy
5000msgid "Failed to connect to identity\n"
5001msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
5002
5003#: src/namestore/gnunet-namestore-fcfsd.c:1074
5004msgid "GNU Name System First Come First Serve name registration service"
5005msgstr ""
5006
4754#: src/namestore/gnunet-namestore.c:301 5007#: src/namestore/gnunet-namestore.c:301
4755#, c-format 5008#, c-format
4756msgid "Adding record failed: %s\n" 5009msgid "Adding record failed: %s\n"
4757msgstr "" 5010msgstr ""
4758 5011
4759#: src/namestore/gnunet-namestore.c:330 5012#: src/namestore/gnunet-namestore.c:330
4760#: src/namestore/plugin_rest_namestore.c:562 5013#: src/namestore/plugin_rest_namestore.c:567
4761#, c-format 5014#, c-format
4762msgid "Deleting record failed, record does not exist%s%s\n" 5015msgid "Deleting record failed, record does not exist%s%s\n"
4763msgstr "" 5016msgstr ""
4764 5017
4765#: src/namestore/gnunet-namestore.c:337 5018#: src/namestore/gnunet-namestore.c:337
4766#: src/namestore/plugin_rest_namestore.c:571 5019#: src/namestore/plugin_rest_namestore.c:576
4767#, c-format 5020#, c-format
4768msgid "Deleting record failed%s%s\n" 5021msgid "Deleting record failed%s%s\n"
4769msgstr "" 5022msgstr ""
@@ -4781,7 +5034,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
4781msgstr "" 5034msgstr ""
4782 5035
4783#: src/namestore/gnunet-namestore.c:698 5036#: src/namestore/gnunet-namestore.c:698
4784#: src/namestore/plugin_rest_namestore.c:597 5037#: src/namestore/plugin_rest_namestore.c:602
4785#, c-format 5038#, c-format
4786msgid "There are no records under label `%s' that could be deleted.\n" 5039msgid "There are no records under label `%s' that could be deleted.\n"
4787msgstr "" 5040msgstr ""
@@ -4792,24 +5045,11 @@ msgid ""
4792"There are no records under label `%s' that match the request for deletion.\n" 5045"There are no records under label `%s' that match the request for deletion.\n"
4793msgstr "" 5046msgstr ""
4794 5047
4795#: src/namestore/gnunet-namestore.c:776
4796#: src/namestore/plugin_rest_namestore.c:1004
4797#, c-format
4798msgid "Ego `%s' not known to identity service\n"
4799msgstr ""
4800
4801#: src/namestore/gnunet-namestore.c:791 5048#: src/namestore/gnunet-namestore.c:791
4802#, c-format 5049#, c-format
4803msgid "No options given\n" 5050msgid "No options given\n"
4804msgstr "" 5051msgstr ""
4805 5052
4806#: src/namestore/gnunet-namestore.c:802
4807#: src/namestore/gnunet-namestore-fcfsd.c:1034
4808#: src/namestore/plugin_rest_namestore.c:1017
4809#, fuzzy
4810msgid "Failed to connect to namestore\n"
4811msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
4812
4813#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819 5053#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
4814#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861 5054#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
4815#: src/namestore/gnunet-namestore.c:915 5055#: src/namestore/gnunet-namestore.c:915
@@ -4823,14 +5063,14 @@ msgid "add"
4823msgstr "" 5063msgstr ""
4824 5064
4825#: src/namestore/gnunet-namestore.c:829 5065#: src/namestore/gnunet-namestore.c:829
4826#: src/namestore/plugin_rest_namestore.c:671 5066#: src/namestore/plugin_rest_namestore.c:676
4827#, fuzzy, c-format 5067#, fuzzy, c-format
4828msgid "Unsupported type `%s'\n" 5068msgid "Unsupported type `%s'\n"
4829msgstr "未知的命令“%sâ€ã€‚\n" 5069msgstr "未知的命令“%sâ€ã€‚\n"
4830 5070
4831#: src/namestore/gnunet-namestore.c:851 5071#: src/namestore/gnunet-namestore.c:851
4832#: src/namestore/plugin_rest_namestore.c:689 5072#: src/namestore/plugin_rest_namestore.c:694
4833#: src/namestore/plugin_rest_namestore.c:729 5073#: src/namestore/plugin_rest_namestore.c:734
4834#, c-format 5074#, c-format
4835msgid "Value `%s' invalid for record type `%s'\n" 5075msgid "Value `%s' invalid for record type `%s'\n"
4836msgstr "" 5076msgstr ""
@@ -4849,8 +5089,7 @@ msgstr ""
4849msgid "Invalid public key for reverse lookup `%s'\n" 5089msgid "Invalid public key for reverse lookup `%s'\n"
4850msgstr "“%sâ€çš„å‚数无效。\n" 5090msgstr "“%sâ€çš„å‚数无效。\n"
4851 5091
4852#: src/namestore/gnunet-namestore.c:979 5092#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
4853#: src/peerinfo-tool/gnunet-peerinfo.c:775
4854#, fuzzy, c-format 5093#, fuzzy, c-format
4855msgid "Invalid URI `%s'\n" 5094msgid "Invalid URI `%s'\n"
4856msgstr "无效æ¡ç›®ã€‚\n" 5095msgstr "无效æ¡ç›®ã€‚\n"
@@ -4861,13 +5100,13 @@ msgid "Invalid nick `%s'\n"
4861msgstr "无效æ¡ç›®ã€‚\n" 5100msgstr "无效æ¡ç›®ã€‚\n"
4862 5101
4863#: src/namestore/gnunet-namestore.c:1051 5102#: src/namestore/gnunet-namestore.c:1051
4864#: src/namestore/plugin_rest_namestore.c:1047 5103#: src/namestore/plugin_rest_namestore.c:1052
4865#, c-format 5104#, c-format
4866msgid "No default ego configured in identity service\n" 5105msgid "No default ego configured in identity service\n"
4867msgstr "" 5106msgstr ""
4868 5107
4869#: src/namestore/gnunet-namestore.c:1108 5108#: src/namestore/gnunet-namestore.c:1108
4870#: src/namestore/plugin_rest_namestore.c:1143 5109#: src/namestore/plugin_rest_namestore.c:1148
4871#, fuzzy, c-format 5110#, fuzzy, c-format
4872msgid "Cannot connect to identity service\n" 5111msgid "Cannot connect to identity service\n"
4873msgstr "无法连接到 %s:%u:%s\n" 5112msgstr "无法连接到 %s:%u:%s\n"
@@ -4930,67 +5169,7 @@ msgstr ""
4930msgid "name of the ego controlling the zone" 5169msgid "name of the ego controlling the zone"
4931msgstr "" 5170msgstr ""
4932 5171
4933#: src/namestore/gnunet-namestore-fcfsd.c:508 5172#: src/namestore/gnunet-service-namestore.c:615
4934#, fuzzy, c-format
4935msgid "Unsupported form value `%s'\n"
4936msgstr "未知的命令“%sâ€ã€‚\n"
4937
4938#: src/namestore/gnunet-namestore-fcfsd.c:535
4939#, fuzzy, c-format
4940msgid "Failed to create record for domain `%s': %s\n"
4941msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4942
4943#: src/namestore/gnunet-namestore-fcfsd.c:555
4944msgid "Error when mapping zone to name\n"
4945msgstr ""
4946
4947#: src/namestore/gnunet-namestore-fcfsd.c:585
4948#, c-format
4949msgid "Found existing name `%s' for the given key\n"
4950msgstr ""
4951
4952#: src/namestore/gnunet-namestore-fcfsd.c:662
4953#, c-format
4954msgid "Found %u existing records for domain `%s'\n"
4955msgstr ""
4956
4957#: src/namestore/gnunet-namestore-fcfsd.c:718
4958#, fuzzy, c-format
4959msgid "Failed to create page for `%s'\n"
4960msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
4961
4962#: src/namestore/gnunet-namestore-fcfsd.c:734
4963#, fuzzy, c-format
4964msgid "Failed to setup post processor for `%s'\n"
4965msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
4966
4967#: src/namestore/gnunet-namestore-fcfsd.c:770
4968msgid "Domain name must not contain `.'\n"
4969msgstr ""
4970
4971#: src/namestore/gnunet-namestore-fcfsd.c:778
4972msgid "Domain name must not contain `+'\n"
4973msgstr ""
4974
4975#: src/namestore/gnunet-namestore-fcfsd.c:974
4976msgid "No ego configured for `fcfsd` subsystem\n"
4977msgstr ""
4978
4979#: src/namestore/gnunet-namestore-fcfsd.c:1000
4980#, fuzzy
4981msgid "Failed to start HTTP server\n"
4982msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
4983
4984#: src/namestore/gnunet-namestore-fcfsd.c:1042
4985#, fuzzy
4986msgid "Failed to connect to identity\n"
4987msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
4988
4989#: src/namestore/gnunet-namestore-fcfsd.c:1074
4990msgid "GNU Name System First Come First Serve name registration service"
4991msgstr ""
4992
4993#: src/namestore/gnunet-service-namestore.c:612
4994#, fuzzy, c-format 5173#, fuzzy, c-format
4995msgid "Failed to replicate block in namecache: %s\n" 5174msgid "Failed to replicate block in namecache: %s\n"
4996msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" 5175msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
@@ -5004,7 +5183,7 @@ msgstr ""
5004msgid "flat file database running\n" 5183msgid "flat file database running\n"
5005msgstr "sqlite æ•°æ®ä»“库" 5184msgstr "sqlite æ•°æ®ä»“库"
5006 5185
5007#: src/namestore/plugin_rest_namestore.c:1188 5186#: src/namestore/plugin_rest_namestore.c:1193
5008msgid "Namestore REST API initialized\n" 5187msgid "Namestore REST API initialized\n"
5009msgstr "" 5188msgstr ""
5010 5189
@@ -5287,10 +5466,6 @@ msgstr ""
5287msgid "`upnpc' command not found\n" 5466msgid "`upnpc' command not found\n"
5288msgstr "" 5467msgstr ""
5289 5468
5290#: src/nse/gnunet-nse.c:122
5291msgid "Show network size estimates from NSE service."
5292msgstr ""
5293
5294#: src/nse/gnunet-nse-profiler.c:842 5469#: src/nse/gnunet-nse-profiler.c:842
5295msgid "limit to the number of connections to NSE services, 0 for none" 5470msgid "limit to the number of connections to NSE services, 0 for none"
5296msgstr "" 5471msgstr ""
@@ -5316,66 +5491,16 @@ msgstr ""
5316msgid "Measure quality and performance of the NSE service." 5491msgid "Measure quality and performance of the NSE service."
5317msgstr "无法访问该æœåŠ¡" 5492msgstr "无法访问该æœåŠ¡"
5318 5493
5494#: src/nse/gnunet-nse.c:122
5495msgid "Show network size estimates from NSE service."
5496msgstr ""
5497
5319#: src/nse/gnunet-service-nse.c:1534 5498#: src/nse/gnunet-service-nse.c:1534
5320#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276 5499#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
5321#, fuzzy 5500#, fuzzy
5322msgid "Value is too large.\n" 5501msgid "Value is too large.\n"
5323msgstr "值ä¸åœ¨åˆæ³•èŒƒå›´å†…。" 5502msgstr "值ä¸åœ¨åˆæ³•èŒƒå›´å†…。"
5324 5503
5325#: src/peerinfo/gnunet-service-peerinfo.c:178
5326#, c-format
5327msgid "Removing expired address of transport `%s'\n"
5328msgstr ""
5329
5330#: src/peerinfo/gnunet-service-peerinfo.c:310
5331#, fuzzy, c-format
5332msgid "Failed to parse HELLO in file `%s': %s\n"
5333msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5334
5335#: src/peerinfo/gnunet-service-peerinfo.c:331
5336#: src/peerinfo/gnunet-service-peerinfo.c:362
5337#, fuzzy, c-format
5338msgid "Failed to parse HELLO in file `%s'\n"
5339msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5340
5341#: src/peerinfo/gnunet-service-peerinfo.c:446
5342msgid "# peers known"
5343msgstr ""
5344
5345#: src/peerinfo/gnunet-service-peerinfo.c:489
5346#, c-format
5347msgid ""
5348"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5349msgstr ""
5350
5351#: src/peerinfo/gnunet-service-peerinfo.c:655
5352#, fuzzy, c-format
5353msgid "Scanning directory `%s'\n"
5354msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5355
5356#: src/peerinfo/gnunet-service-peerinfo.c:663
5357#, c-format
5358msgid "Still no peers found in `%s'!\n"
5359msgstr ""
5360
5361#: src/peerinfo/gnunet-service-peerinfo.c:1076
5362#, fuzzy, c-format
5363msgid "Cleaning up directory `%s'\n"
5364msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5365
5366#: src/peerinfo/gnunet-service-peerinfo.c:1405
5367#, c-format
5368msgid "Importing HELLOs from `%s'\n"
5369msgstr ""
5370
5371#: src/peerinfo/gnunet-service-peerinfo.c:1418
5372msgid "Skipping import of included HELLOs\n"
5373msgstr ""
5374
5375#: src/peerinfo/peerinfo_api.c:220
5376msgid "Failed to receive response from `PEERINFO' service."
5377msgstr ""
5378
5379#: src/peerinfo-tool/gnunet-peerinfo.c:239 5504#: src/peerinfo-tool/gnunet-peerinfo.c:239
5380#, fuzzy, c-format 5505#, fuzzy, c-format
5381msgid "%sPeer `%s'\n" 5506msgid "%sPeer `%s'\n"
@@ -5467,6 +5592,60 @@ msgstr ""
5467msgid "Failed to load transport plugin for `%s'\n" 5592msgid "Failed to load transport plugin for `%s'\n"
5468msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 5593msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5469 5594
5595#: src/peerinfo/gnunet-service-peerinfo.c:178
5596#, c-format
5597msgid "Removing expired address of transport `%s'\n"
5598msgstr ""
5599
5600#: src/peerinfo/gnunet-service-peerinfo.c:310
5601#, fuzzy, c-format
5602msgid "Failed to parse HELLO in file `%s': %s\n"
5603msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5604
5605#: src/peerinfo/gnunet-service-peerinfo.c:331
5606#: src/peerinfo/gnunet-service-peerinfo.c:362
5607#, fuzzy, c-format
5608msgid "Failed to parse HELLO in file `%s'\n"
5609msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5610
5611#: src/peerinfo/gnunet-service-peerinfo.c:446
5612msgid "# peers known"
5613msgstr ""
5614
5615#: src/peerinfo/gnunet-service-peerinfo.c:489
5616#, c-format
5617msgid ""
5618"File `%s' in directory `%s' does not match naming convention. Removed.\n"
5619msgstr ""
5620
5621#: src/peerinfo/gnunet-service-peerinfo.c:655
5622#, fuzzy, c-format
5623msgid "Scanning directory `%s'\n"
5624msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5625
5626#: src/peerinfo/gnunet-service-peerinfo.c:663
5627#, c-format
5628msgid "Still no peers found in `%s'!\n"
5629msgstr ""
5630
5631#: src/peerinfo/gnunet-service-peerinfo.c:1076
5632#, fuzzy, c-format
5633msgid "Cleaning up directory `%s'\n"
5634msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
5635
5636#: src/peerinfo/gnunet-service-peerinfo.c:1405
5637#, c-format
5638msgid "Importing HELLOs from `%s'\n"
5639msgstr ""
5640
5641#: src/peerinfo/gnunet-service-peerinfo.c:1418
5642msgid "Skipping import of included HELLOs\n"
5643msgstr ""
5644
5645#: src/peerinfo/peerinfo_api.c:220
5646msgid "Failed to receive response from `PEERINFO' service."
5647msgstr ""
5648
5470#: src/peerstore/gnunet-peerstore.c:91 5649#: src/peerstore/gnunet-peerstore.c:91
5471msgid "peerstore" 5650msgid "peerstore"
5472msgstr "" 5651msgstr ""
@@ -5516,16 +5695,11 @@ msgstr "创建用户出错"
5516msgid "Unable to create indices: %s.\n" 5695msgid "Unable to create indices: %s.\n"
5517msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" 5696msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
5518 5697
5519#: src/postgres/postgres.c:67 5698#: src/pq/pq_prepare.c:80
5520#, fuzzy, c-format 5699#, fuzzy, c-format
5521msgid "`%s:%s' failed at %s:%d with error: %s\n" 5700msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
5522msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" 5701msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n"
5523 5702
5524#: src/postgres/postgres.c:192
5525#, fuzzy, c-format
5526msgid "Unable to connect to Postgres database '%s': %s\n"
5527msgstr "无法ä¿å­˜é…置文件“%sâ€ï¼š"
5528
5529#: src/psycstore/gnunet-service-psycstore.c:249 5703#: src/psycstore/gnunet-service-psycstore.c:249
5530#, fuzzy 5704#, fuzzy
5531msgid "Failed to store membership information!\n" 5705msgid "Failed to store membership information!\n"
@@ -5696,60 +5870,60 @@ msgstr "ç«‹å³ä¿å­˜é…置?"
5696msgid "Daemon to announce regular expressions for the peer using cadet." 5870msgid "Daemon to announce regular expressions for the peer using cadet."
5697msgstr "" 5871msgstr ""
5698 5872
5699#: src/regex/gnunet-regex-profiler.c:1314 5873#: src/regex/gnunet-regex-profiler.c:1386
5700msgid "No configuration file given. Exiting\n" 5874msgid "No configuration file given. Exiting\n"
5701msgstr "" 5875msgstr ""
5702 5876
5703#: src/regex/gnunet-regex-profiler.c:1355 5877#: src/regex/gnunet-regex-profiler.c:1427
5704#: src/regex/gnunet-regex-simulation-profiler.c:630 5878#: src/regex/gnunet-regex-simulation-profiler.c:630
5705#, c-format 5879#, c-format
5706msgid "No policy directory specified on command line. Exiting.\n" 5880msgid "No policy directory specified on command line. Exiting.\n"
5707msgstr "" 5881msgstr ""
5708 5882
5709#: src/regex/gnunet-regex-profiler.c:1361 5883#: src/regex/gnunet-regex-profiler.c:1433
5710#: src/regex/gnunet-regex-simulation-profiler.c:638 5884#: src/regex/gnunet-regex-simulation-profiler.c:638
5711#, c-format 5885#, c-format
5712msgid "Specified policies directory does not exist. Exiting.\n" 5886msgid "Specified policies directory does not exist. Exiting.\n"
5713msgstr "" 5887msgstr ""
5714 5888
5715#: src/regex/gnunet-regex-profiler.c:1368 5889#: src/regex/gnunet-regex-profiler.c:1440
5716#, fuzzy, c-format 5890#, fuzzy, c-format
5717msgid "No files found in `%s'\n" 5891msgid "No files found in `%s'\n"
5718msgstr "è¿è¡Œ %s失败:%s %d\n" 5892msgstr "è¿è¡Œ %s失败:%s %d\n"
5719 5893
5720#: src/regex/gnunet-regex-profiler.c:1377 5894#: src/regex/gnunet-regex-profiler.c:1449
5721msgid "No search strings file given. Exiting.\n" 5895msgid "No search strings file given. Exiting.\n"
5722msgstr "" 5896msgstr ""
5723 5897
5724#: src/regex/gnunet-regex-profiler.c:1397 5898#: src/regex/gnunet-regex-profiler.c:1469
5725#, fuzzy 5899#, fuzzy
5726msgid "Error loading search strings. Exiting.\n" 5900msgid "Error loading search strings. Exiting.\n"
5727msgstr "创建用户出错" 5901msgstr "创建用户出错"
5728 5902
5729#: src/regex/gnunet-regex-profiler.c:1485 5903#: src/regex/gnunet-regex-profiler.c:1557
5730#, fuzzy 5904#, fuzzy
5731msgid "name of the file for writing statistics" 5905msgid "name of the file for writing statistics"
5732msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 5906msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
5733 5907
5734#: src/regex/gnunet-regex-profiler.c:1491 5908#: src/regex/gnunet-regex-profiler.c:1563
5735msgid "wait TIMEOUT before ending the experiment" 5909msgid "wait TIMEOUT before ending the experiment"
5736msgstr "" 5910msgstr ""
5737 5911
5738#: src/regex/gnunet-regex-profiler.c:1497 5912#: src/regex/gnunet-regex-profiler.c:1569
5739msgid "directory with policy files" 5913msgid "directory with policy files"
5740msgstr "" 5914msgstr ""
5741 5915
5742#: src/regex/gnunet-regex-profiler.c:1504 5916#: src/regex/gnunet-regex-profiler.c:1576
5743#, fuzzy 5917#, fuzzy
5744msgid "name of file with input strings" 5918msgid "name of file with input strings"
5745msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 5919msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
5746 5920
5747#: src/regex/gnunet-regex-profiler.c:1510 5921#: src/regex/gnunet-regex-profiler.c:1582
5748#, fuzzy 5922#, fuzzy
5749msgid "name of file with hosts' names" 5923msgid "name of file with hosts' names"
5750msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 5924msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
5751 5925
5752#: src/regex/gnunet-regex-profiler.c:1523 5926#: src/regex/gnunet-regex-profiler.c:1595
5753msgid "Profiler for regex" 5927msgid "Profiler for regex"
5754msgstr "" 5928msgstr ""
5755 5929
@@ -5980,10 +6154,10 @@ msgstr ""
5980msgid "Calculate the Vectorproduct with a GNUnet peer." 6154msgid "Calculate the Vectorproduct with a GNUnet peer."
5981msgstr "" 6155msgstr ""
5982 6156
5983#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407 6157#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
5984#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
5985#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
5986#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063 6158#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
6159#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
6160#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
5987#, fuzzy 6161#, fuzzy
5988msgid "Connect to CADET failed\n" 6162msgid "Connect to CADET failed\n"
5989msgstr "“%sâ€å·²è¿žæŽ¥åˆ°â€œ%sâ€ã€‚\n" 6163msgstr "“%sâ€å·²è¿žæŽ¥åˆ°â€œ%sâ€ã€‚\n"
@@ -6008,7 +6182,7 @@ msgstr ""
6008msgid "also profile decryption" 6182msgid "also profile decryption"
6009msgstr "" 6183msgstr ""
6010 6184
6011#: src/set/gnunet-service-set.c:1948 6185#: src/set/gnunet-service-set.c:1989
6012#, fuzzy 6186#, fuzzy
6013msgid "Could not connect to CADET service\n" 6187msgid "Could not connect to CADET service\n"
6014msgstr "无法连接到 %s:%u:%s\n" 6188msgstr "无法连接到 %s:%u:%s\n"
@@ -6068,114 +6242,114 @@ msgstr ""
6068msgid "say good-bye and leave somebody else's place" 6242msgid "say good-bye and leave somebody else's place"
6069msgstr "" 6243msgstr ""
6070 6244
6071#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 6245#: src/social/gnunet-social.c:1227
6072msgid "create a place" 6246msgid "create a place"
6073msgstr "" 6247msgstr ""
6074 6248
6075#: src/social/gnunet-social.c:1237 6249#: src/social/gnunet-social.c:1232
6076msgid "destroy a place we were hosting" 6250msgid "destroy a place we were hosting"
6077msgstr "" 6251msgstr ""
6078 6252
6079#: src/social/gnunet-social.c:1242 6253#: src/social/gnunet-social.c:1237
6080msgid "enter somebody else's place" 6254msgid "enter somebody else's place"
6081msgstr "" 6255msgstr ""
6082 6256
6083#: src/social/gnunet-social.c:1248 6257#: src/social/gnunet-social.c:1243
6084msgid "find state matching name prefix" 6258msgid "find state matching name prefix"
6085msgstr "" 6259msgstr ""
6086 6260
6087#: src/social/gnunet-social.c:1253 6261#: src/social/gnunet-social.c:1248
6088msgid "replay history of messages up to the given --limit" 6262msgid "replay history of messages up to the given --limit"
6089msgstr "" 6263msgstr ""
6090 6264
6091#: src/social/gnunet-social.c:1258 6265#: src/social/gnunet-social.c:1253
6092msgid "reconnect to a previously created place" 6266msgid "reconnect to a previously created place"
6093msgstr "" 6267msgstr ""
6094 6268
6095#: src/social/gnunet-social.c:1263 6269#: src/social/gnunet-social.c:1258
6096msgid "publish something to a place we are hosting" 6270msgid "publish something to a place we are hosting"
6097msgstr "" 6271msgstr ""
6098 6272
6099#: src/social/gnunet-social.c:1268 6273#: src/social/gnunet-social.c:1263
6100msgid "reconnect to a previously entered place" 6274msgid "reconnect to a previously entered place"
6101msgstr "" 6275msgstr ""
6102 6276
6103#: src/social/gnunet-social.c:1273 6277#: src/social/gnunet-social.c:1268
6104msgid "search for state matching exact name" 6278msgid "search for state matching exact name"
6105msgstr "" 6279msgstr ""
6106 6280
6107#: src/social/gnunet-social.c:1278 6281#: src/social/gnunet-social.c:1273
6108msgid "submit something to somebody's place" 6282msgid "submit something to somebody's place"
6109msgstr "" 6283msgstr ""
6110 6284
6111#: src/social/gnunet-social.c:1283 6285#: src/social/gnunet-social.c:1278
6112msgid "list of egos and subscribed places" 6286msgid "list of egos and subscribed places"
6113msgstr "" 6287msgstr ""
6114 6288
6115#: src/social/gnunet-social.c:1288 6289#: src/social/gnunet-social.c:1283
6116msgid "extract and replay history between message IDs --start and --until" 6290msgid "extract and replay history between message IDs --start and --until"
6117msgstr "" 6291msgstr ""
6118 6292
6119#: src/social/gnunet-social.c:1297 6293#: src/social/gnunet-social.c:1292
6120msgid "application ID to use when connecting" 6294msgid "application ID to use when connecting"
6121msgstr "" 6295msgstr ""
6122 6296
6123#: src/social/gnunet-social.c:1303 6297#: src/social/gnunet-social.c:1298
6124msgid "message body or state value" 6298msgid "message body or state value"
6125msgstr "" 6299msgstr ""
6126 6300
6127#: src/social/gnunet-social.c:1309 6301#: src/social/gnunet-social.c:1304
6128#, fuzzy 6302#, fuzzy
6129msgid "name or public key of ego" 6303msgid "name or public key of ego"
6130msgstr "“%sâ€çš„å‚数无效。\n" 6304msgstr "“%sâ€çš„å‚数无效。\n"
6131 6305
6132#: src/social/gnunet-social.c:1314 6306#: src/social/gnunet-social.c:1309
6133#, fuzzy 6307#, fuzzy
6134msgid "wait for incoming messages" 6308msgid "wait for incoming messages"
6135msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" 6309msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
6136 6310
6137#: src/social/gnunet-social.c:1320 6311#: src/social/gnunet-social.c:1315
6138msgid "GNS name" 6312msgid "GNS name"
6139msgstr "" 6313msgstr ""
6140 6314
6141#: src/social/gnunet-social.c:1326 6315#: src/social/gnunet-social.c:1321
6142msgid "peer ID for --guest-enter" 6316msgid "peer ID for --guest-enter"
6143msgstr "" 6317msgstr ""
6144 6318
6145#: src/social/gnunet-social.c:1332 6319#: src/social/gnunet-social.c:1327
6146msgid "name (key) to query from state" 6320msgid "name (key) to query from state"
6147msgstr "" 6321msgstr ""
6148 6322
6149#: src/social/gnunet-social.c:1338 6323#: src/social/gnunet-social.c:1333
6150msgid "method name" 6324msgid "method name"
6151msgstr "" 6325msgstr ""
6152 6326
6153#: src/social/gnunet-social.c:1344 6327#: src/social/gnunet-social.c:1339
6154#, fuzzy 6328#, fuzzy
6155msgid "number of messages to replay from history" 6329msgid "number of messages to replay from history"
6156msgstr "æ¯æ¬¡è¿­ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡" 6330msgstr "æ¯æ¬¡è¿­ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡"
6157 6331
6158#: src/social/gnunet-social.c:1350 6332#: src/social/gnunet-social.c:1345
6159msgid "key address of place" 6333msgid "key address of place"
6160msgstr "" 6334msgstr ""
6161 6335
6162#: src/social/gnunet-social.c:1356 6336#: src/social/gnunet-social.c:1351
6163msgid "start message ID for history replay" 6337msgid "start message ID for history replay"
6164msgstr "" 6338msgstr ""
6165 6339
6166#: src/social/gnunet-social.c:1361 6340#: src/social/gnunet-social.c:1356
6167msgid "respond to entry requests by admitting all guests" 6341msgid "respond to entry requests by admitting all guests"
6168msgstr "" 6342msgstr ""
6169 6343
6170#: src/social/gnunet-social.c:1367 6344#: src/social/gnunet-social.c:1362
6171msgid "end message ID for history replay" 6345msgid "end message ID for history replay"
6172msgstr "" 6346msgstr ""
6173 6347
6174#: src/social/gnunet-social.c:1372 6348#: src/social/gnunet-social.c:1367
6175msgid "respond to entry requests by refusing all guests" 6349msgid "respond to entry requests by refusing all guests"
6176msgstr "" 6350msgstr ""
6177 6351
6178#: src/social/gnunet-social.c:1382 6352#: src/social/gnunet-social.c:1377
6179msgid "" 6353msgid ""
6180"gnunet-social - Interact with the social service: enter/leave, send/receive " 6354"gnunet-social - Interact with the social service: enter/leave, send/receive "
6181"messages, access history and state.\n" 6355"messages, access history and state.\n"
@@ -6368,7 +6542,7 @@ msgid ""
6368msgstr "" 6542msgstr ""
6369 6543
6370#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46 6544#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
6371#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298 6545#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
6372#, c-format 6546#, c-format
6373msgid "Incorrect hostkey file format: %s\n" 6547msgid "Incorrect hostkey file format: %s\n"
6374msgstr "" 6548msgstr ""
@@ -6438,15 +6612,6 @@ msgstr ""
6438msgid "%.s Unknown result code." 6612msgid "%.s Unknown result code."
6439msgstr "" 6613msgstr ""
6440 6614
6441#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6442msgid "Waiting for child to exit.\n"
6443msgstr ""
6444
6445#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6446#, fuzzy, c-format
6447msgid "Spawning process `%s'\n"
6448msgstr "å¸è½½ GNUnet æœåŠ¡"
6449
6450#: src/testbed/gnunet-testbed-profiler.c:290 6615#: src/testbed/gnunet-testbed-profiler.c:290
6451msgid "tolerate COUNT number of continious timeout failures" 6616msgid "tolerate COUNT number of continious timeout failures"
6452msgstr "" 6617msgstr ""
@@ -6458,6 +6623,15 @@ msgid ""
6458"signal is received" 6623"signal is received"
6459msgstr "" 6624msgstr ""
6460 6625
6626#: src/testbed/gnunet_testbed_mpi_spawn.c:118
6627msgid "Waiting for child to exit.\n"
6628msgstr ""
6629
6630#: src/testbed/gnunet_testbed_mpi_spawn.c:241
6631#, fuzzy, c-format
6632msgid "Spawning process `%s'\n"
6633msgstr "å¸è½½ GNUnet æœåŠ¡"
6634
6461#: src/testbed/testbed_api.c:410 6635#: src/testbed/testbed_api.c:410
6462#, fuzzy, c-format 6636#, fuzzy, c-format
6463msgid "Adding host %u failed with error: %s\n" 6637msgid "Adding host %u failed with error: %s\n"
@@ -6754,10 +6928,6 @@ msgstr ""
6754msgid "GNUnet topology control" 6928msgid "GNUnet topology control"
6755msgstr "" 6929msgstr ""
6756 6930
6757#: src/transport/gnunet-service-transport_ats.c:141
6758msgid "# Addresses given to ATS"
6759msgstr ""
6760
6761#: src/transport/gnunet-service-transport.c:448 6931#: src/transport/gnunet-service-transport.c:448
6762msgid "# messages dropped due to slow client" 6932msgid "# messages dropped due to slow client"
6763msgstr "" 6933msgstr ""
@@ -6803,6 +6973,10 @@ msgstr ""
6803msgid "Transport service is lacking key configuration settings. Exiting.\n" 6973msgid "Transport service is lacking key configuration settings. Exiting.\n"
6804msgstr "ç«‹å³ä¿å­˜é…置?" 6974msgstr "ç«‹å³ä¿å­˜é…置?"
6805 6975
6976#: src/transport/gnunet-service-transport_ats.c:141
6977msgid "# Addresses given to ATS"
6978msgstr ""
6979
6806#: src/transport/gnunet-service-transport_hello.c:195 6980#: src/transport/gnunet-service-transport_hello.c:195
6807msgid "# refreshed my HELLO" 6981msgid "# refreshed my HELLO"
6808msgstr "" 6982msgstr ""
@@ -7107,6 +7281,44 @@ msgstr ""
7107msgid "# validations succeeded" 7281msgid "# validations succeeded"
7108msgstr "" 7282msgstr ""
7109 7283
7284#: src/transport/gnunet-transport-profiler.c:219
7285#, c-format
7286msgid "%llu B in %llu ms == %.2f KB/s!\n"
7287msgstr ""
7288
7289#: src/transport/gnunet-transport-profiler.c:617
7290msgid "send data to peer"
7291msgstr ""
7292
7293#: src/transport/gnunet-transport-profiler.c:621
7294msgid "receive data from peer"
7295msgstr ""
7296
7297#: src/transport/gnunet-transport-profiler.c:626
7298msgid "iterations"
7299msgstr ""
7300
7301#: src/transport/gnunet-transport-profiler.c:631
7302#, fuzzy
7303msgid "number of messages to send"
7304msgstr "æ¯æ¬¡è¿­ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡"
7305
7306#: src/transport/gnunet-transport-profiler.c:636
7307#, fuzzy
7308msgid "message size to use"
7309msgstr "消æ¯å°ºå¯¸"
7310
7311#: src/transport/gnunet-transport-profiler.c:641
7312#: src/transport/gnunet-transport.c:1462
7313msgid "peer identity"
7314msgstr ""
7315
7316#: src/transport/gnunet-transport-profiler.c:652
7317#: src/transport/gnunet-transport.c:1482
7318#, fuzzy
7319msgid "Direct access to transport service."
7320msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
7321
7110#: src/transport/gnunet-transport.c:413 7322#: src/transport/gnunet-transport.c:413
7111#, c-format 7323#, c-format
7112msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" 7324msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7243,11 +7455,6 @@ msgstr ""
7243msgid "do not resolve hostnames" 7455msgid "do not resolve hostnames"
7244msgstr "" 7456msgstr ""
7245 7457
7246#: src/transport/gnunet-transport.c:1462
7247#: src/transport/gnunet-transport-profiler.c:641
7248msgid "peer identity"
7249msgstr ""
7250
7251#: src/transport/gnunet-transport.c:1466 7458#: src/transport/gnunet-transport.c:1466
7252msgid "monitor plugin sessions" 7459msgid "monitor plugin sessions"
7253msgstr "" 7460msgstr ""
@@ -7256,42 +7463,9 @@ msgstr ""
7256msgid "send data for benchmarking to the other peer (until CTRL-C)" 7463msgid "send data for benchmarking to the other peer (until CTRL-C)"
7257msgstr "" 7464msgstr ""
7258 7465
7259#: src/transport/gnunet-transport.c:1482
7260#: src/transport/gnunet-transport-profiler.c:652
7261#, fuzzy
7262msgid "Direct access to transport service."
7263msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
7264
7265#: src/transport/gnunet-transport-profiler.c:219
7266#, c-format
7267msgid "%llu B in %llu ms == %.2f KB/s!\n"
7268msgstr ""
7269
7270#: src/transport/gnunet-transport-profiler.c:617
7271msgid "send data to peer"
7272msgstr ""
7273
7274#: src/transport/gnunet-transport-profiler.c:621
7275msgid "receive data from peer"
7276msgstr ""
7277
7278#: src/transport/gnunet-transport-profiler.c:626
7279msgid "iterations"
7280msgstr ""
7281
7282#: src/transport/gnunet-transport-profiler.c:631
7283#, fuzzy
7284msgid "number of messages to send"
7285msgstr "æ¯æ¬¡è¿­ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡"
7286
7287#: src/transport/gnunet-transport-profiler.c:636
7288#, fuzzy
7289msgid "message size to use"
7290msgstr "消æ¯å°ºå¯¸"
7291
7292#: src/transport/plugin_transport_http_client.c:1474 7466#: src/transport/plugin_transport_http_client.c:1474
7293#: src/transport/plugin_transport_http_server.c:2249 7467#: src/transport/plugin_transport_http_server.c:2312
7294#: src/transport/plugin_transport_http_server.c:3463 7468#: src/transport/plugin_transport_http_server.c:3526
7295#: src/transport/plugin_transport_tcp.c:3890 7469#: src/transport/plugin_transport_tcp.c:3890
7296#: src/transport/plugin_transport_tcp.c:3897 7470#: src/transport/plugin_transport_tcp.c:3897
7297msgid "TCP_STEALTH not supported on this platform.\n" 7471msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7303,13 +7477,13 @@ msgid "Could not initialize curl multi handle, failed to start %s plugin!\n"
7303msgstr "" 7477msgstr ""
7304 7478
7305#: src/transport/plugin_transport_http_client.c:2164 7479#: src/transport/plugin_transport_http_client.c:2164
7306#: src/transport/plugin_transport_http_server.c:3178 7480#: src/transport/plugin_transport_http_server.c:3241
7307#, fuzzy, c-format 7481#, fuzzy, c-format
7308msgid "Shutting down plugin `%s'\n" 7482msgid "Shutting down plugin `%s'\n"
7309msgstr "未知的命令“%sâ€ã€‚\n" 7483msgstr "未知的命令“%sâ€ã€‚\n"
7310 7484
7311#: src/transport/plugin_transport_http_client.c:2181 7485#: src/transport/plugin_transport_http_client.c:2181
7312#: src/transport/plugin_transport_http_server.c:3248 7486#: src/transport/plugin_transport_http_server.c:3311
7313#, c-format 7487#, c-format
7314msgid "Shutdown for plugin `%s' complete\n" 7488msgid "Shutdown for plugin `%s' complete\n"
7315msgstr "" 7489msgstr ""
@@ -7319,106 +7493,106 @@ msgstr ""
7319msgid "Maximum number of requests is %u\n" 7493msgid "Maximum number of requests is %u\n"
7320msgstr "增加 TCP/IP 的最大连接数" 7494msgstr "增加 TCP/IP 的最大连接数"
7321 7495
7322#: src/transport/plugin_transport_http_server.c:1727 7496#: src/transport/plugin_transport_http_server.c:1756
7323#, c-format 7497#, c-format
7324msgid "" 7498msgid ""
7325"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data " 7499"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
7326"size %u\n" 7500"size %u\n"
7327msgstr "" 7501msgstr ""
7328 7502
7329#: src/transport/plugin_transport_http_server.c:1967 7503#: src/transport/plugin_transport_http_server.c:2028
7330#, c-format 7504#, c-format
7331msgid "Accepting connection (%u of %u) from `%s'\n" 7505msgid "Accepting connection (%u of %u) from `%s'\n"
7332msgstr "" 7506msgstr ""
7333 7507
7334#: src/transport/plugin_transport_http_server.c:1975 7508#: src/transport/plugin_transport_http_server.c:2036
7335#, c-format 7509#, c-format
7336msgid "" 7510msgid ""
7337"Server reached maximum number connections (%u), rejecting new connection\n" 7511"Server reached maximum number connections (%u), rejecting new connection\n"
7338msgstr "" 7512msgstr ""
7339 7513
7340#: src/transport/plugin_transport_http_server.c:2125 7514#: src/transport/plugin_transport_http_server.c:2186
7341msgid "" 7515msgid ""
7342"Could not create a new TLS certificate, program `gnunet-transport-" 7516"Could not create a new TLS certificate, program `gnunet-transport-"
7343"certificate-creation' could not be started!\n" 7517"certificate-creation' could not be started!\n"
7344msgstr "" 7518msgstr ""
7345 7519
7346#: src/transport/plugin_transport_http_server.c:2148 7520#: src/transport/plugin_transport_http_server.c:2209
7347#, c-format 7521#, c-format
7348msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" 7522msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
7349msgstr "" 7523msgstr ""
7350 7524
7351#: src/transport/plugin_transport_http_server.c:2275 7525#: src/transport/plugin_transport_http_server.c:2338
7352msgid "Could not load or create server certificate! Loading plugin failed!\n" 7526msgid "Could not load or create server certificate! Loading plugin failed!\n"
7353msgstr "" 7527msgstr ""
7354 7528
7355#: src/transport/plugin_transport_http_server.c:2587 7529#: src/transport/plugin_transport_http_server.c:2650
7356#, fuzzy 7530#, fuzzy
7357msgid "Require valid port number for service in configuration!\n" 7531msgid "Require valid port number for service in configuration!\n"
7358msgstr "ä¿å­˜é…置失败。" 7532msgstr "ä¿å­˜é…置失败。"
7359 7533
7360#: src/transport/plugin_transport_http_server.c:2752 7534#: src/transport/plugin_transport_http_server.c:2815
7361#, c-format 7535#, c-format
7362msgid "Found %u addresses to report to NAT service\n" 7536msgid "Found %u addresses to report to NAT service\n"
7363msgstr "" 7537msgstr ""
7364 7538
7365#: src/transport/plugin_transport_http_server.c:2838 7539#: src/transport/plugin_transport_http_server.c:2901
7366#: src/transport/plugin_transport_udp.c:3622 7540#: src/transport/plugin_transport_udp.c:3622
7367msgid "Disabling IPv6 since it is not supported on this system!\n" 7541msgid "Disabling IPv6 since it is not supported on this system!\n"
7368msgstr "" 7542msgstr ""
7369 7543
7370#: src/transport/plugin_transport_http_server.c:2944 7544#: src/transport/plugin_transport_http_server.c:3007
7371#, c-format 7545#, c-format
7372msgid "IPv4 support is %s\n" 7546msgid "IPv4 support is %s\n"
7373msgstr "" 7547msgstr ""
7374 7548
7375#: src/transport/plugin_transport_http_server.c:2959 7549#: src/transport/plugin_transport_http_server.c:3022
7376#, c-format 7550#, c-format
7377msgid "IPv6 support is %s\n" 7551msgid "IPv6 support is %s\n"
7378msgstr "" 7552msgstr ""
7379 7553
7380#: src/transport/plugin_transport_http_server.c:2965 7554#: src/transport/plugin_transport_http_server.c:3028
7381msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" 7555msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
7382msgstr "" 7556msgstr ""
7383 7557
7384#: src/transport/plugin_transport_http_server.c:2976 7558#: src/transport/plugin_transport_http_server.c:3039
7385#, fuzzy 7559#, fuzzy
7386msgid "Port is required! Fix in configuration\n" 7560msgid "Port is required! Fix in configuration\n"
7387msgstr "" 7561msgstr ""
7388"\n" 7562"\n"
7389"结æŸé…置。\n" 7563"结æŸé…置。\n"
7390 7564
7391#: src/transport/plugin_transport_http_server.c:2982 7565#: src/transport/plugin_transport_http_server.c:3045
7392#, c-format 7566#, c-format
7393msgid "Using port %u\n" 7567msgid "Using port %u\n"
7394msgstr "" 7568msgstr ""
7395 7569
7396#: src/transport/plugin_transport_http_server.c:3001 7570#: src/transport/plugin_transport_http_server.c:3064
7397#, c-format 7571#, c-format
7398msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" 7572msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
7399msgstr "" 7573msgstr ""
7400 7574
7401#: src/transport/plugin_transport_http_server.c:3036 7575#: src/transport/plugin_transport_http_server.c:3099
7402#, c-format 7576#, c-format
7403msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" 7577msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
7404msgstr "" 7578msgstr ""
7405 7579
7406#: src/transport/plugin_transport_http_server.c:3111 7580#: src/transport/plugin_transport_http_server.c:3174
7407#, fuzzy, c-format 7581#, fuzzy, c-format
7408msgid "Using external hostname `%s'\n" 7582msgid "Using external hostname `%s'\n"
7409msgstr "å¸è½½ GNUnet æœåŠ¡" 7583msgstr "å¸è½½ GNUnet æœåŠ¡"
7410 7584
7411#: src/transport/plugin_transport_http_server.c:3132 7585#: src/transport/plugin_transport_http_server.c:3195
7412#, c-format 7586#, c-format
7413msgid "Notifying transport only about hostname `%s'\n" 7587msgid "Notifying transport only about hostname `%s'\n"
7414msgstr "" 7588msgstr ""
7415 7589
7416#: src/transport/plugin_transport_http_server.c:3149 7590#: src/transport/plugin_transport_http_server.c:3212
7417#, fuzzy, c-format 7591#, fuzzy, c-format
7418msgid "Maximum number of connections is %u\n" 7592msgid "Maximum number of connections is %u\n"
7419msgstr "增加 TCP/IP 的最大连接数" 7593msgstr "增加 TCP/IP 的最大连接数"
7420 7594
7421#: src/transport/plugin_transport_http_server.c:3475 7595#: src/transport/plugin_transport_http_server.c:3538
7422#, fuzzy 7596#, fuzzy
7423msgid "Unable to compile URL regex\n" 7597msgid "Unable to compile URL regex\n"
7424msgstr "无法åˆå§‹åŒ– SQLite:%s。\n" 7598msgstr "无法åˆå§‹åŒ– SQLite:%s。\n"
@@ -7565,20 +7739,6 @@ msgstr ""
7565msgid "TCP transport advertises itself as being on port %llu\n" 7739msgid "TCP transport advertises itself as being on port %llu\n"
7566msgstr "" 7740msgstr ""
7567 7741
7568#: src/transport/plugin_transport_udp_broadcasting.c:168
7569msgid "# Multicast HELLO beacons received via UDP"
7570msgstr ""
7571
7572#: src/transport/plugin_transport_udp_broadcasting.c:548
7573msgid ""
7574"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7575msgstr ""
7576
7577#: src/transport/plugin_transport_udp_broadcasting.c:565
7578#, c-format
7579msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7580msgstr ""
7581
7582#: src/transport/plugin_transport_udp.c:3366 7742#: src/transport/plugin_transport_udp.c:3366
7583#, c-format 7743#, c-format
7584msgid "" 7744msgid ""
@@ -7627,6 +7787,20 @@ msgstr "“%sâ€ä¸å¯ç”¨ã€‚\n"
7627msgid "Failed to create UDP network sockets\n" 7787msgid "Failed to create UDP network sockets\n"
7628msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" 7788msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
7629 7789
7790#: src/transport/plugin_transport_udp_broadcasting.c:168
7791msgid "# Multicast HELLO beacons received via UDP"
7792msgstr ""
7793
7794#: src/transport/plugin_transport_udp_broadcasting.c:548
7795msgid ""
7796"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
7797msgstr ""
7798
7799#: src/transport/plugin_transport_udp_broadcasting.c:565
7800#, c-format
7801msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
7802msgstr ""
7803
7630#: src/transport/plugin_transport_unix.c:1403 7804#: src/transport/plugin_transport_unix.c:1403
7631#, fuzzy, c-format 7805#, fuzzy, c-format
7632msgid "Cannot create path to `%s'\n" 7806msgid "Cannot create path to `%s'\n"
@@ -7731,7 +7905,7 @@ msgid ""
7731"`GNUNET_SERVER_receive_done' after %s\n" 7905"`GNUNET_SERVER_receive_done' after %s\n"
7732msgstr "" 7906msgstr ""
7733 7907
7734#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337 7908#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
7735#, c-format 7909#, c-format
7736msgid "Unknown address family %d\n" 7910msgid "Unknown address family %d\n"
7737msgstr "" 7911msgstr ""
@@ -7776,51 +7950,51 @@ msgstr "è¿è¡Œ %s失败:%s %d\n"
7776msgid "Service `%s' runs at %s\n" 7950msgid "Service `%s' runs at %s\n"
7777msgstr "" 7951msgstr ""
7778 7952
7779#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501 7953#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
7780msgid "Service process failed to initialize\n" 7954msgid "Service process failed to initialize\n"
7781msgstr "" 7955msgstr ""
7782 7956
7783#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505 7957#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
7784msgid "Service process could not initialize server function\n" 7958msgid "Service process could not initialize server function\n"
7785msgstr "" 7959msgstr ""
7786 7960
7787#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509 7961#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
7788msgid "Service process failed to report status\n" 7962msgid "Service process failed to report status\n"
7789msgstr "" 7963msgstr ""
7790 7964
7791#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488 7965#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
7792#: src/util/service.c:1379 7966#: src/util/service.c:1378
7793#, c-format 7967#, c-format
7794msgid "Cannot obtain information about user `%s': %s\n" 7968msgid "Cannot obtain information about user `%s': %s\n"
7795msgstr "无法获å–有关用户“%sâ€çš„ä¿¡æ¯ï¼š%s\n" 7969msgstr "无法获å–有关用户“%sâ€çš„ä¿¡æ¯ï¼š%s\n"
7796 7970
7797#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381 7971#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
7798msgid "No such user" 7972msgid "No such user"
7799msgstr "无此用户" 7973msgstr "无此用户"
7800 7974
7801#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400 7975#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
7802#, c-format 7976#, c-format
7803msgid "Cannot change user/group to `%s': %s\n" 7977msgid "Cannot change user/group to `%s': %s\n"
7804msgstr "无法更改用户/组为“%sâ€ï¼š%s\n" 7978msgstr "无法更改用户/组为“%sâ€ï¼š%s\n"
7805 7979
7806#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728 7980#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
7807msgid "do daemonize (detach from terminal)" 7981msgid "do daemonize (detach from terminal)"
7808msgstr "" 7982msgstr ""
7809 7983
7810#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244 7984#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
7811#: src/util/service.c:1791 7985#: src/util/service.c:1790
7812#, fuzzy, c-format 7986#, fuzzy, c-format
7813msgid "Malformed configuration file `%s', exit ...\n" 7987msgid "Malformed configuration file `%s', exit ...\n"
7814msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 7988msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
7815 7989
7816#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261 7990#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
7817#: src/util/service.c:1802 7991#: src/util/service.c:1801
7818#, fuzzy 7992#, fuzzy
7819msgid "Malformed configuration, exit ...\n" 7993msgid "Malformed configuration, exit ...\n"
7820msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 7994msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
7821 7995
7822#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256 7996#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
7823#: src/util/service.c:1808 7997#: src/util/service.c:1807
7824#, fuzzy, c-format 7998#, fuzzy, c-format
7825msgid "Could not access configuration file `%s'\n" 7999msgid "Could not access configuration file `%s'\n"
7826msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" 8000msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n"
@@ -7864,86 +8038,86 @@ msgstr ""
7864msgid "Need a non-empty hostname for service `%s'.\n" 8038msgid "Need a non-empty hostname for service `%s'.\n"
7865msgstr "" 8039msgstr ""
7866 8040
7867#: src/util/common_logging.c:256 src/util/common_logging.c:1129 8041#: src/util/common_logging.c:259 src/util/common_logging.c:1132
7868msgid "DEBUG" 8042msgid "DEBUG"
7869msgstr "调试" 8043msgstr "调试"
7870 8044
7871#: src/util/common_logging.c:258 src/util/common_logging.c:1127 8045#: src/util/common_logging.c:261 src/util/common_logging.c:1130
7872msgid "INFO" 8046msgid "INFO"
7873msgstr "ä¿¡æ¯" 8047msgstr "ä¿¡æ¯"
7874 8048
7875#: src/util/common_logging.c:260 src/util/common_logging.c:1125 8049#: src/util/common_logging.c:263 src/util/common_logging.c:1128
7876msgid "MESSAGE" 8050msgid "MESSAGE"
7877msgstr "" 8051msgstr ""
7878 8052
7879#: src/util/common_logging.c:262 src/util/common_logging.c:1123 8053#: src/util/common_logging.c:265 src/util/common_logging.c:1126
7880msgid "WARNING" 8054msgid "WARNING"
7881msgstr "警告" 8055msgstr "警告"
7882 8056
7883#: src/util/common_logging.c:264 src/util/common_logging.c:1121 8057#: src/util/common_logging.c:267 src/util/common_logging.c:1124
7884msgid "ERROR" 8058msgid "ERROR"
7885msgstr "错误" 8059msgstr "错误"
7886 8060
7887#: src/util/common_logging.c:266 src/util/common_logging.c:1131 8061#: src/util/common_logging.c:269 src/util/common_logging.c:1134
7888msgid "NONE" 8062msgid "NONE"
7889msgstr "" 8063msgstr ""
7890 8064
7891#: src/util/common_logging.c:879 8065#: src/util/common_logging.c:882
7892#, fuzzy, c-format 8066#, fuzzy, c-format
7893msgid "Message `%.*s' repeated %u times in the last %s\n" 8067msgid "Message `%.*s' repeated %u times in the last %s\n"
7894msgstr "消æ¯â€œ%.*sâ€é‡å¤äº† %u 次,在最近 %llu 秒内\n" 8068msgstr "消æ¯â€œ%.*sâ€é‡å¤äº† %u 次,在最近 %llu 秒内\n"
7895 8069
7896#: src/util/common_logging.c:1132 8070#: src/util/common_logging.c:1135
7897msgid "INVALID" 8071msgid "INVALID"
7898msgstr "" 8072msgstr ""
7899 8073
7900#: src/util/common_logging.c:1302 8074#: src/util/common_logging.c:1326
7901msgid "unknown address" 8075msgid "unknown address"
7902msgstr "" 8076msgstr ""
7903 8077
7904#: src/util/common_logging.c:1344 8078#: src/util/common_logging.c:1368
7905msgid "invalid address" 8079msgid "invalid address"
7906msgstr "" 8080msgstr ""
7907 8081
7908#: src/util/common_logging.c:1362 8082#: src/util/common_logging.c:1386
7909#, fuzzy, c-format 8083#, fuzzy, c-format
7910msgid "Configuration fails to specify option `%s' in section `%s'!\n" 8084msgid "Configuration fails to specify option `%s' in section `%s'!\n"
7911msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n" 8085msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n"
7912 8086
7913#: src/util/common_logging.c:1383 8087#: src/util/common_logging.c:1407
7914#, fuzzy, c-format 8088#, fuzzy, c-format
7915msgid "" 8089msgid ""
7916"Configuration specifies invalid value for option `%s' in section `%s': %s\n" 8090"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
7917msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n" 8091msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n"
7918 8092
7919#: src/util/configuration.c:286 8093#: src/util/configuration.c:296
7920#, fuzzy, c-format 8094#, fuzzy, c-format
7921msgid "Syntax error while deserializing in line %u\n" 8095msgid "Syntax error while deserializing in line %u\n"
7922msgstr "é…置文件“%sâ€ç¬¬ %d 行有语法错误。\n" 8096msgstr "é…置文件“%sâ€ç¬¬ %d 行有语法错误。\n"
7923 8097
7924#: src/util/configuration.c:344 8098#: src/util/configuration.c:355
7925#, fuzzy, c-format 8099#, fuzzy, c-format
7926msgid "Error while reading file `%s'\n" 8100msgid "Error while reading file `%s'\n"
7927msgstr "è§£æž dscl 输出时出错。\n" 8101msgstr "è§£æž dscl 输出时出错。\n"
7928 8102
7929#: src/util/configuration.c:1017 8103#: src/util/configuration.c:1034
7930#, c-format 8104#, c-format
7931msgid "" 8105msgid ""
7932"Configuration value '%s' for '%s' in section '%s' is not in set of legal " 8106"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
7933"choices\n" 8107"choices\n"
7934msgstr "" 8108msgstr ""
7935 8109
7936#: src/util/configuration.c:1136 8110#: src/util/configuration.c:1153
7937#, c-format 8111#, c-format
7938msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" 8112msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
7939msgstr "" 8113msgstr ""
7940 8114
7941#: src/util/configuration.c:1169 8115#: src/util/configuration.c:1186
7942#, fuzzy, c-format 8116#, fuzzy, c-format
7943msgid "Missing closing `%s' in option `%s'\n" 8117msgid "Missing closing `%s' in option `%s'\n"
7944msgstr "é…置文件“%sâ€å·²å†™å…¥ã€‚\n" 8118msgstr "é…置文件“%sâ€å·²å†™å…¥ã€‚\n"
7945 8119
7946#: src/util/configuration.c:1237 8120#: src/util/configuration.c:1254
7947#, c-format 8121#, c-format
7948msgid "" 8122msgid ""
7949"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined " 8123"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -7977,32 +8151,32 @@ msgstr "对驱动器“%2$sâ€çš„“%1$sâ€æ“作失败:%3$u\n"
7977msgid "EdDSA signature verification failed at %s:%d: %s\n" 8151msgid "EdDSA signature verification failed at %s:%d: %s\n"
7978msgstr "对驱动器“%2$sâ€çš„“%1$sâ€æ“作失败:%3$u\n" 8152msgstr "对驱动器“%2$sâ€çš„“%1$sâ€æ“作失败:%3$u\n"
7979 8153
7980#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160 8154#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
7981#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316 8155#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
7982#, fuzzy, c-format 8156#, fuzzy, c-format
7983msgid "Could not acquire lock on file `%s': %s...\n" 8157msgid "Could not acquire lock on file `%s': %s...\n"
7984msgstr "无法解æžâ€œ%sâ€(%s):%s\n" 8158msgstr "无法解æžâ€œ%sâ€(%s):%s\n"
7985 8159
7986#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283 8160#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
7987#, fuzzy 8161#, fuzzy
7988msgid "Creating a new private key. This may take a while.\n" 8162msgid "Creating a new private key. This may take a while.\n"
7989msgstr "正在å¯åŠ¨æ•°æ®ä»“库转æ¢(å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´)。\n" 8163msgstr "正在å¯åŠ¨æ•°æ®ä»“库转æ¢(å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´)。\n"
7990 8164
7991#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320 8165#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
7992msgid "This may be ok if someone is currently generating a private key.\n" 8166msgid "This may be ok if someone is currently generating a private key.\n"
7993msgstr "" 8167msgstr ""
7994 8168
7995#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350 8169#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
7996#, c-format 8170#, c-format
7997msgid "" 8171msgid ""
7998"When trying to read key file `%s' I found %u bytes but I need at least %u.\n" 8172"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
7999msgstr "" 8173msgstr ""
8000 8174
8001#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354 8175#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
8002msgid "This may be ok if someone is currently generating a key.\n" 8176msgid "This may be ok if someone is currently generating a key.\n"
8003msgstr "" 8177msgstr ""
8004 8178
8005#: src/util/crypto_ecc_setup.c:413 8179#: src/util/crypto_ecc_setup.c:415
8006#, fuzzy 8180#, fuzzy
8007msgid "Could not load peer's private key\n" 8181msgid "Could not load peer's private key\n"
8008msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" 8182msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n"
@@ -8193,82 +8367,86 @@ msgstr ""
8193msgid "Manipulate GNUnet configuration files" 8367msgid "Manipulate GNUnet configuration files"
8194msgstr "更改é…置文件中的一个值" 8368msgstr "更改é…置文件中的一个值"
8195 8369
8196#: src/util/gnunet-ecc.c:84 8370#: src/util/gnunet-ecc.c:89
8197#, fuzzy, c-format 8371#, fuzzy, c-format
8198msgid "Failed to open `%s': %s\n" 8372msgid "Failed to open `%s': %s\n"
8199msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" 8373msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n"
8200 8374
8201#: src/util/gnunet-ecc.c:120 8375#: src/util/gnunet-ecc.c:125
8202#, c-format 8376#, c-format
8203msgid "Generating %u keys like %s, please wait" 8377msgid "Generating %u keys like %s, please wait"
8204msgstr "" 8378msgstr ""
8205 8379
8206#: src/util/gnunet-ecc.c:133 8380#: src/util/gnunet-ecc.c:138
8207#, c-format 8381#, c-format
8208msgid "Generating %u keys, please wait" 8382msgid "Generating %u keys, please wait"
8209msgstr "" 8383msgstr ""
8210 8384
8211#: src/util/gnunet-ecc.c:174 8385#: src/util/gnunet-ecc.c:179
8212#, fuzzy, c-format 8386#, fuzzy, c-format
8213msgid "" 8387msgid ""
8214"\n" 8388"\n"
8215"Failed to write to `%s': %s\n" 8389"Failed to write to `%s': %s\n"
8216msgstr "è¿è¡Œ %s失败:%s %d\n" 8390msgstr "è¿è¡Œ %s失败:%s %d\n"
8217 8391
8218#: src/util/gnunet-ecc.c:184 8392#: src/util/gnunet-ecc.c:189
8219#, c-format 8393#, c-format
8220msgid "" 8394msgid ""
8221"\n" 8395"\n"
8222"Finished!\n" 8396"Finished!\n"
8223msgstr "" 8397msgstr ""
8224 8398
8225#: src/util/gnunet-ecc.c:187 8399#: src/util/gnunet-ecc.c:192
8226#, c-format 8400#, c-format
8227msgid "" 8401msgid ""
8228"\n" 8402"\n"
8229"Error, %u keys not generated\n" 8403"Error, %u keys not generated\n"
8230msgstr "" 8404msgstr ""
8231 8405
8232#: src/util/gnunet-ecc.c:280 8406#: src/util/gnunet-ecc.c:283
8233#, c-format 8407#, c-format
8234msgid "Hostkeys file `%s' not found\n" 8408msgid "Hostkeys file `%s' not found\n"
8235msgstr "" 8409msgstr ""
8236 8410
8237#: src/util/gnunet-ecc.c:291 8411#: src/util/gnunet-ecc.c:294
8238#, fuzzy, c-format 8412#, fuzzy, c-format
8239msgid "Hostkeys file `%s' is empty\n" 8413msgid "Hostkeys file `%s' is empty\n"
8240msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" 8414msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n"
8241 8415
8242#: src/util/gnunet-ecc.c:313 8416#: src/util/gnunet-ecc.c:316
8243#, fuzzy, c-format 8417#, fuzzy, c-format
8244msgid "Could not read hostkey file: %s\n" 8418msgid "Could not read hostkey file: %s\n"
8245msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" 8419msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n"
8246 8420
8247#: src/util/gnunet-ecc.c:364 8421#: src/util/gnunet-ecc.c:367
8248msgid "No hostkey file specified on command line\n" 8422msgid "No hostkey file specified on command line\n"
8249msgstr "" 8423msgstr ""
8250 8424
8251#: src/util/gnunet-ecc.c:416 8425#: src/util/gnunet-ecc.c:425
8252msgid "list keys included in a file (for testing)" 8426msgid "list keys included in a file (for testing)"
8253msgstr "" 8427msgstr ""
8254 8428
8255#: src/util/gnunet-ecc.c:421 8429#: src/util/gnunet-ecc.c:430
8256msgid "number of keys to list included in a file (for testing)" 8430msgid "number of keys to list included in a file (for testing)"
8257msgstr "" 8431msgstr ""
8258 8432
8259#: src/util/gnunet-ecc.c:426 8433#: src/util/gnunet-ecc.c:435
8260msgid "create COUNT public-private key pairs (for testing)" 8434msgid "create COUNT public-private key pairs (for testing)"
8261msgstr "" 8435msgstr ""
8262 8436
8263#: src/util/gnunet-ecc.c:430 8437#: src/util/gnunet-ecc.c:439
8264msgid "print the public key in ASCII format" 8438msgid "print the public key in ASCII format"
8265msgstr "" 8439msgstr ""
8266 8440
8267#: src/util/gnunet-ecc.c:434 8441#: src/util/gnunet-ecc.c:443
8442msgid "print the public key in HEX format"
8443msgstr ""
8444
8445#: src/util/gnunet-ecc.c:447
8268msgid "print examples of ECC operations (used for compatibility testing)" 8446msgid "print examples of ECC operations (used for compatibility testing)"
8269msgstr "" 8447msgstr ""
8270 8448
8271#: src/util/gnunet-ecc.c:449 8449#: src/util/gnunet-ecc.c:463
8272#, fuzzy 8450#, fuzzy
8273msgid "Manipulate GNUnet private ECC key files" 8451msgid "Manipulate GNUnet private ECC key files"
8274msgstr "更改é…置文件中的一个值" 8452msgstr "更改é…置文件中的一个值"
@@ -8362,7 +8540,7 @@ msgstr "创建用户出错"
8362msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8540msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8363msgstr "" 8541msgstr ""
8364 8542
8365#: src/util/network.c:1793 src/util/network.c:1969 8543#: src/util/network.c:1793 src/util/network.c:1977
8366#, c-format 8544#, c-format
8367msgid "" 8545msgid ""
8368"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8546"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8415,7 +8593,7 @@ msgstr ""
8415msgid "Could not determine plugin installation path.\n" 8593msgid "Could not determine plugin installation path.\n"
8416msgstr "无法确定用户界é¢å®šä¹‰æ–‡ä»¶ã€‚" 8594msgstr "无法确定用户界é¢å®šä¹‰æ–‡ä»¶ã€‚"
8417 8595
8418#: src/util/resolver_api.c:204 8596#: src/util/resolver_api.c:203
8419#, c-format 8597#, c-format
8420msgid "" 8598msgid ""
8421"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n" 8599"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8428,32 +8606,32 @@ msgid ""
8428"resolution will be unavailable.\n" 8606"resolution will be unavailable.\n"
8429msgstr "" 8607msgstr ""
8430 8608
8431#: src/util/resolver_api.c:815 8609#: src/util/resolver_api.c:826
8432#, c-format 8610#, c-format
8433msgid "Timeout trying to resolve hostname `%s'.\n" 8611msgid "Timeout trying to resolve hostname `%s'.\n"
8434msgstr "" 8612msgstr ""
8435 8613
8436#: src/util/resolver_api.c:827 8614#: src/util/resolver_api.c:839
8437#, fuzzy, c-format 8615#, fuzzy, c-format
8438msgid "Timeout trying to resolve IP address `%s'.\n" 8616msgid "Timeout trying to resolve IP address `%s'.\n"
8439msgstr "GNUnet 现在使用 IP åœ°å€ %s。\n" 8617msgstr "GNUnet 现在使用 IP åœ°å€ %s。\n"
8440 8618
8441#: src/util/resolver_api.c:1004 8619#: src/util/resolver_api.c:1023
8442msgid "Resolver not configured correctly.\n" 8620msgid "Resolver not configured correctly.\n"
8443msgstr "" 8621msgstr ""
8444 8622
8445#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107 8623#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
8446#: src/util/resolver_api.c:1121 8624#: src/util/resolver_api.c:1146
8447#, fuzzy, c-format 8625#, fuzzy, c-format
8448msgid "Could not resolve our FQDN: %s\n" 8626msgid "Could not resolve our FQDN: %s\n"
8449msgstr "无法解æžâ€œ%sâ€(%s):%s\n" 8627msgstr "无法解æžâ€œ%sâ€(%s):%s\n"
8450 8628
8451#: src/util/service.c:1306 8629#: src/util/service.c:1305
8452msgid "" 8630msgid ""
8453"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8631"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8454msgstr "" 8632msgstr ""
8455 8633
8456#: src/util/service.c:2082 8634#: src/util/service.c:2081
8457#, c-format 8635#, c-format
8458msgid "" 8636msgid ""
8459"Processing code for message of type %u did not call " 8637"Processing code for message of type %u did not call "
@@ -8530,63 +8708,63 @@ msgstr " 天"
8530msgid "end of time" 8708msgid "end of time"
8531msgstr "" 8709msgstr ""
8532 8710
8533#: src/util/strings.c:1269 8711#: src/util/strings.c:1270
8534msgid "IPv6 address did not start with `['\n" 8712msgid "IPv6 address did not start with `['\n"
8535msgstr "" 8713msgstr ""
8536 8714
8537#: src/util/strings.c:1277 8715#: src/util/strings.c:1278
8538msgid "IPv6 address did contain ':' to separate port number\n" 8716msgid "IPv6 address did contain ':' to separate port number\n"
8539msgstr "" 8717msgstr ""
8540 8718
8541#: src/util/strings.c:1283 8719#: src/util/strings.c:1284
8542msgid "IPv6 address did contain ']' before ':' to separate port number\n" 8720msgid "IPv6 address did contain ']' before ':' to separate port number\n"
8543msgstr "" 8721msgstr ""
8544 8722
8545#: src/util/strings.c:1290 8723#: src/util/strings.c:1291
8546msgid "IPv6 address did contain a valid port number after the last ':'\n" 8724msgid "IPv6 address did contain a valid port number after the last ':'\n"
8547msgstr "" 8725msgstr ""
8548 8726
8549#: src/util/strings.c:1299 8727#: src/util/strings.c:1300
8550#, fuzzy, c-format 8728#, fuzzy, c-format
8551msgid "Invalid IPv6 address `%s': %s\n" 8729msgid "Invalid IPv6 address `%s': %s\n"
8552msgstr "无效的进程优先级“%sâ€\n" 8730msgstr "无效的进程优先级“%sâ€\n"
8553 8731
8554#: src/util/strings.c:1571 src/util/strings.c:1587 8732#: src/util/strings.c:1572 src/util/strings.c:1588
8555msgid "Port not in range\n" 8733msgid "Port not in range\n"
8556msgstr "" 8734msgstr ""
8557 8735
8558#: src/util/strings.c:1596 8736#: src/util/strings.c:1597
8559#, fuzzy, c-format 8737#, fuzzy, c-format
8560msgid "Malformed port policy `%s'\n" 8738msgid "Malformed port policy `%s'\n"
8561msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" 8739msgstr "解æžé…置文件“%sâ€å¤±è´¥\n"
8562 8740
8563#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758 8741#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
8564#: src/util/strings.c:1779 8742#: src/util/strings.c:1780
8565#, c-format 8743#, c-format
8566msgid "Invalid format for IP: `%s'\n" 8744msgid "Invalid format for IP: `%s'\n"
8567msgstr "IP æ ¼å¼æ— æ•ˆï¼šâ€œ%sâ€\n" 8745msgstr "IP æ ¼å¼æ— æ•ˆï¼šâ€œ%sâ€\n"
8568 8746
8569#: src/util/strings.c:1736 8747#: src/util/strings.c:1737
8570#, c-format 8748#, c-format
8571msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." 8749msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
8572msgstr "网络表示法无效(“/%d†在 IPv4 CIDR 中是éžæ³•çš„)。" 8750msgstr "网络表示法无效(“/%d†在 IPv4 CIDR 中是éžæ³•çš„)。"
8573 8751
8574#: src/util/strings.c:1788 8752#: src/util/strings.c:1789
8575#, fuzzy, c-format 8753#, fuzzy, c-format
8576msgid "Invalid format: `%s'\n" 8754msgid "Invalid format: `%s'\n"
8577msgstr "IP æ ¼å¼æ— æ•ˆï¼šâ€œ%sâ€\n" 8755msgstr "IP æ ¼å¼æ— æ•ˆï¼šâ€œ%sâ€\n"
8578 8756
8579#: src/util/strings.c:1840 8757#: src/util/strings.c:1841
8580#, c-format 8758#, c-format
8581msgid "Invalid network notation (does not end with ';': `%s')\n" 8759msgid "Invalid network notation (does not end with ';': `%s')\n"
8582msgstr "无效的网络表示法(没有以“;â€ç»“尾:“%sâ€)\n" 8760msgstr "无效的网络表示法(没有以“;â€ç»“尾:“%sâ€)\n"
8583 8761
8584#: src/util/strings.c:1890 8762#: src/util/strings.c:1891
8585#, c-format 8763#, c-format
8586msgid "Wrong format `%s' for netmask\n" 8764msgid "Wrong format `%s' for netmask\n"
8587msgstr "网络掩ç çš„æ ¼å¼â€œ%sâ€é”™è¯¯\n" 8765msgstr "网络掩ç çš„æ ¼å¼â€œ%sâ€é”™è¯¯\n"
8588 8766
8589#: src/util/strings.c:1921 8767#: src/util/strings.c:1922
8590#, c-format 8768#, c-format
8591msgid "Wrong format `%s' for network\n" 8769msgid "Wrong format `%s' for network\n"
8592msgstr "网络的格å¼â€œ%sâ€é”™è¯¯\n" 8770msgstr "网络的格å¼â€œ%sâ€é”™è¯¯\n"
@@ -8761,28 +8939,44 @@ msgstr ""
8761msgid "Setup tunnels via VPN." 8939msgid "Setup tunnels via VPN."
8762msgstr "" 8940msgstr ""
8763 8941
8764#: src/zonemaster/gnunet-service-zonemaster.c:705 8942#: src/zonemaster/gnunet-service-zonemaster.c:706
8765#, fuzzy 8943#, fuzzy
8766msgid "Failed to connect to the namestore!\n" 8944msgid "Failed to connect to the namestore!\n"
8767msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 8945msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
8768 8946
8769#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681 8947#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
8770#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699 8948#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
8771#, c-format 8949#, c-format
8772msgid "Assertion failed at %s:%d.\n" 8950msgid "Assertion failed at %s:%d.\n"
8773msgstr "" 8951msgstr ""
8774 8952
8775#: src/include/gnunet_common.h:711 8953#: src/include/gnunet_common.h:726
8776#, c-format 8954#, c-format
8777msgid "External protocol violation detected at %s:%d.\n" 8955msgid "External protocol violation detected at %s:%d.\n"
8778msgstr "" 8956msgstr ""
8779 8957
8780#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747 8958#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
8781#, c-format 8959#, c-format
8782msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" 8960msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
8783msgstr "" 8961msgstr ""
8784 8962
8785#, fuzzy 8963#, fuzzy
8964#~ msgid "Token `%s' is malformed\n"
8965#~ msgstr "“%sâ€çš„å‚数无效。\n"
8966
8967#, fuzzy
8968#~ msgid "Failed to create indices\n"
8969#~ msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
8970
8971#, fuzzy
8972#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
8973#~ msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n"
8974
8975#, fuzzy
8976#~ msgid "Unable to connect to Postgres database '%s': %s\n"
8977#~ msgstr "无法ä¿å­˜é…置文件“%sâ€ï¼š"
8978
8979#, fuzzy
8786#~ msgid "Misconfiguration (can not connect to the ARM service)" 8980#~ msgid "Misconfiguration (can not connect to the ARM service)"
8787#~ msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 8981#~ msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
8788 8982
@@ -9079,10 +9273,6 @@ msgstr ""
9079#~ msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" 9273#~ msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n"
9080 9274
9081#, fuzzy 9275#, fuzzy
9082#~ msgid "Error reading sensor version\n"
9083#~ msgstr "创建用户出错"
9084
9085#, fuzzy
9086#~ msgid "Error reading sensor category\n" 9276#~ msgid "Error reading sensor category\n"
9087#~ msgstr "创建用户出错" 9277#~ msgstr "创建用户出错"
9088 9278
@@ -9405,10 +9595,6 @@ msgstr ""
9405#~ msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" 9595#~ msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n"
9406 9596
9407#, fuzzy 9597#, fuzzy
9408#~ msgid "Failed to remove records from database"
9409#~ msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n"
9410
9411#, fuzzy
9412#~ msgid "Failed to access database" 9598#~ msgid "Failed to access database"
9413#~ msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" 9599#~ msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n"
9414 9600
diff --git a/src/Makefile.am b/src/Makefile.am
index 14c66c5f7..68878b5a0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,6 +17,7 @@ endif
17 17
18if HAVE_JSON 18if HAVE_JSON
19if HAVE_MHD 19if HAVE_MHD
20 ATTRIBUTE_DIR = identity-attribute
20 PROVIDER_DIR = identity-provider 21 PROVIDER_DIR = identity-provider
21endif 22endif
22endif 23endif
@@ -116,6 +117,7 @@ SUBDIRS = \
116 revocation \ 117 revocation \
117 vpn \ 118 vpn \
118 gns \ 119 gns \
120 credential \
119 zonemaster \ 121 zonemaster \
120 $(CONVERSATION_DIR) \ 122 $(CONVERSATION_DIR) \
121 fs \ 123 fs \
@@ -130,6 +132,7 @@ SUBDIRS = \
130 social \ 132 social \
131 $(AUCTION_DIR) \ 133 $(AUCTION_DIR) \
132 $(EXP_DIR) \ 134 $(EXP_DIR) \
135 $(ATTRIBUTE_DIR) \
133 $(PROVIDER_DIR) 136 $(PROVIDER_DIR)
134 137
135endif 138endif
diff --git a/src/credential/Makefile.am b/src/credential/Makefile.am
new file mode 100644
index 000000000..ca11c5e4f
--- /dev/null
+++ b/src/credential/Makefile.am
@@ -0,0 +1,112 @@
1# This Makefile.am is in the public domain
2AM_CPPFLAGS = -I$(top_srcdir)/src/include
3
4EXTRA_DIST = \
5 test_credential_defaults.conf \
6 test_credential_lookup.conf
7
8
9if USE_COVERAGE
10 AM_CFLAGS = --coverage -O0
11endif
12
13pkgcfgdir = $(pkgdatadir)/config.d/
14
15libexecdir= $(pkglibdir)/libexec/
16
17plugindir = $(libdir)/gnunet
18
19pkgcfg_DATA = \
20 credential.conf
21
22
23# /usr/lib - compiles a layer which can be used to be communicagte with the service
24lib_LTLIBRARIES = \
25 libgnunetcredential.la
26
27# /usr/lib/gnunet/libexec - Business logic . Separate process
28libexec_PROGRAMS = \
29 gnunet-service-credential
30
31bin_PROGRAMS = \
32 gnunet-credential
33
34plugin_LTLIBRARIES = \
35 libgnunet_plugin_gnsrecord_credential.la
36
37
38if HAVE_MHD
39if HAVE_JSON
40plugin_LTLIBRARIES += libgnunet_plugin_rest_credential.la
41endif
42endif
43
44
45gnunet_credential_SOURCES = \
46 gnunet-credential.c
47gnunet_credential_LDADD = \
48 libgnunetcredential.la \
49 $(top_builddir)/src/util/libgnunetutil.la \
50 $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
51 $(top_builddir)/src/identity/libgnunetidentity.la \
52 $(GN_LIBINTL)
53
54
55libgnunet_plugin_gnsrecord_credential_la_SOURCES = \
56 plugin_gnsrecord_credential.c
57libgnunet_plugin_gnsrecord_credential_la_LIBADD = \
58 libgnunetcredential.la \
59 $(top_builddir)/src/util/libgnunetutil.la \
60 $(LTLIBINTL)
61libgnunet_plugin_gnsrecord_credential_la_LDFLAGS = \
62 $(GN_PLUGIN_LDFLAGS)
63
64
65
66gnunet_service_credential_SOURCES = \
67 gnunet-service-credential.c
68gnunet_service_credential_LDADD = \
69 libgnunetcredential.la \
70 $(top_builddir)/src/util/libgnunetutil.la \
71 $(top_builddir)/src/gns/libgnunetgns.la \
72 $(top_builddir)/src/namestore/libgnunetnamestore.la \
73 $(top_builddir)/src/statistics/libgnunetstatistics.la \
74 $(GN_LIBINTL)
75
76
77libgnunetcredential_la_SOURCES = \
78 credential_api.c \
79 credential_serialization.c \
80 credential_misc.c
81libgnunetcredential_la_LIBADD = \
82 $(top_builddir)/src/util/libgnunetutil.la $(XLIB)
83libgnunetcredential_la_LDFLAGS = \
84 $(GN_LIB_LDFLAGS)
85
86
87libgnunet_plugin_rest_credential_la_SOURCES = \
88 plugin_rest_credential.c
89libgnunet_plugin_rest_credential_la_LIBADD = \
90 libgnunetcredential.la \
91 $(top_builddir)/src/rest/libgnunetrest.la \
92 $(top_builddir)/src/identity/libgnunetidentity.la \
93 $(top_builddir)/src/jsonapi/libgnunetjsonapi.la \
94 $(top_builddir)/src/jsonapi/libgnunetjsonapiutils.la \
95 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
96 $(LTLIBINTL) -ljansson -lmicrohttpd
97libgnunet_plugin_rest_credential_la_LDFLAGS = \
98 $(GN_PLUGIN_LDFLAGS)
99
100
101check_SCRIPTS = \
102 test_credential_issue.sh \
103 test_credential_verify_simple.sh \
104 test_credential_verify.sh \
105 test_credential_verify_and.sh
106
107if ENABLE_TEST_RUN
108if HAVE_SQLITE
109 AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;
110 TESTS = $(check_SCRIPTS)
111endif
112endif
diff --git a/src/credential/credential.conf.in b/src/credential/credential.conf.in
new file mode 100644
index 000000000..71f3066ca
--- /dev/null
+++ b/src/credential/credential.conf.in
@@ -0,0 +1,5 @@
1[credential]
2BINARY = gnunet-service-credential
3UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-credential.sock
4USER_SERVICE = YES
5OPTIONS = -L DEBUG \ No newline at end of file
diff --git a/src/credential/credential.h b/src/credential/credential.h
new file mode 100644
index 000000000..f16249c1b
--- /dev/null
+++ b/src/credential/credential.h
@@ -0,0 +1,221 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2012-2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @file credential/credential.h
22 * @brief IPC messages between CREDENTIAL API and CREDENTIAL service
23 * @author Adnan Husain
24 */
25#ifndef CREDENTIAL_H
26#define CREDENTIAL_H
27
28#include "gnunet_credential_service.h"
29
30GNUNET_NETWORK_STRUCT_BEGIN
31
32/**
33 * Message from client to Credential service to collect credentials.
34 */
35struct CollectMessage
36{
37 /**
38 * Header of type #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY
39 */
40 struct GNUNET_MessageHeader header;
41
42 /**
43 * Subject public key
44 */
45 struct GNUNET_CRYPTO_EcdsaPrivateKey subject_key;
46
47 /**
48 * Trust anchor
49 */
50 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
51
52 /**
53 * Length of the issuer attribute
54 */
55 uint16_t issuer_attribute_len;
56
57 /**
58 * Unique identifier for this request (for key collisions).
59 */
60 uint32_t id GNUNET_PACKED;
61
62 /* Followed by the zero-terminated attribute */
63
64};
65
66
67/**
68 * Message from client to Credential service to verify attributes.
69 */
70struct VerifyMessage
71{
72 /**
73 * Header of type #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY
74 */
75 struct GNUNET_MessageHeader header;
76
77 /**
78 * Subject public key
79 */
80 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
81
82 /**
83 * Trust anchor
84 */
85 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
86
87 /**
88 * Number of credentials
89 */
90 uint32_t c_count;
91
92 /**
93 * Length of the issuer attribute
94 */
95 uint16_t issuer_attribute_len;
96
97 /**
98 * Unique identifier for this request (for key collisions).
99 */
100 uint32_t id GNUNET_PACKED;
101
102 /* Followed by the zero-terminated attribute and credentials to look up */
103
104};
105
106
107/**
108 * Message from CREDENTIAL service to client: new results.
109 */
110struct DelegationChainResultMessage
111{
112 /**
113 * Header of type #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT
114 */
115 struct GNUNET_MessageHeader header;
116
117 /**
118 * Unique identifier for this request (for key collisions).
119 */
120 uint32_t id GNUNET_PACKED;
121
122 /**
123 * Indicates if credential has been found at all
124 */
125 uint32_t cred_found GNUNET_PACKED;
126
127 /**
128 * The number of delegations in the response
129 */
130 uint32_t d_count GNUNET_PACKED;
131
132 /**
133 * The number of credentials in the response
134 */
135 uint32_t c_count GNUNET_PACKED;
136
137 /* followed by ad_count GNUNET_CREDENTIAL_RecordData structs*/
138
139};
140
141struct DelegationRecordData
142{
143 /**
144 * Subject key
145 */
146 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
147
148 /**
149 * Subject attributes
150 */
151 uint32_t subject_attribute_len GNUNET_PACKED;
152};
153
154
155struct ChainEntry
156{
157 /**
158 * Issuer key
159 */
160 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
161
162 /**
163 * Subject key
164 */
165 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
166
167 /**
168 * Issuer attributes
169 */
170 uint32_t issuer_attribute_len GNUNET_PACKED;
171
172 /**
173 * Subject attributes
174 */
175 uint32_t subject_attribute_len GNUNET_PACKED;
176};
177
178
179struct CredentialEntry
180{
181
182 /**
183 * The signature for this credential by the issuer
184 */
185 struct GNUNET_CRYPTO_EcdsaSignature signature;
186
187 /**
188 * Signature meta
189 */
190 struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
191
192 /**
193 * Public key of the issuer
194 */
195 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
196
197 /**
198 * Public key of the subject this credential was issued to
199 */
200 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
201
202 /**
203 * Expiration time of this credential
204 */
205 uint64_t expiration GNUNET_PACKED;
206
207 /**
208 * Issuer attribute length
209 */
210 uint32_t issuer_attribute_len;
211
212 /**
213 * Followed by the attribute string
214 */
215};
216
217
218GNUNET_NETWORK_STRUCT_END
219
220#endif
221
diff --git a/src/credential/credential_api.c b/src/credential/credential_api.c
new file mode 100644
index 000000000..ca54137ad
--- /dev/null
+++ b/src/credential/credential_api.c
@@ -0,0 +1,513 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2013, 2016 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20/**
21 * @file credential/credential_api.c
22 * @brief library to access the CREDENTIAL service
23 * @author Adnan Husain
24 */
25#include "platform.h"
26#include "gnunet_util_lib.h"
27#include "gnunet_constants.h"
28#include "gnunet_arm_service.h"
29#include "gnunet_hello_lib.h"
30#include "gnunet_protocols.h"
31#include "gnunet_signatures.h"
32#include "credential.h"
33#include "credential_serialization.h"
34#include "gnunet_credential_service.h"
35#include "gnunet_identity_service.h"
36
37
38#define LOG(kind,...) GNUNET_log_from (kind, "credential-api",__VA_ARGS__)
39
40/**
41 * Handle to a verify request
42 */
43struct GNUNET_CREDENTIAL_Request
44{
45
46 /**
47 * DLL
48 */
49 struct GNUNET_CREDENTIAL_Request *next;
50
51 /**
52 * DLL
53 */
54 struct GNUNET_CREDENTIAL_Request *prev;
55
56 /**
57 * handle to credential service
58 */
59 struct GNUNET_CREDENTIAL_Handle *credential_handle;
60
61 /**
62 * processor to call on verify result
63 */
64 GNUNET_CREDENTIAL_CredentialResultProcessor verify_proc;
65
66 /**
67 * @e verify_proc closure
68 */
69 void *proc_cls;
70
71 /**
72 * Envelope with the message for this queue entry.
73 */
74 struct GNUNET_MQ_Envelope *env;
75
76 /**
77 * request id
78 */
79 uint32_t r_id;
80
81};
82
83
84/**
85 * Connection to the CREDENTIAL service.
86 */
87struct GNUNET_CREDENTIAL_Handle
88{
89
90 /**
91 * Configuration to use.
92 */
93 const struct GNUNET_CONFIGURATION_Handle *cfg;
94
95 /**
96 * Connection to service (if available).
97 */
98 struct GNUNET_MQ_Handle *mq;
99
100 /**
101 * Head of linked list of active verify requests.
102 */
103 struct GNUNET_CREDENTIAL_Request *request_head;
104
105 /**
106 * Tail of linked list of active verify requests.
107 */
108 struct GNUNET_CREDENTIAL_Request *request_tail;
109
110 /**
111 * Reconnect task
112 */
113 struct GNUNET_SCHEDULER_Task *reconnect_task;
114
115 /**
116 * How long do we wait until we try to reconnect?
117 */
118 struct GNUNET_TIME_Relative reconnect_backoff;
119
120 /**
121 * Request Id generator. Incremented by one for each request.
122 */
123 uint32_t r_id_gen;
124
125};
126
127
128/**
129 * Reconnect to CREDENTIAL service.
130 *
131 * @param handle the handle to the CREDENTIAL service
132 */
133static void
134reconnect (struct GNUNET_CREDENTIAL_Handle *handle);
135
136
137/**
138 * Reconnect to CREDENTIAL
139 *
140 * @param cls the handle
141 */
142static void
143reconnect_task (void *cls)
144{
145 struct GNUNET_CREDENTIAL_Handle *handle = cls;
146
147 handle->reconnect_task = NULL;
148 reconnect (handle);
149}
150
151
152/**
153 * Disconnect from service and then reconnect.
154 *
155 * @param handle our handle
156 */
157static void
158force_reconnect (struct GNUNET_CREDENTIAL_Handle *handle)
159{
160 GNUNET_MQ_destroy (handle->mq);
161 handle->mq = NULL;
162 handle->reconnect_backoff
163 = GNUNET_TIME_STD_BACKOFF (handle->reconnect_backoff);
164 handle->reconnect_task
165 = GNUNET_SCHEDULER_add_delayed (handle->reconnect_backoff,
166 &reconnect_task,
167 handle);
168}
169
170
171/**
172 * Generic error handler, called with the appropriate error code and
173 * the same closure specified at the creation of the message queue.
174 * Not every message queue implementation supports an error handler.
175 *
176 * @param cls closure with the `struct GNUNET_CREDENTIAL_Handle *`
177 * @param error error code
178 */
179static void
180mq_error_handler (void *cls,
181 enum GNUNET_MQ_Error error)
182{
183 struct GNUNET_CREDENTIAL_Handle *handle = cls;
184
185 force_reconnect (handle);
186}
187
188/**
189 * Check validity of message received from the CREDENTIAL service
190 *
191 * @param cls the `struct GNUNET_CREDENTIAL_Handle *`
192 * @param loookup_msg the incoming message
193 */
194static int
195check_result (void *cls,
196 const struct DelegationChainResultMessage *vr_msg)
197{
198 //TODO
199 return GNUNET_OK;
200}
201
202
203/**
204 * Handler for messages received from the CREDENTIAL service
205 *
206 * @param cls the `struct GNUNET_CREDENTIAL_Handle *`
207 * @param loookup_msg the incoming message
208 */
209static void
210handle_result (void *cls,
211 const struct DelegationChainResultMessage *vr_msg)
212{
213 struct GNUNET_CREDENTIAL_Handle *handle = cls;
214 uint32_t r_id = ntohl (vr_msg->id);
215 struct GNUNET_CREDENTIAL_Request *vr;
216 size_t mlen = ntohs (vr_msg->header.size) - sizeof (*vr_msg);
217 uint32_t d_count = ntohl (vr_msg->d_count);
218 uint32_t c_count = ntohl (vr_msg->c_count);
219 struct GNUNET_CREDENTIAL_Delegation d_chain[d_count];
220 struct GNUNET_CREDENTIAL_Credential creds[c_count];
221 GNUNET_CREDENTIAL_CredentialResultProcessor proc;
222 void *proc_cls;
223
224 LOG (GNUNET_ERROR_TYPE_DEBUG,
225 "Received verify reply from CREDENTIAL service\n");
226 for (vr = handle->request_head; NULL != vr; vr = vr->next)
227 if (vr->r_id == r_id)
228 break;
229 if (NULL == vr)
230 return;
231 proc = vr->verify_proc;
232 proc_cls = vr->proc_cls;
233 GNUNET_CONTAINER_DLL_remove (handle->request_head,
234 handle->request_tail,
235 vr);
236 GNUNET_MQ_discard (vr->env);
237 GNUNET_free (vr);
238 GNUNET_assert (GNUNET_OK ==
239 GNUNET_CREDENTIAL_delegation_chain_deserialize (mlen,
240 (const char*) &vr_msg[1],
241 d_count,
242 d_chain,
243 c_count,
244 creds));
245 if (GNUNET_NO == ntohl (vr_msg->cred_found))
246 {
247 proc (proc_cls,
248 0,
249 NULL,
250 0,
251 NULL); // TODO
252 } else {
253 proc (proc_cls,
254 d_count,
255 d_chain,
256 c_count,
257 creds);
258 }
259}
260
261
262/**
263 * Reconnect to CREDENTIAL service.
264 *
265 * @param handle the handle to the CREDENTIAL service
266 */
267static void
268reconnect (struct GNUNET_CREDENTIAL_Handle *handle)
269{
270 struct GNUNET_MQ_MessageHandler handlers[] = {
271 GNUNET_MQ_hd_var_size (result,
272 GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT,
273 struct DelegationChainResultMessage,
274 handle),
275 GNUNET_MQ_hd_var_size (result,
276 GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT_RESULT,
277 struct DelegationChainResultMessage,
278 handle),
279 GNUNET_MQ_handler_end ()
280 };
281 struct GNUNET_CREDENTIAL_Request *vr;
282
283 GNUNET_assert (NULL == handle->mq);
284 LOG (GNUNET_ERROR_TYPE_DEBUG,
285 "Trying to connect to CREDENTIAL\n");
286 handle->mq = GNUNET_CLIENT_connect (handle->cfg,
287 "credential",
288 handlers,
289 &mq_error_handler,
290 handle);
291 if (NULL == handle->mq)
292 return;
293 for (vr = handle->request_head; NULL != vr; vr = vr->next)
294 GNUNET_MQ_send_copy (handle->mq,
295 vr->env);
296}
297
298
299/**
300 * Initialize the connection with the CREDENTIAL service.
301 *
302 * @param cfg configuration to use
303 * @return handle to the CREDENTIAL service, or NULL on error
304 */
305struct GNUNET_CREDENTIAL_Handle *
306GNUNET_CREDENTIAL_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
307{
308 struct GNUNET_CREDENTIAL_Handle *handle;
309
310 handle = GNUNET_new (struct GNUNET_CREDENTIAL_Handle);
311 handle->cfg = cfg;
312 reconnect (handle);
313 if (NULL == handle->mq)
314 {
315 GNUNET_free (handle);
316 return NULL;
317 }
318 return handle;
319}
320
321
322/**
323 * Shutdown connection with the CREDENTIAL service.
324 *
325 * @param handle handle of the CREDENTIAL connection to stop
326 */
327void
328GNUNET_CREDENTIAL_disconnect (struct GNUNET_CREDENTIAL_Handle *handle)
329{
330 if (NULL != handle->mq)
331 {
332 GNUNET_MQ_destroy (handle->mq);
333 handle->mq = NULL;
334 }
335 if (NULL != handle->reconnect_task)
336 {
337 GNUNET_SCHEDULER_cancel (handle->reconnect_task);
338 handle->reconnect_task = NULL;
339 }
340 GNUNET_assert (NULL == handle->request_head);
341 GNUNET_free (handle);
342}
343
344
345/**
346 * Cancel pending verify request
347 *
348 * @param lr the verify request to cancel
349 */
350void
351GNUNET_CREDENTIAL_request_cancel (struct GNUNET_CREDENTIAL_Request *vr)
352{
353 struct GNUNET_CREDENTIAL_Handle *handle = vr->credential_handle;
354
355 GNUNET_CONTAINER_DLL_remove (handle->request_head,
356 handle->request_tail,
357 vr);
358 GNUNET_MQ_discard (vr->env);
359 GNUNET_free (vr);
360}
361
362
363/**
364 * Performs attribute collection.
365 * Collects all credentials of subject to fulfill the
366 * attribute, if possible
367 *
368 * @param handle handle to the Credential service
369 * @param issuer_key the issuer public key
370 * @param issuer_attribute the issuer attribute
371 * @param subject_key the subject public key
372 * @param credential_count number of credentials provided
373 * @param credentials subject credentials
374 * @param proc function to call on result
375 * @param proc_cls closure for processor
376 * @return handle to the queued request
377 */
378struct GNUNET_CREDENTIAL_Request*
379GNUNET_CREDENTIAL_collect (struct GNUNET_CREDENTIAL_Handle *handle,
380 const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
381 const char *issuer_attribute,
382 const struct GNUNET_CRYPTO_EcdsaPrivateKey *subject_key,
383 GNUNET_CREDENTIAL_CredentialResultProcessor proc,
384 void *proc_cls)
385{
386 /* IPC to shorten credential names, return shorten_handle */
387 struct CollectMessage *c_msg;
388 struct GNUNET_CREDENTIAL_Request *vr;
389 size_t nlen;
390
391 if (NULL == issuer_attribute)
392 {
393 GNUNET_break (0);
394 return NULL;
395 }
396
397 //DEBUG LOG
398 LOG (GNUNET_ERROR_TYPE_DEBUG,
399 "Trying to collect `%s' in CREDENTIAL\n",
400 issuer_attribute);
401 nlen = strlen (issuer_attribute) + 1;
402 if (nlen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (*vr))
403 {
404 GNUNET_break (0);
405 return NULL;
406 }
407 vr = GNUNET_new (struct GNUNET_CREDENTIAL_Request);
408 vr->credential_handle = handle;
409 vr->verify_proc = proc;
410 vr->proc_cls = proc_cls;
411 vr->r_id = handle->r_id_gen++;
412 vr->env = GNUNET_MQ_msg_extra (c_msg,
413 nlen,
414 GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT);
415 c_msg->id = htonl (vr->r_id);
416 c_msg->subject_key = *subject_key;
417 c_msg->issuer_key = *issuer_key;
418 c_msg->issuer_attribute_len = htons(strlen(issuer_attribute));
419 GNUNET_memcpy (&c_msg[1],
420 issuer_attribute,
421 strlen (issuer_attribute));
422 GNUNET_CONTAINER_DLL_insert (handle->request_head,
423 handle->request_tail,
424 vr);
425 if (NULL != handle->mq)
426 GNUNET_MQ_send_copy (handle->mq,
427 vr->env);
428 return vr;
429}
430/**
431 * Performs attribute verification.
432 * Checks if there is a delegation chain from
433 * attribute ``issuer_attribute'' issued by the issuer
434 * with public key ``issuer_key'' maps to the attribute
435 * ``subject_attribute'' claimed by the subject with key
436 * ``subject_key''
437 *
438 * @param handle handle to the Credential service
439 * @param issuer_key the issuer public key
440 * @param issuer_attribute the issuer attribute
441 * @param subject_key the subject public key
442 * @param credential_count number of credentials provided
443 * @param credentials subject credentials
444 * @param proc function to call on result
445 * @param proc_cls closure for processor
446 * @return handle to the queued request
447 */
448struct GNUNET_CREDENTIAL_Request*
449GNUNET_CREDENTIAL_verify (struct GNUNET_CREDENTIAL_Handle *handle,
450 const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
451 const char *issuer_attribute,
452 const struct GNUNET_CRYPTO_EcdsaPublicKey *subject_key,
453 uint32_t credential_count,
454 const struct GNUNET_CREDENTIAL_Credential *credentials,
455 GNUNET_CREDENTIAL_CredentialResultProcessor proc,
456 void *proc_cls)
457{
458 /* IPC to shorten credential names, return shorten_handle */
459 struct VerifyMessage *v_msg;
460 struct GNUNET_CREDENTIAL_Request *vr;
461 size_t nlen;
462 size_t clen;
463
464 if (NULL == issuer_attribute || NULL == credentials)
465 {
466 GNUNET_break (0);
467 return NULL;
468 }
469
470 clen = GNUNET_CREDENTIAL_credentials_get_size (credential_count,
471 credentials);
472
473 //DEBUG LOG
474 LOG (GNUNET_ERROR_TYPE_DEBUG,
475 "Trying to verify `%s' in CREDENTIAL\n",
476 issuer_attribute);
477 nlen = strlen (issuer_attribute) + 1 + clen;
478 if (nlen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (*vr))
479 {
480 GNUNET_break (0);
481 return NULL;
482 }
483 vr = GNUNET_new (struct GNUNET_CREDENTIAL_Request);
484 vr->credential_handle = handle;
485 vr->verify_proc = proc;
486 vr->proc_cls = proc_cls;
487 vr->r_id = handle->r_id_gen++;
488 vr->env = GNUNET_MQ_msg_extra (v_msg,
489 nlen,
490 GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY);
491 v_msg->id = htonl (vr->r_id);
492 v_msg->subject_key = *subject_key;
493 v_msg->c_count = htonl(credential_count);
494 v_msg->issuer_key = *issuer_key;
495 v_msg->issuer_attribute_len = htons(strlen(issuer_attribute));
496 GNUNET_memcpy (&v_msg[1],
497 issuer_attribute,
498 strlen (issuer_attribute));
499 GNUNET_CREDENTIAL_credentials_serialize (credential_count,
500 credentials,
501 clen,
502 ((char*)&v_msg[1])
503 + strlen (issuer_attribute) + 1);
504 GNUNET_CONTAINER_DLL_insert (handle->request_head,
505 handle->request_tail,
506 vr);
507 if (NULL != handle->mq)
508 GNUNET_MQ_send_copy (handle->mq,
509 vr->env);
510 return vr;
511}
512
513/* end of credential_api.c */
diff --git a/src/credential/credential_misc.c b/src/credential/credential_misc.c
new file mode 100644
index 000000000..7849e81e6
--- /dev/null
+++ b/src/credential/credential_misc.c
@@ -0,0 +1,169 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2013, 2016 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21
22/**
23 * @file credential/credential_mic.c
24 * @brief Misc API for credentials
25 *
26 * @author Martin Schanzenbach
27 */
28#include "platform.h"
29#include "gnunet_util_lib.h"
30#include "gnunet_constants.h"
31#include "gnunet_credential_service.h"
32#include "gnunet_signatures.h"
33#include "credential.h"
34#include <inttypes.h>
35
36char*
37GNUNET_CREDENTIAL_credential_to_string (const struct GNUNET_CREDENTIAL_Credential *cred)
38{
39 char *cred_str;
40 char *subject_pkey;
41 char *issuer_pkey;
42 char *signature;
43
44
45 subject_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
46 issuer_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
47 GNUNET_STRINGS_base64_encode ((char*)&cred->signature,
48 sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
49 &signature);
50 GNUNET_asprintf (&cred_str,
51 "%s.%s -> %s | %s | %"SCNu64,
52 issuer_pkey,
53 cred->issuer_attribute,
54 subject_pkey,
55 signature,
56 cred->expiration.abs_value_us);
57 GNUNET_free (subject_pkey);
58 GNUNET_free (issuer_pkey);
59 GNUNET_free (signature);
60 return cred_str;
61}
62
63struct GNUNET_CREDENTIAL_Credential*
64GNUNET_CREDENTIAL_credential_from_string (const char* s)
65{
66 struct GNUNET_CREDENTIAL_Credential *cred;
67 size_t enclen = (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)) * 8;
68 if (enclen % 5 > 0)
69 enclen += 5 - enclen % 5;
70 enclen /= 5; /* 260/5 = 52 */
71 char subject_pkey[enclen + 1];
72 char issuer_pkey[enclen + 1];
73 char name[253 + 1];
74 char signature[256]; //TODO max payload size
75
76 struct GNUNET_CRYPTO_EcdsaSignature *sig;
77 struct GNUNET_TIME_Absolute etime_abs;
78
79 if (5 != SSCANF (s,
80 "%52s.%253s -> %52s | %s | %"SCNu64,
81 issuer_pkey,
82 name,
83 subject_pkey,
84 signature,
85 &etime_abs.abs_value_us))
86 {
87 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
88 _("Unable to parse CRED record string `%s'\n"),
89 s);
90 return NULL;
91 }
92 cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) + strlen (name) + 1);
93 GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_pkey,
94 strlen (subject_pkey),
95 &cred->subject_key);
96 GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_pkey,
97 strlen (issuer_pkey),
98 &cred->issuer_key);
99 GNUNET_assert (sizeof (struct GNUNET_CRYPTO_EcdsaSignature) == GNUNET_STRINGS_base64_decode (signature,
100 strlen (signature),
101 (char**)&sig));
102 cred->signature = *sig;
103 cred->expiration = etime_abs;
104 GNUNET_free (sig);
105 GNUNET_memcpy (&cred[1],
106 name,
107 strlen (name)+1);
108 cred->issuer_attribute_len = strlen ((char*)&cred[1]);
109 cred->issuer_attribute = (char*)&cred[1];
110 return cred;
111}
112
113/**
114 * Issue an attribute to a subject
115 *
116 * @param handle handle to the Credential service
117 * @param issuer the ego that should be used to issue the attribute
118 * @param subject the subject of the attribute
119 * @param attribute the name of the attribute
120 * @return handle to the queued request
121 */
122struct GNUNET_CREDENTIAL_Credential *
123GNUNET_CREDENTIAL_credential_issue (const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
124 struct GNUNET_CRYPTO_EcdsaPublicKey *subject,
125 const char *attribute,
126 struct GNUNET_TIME_Absolute *expiration)
127{
128 struct CredentialEntry *crd;
129 struct GNUNET_CREDENTIAL_Credential *cred;
130 size_t size;
131
132 size = sizeof (struct CredentialEntry) + strlen (attribute) + 1;
133 crd = GNUNET_malloc (size);
134 cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) + strlen (attribute) + 1);
135 crd->purpose.size = htonl (size - sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
136
137 crd->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL);
138 GNUNET_CRYPTO_ecdsa_key_get_public (issuer,
139 &crd->issuer_key);
140 crd->subject_key = *subject;
141 crd->expiration = GNUNET_htonll (expiration->abs_value_us);
142 crd->issuer_attribute_len = htonl (strlen (attribute)+1);
143 GNUNET_memcpy ((char*)&crd[1],
144 attribute,
145 strlen (attribute)+1);
146 if (GNUNET_OK !=
147 GNUNET_CRYPTO_ecdsa_sign (issuer,
148 &crd->purpose,
149 &crd->signature))
150 {
151 GNUNET_break (0);
152 GNUNET_free (crd);
153 return NULL;
154 }
155 cred->signature = crd->signature;
156 cred->expiration = *expiration;
157 GNUNET_CRYPTO_ecdsa_key_get_public (issuer,
158 &cred->issuer_key);
159
160 cred->subject_key = *subject;
161 GNUNET_memcpy (&cred[1],
162 attribute,
163 strlen (attribute)+1);
164 cred->issuer_attribute = (char*)&cred[1];
165 GNUNET_free (crd);
166 return cred;
167}
168
169
diff --git a/src/credential/credential_misc.h b/src/credential/credential_misc.h
new file mode 100644
index 000000000..c3aa8c214
--- /dev/null
+++ b/src/credential/credential_misc.h
@@ -0,0 +1,35 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2012-2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @file credential/credential_misc.h
22 * @brief Credential helper functions
23 */
24#ifndef CREDENTIAL_MISC_H
25#define CREDENTIAL_MISC_H
26
27
28
29char*
30GNUNET_CREDENTIAL_credential_to_string (const struct GNUNET_CREDENTIAL_Credential *cred);
31
32struct GNUNET_CREDENTIAL_Credential*
33GNUNET_CREDENTIAL_credential_from_string (const char* str);
34
35#endif
diff --git a/src/credential/credential_serialization.c b/src/credential/credential_serialization.c
new file mode 100644
index 000000000..1fc72c203
--- /dev/null
+++ b/src/credential/credential_serialization.c
@@ -0,0 +1,463 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2013, 2016 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21
22/**
23 * @file credential/credential_serialization.c
24 * @brief API to serialize and deserialize delegation chains
25 * and credentials
26 * @author Martin Schanzenbach
27 */
28#include "platform.h"
29#include "gnunet_util_lib.h"
30#include "gnunet_constants.h"
31#include "gnunet_credential_service.h"
32#include "gnunet_signatures.h"
33#include "credential.h"
34
35/**
36 * Calculate how many bytes we will need to serialize
37 * the given delegation chain and credential
38 *
39 * @param d_count number of delegation chain entries
40 * @param dd array of #GNUNET_CREDENTIAL_Delegation
41 * @param cd a #GNUNET_CREDENTIAL_Credential
42 * @return the required size to serialize
43 */
44size_t
45GNUNET_CREDENTIAL_delegation_set_get_size (unsigned int ds_count,
46 const struct GNUNET_CREDENTIAL_DelegationSet *dsr)
47{
48 unsigned int i;
49 size_t ret;
50
51 ret = sizeof (struct DelegationRecordData) * (ds_count);
52
53 for (i=0; i<ds_count;i++)
54 {
55 GNUNET_assert ((ret + dsr[i].subject_attribute_len) >= ret);
56 ret += dsr[i].subject_attribute_len;
57 }
58 return ret;
59}
60
61/**
62 * Serizalize the given delegation chain entries and credential
63 *
64 * @param d_count number of delegation chain entries
65 * @param dd array of #GNUNET_CREDENTIAL_Delegation
66 * @param cd a #GNUNET_CREDENTIAL_Credential
67 * @param dest_size size of the destination
68 * @param dest where to store the result
69 * @return the size of the data, -1 on failure
70 */
71ssize_t
72GNUNET_CREDENTIAL_delegation_set_serialize (unsigned int d_count,
73 const struct GNUNET_CREDENTIAL_DelegationSet *dsr,
74 size_t dest_size,
75 char *dest)
76{
77 struct DelegationRecordData rec;
78 unsigned int i;
79 size_t off;
80
81 off = 0;
82 for (i=0;i<d_count;i++)
83 {
84 rec.subject_attribute_len = htonl ((uint32_t) dsr[i].subject_attribute_len);
85 rec.subject_key = dsr[i].subject_key;
86 if (off + sizeof (rec) > dest_size)
87 return -1;
88 GNUNET_memcpy (&dest[off],
89 &rec,
90 sizeof (rec));
91 off += sizeof (rec);
92 if (0 == dsr[i].subject_attribute_len)
93 continue;
94 if (off + dsr[i].subject_attribute_len > dest_size)
95 return -1;
96 GNUNET_memcpy (&dest[off],
97 dsr[i].subject_attribute,
98 dsr[i].subject_attribute_len);
99 off += dsr[i].subject_attribute_len;
100 }
101 return off;
102}
103
104
105/**
106 * Deserialize the given destination
107 *
108 * @param len size of the serialized delegation chain and cred
109 * @param src the serialized data
110 * @param d_count the number of delegation chain entries
111 * @param dd where to put the delegation chain entries
112 * @param cd where to put the credential data
113 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
114 */
115int
116GNUNET_CREDENTIAL_delegation_set_deserialize (size_t len,
117 const char *src,
118 unsigned int d_count,
119 struct GNUNET_CREDENTIAL_DelegationSet *dsr)
120{
121 struct DelegationRecordData rec;
122 unsigned int i;
123 size_t off;
124
125 off = 0;
126 for (i=0;i<d_count;i++)
127 {
128 if (off + sizeof (rec) > len)
129 return GNUNET_SYSERR;
130 GNUNET_memcpy (&rec, &src[off], sizeof (rec));
131 dsr[i].subject_key = rec.subject_key;
132 off += sizeof (rec);
133 dsr[i].subject_attribute_len = ntohl ((uint32_t) rec.subject_attribute_len);
134 if (off + dsr[i].subject_attribute_len > len)
135 return GNUNET_SYSERR;
136 dsr[i].subject_attribute = (char*)&src[off];
137 off += dsr[i].subject_attribute_len;
138 }
139 return GNUNET_OK;
140}
141
142
143/**
144 * Calculate how many bytes we will need to serialize
145 * the credentials
146 *
147 * @param c_count number of credential entries
148 * @param cd a #GNUNET_CREDENTIAL_Credential
149 * @return the required size to serialize
150 */
151size_t
152GNUNET_CREDENTIAL_credentials_get_size (unsigned int c_count,
153 const struct GNUNET_CREDENTIAL_Credential *cd)
154{
155 unsigned int i;
156 size_t ret;
157
158 ret = sizeof (struct CredentialEntry) * (c_count);
159
160 for (i=0; i<c_count;i++)
161 {
162 GNUNET_assert ((ret + cd[i].issuer_attribute_len) >= ret);
163 ret += cd[i].issuer_attribute_len;
164 }
165 return ret;
166}
167/**
168 * Serizalize the given credentials
169 *
170 * @param c_count number of credential entries
171 * @param cd a #GNUNET_CREDENTIAL_Credential
172 * @param dest_size size of the destination
173 * @param dest where to store the result
174 * @return the size of the data, -1 on failure
175 */
176ssize_t
177GNUNET_CREDENTIAL_credentials_serialize (unsigned int c_count,
178 const struct GNUNET_CREDENTIAL_Credential *cd,
179 size_t dest_size,
180 char *dest)
181{
182 struct CredentialEntry c_rec;
183 unsigned int i;
184 size_t off;
185
186 off = 0;
187 for (i=0;i<c_count;i++)
188 {
189 c_rec.issuer_attribute_len = htonl ((uint32_t) cd[i].issuer_attribute_len);
190 c_rec.issuer_key = cd[i].issuer_key;
191 c_rec.subject_key = cd[i].subject_key;
192 c_rec.signature = cd[i].signature;
193 c_rec.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL);
194 c_rec.purpose.size = htonl ((sizeof (struct CredentialEntry) + cd[i].issuer_attribute_len) - sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
195 c_rec.expiration = GNUNET_htonll (cd[i].expiration.abs_value_us);
196 if (off + sizeof (c_rec) > dest_size)
197 return -1;
198 GNUNET_memcpy (&dest[off],
199 &c_rec,
200 sizeof (c_rec));
201 off += sizeof (c_rec);
202 if (off + cd[i].issuer_attribute_len > dest_size)
203 return -1;
204 GNUNET_memcpy (&dest[off],
205 cd[i].issuer_attribute,
206 cd[i].issuer_attribute_len);
207 off += cd[i].issuer_attribute_len;
208 }
209
210 return off;
211}
212
213
214
215/**
216 * Deserialize the given destination
217 *
218 * @param len size of the serialized creds
219 * @param src the serialized data
220 * @param c_count the number of credential entries
221 * @param cd where to put the credential data
222 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
223 */
224int
225GNUNET_CREDENTIAL_credentials_deserialize (size_t len,
226 const char *src,
227 unsigned int c_count,
228 struct GNUNET_CREDENTIAL_Credential *cd)
229{
230 struct CredentialEntry c_rec;
231 unsigned int i;
232 size_t off;
233
234 off = 0;
235 for (i=0;i<c_count;i++)
236 {
237 if (off + sizeof (c_rec) > len)
238 return GNUNET_SYSERR;
239 GNUNET_memcpy (&c_rec, &src[off], sizeof (c_rec));
240 cd[i].issuer_attribute_len = ntohl ((uint32_t) c_rec.issuer_attribute_len);
241 cd[i].issuer_key = c_rec.issuer_key;
242 cd[i].subject_key = c_rec.subject_key;
243 cd[i].signature = c_rec.signature;
244 cd[i].expiration.abs_value_us = GNUNET_ntohll(c_rec.expiration);
245 off += sizeof (c_rec);
246 if (off + cd[i].issuer_attribute_len > len)
247 return GNUNET_SYSERR;
248 cd[i].issuer_attribute = &src[off];
249 off += cd[i].issuer_attribute_len;
250 }
251 return GNUNET_OK;
252}
253
254
255
256/**
257 * Calculate how many bytes we will need to serialize
258 * the given delegation chain and credential
259 *
260 * @param d_count number of delegation chain entries
261 * @param dd array of #GNUNET_CREDENTIAL_Delegation
262 * @param c_count number of credential entries
263 * @param cd a #GNUNET_CREDENTIAL_Credential
264 * @return the required size to serialize
265 */
266size_t
267GNUNET_CREDENTIAL_delegation_chain_get_size (unsigned int d_count,
268 const struct GNUNET_CREDENTIAL_Delegation *dd,
269 unsigned int c_count,
270 const struct GNUNET_CREDENTIAL_Credential *cd)
271{
272 unsigned int i;
273 size_t ret;
274
275 ret = sizeof (struct ChainEntry) * (d_count);
276
277 for (i=0; i<d_count;i++)
278 {
279 GNUNET_assert ((ret +
280 dd[i].issuer_attribute_len +
281 dd[i].subject_attribute_len) >= ret);
282 ret += dd[i].issuer_attribute_len + dd[i].subject_attribute_len;
283 }
284 return ret+GNUNET_CREDENTIAL_credentials_get_size(c_count, cd);
285 return ret;
286}
287
288/**
289 * Serizalize the given delegation chain entries and credential
290 *
291 * @param d_count number of delegation chain entries
292 * @param dd array of #GNUNET_CREDENTIAL_Delegation
293 * @param c_count number of credential entries
294 * @param cd a #GNUNET_CREDENTIAL_Credential
295 * @param dest_size size of the destination
296 * @param dest where to store the result
297 * @return the size of the data, -1 on failure
298 */
299ssize_t
300GNUNET_CREDENTIAL_delegation_chain_serialize (unsigned int d_count,
301 const struct GNUNET_CREDENTIAL_Delegation *dd,
302 unsigned int c_count,
303 const struct GNUNET_CREDENTIAL_Credential *cd,
304 size_t dest_size,
305 char *dest)
306{
307 struct ChainEntry rec;
308 unsigned int i;
309 size_t off;
310
311 off = 0;
312 for (i=0;i<d_count;i++)
313 {
314 rec.issuer_attribute_len = htonl ((uint32_t) dd[i].issuer_attribute_len);
315 rec.subject_attribute_len = htonl ((uint32_t) dd[i].subject_attribute_len);
316 rec.issuer_key = dd[i].issuer_key;
317 rec.subject_key = dd[i].subject_key;
318 if (off + sizeof (rec) > dest_size)
319 return -1;
320 GNUNET_memcpy (&dest[off],
321 &rec,
322 sizeof (rec));
323 off += sizeof (rec);
324 if (off + dd[i].issuer_attribute_len > dest_size)
325 return -1;
326 GNUNET_memcpy (&dest[off],
327 dd[i].issuer_attribute,
328 dd[i].issuer_attribute_len);
329 off += dd[i].issuer_attribute_len;
330 if (0 == dd[i].subject_attribute_len)
331 continue;
332 if (off + dd[i].subject_attribute_len > dest_size)
333 return -1;
334 GNUNET_memcpy (&dest[off],
335 dd[i].subject_attribute,
336 dd[i].subject_attribute_len);
337 off += dd[i].subject_attribute_len;
338 }
339 return off+GNUNET_CREDENTIAL_credentials_serialize (c_count,
340 cd,
341 dest_size-off,
342 &dest[off]);
343}
344
345
346/**
347 * Deserialize the given destination
348 *
349 * @param len size of the serialized delegation chain and cred
350 * @param src the serialized data
351 * @param d_count the number of delegation chain entries
352 * @param dd where to put the delegation chain entries
353 * @param c_count the number of credential entries
354 * @param cd where to put the credential data
355 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
356 */
357int
358GNUNET_CREDENTIAL_delegation_chain_deserialize (size_t len,
359 const char *src,
360 unsigned int d_count,
361 struct GNUNET_CREDENTIAL_Delegation *dd,
362 unsigned int c_count,
363 struct GNUNET_CREDENTIAL_Credential *cd)
364{
365 struct ChainEntry rec;
366 unsigned int i;
367 size_t off;
368
369 off = 0;
370 for (i=0;i<d_count;i++)
371 {
372 if (off + sizeof (rec) > len)
373 return GNUNET_SYSERR;
374 GNUNET_memcpy (&rec, &src[off], sizeof (rec));
375 dd[i].issuer_attribute_len = ntohl ((uint32_t) rec.issuer_attribute_len);
376 dd[i].issuer_key = rec.issuer_key;
377 dd[i].subject_key = rec.subject_key;
378 off += sizeof (rec);
379 if (off + dd[i].issuer_attribute_len > len)
380 return GNUNET_SYSERR;
381 dd[i].issuer_attribute = &src[off];
382 off += dd[i].issuer_attribute_len;
383 dd[i].subject_attribute_len = ntohl ((uint32_t) rec.subject_attribute_len);
384 if (off + dd[i].subject_attribute_len > len)
385 return GNUNET_SYSERR;
386 dd[i].subject_attribute = &src[off];
387 off += dd[i].subject_attribute_len;
388 }
389 return GNUNET_CREDENTIAL_credentials_deserialize (len-off,
390 &src[off],
391 c_count,
392 cd);
393}
394int
395GNUNET_CREDENTIAL_credential_serialize (struct GNUNET_CREDENTIAL_Credential *cred,
396 char **data)
397{
398 size_t size;
399 struct CredentialEntry *cdata;
400
401 size = sizeof (struct CredentialEntry) + strlen (cred->issuer_attribute) + 1;
402 *data = GNUNET_malloc (size);
403 cdata = (struct CredentialEntry*)*data;
404 cdata->subject_key = cred->subject_key;
405 cdata->issuer_key = cred->issuer_key;
406 cdata->expiration = GNUNET_htonll (cred->expiration.abs_value_us);
407 cdata->signature = cred->signature;
408 cdata->issuer_attribute_len = htonl (strlen (cred->issuer_attribute) + 1);
409 cdata->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL);
410 cdata->purpose.size = htonl (size - sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
411 GNUNET_memcpy (&cdata[1],
412 cred->issuer_attribute,
413 strlen (cred->issuer_attribute));
414
415 if(GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_CREDENTIAL,
416 &cdata->purpose,
417 &cdata->signature,
418 &cdata->issuer_key))
419 {
420 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
421 "Invalid credential\n");
422 //return NULL;
423 }
424 return size;
425}
426
427struct GNUNET_CREDENTIAL_Credential*
428GNUNET_CREDENTIAL_credential_deserialize (const char* data,
429 size_t data_size)
430{
431 struct GNUNET_CREDENTIAL_Credential *cred;
432 struct CredentialEntry *cdata;
433 char *issuer_attribute;
434
435 if (data_size < sizeof (struct CredentialEntry))
436 return NULL;
437 cdata = (struct CredentialEntry*)data;
438 if(GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_CREDENTIAL,
439 &cdata->purpose,
440 &cdata->signature,
441 &cdata->issuer_key))
442 {
443 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
444 "Invalid credential\n");
445 //return NULL;
446 }
447 issuer_attribute = (char*)&cdata[1];
448
449 cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) + ntohl(cdata->issuer_attribute_len));
450
451 cred->issuer_key = cdata->issuer_key;
452 cred->subject_key = cdata->subject_key;
453 GNUNET_memcpy (&cred[1],
454 issuer_attribute,
455 ntohl (cdata->issuer_attribute_len));
456 cred->signature = cdata->signature;
457 cred->issuer_attribute = (char*)&cred[1];
458 cred->expiration.abs_value_us = GNUNET_ntohll (cdata->expiration);
459 return cred;
460}
461
462
463/* end of credential_serialization.c */
diff --git a/src/credential/credential_serialization.h b/src/credential/credential_serialization.h
new file mode 100644
index 000000000..b870d47dc
--- /dev/null
+++ b/src/credential/credential_serialization.h
@@ -0,0 +1,159 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2013, 2016 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21
22/**
23 * @file credential/credential_serialization.h
24 * @brief API to serialize and deserialize delegation chains
25 * and credentials
26 * @author Martin Schanzenbach
27 */
28#ifndef CREDENTIAL_SERIALIZATION_H
29#define CREDENTIAL_SERIALIZATION_H
30
31#include "platform.h"
32#include "gnunet_util_lib.h"
33#include "gnunet_constants.h"
34#include "gnunet_credential_service.h"
35
36/**
37 * Calculate how many bytes we will need to serialize
38 * the given delegation record
39 *
40 * @param ds_count number of delegation chain entries
41 * @param dsr array of #GNUNET_CREDENTIAL_Delegation
42 * @return the required size to serialize
43 */
44size_t
45GNUNET_CREDENTIAL_delegation_set_get_size (unsigned int ds_count,
46 const struct GNUNET_CREDENTIAL_DelegationSet *dsr);
47
48/**
49 * Serizalize the given delegation record entries
50 *
51 * @param d_count number of delegation chain entries
52 * @param dsr array of #GNUNET_CREDENTIAL_Delegation
53 * @param dest_size size of the destination
54 * @param dest where to store the result
55 * @return the size of the data, -1 on failure
56 */
57ssize_t
58GNUNET_CREDENTIAL_delegation_set_serialize (unsigned int d_count,
59 const struct GNUNET_CREDENTIAL_DelegationSet *dsr,
60 size_t dest_size,
61 char *dest);
62
63
64/**
65 * Deserialize the given destination
66 *
67 * @param len size of the serialized delegation recird
68 * @param src the serialized data
69 * @param d_count the number of delegation chain entries
70 * @param dsr where to put the delegation chain entries
71 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
72 */
73int
74GNUNET_CREDENTIAL_delegation_set_deserialize (size_t len,
75 const char *src,
76 unsigned int d_count,
77 struct GNUNET_CREDENTIAL_DelegationSet *dsr);
78
79 /**
80 * Calculate how many bytes we will need to serialize
81 * the given delegation chain and credential
82 *
83 * @param d_count number of delegation chain entries
84 * @param dd array of #GNUNET_CREDENTIAL_Delegation
85 * @param c_count number of credential entries
86 * @param cd a #GNUNET_CREDENTIAL_Credential
87 * @return the required size to serialize
88 */
89 size_t
90 GNUNET_CREDENTIAL_delegation_chain_get_size (unsigned int d_count,
91 const struct GNUNET_CREDENTIAL_Delegation *dd,
92 unsigned int c_count,
93 const struct GNUNET_CREDENTIAL_Credential *cd);
94
95 /**
96 * Serizalize the given delegation chain entries and credential
97 *
98 * @param d_count number of delegation chain entries
99 * @param dd array of #GNUNET_CREDENTIAL_Delegation
100 * @param c_count number of credential entries
101 * @param cd a #GNUNET_CREDENTIAL_Credential
102 * @param dest_size size of the destination
103 * @param dest where to store the result
104 * @return the size of the data, -1 on failure
105 */
106 ssize_t
107 GNUNET_CREDENTIAL_delegation_chain_serialize (unsigned int d_count,
108 const struct GNUNET_CREDENTIAL_Delegation *dd,
109 unsigned int c_count,
110 const struct GNUNET_CREDENTIAL_Credential *cd,
111 size_t dest_size,
112 char *dest);
113
114
115 /**
116 * Deserialize the given destination
117 *
118 * @param len size of the serialized delegation chain and cred
119 * @param src the serialized data
120 * @param d_count the number of delegation chain entries
121 * @param dd where to put the delegation chain entries
122 * @param c_count number of credential entries
123 * @param cd where to put the credential data
124 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
125 */
126 int
127 GNUNET_CREDENTIAL_delegation_chain_deserialize (size_t len,
128 const char *src,
129 unsigned int d_count,
130 struct GNUNET_CREDENTIAL_Delegation *dd,
131 unsigned int c_count,
132 struct GNUNET_CREDENTIAL_Credential *cd);
133 size_t
134 GNUNET_CREDENTIAL_credentials_get_size (unsigned int c_count,
135 const struct GNUNET_CREDENTIAL_Credential *cd);
136
137ssize_t
138GNUNET_CREDENTIAL_credentials_serialize (unsigned int c_count,
139 const struct GNUNET_CREDENTIAL_Credential *cd,
140 size_t dest_size,
141 char *dest);
142
143
144int
145GNUNET_CREDENTIAL_credentials_deserialize (size_t len,
146 const char *src,
147 unsigned int c_count,
148 struct GNUNET_CREDENTIAL_Credential *cd);
149
150
151int
152GNUNET_CREDENTIAL_credential_serialize (struct GNUNET_CREDENTIAL_Credential *cred,
153 char **data);
154
155struct GNUNET_CREDENTIAL_Credential*
156GNUNET_CREDENTIAL_credential_deserialize (const char* data,
157 size_t data_size);
158#endif
159/* end of credential_serialization.h */
diff --git a/src/credential/gnunet-credential.c b/src/credential/gnunet-credential.c
new file mode 100644
index 000000000..4a6dc5ccd
--- /dev/null
+++ b/src/credential/gnunet-credential.c
@@ -0,0 +1,602 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20/**
21 * @file gnunet-credential.c
22 * @brief command line tool to access command line Credential service
23 * @author Adnan Husain
24 */
25#include "platform.h"
26#include <gnunet_util_lib.h>
27#include <gnunet_credential_service.h>
28#include <gnunet_gnsrecord_lib.h>
29#include "credential_misc.h"
30#include "credential_serialization.h"
31
32/**
33 * Configuration we are using.
34 */
35static const struct GNUNET_CONFIGURATION_Handle *cfg;
36
37/**
38 * EgoLookup
39 */
40static struct GNUNET_IDENTITY_EgoLookup *el;
41
42/**
43 * Handle to Credential service.
44 */
45static struct GNUNET_CREDENTIAL_Handle *credential;
46
47/**
48 * Desired timeout for the lookup (default is no timeout).
49 */
50static struct GNUNET_TIME_Relative timeout;
51
52/**
53 * Handle to verify request
54 */
55static struct GNUNET_CREDENTIAL_Request *verify_request;
56
57/**
58 * Handle to collect request
59 */
60static struct GNUNET_CREDENTIAL_Request *collect_request;
61
62/**
63 * Task scheduled to handle timeout.
64 */
65static struct GNUNET_SCHEDULER_Task *tt;
66
67/**
68 * Subject pubkey string
69 */
70static char *subject_key;
71
72/**
73 * Subject credential string
74 */
75static char *subject_credential;
76
77/**
78 * Credential TTL
79 */
80static char *expiration;
81
82/**
83 * Subject key
84 */
85struct GNUNET_CRYPTO_EcdsaPublicKey subject_pkey;
86
87/**
88 * Issuer key
89 */
90struct GNUNET_CRYPTO_EcdsaPublicKey issuer_pkey;
91
92
93/**
94 * Issuer pubkey string
95 */
96static char *issuer_key;
97
98/**
99 * ego
100 */
101static char *ego_name;
102
103/**
104 * Issuer attribute
105 */
106static char *issuer_attr;
107
108/**
109 * Verify mode
110 */
111static int verify;
112
113/**
114 * Issue mode
115 */
116static int create_cred;
117
118/**
119 * Collect mode
120 */
121static int collect;
122
123/**
124 * Task run on shutdown. Cleans up everything.
125 *
126 * @param cls unused
127 */
128static void
129do_shutdown (void *cls)
130{
131 if (NULL != verify_request)
132 {
133 GNUNET_CREDENTIAL_request_cancel (verify_request);
134 verify_request = NULL;
135 }
136 if (NULL != credential)
137 {
138 GNUNET_CREDENTIAL_disconnect (credential);
139 credential = NULL;
140 }
141 if (NULL != tt)
142 {
143 GNUNET_SCHEDULER_cancel (tt);
144 tt = NULL;
145 }
146}
147
148
149/**
150 * Task run on timeout. Triggers shutdown.
151 *
152 * @param cls unused
153 */
154static void
155do_timeout (void *cls)
156{
157 tt = NULL;
158 GNUNET_SCHEDULER_shutdown ();
159}
160
161/**
162 * Function called with the result of a Credential lookup.
163 *
164 * @param cls the 'const char *' name that was resolved
165 * @param cd_count number of records returned
166 * @param cd array of @a cd_count records with the results
167 */
168static void
169handle_collect_result (void *cls,
170 unsigned int d_count,
171 struct GNUNET_CREDENTIAL_Delegation *dc,
172 unsigned int c_count,
173 struct GNUNET_CREDENTIAL_Credential *cred)
174{
175 int i;
176 char* line;
177
178 verify_request = NULL;
179 if (NULL != cred)
180 {
181 for (i=0;i<c_count;i++)
182 {
183 line = GNUNET_CREDENTIAL_credential_to_string (&cred[i]);
184 printf ("%s\n",
185 line);
186 GNUNET_free (line);
187 }
188 }
189
190
191 GNUNET_SCHEDULER_shutdown ();
192}
193
194
195/**
196 * Function called with the result of a Credential lookup.
197 *
198 * @param cls the 'const char *' name that was resolved
199 * @param cd_count number of records returned
200 * @param cd array of @a cd_count records with the results
201 */
202static void
203handle_verify_result (void *cls,
204 unsigned int d_count,
205 struct GNUNET_CREDENTIAL_Delegation *dc,
206 unsigned int c_count,
207 struct GNUNET_CREDENTIAL_Credential *cred)
208{
209 int i;
210 char* iss_key;
211 char* sub_key;
212
213 verify_request = NULL;
214 if (NULL == cred)
215 printf ("Failed.\n");
216 else
217 {
218 printf("Delegation Chain:\n");
219 for (i=0;i<d_count;i++)
220 {
221 iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&dc[i].issuer_key);
222 sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&dc[i].subject_key);
223 if (0 != dc[i].subject_attribute_len)
224 {
225 printf ("(%d) %s.%s <- %s.%s\n", i,
226 iss_key, dc[i].issuer_attribute,
227 sub_key, dc[i].subject_attribute);
228 } else {
229 printf ("(%d) %s.%s <- %s\n", i,
230 iss_key, dc[i].issuer_attribute,
231 sub_key);
232 }
233 GNUNET_free (iss_key);
234 GNUNET_free (sub_key);
235 }
236 printf("\nCredentials:\n");
237 for (i=0;i<c_count;i++)
238 {
239 iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred[i].issuer_key);
240 sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred[i].subject_key);
241 printf ("%s.%s <- %s\n",
242 iss_key, cred[i].issuer_attribute,
243 sub_key);
244 GNUNET_free (iss_key);
245 GNUNET_free (sub_key);
246
247 }
248 printf ("Successful.\n");
249 }
250
251
252 GNUNET_SCHEDULER_shutdown ();
253}
254
255/**
256 * Callback invoked from identity service with ego information.
257 * An @a ego of NULL means the ego was not found.
258 *
259 * @param cls closure with the configuration
260 * @param ego an ego known to identity service, or NULL
261 */
262static void
263identity_cb (void *cls,
264 const struct GNUNET_IDENTITY_Ego *ego)
265{
266 const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
267 struct GNUNET_CREDENTIAL_Credential *crd;
268 struct GNUNET_TIME_Absolute etime_abs;
269 struct GNUNET_TIME_Relative etime_rel;
270 char *res;
271
272 el = NULL;
273 if (NULL == ego)
274 {
275 if (NULL != ego_name)
276 {
277 fprintf (stderr,
278 _("Ego `%s' not known to identity service\n"),
279 ego_name);
280 }
281 GNUNET_SCHEDULER_shutdown ();
282 return;
283 }
284
285 if (GNUNET_YES == collect)
286 {
287
288 if (GNUNET_OK !=
289 GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
290 strlen (issuer_key),
291 &issuer_pkey))
292 {
293 fprintf (stderr,
294 _("Issuer public key `%s' is not well-formed\n"),
295 issuer_key);
296 GNUNET_SCHEDULER_shutdown ();
297 }
298 privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
299
300 collect_request = GNUNET_CREDENTIAL_collect(credential,
301 &issuer_pkey,
302 issuer_attr, //TODO argument
303 privkey,
304 &handle_collect_result,
305 NULL);
306 return;
307 }
308
309 //Else issue
310
311 if (NULL == expiration)
312 {
313 fprintf (stderr,
314 "Please specify a TTL\n");
315 GNUNET_SCHEDULER_shutdown ();
316 return;
317 } else if (GNUNET_OK == GNUNET_STRINGS_fancy_time_to_relative (expiration,
318 &etime_rel))
319 {
320 etime_abs = GNUNET_TIME_relative_to_absolute (etime_rel);
321 } else if (GNUNET_OK != GNUNET_STRINGS_fancy_time_to_absolute (expiration,
322 &etime_abs))
323 {
324 fprintf (stderr,
325 "%s is not a valid ttl!\n",
326 expiration);
327 GNUNET_SCHEDULER_shutdown ();
328 return;
329 }
330
331
332 privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
333 GNUNET_free_non_null (ego_name);
334 ego_name = NULL;
335 crd = GNUNET_CREDENTIAL_credential_issue (privkey,
336 &subject_pkey,
337 issuer_attr,
338 &etime_abs);
339
340 res = GNUNET_CREDENTIAL_credential_to_string (crd);
341 GNUNET_free (crd);
342 printf ("%s\n", res);
343 GNUNET_SCHEDULER_shutdown ();
344}
345
346
347
348
349/**
350 * Main function that will be run.
351 *
352 * @param cls closure
353 * @param args remaining command-line arguments
354 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
355 * @param c configuration
356 */
357static void
358run (void *cls,
359 char *const *args,
360 const char *cfgfile,
361 const struct GNUNET_CONFIGURATION_Handle *c)
362{
363
364 cfg = c;
365
366
367 tt = GNUNET_SCHEDULER_add_delayed (timeout,
368 &do_timeout, NULL);
369 GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
370
371 if (GNUNET_YES == collect) {
372 if (NULL == issuer_key)
373 {
374 fprintf (stderr,
375 _("Issuer public key not well-formed\n"));
376 GNUNET_SCHEDULER_shutdown ();
377 return;
378
379 }
380
381 credential = GNUNET_CREDENTIAL_connect (cfg);
382
383 if (NULL == credential)
384 {
385 fprintf (stderr,
386 _("Failed to connect to CREDENTIAL\n"));
387 GNUNET_SCHEDULER_shutdown ();
388 }
389 if (NULL == issuer_attr)
390 {
391 fprintf (stderr,
392 _("You must provide issuer the attribute\n"));
393 GNUNET_SCHEDULER_shutdown ();
394 }
395
396 if (NULL == ego_name)
397 {
398 fprintf (stderr,
399 _("ego required\n"));
400 GNUNET_SCHEDULER_shutdown ();
401 return;
402
403 }
404 el = GNUNET_IDENTITY_ego_lookup (cfg,
405 ego_name,
406 &identity_cb,
407 (void *) cfg);
408 return;
409
410 }
411
412 if (NULL == subject_key)
413 {
414 fprintf (stderr,
415 _("Subject public key needed\n"));
416 GNUNET_SCHEDULER_shutdown ();
417 return;
418
419 }
420 if (GNUNET_OK !=
421 GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_key,
422 strlen (subject_key),
423 &subject_pkey))
424 {
425 fprintf (stderr,
426 _("Subject public key `%s' is not well-formed\n"),
427 subject_key);
428 GNUNET_SCHEDULER_shutdown ();
429 return;
430 }
431 if (GNUNET_YES == verify) {
432 if (NULL == issuer_key)
433 {
434 fprintf (stderr,
435 _("Issuer public key not well-formed\n"));
436 GNUNET_SCHEDULER_shutdown ();
437 return;
438
439 }
440 if (GNUNET_OK !=
441 GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
442 strlen (issuer_key),
443 &issuer_pkey))
444 {
445 fprintf (stderr,
446 _("Issuer public key `%s' is not well-formed\n"),
447 issuer_key);
448 GNUNET_SCHEDULER_shutdown ();
449 }
450 credential = GNUNET_CREDENTIAL_connect (cfg);
451
452 if (NULL == credential)
453 {
454 fprintf (stderr,
455 _("Failed to connect to CREDENTIAL\n"));
456 GNUNET_SCHEDULER_shutdown ();
457 }
458 if (NULL == issuer_attr || NULL == subject_credential)
459 {
460 fprintf (stderr,
461 _("You must provide issuer and subject attributes\n"));
462 GNUNET_SCHEDULER_shutdown ();
463 }
464
465 //Subject credentials are comma separated
466 char *tmp = GNUNET_strdup (subject_credential);
467 char *tok = strtok (tmp, ",");
468 if (NULL == tok)
469 {
470 fprintf (stderr,
471 "Invalid subject credentials\n");
472 GNUNET_free (tmp);
473 GNUNET_SCHEDULER_shutdown ();
474 }
475 int count = 1;
476 int i;
477 while (NULL != (tok = strtok(NULL, ",")))
478 count++;
479 struct GNUNET_CREDENTIAL_Credential credentials[count];
480 struct GNUNET_CREDENTIAL_Credential *cred;
481 GNUNET_free (tmp);
482 tmp = GNUNET_strdup (subject_credential);
483 tok = strtok (tmp, ",");
484 for (i=0;i<count;i++)
485 {
486 cred = GNUNET_CREDENTIAL_credential_from_string (tok);
487 GNUNET_memcpy (&credentials[i],
488 cred,
489 sizeof (struct GNUNET_CREDENTIAL_Credential));
490 credentials[i].issuer_attribute = GNUNET_strdup (cred->issuer_attribute);
491 tok = strtok(NULL, ",");
492 GNUNET_free (cred);
493 }
494
495 verify_request = GNUNET_CREDENTIAL_verify(credential,
496 &issuer_pkey,
497 issuer_attr, //TODO argument
498 &subject_pkey,
499 count,
500 credentials,
501 &handle_verify_result,
502 NULL);
503 for (i=0;i<count;i++)
504 {
505 GNUNET_free ((char*)credentials[i].issuer_attribute);
506 }
507 } else if (GNUNET_YES == create_cred) {
508 if (NULL == ego_name)
509 {
510 fprintf (stderr,
511 _("Issuer ego required\n"));
512 GNUNET_SCHEDULER_shutdown ();
513 return;
514
515 }
516 el = GNUNET_IDENTITY_ego_lookup (cfg,
517 ego_name,
518 &identity_cb,
519 (void *) cfg);
520 return;
521 } else {
522 fprintf (stderr,
523 _("Please specify name to lookup, subject key and issuer key!\n"));
524 GNUNET_SCHEDULER_shutdown ();
525 }
526 return;
527}
528
529
530/**
531 * The main function for gnunet-gns.
532 *
533 * @param argc number of arguments from the command line
534 * @param argv command line arguments
535 * @return 0 ok, 1 on error
536 */
537int
538main (int argc, char *const *argv)
539{
540 struct GNUNET_GETOPT_CommandLineOption options[] = {
541 GNUNET_GETOPT_option_flag ('I',
542 "issue",
543 gettext_noop ("create credential"),
544 &create_cred),
545 GNUNET_GETOPT_option_flag ('V',
546 "verify",
547 gettext_noop ("verify credential against attribute"),
548 &verify),
549 GNUNET_GETOPT_option_string ('s',
550 "subject",
551 "PKEY",
552 gettext_noop ("The public key of the subject to lookup the credential for"),
553 &subject_key),
554 GNUNET_GETOPT_option_string ('b',
555 "credential",
556 "CRED",
557 gettext_noop ("The name of the credential presented by the subject"),
558 &subject_credential),
559 GNUNET_GETOPT_option_string ('i',
560 "issuer",
561 "PKEY",
562 gettext_noop ("The public key of the authority to verify the credential against"),
563 &issuer_key),
564 GNUNET_GETOPT_option_string ('e',
565 "ego",
566 "EGO",
567 gettext_noop ("The ego to use"),
568 &ego_name),
569 GNUNET_GETOPT_option_string ('a',
570 "attribute",
571 "ATTR",
572 gettext_noop ("The issuer attribute to verify against or to issue"),
573 &issuer_attr),
574 GNUNET_GETOPT_option_string ('T',
575 "ttl",
576 "EXP",
577 gettext_noop ("The time to live for the credential"),
578 &expiration),
579 GNUNET_GETOPT_option_flag ('g',
580 "collect",
581 gettext_noop ("collect credentials"),
582 &collect),
583 GNUNET_GETOPT_OPTION_END
584 };
585 int ret;
586
587 timeout = GNUNET_TIME_UNIT_FOREVER_REL;
588 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
589 return 2;
590
591 GNUNET_log_setup ("gnunet-credential", "WARNING", NULL);
592 ret =
593 (GNUNET_OK ==
594 GNUNET_PROGRAM_run (argc, argv, "gnunet-credential",
595 _("GNUnet credential resolver tool"),
596 options,
597 &run, NULL)) ? 0 : 1;
598 GNUNET_free ((void*) argv);
599 return ret;
600}
601
602/* end of gnunet-credential.c */
diff --git a/src/credential/gnunet-service-credential.c b/src/credential/gnunet-service-credential.c
new file mode 100644
index 000000000..be75e485e
--- /dev/null
+++ b/src/credential/gnunet-service-credential.c
@@ -0,0 +1,1238 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2011-2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20/**
21 * @file gns/gnunet-service-credential.c
22 * @brief GNU Credential Service (main service)
23 * @author Adnan Husain
24 */
25#include "platform.h"
26#include "gnunet_util_lib.h"
27#include "gnunet_credential_service.h"
28#include "gnunet_statistics_service.h"
29#include "credential.h"
30#include "credential_serialization.h"
31#include "gnunet_protocols.h"
32#include "gnunet_signatures.h"
33
34#include <gnunet_dnsparser_lib.h>
35#include <gnunet_identity_service.h>
36#include <gnunet_gnsrecord_lib.h>
37#include <gnunet_namestore_service.h>
38#include <gnunet_gns_service.h>
39
40
41#define GNUNET_CREDENTIAL_MAX_LENGTH 255
42
43struct VerifyRequestHandle;
44
45struct DelegationSetQueueEntry;
46
47
48struct DelegationChainEntry
49{
50 /**
51 * DLL
52 */
53 struct DelegationChainEntry *next;
54
55 /**
56 * DLL
57 */
58 struct DelegationChainEntry *prev;
59
60 /**
61 * The issuer
62 */
63 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
64
65 /**
66 * The subject
67 */
68 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
69
70 /**
71 * The issued attribute
72 */
73 char *issuer_attribute;
74
75 /**
76 * The delegated attribute
77 */
78 char *subject_attribute;
79};
80
81/**
82 * DLL for record
83 */
84struct CredentialRecordEntry
85{
86 /**
87 * DLL
88 */
89 struct CredentialRecordEntry *next;
90
91 /**
92 * DLL
93 */
94 struct CredentialRecordEntry *prev;
95
96 /**
97 * Number of references in delegation chains
98 */
99 uint32_t refcount;
100
101 /**
102 * Payload
103 */
104 struct GNUNET_CREDENTIAL_Credential *credential;
105};
106
107/**
108 * DLL used for delegations
109 * Used for OR delegations
110 */
111struct DelegationQueueEntry
112{
113 /**
114 * DLL
115 */
116 struct DelegationQueueEntry *next;
117
118 /**
119 * DLL
120 */
121 struct DelegationQueueEntry *prev;
122
123 /**
124 * Sets under this Queue
125 */
126 struct DelegationSetQueueEntry *set_entries_head;
127
128 /**
129 * Sets under this Queue
130 */
131 struct DelegationSetQueueEntry *set_entries_tail;
132
133 /**
134 * Parent set
135 */
136 struct DelegationSetQueueEntry *parent_set;
137
138 /**
139 * Required solutions
140 */
141 uint32_t required_solutions;
142};
143
144/**
145 * DLL for delegation sets
146 * Used for AND delegation set
147 */
148struct DelegationSetQueueEntry
149{
150 /**
151 * DLL
152 */
153 struct DelegationSetQueueEntry *next;
154
155 /**
156 * DLL
157 */
158 struct DelegationSetQueueEntry *prev;
159
160 /**
161 * GNS handle
162 */
163 struct GNUNET_GNS_LookupRequest *lookup_request;
164
165 /**
166 * Verify handle
167 */
168 struct VerifyRequestHandle *handle;
169
170 /**
171 * Parent attribute delegation
172 */
173 struct DelegationQueueEntry *parent;
174
175 /**
176 * Issuer key
177 */
178 struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key;
179
180 /**
181 * Queue entries of this set
182 */
183 struct DelegationQueueEntry *queue_entries_head;
184
185 /**
186 * Queue entries of this set
187 */
188 struct DelegationQueueEntry *queue_entries_tail;
189
190 /**
191 * Parent QueueEntry
192 */
193 struct DelegationQueueEntry *parent_queue_entry;
194
195 /**
196 * Issuer attribute delegated to
197 */
198 char *issuer_attribute;
199
200 /**
201 * The current attribute to look up
202 */
203 char *lookup_attribute;
204
205 /**
206 * Trailing attribute context
207 */
208 char *attr_trailer;
209
210 /**
211 * Still to resolve delegation as string
212 */
213 char *unresolved_attribute_delegation;
214
215 /**
216 * The delegation chain entry
217 */
218 struct DelegationChainEntry *delegation_chain_entry;
219
220};
221
222
223/**
224 * Handle to a lookup operation from api
225 */
226struct VerifyRequestHandle
227{
228
229 /**
230 * We keep these in a DLL.
231 */
232 struct VerifyRequestHandle *next;
233
234 /**
235 * We keep these in a DLL.
236 */
237 struct VerifyRequestHandle *prev;
238
239 /**
240 * Handle to the requesting client
241 */
242 struct GNUNET_SERVICE_Client *client;
243
244 /**
245 * GNS handle
246 */
247 struct GNUNET_GNS_LookupRequest *lookup_request;
248
249 /**
250 * Size of delegation tree
251 */
252 uint32_t delegation_chain_size;
253
254 /**
255 * Children of this attribute
256 */
257 struct DelegationChainEntry *delegation_chain_head;
258
259 /**
260 * Children of this attribute
261 */
262 struct DelegationChainEntry *delegation_chain_tail;
263
264 /**
265 * Issuer public key
266 */
267 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
268
269 /**
270 * Issuer attribute
271 */
272 char *issuer_attribute;
273
274 /**
275 * Subject public key
276 */
277 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
278
279 /**
280 * Credential DLL
281 */
282 struct CredentialRecordEntry *cred_chain_head;
283
284 /**
285 * Credential DLL
286 */
287 struct CredentialRecordEntry *cred_chain_tail;
288
289 /**
290 * Credential DLL size
291 */
292 uint32_t cred_chain_size;
293
294 /**
295 * Root Delegation Set
296 */
297 struct DelegationSetQueueEntry *root_set;
298
299 /**
300 * Current Delegation Pointer
301 */
302 struct DelegationQueueEntry *current_delegation;
303
304 /**
305 * request id
306 */
307 uint32_t request_id;
308
309 /**
310 * Pending lookups
311 */
312 uint64_t pending_lookups;
313
314 /**
315 * Credential iterator
316 */
317 struct GNUNET_NAMESTORE_ZoneIterator *cred_collection_iter;
318
319 /**
320 * Collect task
321 */
322 struct GNUNET_SCHEDULER_Task *collect_next_task;
323
324};
325
326
327/**
328 * Head of the DLL.
329 */
330static struct VerifyRequestHandle *vrh_head;
331
332/**
333 * Tail of the DLL.
334 */
335static struct VerifyRequestHandle *vrh_tail;
336
337/**
338 * Handle to the statistics service
339 */
340static struct GNUNET_STATISTICS_Handle *statistics;
341
342/**
343 * Handle to GNS service.
344 */
345static struct GNUNET_GNS_Handle *gns;
346
347
348/**
349 * Handle to namestore service
350 */
351static struct GNUNET_NAMESTORE_Handle *namestore;
352
353static void
354cleanup_delegation_set (struct DelegationSetQueueEntry *ds_entry)
355{
356 struct DelegationQueueEntry *dq_entry;
357 struct DelegationSetQueueEntry *child;
358
359 if (NULL == ds_entry)
360 return;
361
362 for (dq_entry = ds_entry->queue_entries_head;
363 NULL != dq_entry;
364 dq_entry = ds_entry->queue_entries_head)
365 {
366 GNUNET_CONTAINER_DLL_remove (ds_entry->queue_entries_head,
367 ds_entry->queue_entries_tail,
368 dq_entry);
369 for (child = dq_entry->set_entries_head;
370 NULL != child;
371 child = dq_entry->set_entries_head)
372 {
373 GNUNET_CONTAINER_DLL_remove (dq_entry->set_entries_head,
374 dq_entry->set_entries_tail,
375 child);
376 cleanup_delegation_set (child);
377 }
378 GNUNET_free (dq_entry);
379 }
380 if (NULL != ds_entry->issuer_key)
381 GNUNET_free (ds_entry->issuer_key);
382 if (NULL != ds_entry->lookup_attribute)
383 GNUNET_free (ds_entry->lookup_attribute);
384 if (NULL != ds_entry->issuer_attribute)
385 GNUNET_free (ds_entry->issuer_attribute);
386 if (NULL != ds_entry->unresolved_attribute_delegation)
387 GNUNET_free (ds_entry->unresolved_attribute_delegation);
388 if (NULL != ds_entry->attr_trailer)
389 GNUNET_free (ds_entry->attr_trailer);
390 if (NULL != ds_entry->lookup_request)
391 {
392 GNUNET_GNS_lookup_cancel (ds_entry->lookup_request);
393 ds_entry->lookup_request = NULL;
394 }
395 if (NULL != ds_entry->delegation_chain_entry)
396 {
397 if (NULL != ds_entry->delegation_chain_entry->subject_attribute)
398 GNUNET_free (ds_entry->delegation_chain_entry->subject_attribute);
399 if (NULL != ds_entry->delegation_chain_entry->issuer_attribute)
400 GNUNET_free (ds_entry->delegation_chain_entry->issuer_attribute);
401 GNUNET_free (ds_entry->delegation_chain_entry);
402 }
403 GNUNET_free (ds_entry);
404}
405
406static void
407cleanup_handle (struct VerifyRequestHandle *vrh)
408{
409 struct CredentialRecordEntry *cr_entry;
410 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
411 "Cleaning up...\n");
412 if (NULL != vrh->lookup_request)
413 {
414 GNUNET_GNS_lookup_cancel (vrh->lookup_request);
415 vrh->lookup_request = NULL;
416 }
417 cleanup_delegation_set (vrh->root_set);
418 if (NULL != vrh->issuer_attribute)
419 GNUNET_free (vrh->issuer_attribute);
420 for (cr_entry = vrh->cred_chain_head;
421 NULL != vrh->cred_chain_head;
422 cr_entry = vrh->cred_chain_head)
423 {
424 GNUNET_CONTAINER_DLL_remove (vrh->cred_chain_head,
425 vrh->cred_chain_tail,
426 cr_entry);
427 if (NULL != cr_entry->credential);
428 GNUNET_free (cr_entry->credential);
429 GNUNET_free (cr_entry);
430 }
431 GNUNET_free (vrh);
432}
433
434/**
435 * Task run during shutdown.
436 *
437 * @param cls unused
438 * @param tc unused
439 */
440static void
441shutdown_task (void *cls)
442{
443 struct VerifyRequestHandle *vrh;
444
445 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
446 "Shutting down!\n");
447
448 while (NULL != (vrh = vrh_head))
449 {
450 //CREDENTIAL_resolver_lookup_cancel (clh->lookup);
451 GNUNET_CONTAINER_DLL_remove (vrh_head,
452 vrh_tail,
453 vrh);
454 cleanup_handle (vrh);
455 }
456
457 if (NULL != gns)
458 {
459 GNUNET_GNS_disconnect (gns);
460 gns = NULL;
461 }
462 if (NULL != namestore)
463 {
464 GNUNET_NAMESTORE_disconnect (namestore);
465 namestore = NULL;
466 }
467 if (NULL != statistics)
468 {
469 GNUNET_STATISTICS_destroy (statistics,
470 GNUNET_NO);
471 statistics = NULL;
472 }
473
474}
475
476
477
478/**
479 * Send.
480 *
481 * @param handle the handle to the request
482 */
483static void
484send_lookup_response (struct VerifyRequestHandle *vrh)
485{
486 struct GNUNET_MQ_Envelope *env;
487 struct DelegationChainResultMessage *rmsg;
488 struct DelegationChainEntry *dce;
489 struct GNUNET_CREDENTIAL_Delegation dd[vrh->delegation_chain_size];
490 struct GNUNET_CREDENTIAL_Credential cred[vrh->cred_chain_size];
491 struct CredentialRecordEntry *cd;
492 struct CredentialRecordEntry *tmp;
493 size_t size;
494 int i;
495
496 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
497 "Sending response\n");
498 dce = vrh->delegation_chain_head;
499 for (i=0;i<vrh->delegation_chain_size;i++)
500 {
501 dd[i].issuer_key = dce->issuer_key;
502 dd[i].subject_key = dce->subject_key;
503 dd[i].issuer_attribute = dce->issuer_attribute;
504 dd[i].issuer_attribute_len = strlen (dce->issuer_attribute)+1;
505 dd[i].subject_attribute_len = 0;
506 dd[i].subject_attribute = NULL;
507 if (NULL != dce->subject_attribute)
508 {
509 dd[i].subject_attribute = dce->subject_attribute;
510 dd[i].subject_attribute_len = strlen(dce->subject_attribute)+1;
511 }
512 dce = dce->next;
513 }
514
515 /**
516 * Remove all credentials not needed
517 */
518 for (cd = vrh->cred_chain_head; NULL != cd;)
519 {
520 if (cd->refcount > 0)
521 {
522 cd = cd->next;
523 continue;
524 }
525 tmp = cd;
526 cd = cd->next;
527 GNUNET_CONTAINER_DLL_remove (vrh->cred_chain_head,
528 vrh->cred_chain_tail,
529 tmp);
530 GNUNET_free (tmp->credential);
531 GNUNET_free (tmp);
532 vrh->cred_chain_size--;
533 }
534
535 /**
536 * Get serialized record data
537 * Append at the end of rmsg
538 */
539 cd = vrh->cred_chain_head;
540 for (i=0;i<vrh->cred_chain_size;i++)
541 {
542 cred[i].issuer_key = cd->credential->issuer_key;
543 cred[i].subject_key = cd->credential->subject_key;
544 cred[i].issuer_attribute_len = strlen(cd->credential->issuer_attribute)+1;
545 cred[i].issuer_attribute = cd->credential->issuer_attribute;
546 cred[i].expiration = cd->credential->expiration;
547 cred[i].signature = cd->credential->signature;
548 cd = cd->next;
549 }
550 size = GNUNET_CREDENTIAL_delegation_chain_get_size (vrh->delegation_chain_size,
551 dd,
552 vrh->cred_chain_size,
553 cred);
554 env = GNUNET_MQ_msg_extra (rmsg,
555 size,
556 GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT);
557 //Assign id so that client can find associated request
558 rmsg->id = vrh->request_id;
559 rmsg->d_count = htonl (vrh->delegation_chain_size);
560 rmsg->c_count = htonl (vrh->cred_chain_size);
561
562 if (0 < vrh->cred_chain_size)
563 rmsg->cred_found = htonl (GNUNET_YES);
564 else
565 rmsg->cred_found = htonl (GNUNET_NO);
566
567 GNUNET_assert (-1 !=
568 GNUNET_CREDENTIAL_delegation_chain_serialize (vrh->delegation_chain_size,
569 dd,
570 vrh->cred_chain_size,
571 cred,
572 size,
573 (char*)&rmsg[1]));
574
575 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(vrh->client),
576 env);
577 GNUNET_CONTAINER_DLL_remove (vrh_head, vrh_tail, vrh);
578 cleanup_handle(vrh);
579
580 GNUNET_STATISTICS_update (statistics,
581 "Completed verifications", 1,
582 GNUNET_NO);
583}
584
585
586static void
587backward_resolution (void* cls,
588 uint32_t rd_count,
589 const struct GNUNET_GNSRECORD_Data *rd)
590{
591
592 struct VerifyRequestHandle *vrh;
593 const struct GNUNET_CREDENTIAL_DelegationRecord *sets;
594 struct CredentialRecordEntry *cred_pointer;
595 struct DelegationSetQueueEntry *current_set;
596 struct DelegationSetQueueEntry *ds_entry;
597 struct DelegationSetQueueEntry *tmp_set;
598 struct DelegationQueueEntry *dq_entry;
599 char *expanded_attr;
600 char *lookup_attribute;
601 int i;
602 int j;
603
604
605 current_set = cls;
606 current_set->lookup_request = NULL;
607 vrh = current_set->handle;
608 vrh->pending_lookups--;
609 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
610 "Got %d attrs\n", rd_count);
611
612 // Each OR
613 for (i=0; i < rd_count; i++)
614 {
615 if (GNUNET_GNSRECORD_TYPE_ATTRIBUTE != rd[i].record_type)
616 continue;
617
618 sets = rd[i].data;
619 struct GNUNET_CREDENTIAL_DelegationSet set[ntohl(sets->set_count)];
620 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
621 "Found new attribute delegation with %d sets. Creating new Job...\n",
622 ntohl (sets->set_count));
623
624 if (GNUNET_OK !=GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll(sets->data_size),
625 (const char*)&sets[1],
626 ntohl(sets->set_count),
627 set))
628 {
629 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
630 "Failed to deserialize!\n");
631 continue;
632 }
633 dq_entry = GNUNET_new (struct DelegationQueueEntry);
634 dq_entry->required_solutions = ntohl(sets->set_count);
635 dq_entry->parent_set = current_set;
636 GNUNET_CONTAINER_DLL_insert (current_set->queue_entries_head,
637 current_set->queue_entries_tail,
638 dq_entry);
639 // Each AND
640 for (j=0; j<ntohl(sets->set_count); j++)
641 {
642 ds_entry = GNUNET_new (struct DelegationSetQueueEntry);
643 if (NULL != current_set->attr_trailer)
644 {
645 if (0 == set[j].subject_attribute_len)
646 {
647 GNUNET_asprintf (&expanded_attr,
648 "%s",
649 current_set->attr_trailer);
650
651 } else {
652 GNUNET_asprintf (&expanded_attr,
653 "%s.%s",
654 set[j].subject_attribute,
655 current_set->attr_trailer);
656 }
657 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
658 "Expanded to %s\n", expanded_attr);
659 ds_entry->unresolved_attribute_delegation = expanded_attr;
660 } else {
661 if (0 != set[j].subject_attribute_len)
662 {
663 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
664 "Not Expanding %s\n", set[j].subject_attribute);
665 ds_entry->unresolved_attribute_delegation = GNUNET_strdup (set[j].subject_attribute);
666 }
667 }
668
669 //Add a credential chain entry
670 ds_entry->delegation_chain_entry = GNUNET_new (struct DelegationChainEntry);
671 ds_entry->delegation_chain_entry->subject_key = set[j].subject_key;
672 ds_entry->issuer_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey);
673 GNUNET_memcpy (ds_entry->issuer_key,
674 &set[j].subject_key,
675 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
676 if (0 < set[j].subject_attribute_len)
677 ds_entry->delegation_chain_entry->subject_attribute = GNUNET_strdup (set[j].subject_attribute);
678 ds_entry->delegation_chain_entry->issuer_key = *current_set->issuer_key;
679 ds_entry->delegation_chain_entry->issuer_attribute = GNUNET_strdup (current_set->lookup_attribute);
680
681 ds_entry->parent_queue_entry = dq_entry; //current_delegation;
682 GNUNET_CONTAINER_DLL_insert (dq_entry->set_entries_head,
683 dq_entry->set_entries_tail,
684 ds_entry);
685
686 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
687 "Checking for cred match\n");
688 /**
689 * Check if this delegation already matches one of our credentials
690 */
691 for(cred_pointer = vrh->cred_chain_head; cred_pointer != NULL;
692 cred_pointer = cred_pointer->next)
693 {
694 if(0 != memcmp (&set->subject_key,
695 &cred_pointer->credential->issuer_key,
696 sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
697 continue;
698 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
699 "Checking if %s matches %s\n",
700 ds_entry->unresolved_attribute_delegation,
701 cred_pointer->credential->issuer_attribute);
702
703 if (0 != strcmp (ds_entry->unresolved_attribute_delegation,
704 cred_pointer->credential->issuer_attribute))
705 continue;
706
707 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
708 "Found issuer\n");
709 cred_pointer->refcount++;
710 //Backtrack
711 for (tmp_set = ds_entry;
712 NULL != tmp_set->parent_queue_entry;
713 tmp_set = tmp_set->parent_queue_entry->parent_set)
714 {
715 tmp_set->parent_queue_entry->required_solutions--;
716 if (NULL != tmp_set->delegation_chain_entry)
717 {
718 vrh->delegation_chain_size++;
719 GNUNET_CONTAINER_DLL_insert (vrh->delegation_chain_head,
720 vrh->delegation_chain_tail,
721 tmp_set->delegation_chain_entry);
722 }
723 if (0 < tmp_set->parent_queue_entry->required_solutions)
724 break;
725 }
726
727 if (NULL == tmp_set->parent_queue_entry)
728 {
729 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
730 "All solutions found\n");
731 //Found match
732 send_lookup_response (vrh);
733 return;
734 }
735 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
736 "Not all solutions found yet.\n");
737 continue;
738
739 }
740 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
741 "Building new lookup request from %s\n",
742 ds_entry->unresolved_attribute_delegation);
743 //Continue with backward resolution
744 char issuer_attribute_name[strlen (ds_entry->unresolved_attribute_delegation)+1];
745 strcpy (issuer_attribute_name,
746 ds_entry->unresolved_attribute_delegation);
747 char *next_attr = strtok (issuer_attribute_name, ".");
748 GNUNET_asprintf (&lookup_attribute,
749 "%s.gnu",
750 next_attr);
751 GNUNET_asprintf (&ds_entry->lookup_attribute,
752 "%s",
753 next_attr);
754 if (strlen (next_attr) == strlen (ds_entry->unresolved_attribute_delegation))
755 {
756 ds_entry->attr_trailer = NULL;
757 } else {
758 next_attr += strlen (next_attr) + 1;
759 ds_entry->attr_trailer = GNUNET_strdup (next_attr);
760 }
761
762 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
763 "Looking up %s\n", ds_entry->lookup_attribute);
764 if (NULL != ds_entry->attr_trailer)
765 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
766 "%s still to go...\n", ds_entry->attr_trailer);
767
768 vrh->pending_lookups++;
769 ds_entry->handle = vrh;
770 ds_entry->lookup_request = GNUNET_GNS_lookup (gns,
771 lookup_attribute,
772 ds_entry->issuer_key, //issuer_key,
773 GNUNET_GNSRECORD_TYPE_ATTRIBUTE,
774 GNUNET_GNS_LO_DEFAULT,
775 &backward_resolution,
776 ds_entry);
777 GNUNET_free (lookup_attribute);
778 }
779 }
780
781 if(0 == vrh->pending_lookups)
782 {
783 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
784 "We are all out of attributes...\n");
785 send_lookup_response (vrh);
786 return;
787
788 }
789}
790
791
792/**
793 * Result from GNS lookup.
794 *
795 * @param cls the closure (our client lookup handle)
796 * @param rd_count the number of records in @a rd
797 * @param rd the record data
798 */
799static void
800delegation_chain_resolution_start (void* cls)
801{
802 struct VerifyRequestHandle *vrh = cls;
803 struct DelegationSetQueueEntry *ds_entry;
804 struct CredentialRecordEntry *cr_entry;
805 vrh->lookup_request = NULL;
806
807 if (0 == vrh->cred_chain_size)
808 {
809 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
810 "No credentials found\n");
811 send_lookup_response (vrh);
812 return;
813 }
814
815 for (cr_entry = vrh->cred_chain_head; cr_entry != NULL; cr_entry = cr_entry->next)
816 {
817 if (0 != memcmp (&cr_entry->credential->issuer_key,
818 &vrh->issuer_key,
819 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
820 continue;
821 if (0 != strcmp (cr_entry->credential->issuer_attribute, vrh->issuer_attribute))
822 continue;
823 cr_entry->refcount++;
824 //Found match prematurely
825 send_lookup_response (vrh);
826 return;
827
828 }
829
830 /**
831 * Check for attributes from the issuer and follow the chain
832 * till you get the required subject's attributes
833 */
834 char issuer_attribute_name[strlen (vrh->issuer_attribute)];
835 strcpy (issuer_attribute_name,
836 vrh->issuer_attribute);
837 strcpy (issuer_attribute_name + strlen (vrh->issuer_attribute),
838 ".gnu");
839 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
840 "Looking up %s\n", issuer_attribute_name);
841 ds_entry = GNUNET_new (struct DelegationSetQueueEntry);
842 ds_entry->issuer_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey);
843 memcpy (ds_entry->issuer_key,
844 &vrh->issuer_key,
845 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
846 ds_entry->issuer_attribute = GNUNET_strdup (vrh->issuer_attribute);
847 ds_entry->handle = vrh;
848 ds_entry->lookup_attribute = GNUNET_strdup (vrh->issuer_attribute);
849 vrh->root_set = ds_entry;
850 vrh->pending_lookups = 1;
851 //Start with backward resolution
852 ds_entry->lookup_request = GNUNET_GNS_lookup (gns,
853 issuer_attribute_name,
854 &vrh->issuer_key, //issuer_key,
855 GNUNET_GNSRECORD_TYPE_ATTRIBUTE,
856 GNUNET_GNS_LO_DEFAULT,
857 &backward_resolution,
858 ds_entry);
859}
860
861/**
862 * Checks a #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY message
863 *
864 * @param cls client sending the message
865 * @param v_msg message of type `struct VerifyMessage`
866 * @return #GNUNET_OK if @a v_msg is well-formed
867 */
868static int
869check_verify (void *cls,
870 const struct VerifyMessage *v_msg)
871{
872 size_t msg_size;
873 const char* attr;
874
875 msg_size = ntohs (v_msg->header.size);
876 if (msg_size < sizeof (struct VerifyMessage))
877 {
878 GNUNET_break (0);
879 return GNUNET_SYSERR;
880 }
881 if (ntohs (v_msg->issuer_attribute_len) > GNUNET_CREDENTIAL_MAX_LENGTH)
882 {
883 GNUNET_break (0);
884 return GNUNET_SYSERR;
885 }
886 attr = (const char *) &v_msg[1];
887
888 if ( strlen (attr) > GNUNET_CREDENTIAL_MAX_LENGTH)
889 {
890 GNUNET_break (0);
891 return GNUNET_SYSERR;
892 }
893 return GNUNET_OK;
894}
895
896/**
897 * Handle Credential verification requests from client
898 *
899 * @param cls the closure
900 * @param client the client
901 * @param message the message
902 */
903static void
904handle_verify (void *cls,
905 const struct VerifyMessage *v_msg)
906{
907 struct VerifyRequestHandle *vrh;
908 struct GNUNET_SERVICE_Client *client = cls;
909 struct CredentialRecordEntry *cr_entry;
910 uint32_t credentials_count;
911 uint32_t credential_data_size;
912 int i;
913 char attr[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
914 char issuer_attribute[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
915 char *attrptr = attr;
916 char *credential_data;
917 const char *utf_in;
918
919 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
920 "Received VERIFY message\n");
921 utf_in = (const char *) &v_msg[1];
922 GNUNET_STRINGS_utf8_tolower (utf_in, attrptr);
923 GNUNET_memcpy (issuer_attribute, attr, ntohs (v_msg->issuer_attribute_len));
924 issuer_attribute[ntohs (v_msg->issuer_attribute_len)] = '\0';
925 vrh = GNUNET_new (struct VerifyRequestHandle);
926 GNUNET_CONTAINER_DLL_insert (vrh_head, vrh_tail, vrh);
927 vrh->client = client;
928 vrh->request_id = v_msg->id;
929 vrh->issuer_key = v_msg->issuer_key;
930 vrh->subject_key = v_msg->subject_key;
931 vrh->issuer_attribute = GNUNET_strdup (issuer_attribute);
932 if (NULL == issuer_attribute)
933 {
934 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
935 "No issuer attribute provided!\n");
936 send_lookup_response (vrh);
937 return;
938 }
939 /**
940 * First, collect credentials
941 * TODO: cleanup!
942 */
943 credentials_count = ntohl(v_msg->c_count);
944 credential_data_size = ntohs (v_msg->header.size)
945 - sizeof (struct VerifyMessage)
946 - ntohs (v_msg->issuer_attribute_len)
947 - 1;
948 struct GNUNET_CREDENTIAL_Credential credentials[credentials_count];
949 credential_data = (char*)&v_msg[1] + ntohs (v_msg->issuer_attribute_len) + 1;
950 if (GNUNET_OK != GNUNET_CREDENTIAL_credentials_deserialize (credential_data_size,
951 credential_data,
952 credentials_count,
953 credentials))
954 {
955 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
956 "Cannot deserialize credentials!\n");
957 send_lookup_response (vrh);
958 return;
959 }
960
961 for (i=0;i<credentials_count;i++) {
962 cr_entry = GNUNET_new (struct CredentialRecordEntry);
963 cr_entry->credential = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) +
964 credentials[i].issuer_attribute_len);
965 GNUNET_memcpy (cr_entry->credential,
966 &credentials[i],
967 sizeof (struct GNUNET_CREDENTIAL_Credential));
968 GNUNET_memcpy (&cr_entry->credential[1],
969 credentials[i].issuer_attribute,
970 credentials[i].issuer_attribute_len);
971 cr_entry->credential->issuer_attribute = (char*)&cr_entry->credential[1];
972 GNUNET_CONTAINER_DLL_insert_tail (vrh->cred_chain_head,
973 vrh->cred_chain_tail,
974 cr_entry);
975 vrh->cred_chain_size++;
976 }
977
978 delegation_chain_resolution_start (vrh);
979
980}
981
982/**
983 * We encountered an error while collecting
984 */
985static void
986handle_cred_collection_error_cb (void *cls)
987{
988 struct VerifyRequestHandle *vrh = cls;
989 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
990 "Got disconnected from namestore database.\n");
991 vrh->cred_collection_iter = NULL;
992 send_lookup_response (vrh);
993}
994
995static void
996collect_next (void *cls)
997{
998 struct VerifyRequestHandle *vrh = cls;
999 vrh->collect_next_task = NULL;
1000 GNUNET_assert (NULL != vrh->cred_collection_iter);
1001 GNUNET_NAMESTORE_zone_iterator_next (vrh->cred_collection_iter);
1002}
1003
1004/**
1005 * Store credential
1006 */
1007static void
1008handle_cred_collection_cb (void *cls,
1009 const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
1010 const char *label,
1011 unsigned int rd_count,
1012 const struct GNUNET_GNSRECORD_Data *rd)
1013{
1014 struct VerifyRequestHandle *vrh = cls;
1015 struct GNUNET_CREDENTIAL_Credential *crd;
1016 struct CredentialRecordEntry *cr_entry;
1017 int cred_record_count;
1018 int i;
1019
1020 cred_record_count = 0;
1021 for (i=0; i < rd_count; i++)
1022 {
1023 if (GNUNET_GNSRECORD_TYPE_CREDENTIAL != rd[i].record_type)
1024 continue;
1025 cred_record_count++;
1026 crd = GNUNET_CREDENTIAL_credential_deserialize (rd[i].data,
1027 rd[i].data_size);
1028 if (NULL == crd)
1029 {
1030 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1031 "Invalid credential found\n");
1032 continue;
1033 }
1034 cr_entry = GNUNET_new (struct CredentialRecordEntry);
1035 cr_entry->credential = crd;
1036 GNUNET_CONTAINER_DLL_insert_tail (vrh->cred_chain_head,
1037 vrh->cred_chain_tail,
1038 cr_entry);
1039 vrh->cred_chain_size++;
1040 }
1041 vrh->collect_next_task = GNUNET_SCHEDULER_add_now (&collect_next,
1042 vrh);
1043}
1044
1045/**
1046 * We encountered an error while collecting
1047 */
1048static void
1049handle_cred_collection_finished_cb (void *cls)
1050{
1051 struct VerifyRequestHandle *vrh = cls;
1052 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1053 "Done collecting credentials.\n");
1054 vrh->cred_collection_iter = NULL;
1055 delegation_chain_resolution_start (vrh);
1056}
1057
1058/**
1059 * Handle Credential collection requests from client
1060 *
1061 * @param cls the closure
1062 * @param client the client
1063 * @param message the message
1064 */
1065static void
1066handle_collect (void *cls,
1067 const struct CollectMessage *c_msg)
1068{
1069 char attr[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
1070 char issuer_attribute[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
1071 struct VerifyRequestHandle *vrh;
1072 struct GNUNET_SERVICE_Client *client = cls;
1073 char *attrptr = attr;
1074 const char *utf_in;
1075
1076 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1077 "Received COLLECT message\n");
1078
1079 utf_in = (const char *) &c_msg[1];
1080 GNUNET_STRINGS_utf8_tolower (utf_in, attrptr);
1081
1082 GNUNET_memcpy (issuer_attribute, attr, ntohs (c_msg->issuer_attribute_len));
1083 issuer_attribute[ntohs (c_msg->issuer_attribute_len)] = '\0';
1084 vrh = GNUNET_new (struct VerifyRequestHandle);
1085 GNUNET_CONTAINER_DLL_insert (vrh_head, vrh_tail, vrh);
1086 vrh->client = client;
1087 vrh->request_id = c_msg->id;
1088 vrh->issuer_key = c_msg->issuer_key;
1089 GNUNET_CRYPTO_ecdsa_key_get_public (&c_msg->subject_key,
1090 &vrh->subject_key);
1091 vrh->issuer_attribute = GNUNET_strdup (issuer_attribute);
1092
1093 if (NULL == issuer_attribute)
1094 {
1095 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1096 "No issuer attribute provided!\n");
1097 send_lookup_response (vrh);
1098 return;
1099 }
1100 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1101 "Getting credentials for subject\n");
1102 /**
1103 * First, get attribute from subject
1104 */
1105 vrh->cred_collection_iter = GNUNET_NAMESTORE_zone_iteration_start (namestore,
1106 &c_msg->subject_key,
1107 &handle_cred_collection_error_cb,
1108 vrh,
1109 &handle_cred_collection_cb,
1110 vrh,
1111 &handle_cred_collection_finished_cb,
1112 vrh);
1113}
1114
1115
1116/**
1117 * Checks a #GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT message
1118 *
1119 * @param cls client sending the message
1120 * @param v_msg message of type `struct CollectMessage`
1121 * @return #GNUNET_OK if @a v_msg is well-formed
1122 */
1123static int
1124check_collect (void *cls,
1125 const struct CollectMessage *c_msg)
1126{
1127 size_t msg_size;
1128 const char* attr;
1129
1130 msg_size = ntohs (c_msg->header.size);
1131 if (msg_size < sizeof (struct CollectMessage))
1132 {
1133 GNUNET_break (0);
1134 return GNUNET_SYSERR;
1135 }
1136 if (ntohs (c_msg->issuer_attribute_len) > GNUNET_CREDENTIAL_MAX_LENGTH)
1137 {
1138 GNUNET_break (0);
1139 return GNUNET_SYSERR;
1140 }
1141 attr = (const char *) &c_msg[1];
1142
1143 if ( ('\0' != attr[ntohs(c_msg->header.size) - sizeof (struct CollectMessage) - 1]) ||
1144 (strlen (attr) > GNUNET_CREDENTIAL_MAX_LENGTH) )
1145 {
1146 GNUNET_break (0);
1147 return GNUNET_SYSERR;
1148 }
1149 return GNUNET_OK;
1150}
1151
1152/**
1153 * One of our clients disconnected, clean up after it.
1154 *
1155 * @param cls NULL
1156 * @param client the client that disconnected
1157 */
1158static void
1159client_disconnect_cb (void *cls,
1160 struct GNUNET_SERVICE_Client *client,
1161 void *app_ctx)
1162{
1163 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1164 "Client %p disconnected\n",
1165 client);
1166}
1167
1168/**
1169 * Add a client to our list of active clients.
1170 *
1171 * @param cls NULL
1172 * @param client client to add
1173 * @param mq message queue for @a client
1174 * @return this client
1175 */
1176static void *
1177client_connect_cb (void *cls,
1178 struct GNUNET_SERVICE_Client *client,
1179 struct GNUNET_MQ_Handle *mq)
1180{
1181 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1182 "Client %p connected\n",
1183 client);
1184 return client;
1185}
1186
1187/**
1188 * Process Credential requests.
1189 *
1190 * @param cls closure
1191 * @param server the initialized server
1192 * @param c configuration to use
1193 */
1194static void
1195run (void *cls,
1196 const struct GNUNET_CONFIGURATION_Handle *c,
1197 struct GNUNET_SERVICE_Handle *handle)
1198{
1199
1200 gns = GNUNET_GNS_connect (c);
1201 if (NULL == gns)
1202 {
1203 fprintf (stderr,
1204 _("Failed to connect to GNS\n"));
1205 }
1206 namestore = GNUNET_NAMESTORE_connect (c);
1207 if (NULL == namestore)
1208 {
1209 fprintf (stderr,
1210 _("Failed to connect to namestore\n"));
1211 }
1212
1213 statistics = GNUNET_STATISTICS_create ("credential", c);
1214 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
1215}
1216
1217
1218/**
1219 * Define "main" method using service macro
1220 */
1221GNUNET_SERVICE_MAIN
1222("credential",
1223 GNUNET_SERVICE_OPTION_NONE,
1224 &run,
1225 &client_connect_cb,
1226 &client_disconnect_cb,
1227 NULL,
1228 GNUNET_MQ_hd_var_size (verify,
1229 GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY,
1230 struct VerifyMessage,
1231 NULL),
1232 GNUNET_MQ_hd_var_size (collect,
1233 GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT,
1234 struct CollectMessage,
1235 NULL),
1236 GNUNET_MQ_handler_end());
1237
1238/* end of gnunet-service-credential.c */
diff --git a/src/credential/plugin_gnsrecord_credential.c b/src/credential/plugin_gnsrecord_credential.c
new file mode 100644
index 000000000..72d6b53f5
--- /dev/null
+++ b/src/credential/plugin_gnsrecord_credential.c
@@ -0,0 +1,353 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21/**
22 * @file credential/plugin_gnsrecord_credential.c
23 * @brief gnsrecord plugin to provide the API for CREDENTIAL records
24 * @author Adnan Husain
25 */
26
27#include "platform.h"
28#include "gnunet_util_lib.h"
29#include "gnunet_gnsrecord_lib.h"
30#include "gnunet_credential_service.h"
31#include "gnunet_gnsrecord_plugin.h"
32#include "gnunet_signatures.h"
33#include "credential_serialization.h"
34#include "credential_misc.h"
35
36/**
37 * Convert the 'value' of a record to a string.
38 *
39 * @param cls closure, unused
40 * @param type type of the record
41 * @param data value in binary encoding
42 * @param data_size number of bytes in @a data
43 * @return NULL on error, otherwise human-readable representation of the value
44 */
45static char *
46credential_value_to_string (void *cls,
47 uint32_t type,
48 const void *data,
49 size_t data_size)
50{
51
52 const char *cdata;
53
54 switch (type)
55 {
56 case GNUNET_GNSRECORD_TYPE_ATTRIBUTE:
57 {
58 struct GNUNET_CREDENTIAL_DelegationRecord sets;
59 char *attr_str;
60 char *subject_pkey;
61 char *tmp_str;
62 int i;
63 if (data_size < sizeof (struct GNUNET_CREDENTIAL_DelegationRecord))
64 return NULL; /* malformed */
65 memcpy (&sets,
66 data,
67 sizeof (sets));
68 cdata = data;
69 struct GNUNET_CREDENTIAL_DelegationSet set[ntohl(sets.set_count)];
70 if (GNUNET_OK != GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll (sets.data_size),
71 &cdata[sizeof (sets)],
72 ntohl (sets.set_count),
73 set))
74 return NULL;
75
76 for (i=0;i<ntohl(sets.set_count);i++)
77 {
78 subject_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&set[i].subject_key);
79 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
80 "%d len attr\n", set[i].subject_attribute_len);
81 if (0 == set[i].subject_attribute_len)
82 {
83 if (0 == i)
84 {
85 GNUNET_asprintf (&attr_str,
86 "%s",
87 subject_pkey);
88 } else {
89 GNUNET_asprintf (&tmp_str,
90 "%s,%s",
91 attr_str,
92 subject_pkey);
93 GNUNET_free (attr_str);
94 attr_str = tmp_str;
95 }
96 } else {
97 if (0 == i)
98 {
99 GNUNET_asprintf (&attr_str,
100 "%s %s",
101 subject_pkey,
102 set[i].subject_attribute);
103 } else {
104 GNUNET_asprintf (&tmp_str,
105 "%s,%s %s",
106 attr_str,
107 subject_pkey,
108 set[i].subject_attribute);
109 GNUNET_free (attr_str);
110 attr_str = tmp_str;
111 }
112 }
113 GNUNET_free (subject_pkey);
114 }
115 return attr_str;
116 }
117 case GNUNET_GNSRECORD_TYPE_CREDENTIAL:
118 {
119 struct GNUNET_CREDENTIAL_Credential *cred;
120 char *cred_str;
121
122 cred = GNUNET_CREDENTIAL_credential_deserialize (data,
123 data_size);
124 cred_str = GNUNET_CREDENTIAL_credential_to_string (cred);
125 GNUNET_free (cred);
126 return cred_str;
127 }
128 case GNUNET_GNSRECORD_TYPE_POLICY:
129 {
130 return GNUNET_strndup (data,data_size);
131 }
132 default:
133 return NULL;
134 }
135}
136
137
138/**
139 * Convert human-readable version of a 'value' of a record to the binary
140 * representation.
141 *
142 * @param cls closure, unused
143 * @param type type of the record
144 * @param s human-readable string
145 * @param data set to value in binary encoding (will be allocated)
146 * @param data_size set to number of bytes in @a data
147 * @return #GNUNET_OK on success
148 */
149static int
150credential_string_to_value (void *cls,
151 uint32_t type,
152 const char *s,
153 void **data,
154 size_t *data_size)
155{
156 if (NULL == s)
157 return GNUNET_SYSERR;
158 switch (type)
159 {
160 case GNUNET_GNSRECORD_TYPE_ATTRIBUTE:
161 {
162 struct GNUNET_CREDENTIAL_DelegationRecord *sets;
163 char attr_str[253 + 1];
164 char subject_pkey[52 + 1];
165 char *token;
166 char *tmp_str;
167 int matches = 0;
168 int entries;
169 size_t tmp_data_size;
170 int i;
171
172 tmp_str = GNUNET_strdup (s);
173 token = strtok (tmp_str, ",");
174 entries = 0;
175 tmp_data_size = 0;
176 *data_size = sizeof (struct GNUNET_CREDENTIAL_DelegationRecord);
177 while (NULL != token)
178 {
179 matches = SSCANF (token,
180 "%s %s",
181 subject_pkey,
182 attr_str);
183 if (0 == matches)
184 {
185 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
186 _("Unable to parse ATTR record string `%s'\n"),
187 s);
188 GNUNET_free (tmp_str);
189 return GNUNET_SYSERR;
190 }
191 if (1 == matches) {
192 tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationRecordSet);
193 } else if (2 == matches) {
194 tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationRecordSet) + strlen (attr_str) + 1;
195 }
196 entries++;
197 token = strtok (NULL, ",");
198 }
199 GNUNET_free (tmp_str);
200 tmp_str = GNUNET_strdup (s);
201 token = strtok (tmp_str, ",");
202 struct GNUNET_CREDENTIAL_DelegationSet set[entries];
203 for (i=0;i<entries;i++)
204 {
205 matches = SSCANF (token,
206 "%s %s",
207 subject_pkey,
208 attr_str);
209 GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_pkey,
210 strlen (subject_pkey),
211 &set[i].subject_key);
212 if (2 == matches) {
213 set[i].subject_attribute_len = strlen (attr_str) + 1;
214 set[i].subject_attribute = GNUNET_strdup (attr_str);
215 }
216 token = strtok (NULL , ",");
217 }
218 tmp_data_size = GNUNET_CREDENTIAL_delegation_set_get_size (entries,
219 set);
220
221 if (-1 == tmp_data_size)
222 return GNUNET_SYSERR;
223 *data_size += tmp_data_size;
224 *data = sets = GNUNET_malloc (*data_size);
225 GNUNET_CREDENTIAL_delegation_set_serialize (entries,
226 set,
227 tmp_data_size,
228 (char*)&sets[1]);
229 for (i=0;i<entries;i++)
230 {
231 if (0 != set[i].subject_attribute_len)
232 GNUNET_free ((char*)set[i].subject_attribute);
233 }
234 sets->set_count = htonl (entries);
235 sets->data_size = GNUNET_htonll (tmp_data_size);
236
237 GNUNET_free (tmp_str);
238 return GNUNET_OK;
239 }
240 case GNUNET_GNSRECORD_TYPE_CREDENTIAL:
241 {
242 struct GNUNET_CREDENTIAL_Credential *cred;
243 cred = GNUNET_CREDENTIAL_credential_from_string (s);
244
245 *data_size = GNUNET_CREDENTIAL_credential_serialize (cred,
246 (char**)data);
247 return GNUNET_OK;
248 }
249 case GNUNET_GNSRECORD_TYPE_POLICY:
250 {
251 *data_size = strlen (s);
252 *data = GNUNET_strdup (s);
253 return GNUNET_OK;
254 }
255 default:
256 return GNUNET_SYSERR;
257 }
258}
259
260
261/**
262 * Mapping of record type numbers to human-readable
263 * record type names.
264 */
265static struct {
266 const char *name;
267 uint32_t number;
268} name_map[] = {
269 { "CRED", GNUNET_GNSRECORD_TYPE_CREDENTIAL },
270 { "ATTR", GNUNET_GNSRECORD_TYPE_ATTRIBUTE },
271 { "POLICY", GNUNET_GNSRECORD_TYPE_POLICY },
272 { NULL, UINT32_MAX }
273};
274
275
276/**
277 * Convert a type name (i.e. "AAAA") to the corresponding number.
278 *
279 * @param cls closure, unused
280 * @param gns_typename name to convert
281 * @return corresponding number, UINT32_MAX on error
282 */
283static uint32_t
284credential_typename_to_number (void *cls,
285 const char *gns_typename)
286{
287 unsigned int i;
288
289 i=0;
290 while ( (name_map[i].name != NULL) &&
291 (0 != strcasecmp (gns_typename, name_map[i].name)) )
292 i++;
293 return name_map[i].number;
294}
295
296
297/**
298 * Convert a type number (i.e. 1) to the corresponding type string (i.e. "A")
299 *
300 * @param cls closure, unused
301 * @param type number of a type to convert
302 * @return corresponding typestring, NULL on error
303 */
304static const char *
305credential_number_to_typename (void *cls,
306 uint32_t type)
307{
308 unsigned int i;
309
310 i=0;
311 while ( (name_map[i].name != NULL) &&
312 (type != name_map[i].number) )
313 i++;
314 return name_map[i].name;
315}
316
317
318/**
319 * Entry point for the plugin.
320 *
321 * @param cls NULL
322 * @return the exported block API
323 */
324void *
325libgnunet_plugin_gnsrecord_credential_init (void *cls)
326{
327 struct GNUNET_GNSRECORD_PluginFunctions *api;
328
329 api = GNUNET_new (struct GNUNET_GNSRECORD_PluginFunctions);
330 api->value_to_string = &credential_value_to_string;
331 api->string_to_value = &credential_string_to_value;
332 api->typename_to_number = &credential_typename_to_number;
333 api->number_to_typename = &credential_number_to_typename;
334 return api;
335}
336
337
338/**
339 * Exit point from the plugin.
340 *
341 * @param cls the return value from #libgnunet_plugin_block_test_init
342 * @return NULL
343 */
344void *
345libgnunet_plugin_gnsrecord_credential_done (void *cls)
346{
347 struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
348
349 GNUNET_free (api);
350 return NULL;
351}
352
353/* end of plugin_gnsrecord_credential.c */
diff --git a/src/credential/plugin_rest_credential.c b/src/credential/plugin_rest_credential.c
new file mode 100644
index 000000000..48d48fba0
--- /dev/null
+++ b/src/credential/plugin_rest_credential.c
@@ -0,0 +1,1179 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2016 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @author Martin Schanzenbach
22 * @file gns/plugin_rest_credential.c
23 * @brief GNUnet CREDENTIAL REST plugin
24 *
25 */
26
27#include "platform.h"
28#include "gnunet_rest_plugin.h"
29#include <gnunet_identity_service.h>
30#include <gnunet_gnsrecord_lib.h>
31#include <gnunet_namestore_service.h>
32#include <gnunet_credential_service.h>
33#include <gnunet_rest_lib.h>
34#include <gnunet_jsonapi_lib.h>
35#include <gnunet_jsonapi_util.h>
36#include <jansson.h>
37
38#define GNUNET_REST_API_NS_CREDENTIAL "/credential"
39
40#define GNUNET_REST_API_NS_CREDENTIAL_ISSUE "/credential/issue"
41
42#define GNUNET_REST_API_NS_CREDENTIAL_VERIFY "/credential/verify"
43
44#define GNUNET_REST_API_NS_CREDENTIAL_COLLECT "/credential/collect"
45
46#define GNUNET_REST_JSONAPI_CREDENTIAL_EXPIRATION "expiration"
47
48#define GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY "subject_key"
49
50#define GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_EGO "subject"
51
52#define GNUNET_REST_JSONAPI_CREDENTIAL "credential"
53
54#define GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO "credential"
55
56#define GNUNET_REST_JSONAPI_DELEGATIONS "delegations"
57
58#define GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR "attribute"
59
60#define GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_ATTR "credential"
61
62/**
63 * @brief struct returned by the initialization function of the plugin
64 */
65struct Plugin
66{
67 const struct GNUNET_CONFIGURATION_Handle *cfg;
68};
69
70const struct GNUNET_CONFIGURATION_Handle *cfg;
71
72struct RequestHandle
73{
74 /**
75 * Handle to Credential service.
76 */
77 struct GNUNET_CREDENTIAL_Handle *credential;
78
79 /**
80 * Handle to lookup request
81 */
82 struct GNUNET_CREDENTIAL_Request *verify_request;
83
84 /**
85 * Handle to issue request
86 */
87 struct GNUNET_CREDENTIAL_Request *issue_request;
88
89 /**
90 * Handle to identity
91 */
92 struct GNUNET_IDENTITY_Handle *identity;
93
94 /**
95 * Handle to identity operation
96 */
97 struct GNUNET_IDENTITY_Operation *id_op;
98
99 /**
100 * Handle to ego lookup
101 */
102 struct GNUNET_IDENTITY_EgoLookup *ego_lookup;
103
104 /**
105 * Handle to rest request
106 */
107 struct GNUNET_REST_RequestHandle *rest_handle;
108
109 /**
110 * ID of a task associated with the resolution process.
111 */
112 struct GNUNET_SCHEDULER_Task * timeout_task;
113
114 /**
115 * The root of the received JSON or NULL
116 */
117 json_t *json_root;
118
119 /**
120 * The plugin result processor
121 */
122 GNUNET_REST_ResultProcessor proc;
123
124 /**
125 * The closure of the result processor
126 */
127 void *proc_cls;
128
129 /**
130 * The issuer attribute to verify
131 */
132 char *issuer_attr;
133
134 /**
135 * The subject attribute
136 */
137 char *subject_attr;
138
139 /**
140 * The public key of the issuer
141 */
142 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
143
144 /**
145 * The public key of the subject
146 */
147 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
148
149 /**
150 * HTTP response code
151 */
152 int response_code;
153
154 /**
155 * Timeout
156 */
157 struct GNUNET_TIME_Relative timeout;
158
159};
160
161
162/**
163 * Cleanup lookup handle.
164 *
165 * @param handle Handle to clean up
166 */
167static void
168cleanup_handle (struct RequestHandle *handle)
169{
170 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
171 "Cleaning up\n");
172 if (NULL != handle->json_root)
173 json_decref (handle->json_root);
174
175 if (NULL != handle->issuer_attr)
176 GNUNET_free (handle->issuer_attr);
177 if (NULL != handle->subject_attr)
178 GNUNET_free (handle->subject_attr);
179 if (NULL != handle->verify_request)
180 GNUNET_CREDENTIAL_request_cancel (handle->verify_request);
181 if (NULL != handle->credential)
182 GNUNET_CREDENTIAL_disconnect (handle->credential);
183 if (NULL != handle->id_op)
184 GNUNET_IDENTITY_cancel (handle->id_op);
185 if (NULL != handle->ego_lookup)
186 GNUNET_IDENTITY_ego_lookup_cancel (handle->ego_lookup);
187 if (NULL != handle->identity)
188 GNUNET_IDENTITY_disconnect (handle->identity);
189 if (NULL != handle->timeout_task)
190 {
191 GNUNET_SCHEDULER_cancel (handle->timeout_task);
192 }
193 GNUNET_free (handle);
194}
195
196
197/**
198 * Task run on shutdown. Cleans up everything.
199 *
200 * @param cls unused
201 * @param tc scheduler context
202 */
203static void
204do_error (void *cls)
205{
206 struct RequestHandle *handle = cls;
207 struct MHD_Response *resp;
208
209 resp = GNUNET_REST_create_response (NULL);
210 handle->proc (handle->proc_cls, resp, handle->response_code);
211 cleanup_handle (handle);
212}
213
214/**
215 * Attribute delegation to JSON
216 * @param attr the attribute
217 * @return JSON, NULL if failed
218 */
219static json_t*
220attribute_delegation_to_json (struct GNUNET_CREDENTIAL_Delegation *delegation_chain_entry)
221{
222 char *subject;
223 char *issuer;
224 json_t *attr_obj;
225
226 issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&delegation_chain_entry->issuer_key);
227 if (NULL == issuer)
228 {
229 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
230 "Issuer in delegation malformed\n");
231 return NULL;
232 }
233 subject = GNUNET_CRYPTO_ecdsa_public_key_to_string (&delegation_chain_entry->subject_key);
234 if (NULL == subject)
235 {
236 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
237 "Subject in credential malformed\n");
238 GNUNET_free (issuer);
239 return NULL;
240 }
241 attr_obj = json_object ();
242
243 json_object_set_new (attr_obj, "issuer", json_string (issuer));
244 json_object_set_new (attr_obj, "issuer_attribute",
245 json_string (delegation_chain_entry->issuer_attribute));
246
247 json_object_set_new (attr_obj, "subject", json_string (subject));
248 if (0 < delegation_chain_entry->subject_attribute_len)
249 {
250 json_object_set_new (attr_obj, "subject_attribute",
251 json_string (delegation_chain_entry->subject_attribute));
252 }
253 GNUNET_free (issuer);
254 GNUNET_free (subject);
255 return attr_obj;
256}
257
258/**
259 * JSONAPI resource to Credential
260 * @param res the JSONAPI resource
261 * @return the resulting credential, NULL if failed
262 */
263static struct GNUNET_CREDENTIAL_Credential*
264json_to_credential (json_t *res)
265{
266 struct GNUNET_CREDENTIAL_Credential *cred;
267 json_t *tmp;
268 const char *attribute;
269 const char *signature;
270 char *sig;
271
272 tmp = json_object_get (res, "attribute");
273 if (0 == json_is_string (tmp))
274 {
275 return NULL;
276 }
277 attribute = json_string_value (tmp);
278 cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential)
279 + strlen (attribute));
280 cred->issuer_attribute = attribute;
281 cred->issuer_attribute_len = strlen (attribute);
282 tmp = json_object_get (res, "issuer");
283 if (0 == json_is_string (tmp))
284 {
285 GNUNET_free (cred);
286 return NULL;
287 }
288
289 GNUNET_CRYPTO_ecdsa_public_key_from_string (json_string_value(tmp),
290 strlen (json_string_value(tmp)),
291 &cred->issuer_key);
292 tmp = json_object_get (res, "subject");
293 if (0 == json_is_string (tmp))
294 {
295 GNUNET_free (cred);
296 return NULL;
297 }
298 GNUNET_CRYPTO_ecdsa_public_key_from_string (json_string_value(tmp),
299 strlen (json_string_value(tmp)),
300 &cred->subject_key);
301
302 tmp = json_object_get (res, "signature");
303 if (0 == json_is_string (tmp))
304 {
305 GNUNET_free (cred);
306 return NULL;
307 }
308 signature = json_string_value (tmp);
309 GNUNET_STRINGS_base64_decode (signature,
310 strlen (signature),
311 (char**)&sig);
312 GNUNET_memcpy (&cred->signature,
313 sig,
314 sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
315 GNUNET_free (sig);
316
317 tmp = json_object_get (res, "expiration");
318 if (0 == json_is_integer (tmp))
319 {
320 GNUNET_free (cred);
321 return NULL;
322 }
323 cred->expiration.abs_value_us = json_integer_value (tmp);
324 return cred;
325}
326
327
328/**
329 * Credential to JSON
330 * @param cred the credential
331 * @return the resulting json, NULL if failed
332 */
333static json_t*
334credential_to_json (struct GNUNET_CREDENTIAL_Credential *cred)
335{
336 char *issuer;
337 char *subject;
338 char *signature;
339 char attribute[cred->issuer_attribute_len + 1];
340 json_t *cred_obj;
341
342 issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
343 if (NULL == issuer)
344 {
345 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
346 "Issuer in credential malformed\n");
347 return NULL;
348 }
349 subject = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
350 if (NULL == subject)
351 {
352 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
353 "Subject in credential malformed\n");
354 GNUNET_free (issuer);
355 return NULL;
356 }
357 GNUNET_STRINGS_base64_encode ((char*)&cred->signature,
358 sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
359 &signature);
360 memcpy (attribute,
361 cred->issuer_attribute,
362 cred->issuer_attribute_len);
363 attribute[cred->issuer_attribute_len] = '\0';
364 cred_obj = json_object ();
365 json_object_set_new (cred_obj, "issuer", json_string (issuer));
366 json_object_set_new (cred_obj, "subject", json_string (subject));
367 json_object_set_new (cred_obj, "attribute", json_string (attribute));
368 json_object_set_new (cred_obj, "signature", json_string (signature));
369 json_object_set_new (cred_obj, "expiration", json_integer (cred->expiration.abs_value_us));
370 GNUNET_free (issuer);
371 GNUNET_free (subject);
372 GNUNET_free (signature);
373 return cred_obj;
374}
375
376/**
377 * Function called with the result of a Credential lookup.
378 *
379 * @param cls the 'const char *' name that was resolved
380 * @param cd_count number of records returned
381 * @param cd array of @a cd_count records with the results
382 */
383static void
384handle_collect_response (void *cls,
385 unsigned int d_count,
386 struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
387 unsigned int c_count,
388 struct GNUNET_CREDENTIAL_Credential *cred)
389{
390 struct RequestHandle *handle = cls;
391 struct MHD_Response *resp;
392 struct GNUNET_JSONAPI_Document *json_document;
393 struct GNUNET_JSONAPI_Resource *json_resource;
394 json_t *cred_obj;
395 json_t *cred_array;
396 char *result;
397 char *issuer;
398 char *id;
399 uint32_t i;
400
401 handle->verify_request = NULL;
402 if (NULL == cred) {
403 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
404 "Verify failed.\n");
405 handle->response_code = MHD_HTTP_NOT_FOUND;
406 GNUNET_SCHEDULER_add_now (&do_error, handle);
407 return;
408 }
409 issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&handle->issuer_key);
410 if (NULL == issuer)
411 {
412 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
413 "Issuer in delegation malformed\n");
414 return;
415 }
416 GNUNET_asprintf (&id,
417 "%s.%s",
418 issuer,
419 handle->issuer_attr);
420 GNUNET_free (issuer);
421 json_document = GNUNET_JSONAPI_document_new ();
422 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
423 id);
424 GNUNET_free (id);
425 cred_array = json_array ();
426 for (i=0;i<c_count;i++)
427 {
428 cred_obj = credential_to_json (&cred[i]);
429 json_array_append_new (cred_array, cred_obj);
430 }
431 GNUNET_JSONAPI_resource_add_attr (json_resource,
432 GNUNET_REST_JSONAPI_CREDENTIAL,
433 cred_array);
434 GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
435 GNUNET_JSONAPI_document_serialize (json_document, &result);
436 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
437 "Result %s\n",
438 result);
439 json_decref (cred_array);
440 GNUNET_JSONAPI_document_delete (json_document);
441 resp = GNUNET_REST_create_response (result);
442 GNUNET_free(result);
443 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
444 cleanup_handle (handle);
445}
446
447static void
448subject_ego_lookup (void *cls,
449 const struct GNUNET_IDENTITY_Ego *ego)
450{
451 struct RequestHandle *handle = cls;
452 const struct GNUNET_CRYPTO_EcdsaPrivateKey *sub_key;
453 handle->ego_lookup = NULL;
454
455 if (NULL == ego)
456 {
457 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
458 "Subject not found\n");
459 GNUNET_SCHEDULER_add_now (&do_error, handle);
460 return;
461 }
462 sub_key = GNUNET_IDENTITY_ego_get_private_key (ego);
463 handle->verify_request = GNUNET_CREDENTIAL_collect (handle->credential,
464 &handle->issuer_key,
465 handle->issuer_attr,
466 sub_key,
467 &handle_collect_response,
468 handle);
469}
470
471
472
473/**
474 * Function called with the result of a Credential lookup.
475 *
476 * @param cls the 'const char *' name that was resolved
477 * @param cd_count number of records returned
478 * @param cd array of @a cd_count records with the results
479 */
480static void
481handle_verify_response (void *cls,
482 unsigned int d_count,
483 struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
484 unsigned int c_count,
485 struct GNUNET_CREDENTIAL_Credential *cred)
486{
487
488 struct RequestHandle *handle = cls;
489 struct MHD_Response *resp;
490 struct GNUNET_JSONAPI_Document *json_document;
491 struct GNUNET_JSONAPI_Resource *json_resource;
492 json_t *cred_obj;
493 json_t *attr_obj;
494 json_t *cred_array;
495 json_t *attr_array;
496 char *result;
497 char *issuer;
498 char *id;
499 uint32_t i;
500
501 handle->verify_request = NULL;
502 if (NULL == cred) {
503 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
504 "Verify failed.\n");
505 handle->response_code = MHD_HTTP_NOT_FOUND;
506 GNUNET_SCHEDULER_add_now (&do_error, handle);
507 return;
508 }
509 issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&handle->issuer_key);
510 if (NULL == issuer)
511 {
512 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
513 "Issuer in delegation malformed\n");
514 return;
515 }
516 GNUNET_asprintf (&id,
517 "%s.%s",
518 issuer,
519 handle->issuer_attr);
520 GNUNET_free (issuer);
521 json_document = GNUNET_JSONAPI_document_new ();
522 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
523 id);
524 GNUNET_free (id);
525 attr_array = json_array ();
526 for (i = 0; i < d_count; i++)
527 {
528 attr_obj = attribute_delegation_to_json (&delegation_chain[i]);
529 json_array_append_new (attr_array, attr_obj);
530 }
531 cred_array = json_array ();
532 for (i=0;i<c_count;i++)
533 {
534 cred_obj = credential_to_json (&cred[i]);
535 json_array_append_new (cred_array, cred_obj);
536 }
537 GNUNET_JSONAPI_resource_add_attr (json_resource,
538 GNUNET_REST_JSONAPI_CREDENTIAL,
539 cred_array);
540 GNUNET_JSONAPI_resource_add_attr (json_resource,
541 GNUNET_REST_JSONAPI_DELEGATIONS,
542 attr_array);
543 GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
544 GNUNET_JSONAPI_document_serialize (json_document, &result);
545 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
546 "Result %s\n",
547 result);
548 json_decref (attr_array);
549 json_decref (cred_array);
550 GNUNET_JSONAPI_document_delete (json_document);
551 resp = GNUNET_REST_create_response (result);
552 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
553 GNUNET_free (result);
554 cleanup_handle (handle);
555}
556
557static void
558collect_cred_cont (struct GNUNET_REST_RequestHandle *conndata_handle,
559 const char* url,
560 void *cls)
561{
562 struct RequestHandle *handle = cls;
563 struct GNUNET_HashCode key;
564 char *tmp;
565 char *entity_attr;
566
567 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
568 "Connecting...\n");
569 handle->credential = GNUNET_CREDENTIAL_connect (cfg);
570 handle->timeout_task = GNUNET_SCHEDULER_add_delayed (handle->timeout,
571 &do_error, handle);
572 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
573 "Connected\n");
574 if (NULL == handle->credential)
575 {
576 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
577 "Connecting to CREDENTIAL failed\n");
578 GNUNET_SCHEDULER_add_now (&do_error, handle);
579 return;
580 }
581 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR,
582 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR),
583 &key);
584 if ( GNUNET_NO ==
585 GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
586 &key) )
587 {
588 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
589 "Missing issuer attribute\n");
590 GNUNET_SCHEDULER_add_now (&do_error, handle);
591 return;
592 }
593 tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
594 &key);
595 entity_attr = GNUNET_strdup (tmp);
596 tmp = strtok(entity_attr, ".");
597 if (NULL == tmp)
598 {
599 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
600 "Malformed issuer or attribute\n");
601 GNUNET_free (entity_attr);
602 GNUNET_SCHEDULER_add_now (&do_error, handle);
603 return;
604 }
605 if (GNUNET_OK !=
606 GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
607 strlen (tmp),
608 &handle->issuer_key))
609 {
610 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
611 "Malformed issuer key\n");
612 GNUNET_free (entity_attr);
613 GNUNET_SCHEDULER_add_now (&do_error, handle);
614 return;
615 }
616 tmp = strtok (NULL, "."); //Issuer attribute
617 if (NULL == tmp)
618 {
619 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
620 "Malformed attribute\n");
621 GNUNET_free (entity_attr);
622 GNUNET_SCHEDULER_add_now (&do_error, handle);
623 return;
624 }
625 handle->issuer_attr = GNUNET_strdup (tmp);
626 GNUNET_free (entity_attr);
627
628 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_EGO,
629 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_EGO),
630 &key);
631 if ( GNUNET_NO ==
632 GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
633 &key) )
634 {
635 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
636 "Missing subject\n");
637 GNUNET_free (entity_attr);
638 GNUNET_SCHEDULER_add_now (&do_error, handle);
639 return;
640 }
641 tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
642 &key);
643 if (NULL == tmp)
644 {
645 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
646 "Malformed subject\n");
647 GNUNET_free (entity_attr);
648 GNUNET_SCHEDULER_add_now (&do_error, handle);
649 return;
650 }
651 handle->ego_lookup = GNUNET_IDENTITY_ego_lookup (cfg,
652 tmp,
653 &subject_ego_lookup,
654 handle);
655}
656
657
658
659static void
660verify_cred_cont (struct GNUNET_REST_RequestHandle *conndata_handle,
661 const char* url,
662 void *cls)
663{
664 struct RequestHandle *handle = cls;
665 struct GNUNET_HashCode key;
666 struct GNUNET_JSONAPI_Document *json_obj;
667 struct GNUNET_JSONAPI_Resource *res;
668 struct GNUNET_CREDENTIAL_Credential *cred;
669 char *tmp;
670 char *entity_attr;
671 int i;
672 uint32_t credential_count;
673 uint32_t resource_count;
674 json_t *cred_json;
675 json_t *data_js;
676 json_error_t err;
677
678 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
679 "Connecting...\n");
680 handle->credential = GNUNET_CREDENTIAL_connect (cfg);
681 handle->timeout_task = GNUNET_SCHEDULER_add_delayed (handle->timeout,
682 &do_error, handle);
683 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
684 "Connected\n");
685 if (NULL == handle->credential)
686 {
687 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
688 "Connecting to CREDENTIAL failed\n");
689 GNUNET_SCHEDULER_add_now (&do_error, handle);
690 return;
691 }
692 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR,
693 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR),
694 &key);
695 if ( GNUNET_NO ==
696 GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
697 &key) )
698 {
699 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
700 "Missing issuer attribute\n");
701 GNUNET_SCHEDULER_add_now (&do_error, handle);
702 return;
703 }
704 tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
705 &key);
706 entity_attr = GNUNET_strdup (tmp);
707 tmp = strtok(entity_attr, ".");
708 if (NULL == tmp)
709 {
710 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
711 "Malformed issuer or attribute\n");
712 GNUNET_free (entity_attr);
713 GNUNET_SCHEDULER_add_now (&do_error, handle);
714 return;
715 }
716 if (GNUNET_OK !=
717 GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
718 strlen (tmp),
719 &handle->issuer_key))
720 {
721 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
722 "Malformed issuer key\n");
723 GNUNET_free (entity_attr);
724 GNUNET_SCHEDULER_add_now (&do_error, handle);
725 return;
726 }
727 tmp = strtok (NULL, "."); //Issuer attribute
728 if (NULL == tmp)
729 {
730 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
731 "Malformed attribute\n");
732 GNUNET_free (entity_attr);
733 GNUNET_SCHEDULER_add_now (&do_error, handle);
734 return;
735 }
736 handle->issuer_attr = GNUNET_strdup (tmp);
737 GNUNET_free (entity_attr);
738
739 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY,
740 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY),
741 &key);
742 if ( GNUNET_NO ==
743 GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
744 &key) )
745 {
746 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
747 "Missing subject key\n");
748 GNUNET_free (entity_attr);
749 GNUNET_SCHEDULER_add_now (&do_error, handle);
750 return;
751 }
752 tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
753 &key);
754 if (NULL == tmp)
755 {
756 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
757 "Malformed subject\n");
758 GNUNET_free (entity_attr);
759 GNUNET_SCHEDULER_add_now (&do_error, handle);
760 return;
761 }
762 if (GNUNET_OK !=
763 GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
764 strlen (tmp),
765 &handle->subject_key)) {
766 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
767 "Malformed subject key\n");
768 GNUNET_free (entity_attr);
769 GNUNET_SCHEDULER_add_now (&do_error, handle);
770 return;
771 }
772
773 if (0 >= handle->rest_handle->data_size)
774 {
775 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
776 "Missing credentials\n");
777 GNUNET_SCHEDULER_add_now (&do_error, handle);
778 return;
779 }
780
781 struct GNUNET_JSON_Specification docspec[] = {
782 GNUNET_JSON_spec_jsonapi_document (&json_obj),
783 GNUNET_JSON_spec_end()
784 };
785 char term_data[handle->rest_handle->data_size+1];
786 term_data[handle->rest_handle->data_size] = '\0';
787 credential_count = 0;
788 GNUNET_memcpy (term_data,
789 handle->rest_handle->data,
790 handle->rest_handle->data_size);
791 data_js = json_loads (term_data,
792 JSON_DECODE_ANY,
793 &err);
794 GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (data_js, docspec,
795 NULL, NULL));
796 json_decref (data_js);
797 if (NULL == json_obj)
798 {
799 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
800 "Unable to parse JSONAPI Object from %s\n",
801 term_data);
802 GNUNET_SCHEDULER_add_now (&do_error, handle);
803 return;
804 }
805
806 resource_count = GNUNET_JSONAPI_document_resource_count(json_obj);
807 GNUNET_assert (1 == resource_count);
808 res = (GNUNET_JSONAPI_document_get_resource(json_obj, 0));
809 if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type(res,
810 GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO))
811 {
812 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
813 "Resource not a credential!\n");
814 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
815 "Unable to parse JSONAPI Object from %s\n",
816 term_data);
817 GNUNET_JSONAPI_document_delete (json_obj);
818 GNUNET_SCHEDULER_add_now (&do_error, handle);
819 return;
820 }
821 cred_json = GNUNET_JSONAPI_resource_read_attr (res,
822 GNUNET_REST_JSONAPI_CREDENTIAL);
823
824 GNUNET_assert (json_is_array (cred_json));
825
826 credential_count = json_array_size(cred_json);
827
828 struct GNUNET_CREDENTIAL_Credential credentials[credential_count];
829 for (i=0;i<credential_count;i++)
830 {
831 cred = json_to_credential (json_array_get (cred_json, i));
832 if (NULL == cred)
833 {
834 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
835 "Unable to parse credential!\n");
836 continue;
837 }
838 GNUNET_memcpy (&credentials[i],
839 cred,
840 sizeof (struct GNUNET_CREDENTIAL_Credential));
841 credentials[i].issuer_attribute = GNUNET_strdup (cred->issuer_attribute);
842 GNUNET_free (cred);
843 }
844 GNUNET_JSONAPI_document_delete(json_obj);
845 handle->verify_request = GNUNET_CREDENTIAL_verify (handle->credential,
846 &handle->issuer_key,
847 handle->issuer_attr,
848 &handle->subject_key,
849 credential_count,
850 credentials,
851 &handle_verify_response,
852 handle);
853 for (i=0;i<credential_count;i++)
854 GNUNET_free ((char*)credentials[i].issuer_attribute);
855
856}
857
858void
859send_cred_response (struct RequestHandle *handle,
860 struct GNUNET_CREDENTIAL_Credential *cred)
861{
862 struct MHD_Response *resp;
863 struct GNUNET_JSONAPI_Document *json_document;
864 struct GNUNET_JSONAPI_Resource *json_resource;
865 json_t *cred_obj;
866 char *result;
867 char *issuer;
868 char *subject;
869 char *signature;
870 char *id;
871
872 GNUNET_assert (NULL != cred);
873 issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
874 if (NULL == issuer)
875 {
876 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
877 "Subject malformed\n");
878 return;
879 }
880 GNUNET_asprintf (&id,
881 "%s.%s",
882 issuer,
883 (char*)&cred[1]);
884 subject = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
885 if (NULL == subject)
886 {
887 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
888 "Subject malformed\n");
889 return;
890 }
891 GNUNET_STRINGS_base64_encode ((char*)&cred->signature,
892 sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
893 &signature);
894 json_document = GNUNET_JSONAPI_document_new ();
895 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
896 id);
897 GNUNET_free (id);
898 cred_obj = json_object();
899 json_object_set_new (cred_obj, "issuer", json_string (issuer));
900 json_object_set_new (cred_obj, "subject", json_string (subject));
901 json_object_set_new (cred_obj, "expiration", json_integer( cred->expiration.abs_value_us));
902 json_object_set_new (cred_obj, "signature", json_string (signature));
903 GNUNET_JSONAPI_resource_add_attr (json_resource,
904 GNUNET_REST_JSONAPI_CREDENTIAL,
905 cred_obj);
906 GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
907 GNUNET_JSONAPI_document_serialize (json_document, &result);
908 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
909 "Result %s\n",
910 result);
911 json_decref (cred_obj);
912 GNUNET_JSONAPI_document_delete (json_document);
913 resp = GNUNET_REST_create_response (result);
914 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
915 GNUNET_free (result);
916 GNUNET_free (signature);
917 GNUNET_free (issuer);
918 GNUNET_free (subject);
919 cleanup_handle (handle);
920}
921
922void
923get_cred_issuer_cb (void *cls,
924 struct GNUNET_IDENTITY_Ego *ego,
925 void **ctx,
926 const char *name)
927{
928 struct RequestHandle *handle = cls;
929 struct GNUNET_TIME_Absolute etime_abs;
930 struct GNUNET_TIME_Relative etime_rel;
931 const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer_key;
932 struct GNUNET_HashCode key;
933 struct GNUNET_CREDENTIAL_Credential *cred;
934 char* expiration_str;
935 char* tmp;
936
937 handle->id_op = NULL;
938
939 if (NULL == name)
940 {
941 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
942 "Issuer not configured!\n");
943 GNUNET_SCHEDULER_add_now (&do_error, handle);
944 return;
945 }
946
947 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
948 "Connecting to credential service...\n");
949 handle->credential = GNUNET_CREDENTIAL_connect (cfg);
950 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
951 "Connected\n");
952 if (NULL == handle->credential)
953 {
954 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
955 "Connecting to CREDENTIAL failed\n");
956 GNUNET_SCHEDULER_add_now (&do_error, handle);
957 return;
958 }
959 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_EXPIRATION,
960 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_EXPIRATION),
961 &key);
962 if ( GNUNET_NO ==
963 GNUNET_CONTAINER_multihashmap_contains (handle->rest_handle->url_param_map,
964 &key) )
965 {
966 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
967 "Missing expiration\n");
968 GNUNET_SCHEDULER_add_now (&do_error, handle);
969 return;
970 }
971 expiration_str = GNUNET_CONTAINER_multihashmap_get (handle->rest_handle->url_param_map,
972 &key);
973 if (GNUNET_OK == GNUNET_STRINGS_fancy_time_to_relative (expiration_str,
974 &etime_rel))
975 {
976 etime_abs = GNUNET_TIME_relative_to_absolute (etime_rel);
977 } else if (GNUNET_OK != GNUNET_STRINGS_fancy_time_to_absolute (expiration_str,
978 &etime_abs))
979 {
980 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
981 "Malformed expiration: %s\n", expiration_str);
982 GNUNET_SCHEDULER_add_now (&do_error, handle);
983 return;
984 }
985 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR,
986 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR),
987 &key);
988 if ( GNUNET_NO ==
989 GNUNET_CONTAINER_multihashmap_contains (handle->rest_handle->url_param_map,
990 &key) )
991 {
992 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
993 "Missing issuer attribute\n");
994 GNUNET_SCHEDULER_add_now (&do_error, handle);
995 return;
996 }
997 handle->issuer_attr = GNUNET_strdup(GNUNET_CONTAINER_multihashmap_get
998 (handle->rest_handle->url_param_map,
999 &key));
1000 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY,
1001 strlen (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY),
1002 &key);
1003 if ( GNUNET_NO ==
1004 GNUNET_CONTAINER_multihashmap_contains (handle->rest_handle->url_param_map,
1005 &key) )
1006 {
1007 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1008 "Missing subject\n");
1009 GNUNET_SCHEDULER_add_now (&do_error, handle);
1010 return;
1011 }
1012 tmp = GNUNET_CONTAINER_multihashmap_get (handle->rest_handle->url_param_map,
1013 &key);
1014 if (NULL == tmp)
1015 {
1016 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1017 "Malformed subject\n");
1018 GNUNET_SCHEDULER_add_now (&do_error, handle);
1019 return;
1020 }
1021 if (GNUNET_OK !=
1022 GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
1023 strlen (tmp),
1024 &handle->subject_key)) {
1025 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1026 "Malformed subject key\n");
1027 GNUNET_SCHEDULER_add_now (&do_error, handle);
1028 return;
1029 }
1030 issuer_key = GNUNET_IDENTITY_ego_get_private_key (ego);
1031 cred = GNUNET_CREDENTIAL_credential_issue (issuer_key,
1032 &handle->subject_key,
1033 handle->issuer_attr,
1034 &etime_abs);
1035 if (NULL == cred)
1036 {
1037 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1038 "Failed to create credential\n");
1039 GNUNET_SCHEDULER_add_now (&do_error, handle);
1040 return;
1041 }
1042 send_cred_response (handle, cred);
1043}
1044
1045
1046static void
1047issue_cred_cont (struct GNUNET_REST_RequestHandle *conndata_handle,
1048 const char* url,
1049 void *cls)
1050{
1051 struct RequestHandle *handle = cls;
1052
1053 handle->identity = GNUNET_IDENTITY_connect (cfg,
1054 NULL,
1055 NULL);
1056 handle->id_op = GNUNET_IDENTITY_get(handle->identity,
1057 "credential-issuer",
1058 &get_cred_issuer_cb,
1059 handle);
1060 handle->timeout_task = GNUNET_SCHEDULER_add_delayed (handle->timeout,
1061 &do_error,
1062 handle);
1063}
1064
1065/**
1066 * Handle rest request
1067 *
1068 * @param handle the lookup handle
1069 */
1070static void
1071options_cont (struct GNUNET_REST_RequestHandle *con_handle,
1072 const char* url,
1073 void *cls)
1074{
1075 struct MHD_Response *resp;
1076 struct RequestHandle *handle = cls;
1077
1078 //For GNS, independent of path return all options
1079 resp = GNUNET_REST_create_response (NULL);
1080 MHD_add_response_header (resp,
1081 "Access-Control-Allow-Methods",
1082 MHD_HTTP_METHOD_GET);
1083 handle->proc (handle->proc_cls,
1084 resp,
1085 MHD_HTTP_OK);
1086 cleanup_handle (handle);
1087}
1088
1089
1090/**
1091 * Function processing the REST call
1092 *
1093 * @param method HTTP method
1094 * @param url URL of the HTTP request
1095 * @param data body of the HTTP request (optional)
1096 * @param data_size length of the body
1097 * @param proc callback function for the result
1098 * @param proc_cls closure for callback function
1099 * @return GNUNET_OK if request accepted
1100 */
1101static void
1102rest_credential_process_request(struct GNUNET_REST_RequestHandle *conndata_handle,
1103 GNUNET_REST_ResultProcessor proc,
1104 void *proc_cls)
1105{
1106 struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
1107 struct GNUNET_REST_RequestHandlerError err;
1108
1109 handle->timeout = GNUNET_TIME_UNIT_FOREVER_REL;
1110 handle->proc_cls = proc_cls;
1111 handle->proc = proc;
1112 handle->rest_handle = conndata_handle;
1113
1114 static const struct GNUNET_REST_RequestHandler handlers[] = {
1115 {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_CREDENTIAL_VERIFY, &verify_cred_cont},
1116 {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_CREDENTIAL_COLLECT, &collect_cred_cont},
1117 {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_CREDENTIAL_ISSUE, &issue_cred_cont},
1118 {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_CREDENTIAL, &options_cont},
1119 GNUNET_REST_HANDLER_END
1120 };
1121
1122 if (GNUNET_NO == GNUNET_JSONAPI_handle_request (conndata_handle,
1123 handlers,
1124 &err,
1125 handle))
1126 {
1127 handle->response_code = err.error_code;
1128 GNUNET_SCHEDULER_add_now (&do_error, handle);
1129 }
1130}
1131
1132
1133/**
1134 * Entry point for the plugin.
1135 *
1136 * @param cls the "struct GNUNET_NAMESTORE_PluginEnvironment*"
1137 * @return NULL on error, otherwise the plugin context
1138 */
1139void *
1140libgnunet_plugin_rest_credential_init (void *cls)
1141{
1142 static struct Plugin plugin;
1143 cfg = cls;
1144 struct GNUNET_REST_Plugin *api;
1145
1146 if (NULL != plugin.cfg)
1147 return NULL; /* can only initialize once! */
1148 memset (&plugin, 0, sizeof (struct Plugin));
1149 plugin.cfg = cfg;
1150 api = GNUNET_new (struct GNUNET_REST_Plugin);
1151 api->cls = &plugin;
1152 api->name = GNUNET_REST_API_NS_CREDENTIAL;
1153 api->process_request = &rest_credential_process_request;
1154 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1155 _("GNS REST API initialized\n"));
1156 return api;
1157}
1158
1159
1160/**
1161 * Exit point from the plugin.
1162 *
1163 * @param cls the plugin context (as returned by "init")
1164 * @return always NULL
1165 */
1166void *
1167libgnunet_plugin_rest_credential_done (void *cls)
1168{
1169 struct GNUNET_REST_Plugin *api = cls;
1170 struct Plugin *plugin = api->cls;
1171
1172 plugin->cfg = NULL;
1173 GNUNET_free (api);
1174 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1175 "GNS REST plugin is finished\n");
1176 return NULL;
1177}
1178
1179/* end of plugin_rest_gns.c */
diff --git a/src/credential/test_credential_collect.sh b/src/credential/test_credential_collect.sh
new file mode 100755
index 000000000..6c713063f
--- /dev/null
+++ b/src/credential/test_credential_collect.sh
@@ -0,0 +1,47 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26TEST_ATTR2="test2"
27gnunet-arm -s -c test_credential_lookup.conf
28gnunet-identity -C testissuer -c test_credential_lookup.conf
29gnunet-identity -C testsubject -c test_credential_lookup.conf
30SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
31ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
32#TODO1 Get credential and store it with subject (3)
33CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
34$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
35CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR2 --ttl=5m -c test_credential_lookup.conf`
36$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c2 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
37CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$ISSUER_KEY --attribute=$TEST_ATTR --ego=testsubject -c test_credential_lookup.conf | paste -d, -s`
38echo $CREDS
39RES=$?
40gnunet-arm -e -c test_credential_lookup.conf
41
42if test $? != 0
43then
44 echo "Error collecting..."
45 exit 1
46fi
47
diff --git a/src/credential/test_credential_collect_rest.sh b/src/credential/test_credential_collect_rest.sh
new file mode 100755
index 000000000..0b31f85bc
--- /dev/null
+++ b/src/credential/test_credential_collect_rest.sh
@@ -0,0 +1,90 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) Service.user -> GNU.project.member
19# (2) GNU.project -> GNUnet
20# (3) GNUnet.member -> GNUnet.developer
21# (4) GNUnet.member -> GNUnet.user
22# (5) GNUnet.developer -> Alice
23
24
25which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
26gnunet-arm -s -c test_credential_lookup.conf
27gnunet-identity -C service -c test_credential_lookup.conf
28gnunet-identity -C alice -c test_credential_lookup.conf
29gnunet-identity -C gnu -c test_credential_lookup.conf
30gnunet-identity -C gnunet -c test_credential_lookup.conf
31
32GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
33ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
34GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
35SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
36
37USER_ATTR="user"
38GNU_PROJECT_ATTR="project"
39MEMBER_ATTR="member"
40DEVELOPER_ATTR="developer"
41DEV_ATTR="developer"
42TEST_CREDENTIAL="mygnunetcreds"
43
44# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
45gnunet-namestore -p -z service -a -n $USER_ATTR -t ATTR -V "$GNU_KEY $GNU_PROJECT_ATTR.$MEMBER_ATTR" -e 5m -c test_credential_lookup.conf
46
47# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
48gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
49
50# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
51gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf
52gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
53
54# (5) GNUnet issues Alice the credential "developer"
55CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
56
57# Alice stores the credential under "mygnunetcreds"
58gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
59
60# (5) GNUnet issues Alice the credential "developer"
61CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$USER_ATTR --ttl=5m -c test_credential_lookup.conf`
62
63# Alice stores the credential under "mygnunetcreds"
64gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
65
66#TODO2 Add -z swich like in gnunet-gns
67#RES_CRED=`gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY -c test_credential_lookup.conf`
68
69gnunet-arm -i rest -c test_credential_lookup.conf
70
71sleep 5
72
73curl -v "localhost:7776/credential/collect?attribute=$SERVICE_KEY.$USER_ATTR&subject=alice"
74
75#TODO cleanup properly
76gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
77gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
78gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
79gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
80echo "Stopping arm..."
81gnunet-arm -e -c test_credential_lookup.conf
82echo "Done"
83if [ "$RES_CRED" != "Failed." ]
84then
85 echo -e "${RES_CRED}"
86 exit 0
87else
88 echo "FAIL: Failed to verify credential $RES_CRED."
89 exit 1
90fi
diff --git a/src/credential/test_credential_defaults.conf b/src/credential/test_credential_defaults.conf
new file mode 100644
index 000000000..d157ddd43
--- /dev/null
+++ b/src/credential/test_credential_defaults.conf
@@ -0,0 +1,24 @@
1@INLINE@ ../../contrib/no_forcestart.conf
2
3[PATHS]
4GNUNET_TEST_HOME = /tmp/test-gnunet-credential-testing/
5
6[namestore-sqlite]
7FILENAME = $GNUNET_TEST_HOME/namestore/sqlite_test.db
8
9[namecache-sqlite]
10FILENAME=$GNUNET_TEST_HOME/namecache/namecache.db
11
12[identity]
13# Directory where we store information about our egos
14EGODIR = $GNUNET_TEST_HOME/identity/egos/
15
16[dhtcache]
17DATABASE = heap
18
19[transport]
20PLUGINS = tcp
21
22[transport-tcp]
23BINDTO = 127.0.0.1
24
diff --git a/src/credential/test_credential_issue.sh b/src/credential/test_credential_issue.sh
new file mode 100755
index 000000000..158d91c5b
--- /dev/null
+++ b/src/credential/test_credential_issue.sh
@@ -0,0 +1,44 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_credential_lookup.conf
27gnunet-identity -C testissuer -c test_credential_lookup.conf
28gnunet-identity -C testsubject -c test_credential_lookup.conf
29SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
30ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
31#TODO1 Get credential and store it with subject (3)
32CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
33STATUS=$?
34
35if test $? != 0
36then
37 echo "Error issuing..."
38 exit 1
39fi
40#Try import
41$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
42RES=$?
43gnunet-arm -e -c test_credential_lookup.conf
44exit $RES
diff --git a/src/credential/test_credential_issue_rest.sh b/src/credential/test_credential_issue_rest.sh
new file mode 100755
index 000000000..15cd55083
--- /dev/null
+++ b/src/credential/test_credential_issue_rest.sh
@@ -0,0 +1,53 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_credential_lookup.conf
27gnunet-arm -i gns
28gnunet-arm -i credential
29gnunet-arm -i identity
30gnunet-arm -i rest -c test_credential_lookup.conf
31
32gnunet-arm -I -c test_credential_lookup.conf
33gnunet-identity -C testissuer -c test_credential_lookup.conf
34gnunet-identity -C testsubject -c test_credential_lookup.conf
35gnunet-identity -s credential-issuer -e testissuer
36SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
37ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
38#TODO1 Get credential and store it with subject (3)
39sleep 5
40curl "localhost:7776/credential/issue?subject_key=$SUBJECT_KEY&attribute=$TEST_ATTR&expiration=1d"
41#CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
42STATUS=$?
43
44if test $? != 0
45then
46 echo "Error issuing..."
47 exit 1
48fi
49#Try import
50#$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
51RES=$?
52gnunet-arm -e -c test_credential_lookup.conf
53exit $RES
diff --git a/src/credential/test_credential_lookup.conf b/src/credential/test_credential_lookup.conf
new file mode 100644
index 000000000..3684063b1
--- /dev/null
+++ b/src/credential/test_credential_lookup.conf
@@ -0,0 +1,28 @@
1@INLINE@ test_credential_defaults.conf
2
3[PATHS]
4GNUNET_TEST_HOME = /tmp/test-gnunet-credential-peer-1/
5
6[dht]
7AUTOSTART = YES
8
9[transport]
10PLUGINS =
11
12[credential]
13AUTOSTART = YES
14PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/credlog
15
16[rest]
17PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/restlog
18
19[gns]
20#PREFIX = valgrind --leak-check=full --track-origins=yes
21AUTOSTART = YES
22AUTO_IMPORT_PKEY = YES
23MAX_PARALLEL_BACKGROUND_QUERIES = 10
24DEFAULT_LOOKUP_TIMEOUT = 15 s
25RECORD_PUT_INTERVAL = 1 h
26ZONE_PUBLISH_TIME_WINDOW = 1 h
27DNS_ROOT=PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
28
diff --git a/src/credential/test_credential_verify.sh b/src/credential/test_credential_verify.sh
new file mode 100755
index 000000000..d042bcfe6
--- /dev/null
+++ b/src/credential/test_credential_verify.sh
@@ -0,0 +1,81 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) Service.user -> GNU.project.member
19# (2) GNU.project -> GNUnet
20# (3) GNUnet.member -> GNUnet.developer
21# (4) GNUnet.member -> GNUnet.user
22# (5) GNUnet.developer -> Alice
23
24
25which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
26gnunet-arm -s -c test_credential_lookup.conf
27gnunet-identity -C service -c test_credential_lookup.conf
28gnunet-identity -C alice -c test_credential_lookup.conf
29gnunet-identity -C gnu -c test_credential_lookup.conf
30gnunet-identity -C gnunet -c test_credential_lookup.conf
31
32GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
33ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
34GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
35SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
36
37USER_ATTR="user"
38GNU_PROJECT_ATTR="project"
39MEMBER_ATTR="member"
40DEVELOPER_ATTR="developer"
41DEV_ATTR="developer"
42TEST_CREDENTIAL="mygnunetcreds"
43
44# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
45gnunet-namestore -p -z service -a -n $USER_ATTR -t ATTR -V "$GNU_KEY $GNU_PROJECT_ATTR.$MEMBER_ATTR" -e 5m -c test_credential_lookup.conf
46
47# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
48gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
49
50# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
51gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf
52gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
53
54# (5) GNUnet issues Alice the credential "developer"
55CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
56
57# Alice stores the credential under "mygnunetcreds"
58gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
59
60CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --ego=alice -c test_credential_lookup.conf | paste -d, -s`
61
62echo gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential=\'$CREDS\' -c test_credential_lookup.conf
63#TODO2 Add -z swich like in gnunet-gns
64gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential="$CREDS" -c test_credential_lookup.conf
65
66
67#TODO cleanup properly
68gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
69gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
70gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
71gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
72gnunet-arm -e -c test_credential_lookup.conf
73
74if [ "$RES_CRED" != "Failed." ]
75then
76 echo -e "${RES_CRED}"
77 exit 0
78else
79 echo "FAIL: Failed to verify credential $RES_CRED."
80 exit 1
81fi
diff --git a/src/credential/test_credential_verify_and.sh b/src/credential/test_credential_verify_and.sh
new file mode 100755
index 000000000..9d5c1962e
--- /dev/null
+++ b/src/credential/test_credential_verify_and.sh
@@ -0,0 +1,81 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) Service.user -> GNU.project.member
19# (2) GNU.project -> GNUnet
20# (3) GNUnet.member -> GNUnet.developer
21# (4) GNUnet.member -> GNUnet.user
22# (5) GNUnet.developer -> Alice
23
24
25which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
26gnunet-arm -s -c test_credential_lookup.conf
27gnunet-identity -C service -c test_credential_lookup.conf
28gnunet-identity -C alice -c test_credential_lookup.conf
29gnunet-identity -C gnu -c test_credential_lookup.conf
30gnunet-identity -C gnunet -c test_credential_lookup.conf
31
32GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
33ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
34GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
35SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
36
37USER_ATTR="user"
38GNU_PROJECT_ATTR="project"
39MEMBER_ATTR="member"
40DEVELOPER_ATTR="developer"
41DEV_ATTR="developer"
42TEST_CREDENTIAL="mygnunetcreds"
43
44# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
45gnunet-namestore -p -z service -a -n $USER_ATTR -t ATTR -V "$GNU_KEY $GNU_PROJECT_ATTR.$MEMBER_ATTR" -e 5m -c test_credential_lookup.conf
46
47# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
48gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
49
50# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
51gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR,$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
52
53# (5) GNUnet issues Alice the credential "developer"
54CRED1=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
55# (5) GNUnet issues Alice the credential "user"
56CRED2=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$USER_ATTR --ttl=5m -c test_credential_lookup.conf`
57# Alice stores the credential under "mygnunetcreds"
58gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED1" -e 5m -c test_credential_lookup.conf
59gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED2" -e 5m -c test_credential_lookup.conf
60
61CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --ego=alice -c test_credential_lookup.conf | paste -d, -s`
62
63#TODO2 Add -z swich like in gnunet-gns
64RES_CRED=`gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential="$CREDS" -c test_credential_lookup.conf`
65
66
67#TODO cleanup properly
68gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
69gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
70gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
71gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
72gnunet-arm -e -c test_credential_lookup.conf
73
74if [ "$RES_CRED" != "Failed." ]
75then
76 echo -e "${RES_CRED}"
77 exit 0
78else
79 echo "FAIL: Failed to verify credential $RES_CRED."
80 exit 1
81fi
diff --git a/src/credential/test_credential_verify_rest.sh b/src/credential/test_credential_verify_rest.sh
new file mode 100755
index 000000000..6133ea25e
--- /dev/null
+++ b/src/credential/test_credential_verify_rest.sh
@@ -0,0 +1,87 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) Service.user -> GNU.project.member
19# (2) GNU.project -> GNUnet
20# (3) GNUnet.member -> GNUnet.developer
21# (4) GNUnet.member -> GNUnet.user
22# (5) GNUnet.developer -> Alice
23
24
25which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
26gnunet-arm -s -c test_credential_lookup.conf
27gnunet-identity -C service -c test_credential_lookup.conf
28gnunet-identity -C alice -c test_credential_lookup.conf
29gnunet-identity -C gnu -c test_credential_lookup.conf
30gnunet-identity -C gnunet -c test_credential_lookup.conf
31
32GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
33ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
34GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
35SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
36
37USER_ATTR="user"
38GNU_PROJECT_ATTR="project"
39MEMBER_ATTR="member"
40DEVELOPER_ATTR="developer"
41DEV_ATTR="developer"
42TEST_CREDENTIAL="mygnunetcreds"
43
44# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
45gnunet-namestore -p -z service -a -n $USER_ATTR -t ATTR -V "$GNU_KEY $GNU_PROJECT_ATTR.$MEMBER_ATTR" -e 5m -c test_credential_lookup.conf
46
47# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
48gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
49
50# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
51gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf
52gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
53
54# (5) GNUnet issues Alice the credential "developer"
55CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
56
57# Alice stores the credential under "mygnunetcreds"
58gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
59
60#TODO2 Add -z swich like in gnunet-gns
61#RES_CRED=`gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential=$TEST_CREDENTIAL -c test_credential_lookup.conf`
62
63gnunet-arm -i rest -c test_credential_lookup.conf
64
65sleep 5
66
67CREDS=`curl "localhost:7776/credential/collect?attribute=$SERVICE_KEY.$USER_ATTR&subject=alice"`
68
69echo $CREDS
70
71curl -v "localhost:7776/credential/verify?attribute=$SERVICE_KEY.$USER_ATTR&subject_key=$ALICE_KEY" --data "$CREDS"
72
73#TODO cleanup properly
74gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
75gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
76gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
77gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
78gnunet-arm -e -c test_credential_lookup.conf
79
80if [ "$RES_CRED" != "Failed." ]
81then
82 echo -e "${RES_CRED}"
83 exit 0
84else
85 echo "FAIL: Failed to verify credential $RES_CRED."
86 exit 1
87fi
diff --git a/src/credential/test_credential_verify_simple.sh b/src/credential/test_credential_verify_simple.sh
new file mode 100755
index 000000000..c4fd8c7a3
--- /dev/null
+++ b/src/credential/test_credential_verify_simple.sh
@@ -0,0 +1,50 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
17
18# (3) Isser.user -> Subject
19
20
21which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
22gnunet-arm -s -c test_credential_lookup.conf
23gnunet-identity -C testissuer -c test_credential_lookup.conf
24gnunet-identity -C testsubject -c test_credential_lookup.conf
25
26TEST_ATTR="user"
27SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
28ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
29CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
30
31TEST_CREDENTIAL="t1"
32gnunet-namestore -p -z testsubject -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
33
34#TODO2 Add -z swich like in gnunet-gns
35#RES_CRED=`$DO_TIMEOUT gnunet-credential --verify --issuer=$ISSUER_KEY --attribute="$TEST_ATTR" --subject=$SUBJECT_KEY --credential=$TEST_CREDENTIAL -c test_credential_lookup.conf`
36RES_CRED=`gnunet-credential --verify --issuer=$ISSUER_KEY --attribute=$TEST_ATTR --subject=$SUBJECT_KEY --credential=$TEST_CREDENTIAL -c test_credential_lookup.conf`
37
38#TODO cleanup properly
39gnunet-namestore -z testsubject -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
40gnunet-identity -D testsubject -c test_credential_lookup.conf
41gnunet-arm -e -c test_credential_lookup.conf
42echo $RES_CRED
43#TODO3 proper test
44if [ "$RES_CRED" == "Successful." ]
45then
46 exit 0
47else
48 echo "FAIL: Failed to verify credential."
49 exit 1
50fi
diff --git a/src/exit/gnunet-daemon-exit.c b/src/exit/gnunet-daemon-exit.c
index 7196a1844..d9a5dd684 100644
--- a/src/exit/gnunet-daemon-exit.c
+++ b/src/exit/gnunet-daemon-exit.c
@@ -3802,7 +3802,7 @@ run (void *cls,
3802 if (GNUNET_YES != 3802 if (GNUNET_YES !=
3803 GNUNET_OS_check_helper_binary (binary, 3803 GNUNET_OS_check_helper_binary (binary,
3804 GNUNET_YES, 3804 GNUNET_YES,
3805 "-d gnunet-vpn - - - 169.1.3.3.7 255.255.255.0")) //no nat, ipv4 only 3805 "gnunet-vpn - - - 169.1.3.7 255.255.255.0")) //no nat, ipv4 only
3806 { 3806 {
3807 GNUNET_free (binary); 3807 GNUNET_free (binary);
3808 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 3808 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
diff --git a/src/gns/gns_api.c b/src/gns/gns_api.c
index 26293f4df..84c4ae189 100644
--- a/src/gns/gns_api.c
+++ b/src/gns/gns_api.c
@@ -244,10 +244,7 @@ handle_result (void *cls,
244 return; 244 return;
245 proc = lr->lookup_proc; 245 proc = lr->lookup_proc;
246 proc_cls = lr->proc_cls; 246 proc_cls = lr->proc_cls;
247 GNUNET_CONTAINER_DLL_remove (handle->lookup_head, 247
248 handle->lookup_tail,
249 lr);
250 GNUNET_free (lr);
251 GNUNET_assert (GNUNET_OK == 248 GNUNET_assert (GNUNET_OK ==
252 GNUNET_GNSRECORD_records_deserialize (mlen, 249 GNUNET_GNSRECORD_records_deserialize (mlen,
253 (const char*) &lookup_msg[1], 250 (const char*) &lookup_msg[1],
@@ -256,6 +253,12 @@ handle_result (void *cls,
256 proc (proc_cls, 253 proc (proc_cls,
257 rd_count, 254 rd_count,
258 rd); 255 rd);
256 GNUNET_CONTAINER_DLL_remove (handle->lookup_head,
257 handle->lookup_tail,
258 lr);
259 if (NULL != lr->env)
260 GNUNET_MQ_discard (lr->env);
261 GNUNET_free (lr);
259} 262}
260 263
261 264
diff --git a/src/gns/plugin_gnsrecord_gns.c b/src/gns/plugin_gnsrecord_gns.c
index 5d611e19e..6adad0f34 100644
--- a/src/gns/plugin_gnsrecord_gns.c
+++ b/src/gns/plugin_gnsrecord_gns.c
@@ -140,30 +140,6 @@ gns_value_to_string (void *cls,
140 GNUNET_free (ival); 140 GNUNET_free (ival);
141 return box_str; 141 return box_str;
142 } 142 }
143 case GNUNET_GNSRECORD_TYPE_REVERSE:
144 {
145 struct GNUNET_GNSRECORD_ReverseRecord rev;
146 char *rev_str;
147 char *pkey_str;
148
149 if (data_size < sizeof (struct GNUNET_GNSRECORD_ReverseRecord))
150 return NULL; /* malformed */
151
152 memcpy (&rev,
153 data,
154 sizeof (rev));
155 cdata = data;
156 pkey_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (&rev.pkey);
157
158 GNUNET_asprintf (&rev_str,
159 "%s %s %"SCNu64,
160 &cdata[sizeof (rev)],
161 pkey_str,
162 rev.expiration.abs_value_us);
163 GNUNET_free (pkey_str);
164 return rev_str;
165
166 }
167 default: 143 default:
168 return NULL; 144 return NULL;
169 } 145 }
@@ -335,48 +311,6 @@ gns_string_to_value (void *cls,
335 GNUNET_free (bval); 311 GNUNET_free (bval);
336 return GNUNET_OK; 312 return GNUNET_OK;
337 } 313 }
338 case GNUNET_GNSRECORD_TYPE_REVERSE:
339 {
340 struct GNUNET_GNSRECORD_ReverseRecord *rev;
341 char known_by[253 + 1];
342 struct GNUNET_TIME_Absolute expiration;
343
344 /* TODO: From crypto_ecc.c
345 * Why is this not a constant???
346 */
347 size_t enclen = (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)) * 8;
348 if (enclen % 5 > 0)
349 enclen += 5 - enclen % 5;
350 enclen /= 5; /* 260/5 = 52 */
351 char pkey_str[enclen + 1];
352
353 if (3 != SSCANF (s,
354 "%253s %52s %"SCNu64,
355 known_by,
356 pkey_str,
357 &expiration.abs_value_us))
358 {
359 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
360 _("Unable to parse REVERSE record string `%s'\n"),
361 s);
362 return GNUNET_SYSERR;
363 }
364 *data_size = sizeof (struct GNUNET_GNSRECORD_ReverseRecord) + strlen (known_by) + 1;
365 *data = rev = GNUNET_malloc (*data_size);
366 if (GNUNET_OK !=
367 GNUNET_CRYPTO_ecdsa_public_key_from_string (pkey_str,
368 strlen (pkey_str),
369 &rev->pkey))
370 {
371 GNUNET_free (rev);
372 return GNUNET_SYSERR;
373 }
374 rev->expiration = expiration;
375 GNUNET_memcpy (&rev[1],
376 known_by,
377 strlen (known_by));
378 return GNUNET_OK;
379 }
380 default: 314 default:
381 return GNUNET_SYSERR; 315 return GNUNET_SYSERR;
382 } 316 }
@@ -397,7 +331,6 @@ static struct {
397 { "VPN", GNUNET_GNSRECORD_TYPE_VPN }, 331 { "VPN", GNUNET_GNSRECORD_TYPE_VPN },
398 { "GNS2DNS", GNUNET_GNSRECORD_TYPE_GNS2DNS }, 332 { "GNS2DNS", GNUNET_GNSRECORD_TYPE_GNS2DNS },
399 { "BOX", GNUNET_GNSRECORD_TYPE_BOX }, 333 { "BOX", GNUNET_GNSRECORD_TYPE_BOX },
400 { "REVERSE", GNUNET_GNSRECORD_TYPE_REVERSE },
401 { NULL, UINT32_MAX } 334 { NULL, UINT32_MAX }
402}; 335};
403 336
diff --git a/src/identity-attribute/Makefile.am b/src/identity-attribute/Makefile.am
new file mode 100644
index 000000000..770bc2ead
--- /dev/null
+++ b/src/identity-attribute/Makefile.am
@@ -0,0 +1,44 @@
1# This Makefile.am is in the public domain
2AM_CPPFLAGS = -I$(top_srcdir)/src/include
3
4plugindir = $(libdir)/gnunet
5
6pkgcfgdir= $(pkgdatadir)/config.d/
7
8libexecdir= $(pkglibdir)/libexec/
9
10if MINGW
11 WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols
12endif
13
14if USE_COVERAGE
15 AM_CFLAGS = --coverage -O0
16 XLIBS = -lgcov
17endif
18
19lib_LTLIBRARIES = \
20 libgnunetidentityattribute.la
21
22libgnunetidentityattribute_la_SOURCES = \
23 identity_attribute.c
24libgnunetidentityattribute_la_LIBADD = \
25 $(top_builddir)/src/util/libgnunetutil.la \
26 $(GN_LIBINTL)
27libgnunetidentityattribute_la_LDFLAGS = \
28 $(GN_LIB_LDFLAGS) $(WINFLAGS) \
29 -version-info 0:0:0
30
31
32plugin_LTLIBRARIES = \
33 libgnunet_plugin_identity_attribute_gnuid.la
34
35
36libgnunet_plugin_identity_attribute_gnuid_la_SOURCES = \
37 plugin_identity_attribute_gnuid.c
38libgnunet_plugin_identity_attribute_gnuid_la_LIBADD = \
39 $(top_builddir)/src/util/libgnunetutil.la \
40 $(LTLIBINTL)
41libgnunet_plugin_gnsrecord_dns_la_LDFLAGS = \
42 $(GN_PLUGIN_LDFLAGS)
43
44
diff --git a/src/identity-attribute/identity_attribute.c b/src/identity-attribute/identity_attribute.c
new file mode 100644
index 000000000..377eb3211
--- /dev/null
+++ b/src/identity-attribute/identity_attribute.c
@@ -0,0 +1,245 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20
21/**
22 * @file identity-provider/identity_attribute.c
23 * @brief helper library to manage identity attributes
24 * @author Martin Schanzenbach
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28#include "identity_attribute.h"
29
30/**
31 * Create a new attribute.
32 *
33 * @param name the attribute name
34 * @param type the attribute type
35 * @param data the attribute value
36 * @param data_size the attribute value size
37 * @return the new attribute
38 */
39struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
40GNUNET_IDENTITY_ATTRIBUTE_claim_new (const char* attr_name,
41 uint32_t attr_type,
42 const void* data,
43 size_t data_size)
44{
45 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
46 char *write_ptr;
47
48 attr = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_ATTRIBUTE_Claim) +
49 strlen (attr_name) + 1 +
50 data_size);
51 attr->type = attr_type;
52 attr->data_size = data_size;
53 attr->version = 0;
54 write_ptr = (char*)&attr[1];
55 GNUNET_memcpy (write_ptr,
56 attr_name,
57 strlen (attr_name) + 1);
58 attr->name = write_ptr;
59 write_ptr += strlen (attr->name) + 1;
60 GNUNET_memcpy (write_ptr,
61 data,
62 data_size);
63 attr->data = write_ptr;
64 return attr;
65}
66
67size_t
68GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
69{
70 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
71 size_t len = 0;
72 for (le = attrs->list_head; NULL != le; le = le->next)
73 len += GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (le->claim);
74 return len;
75}
76
77size_t
78GNUNET_IDENTITY_ATTRIBUTE_list_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
79 char *result)
80{
81 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
82 size_t len;
83 size_t total_len;
84 char* write_ptr;
85
86 write_ptr = result;
87 total_len = 0;
88 for (le = attrs->list_head; NULL != le; le = le->next)
89 {
90 len = GNUNET_IDENTITY_ATTRIBUTE_serialize (le->claim,
91 write_ptr);
92 total_len += len;
93 write_ptr += len;
94 }
95 return total_len;
96}
97
98struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *
99GNUNET_IDENTITY_ATTRIBUTE_list_deserialize (const char* data,
100 size_t data_size)
101{
102 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
103 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
104 size_t attr_len;
105 const char* read_ptr;
106
107 if (data_size < sizeof (struct Attribute))
108 return NULL;
109
110 attrs = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
111 read_ptr = data;
112 while (((data + data_size) - read_ptr) >= sizeof (struct Attribute))
113 {
114
115 le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
116 le->claim = GNUNET_IDENTITY_ATTRIBUTE_deserialize (read_ptr,
117 data_size - (read_ptr - data));
118 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
119 "Deserialized attribute %s\n", le->claim->name);
120 GNUNET_CONTAINER_DLL_insert (attrs->list_head,
121 attrs->list_tail,
122 le);
123 attr_len = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (le->claim);
124 read_ptr += attr_len;
125 }
126 return attrs;
127}
128
129struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList*
130GNUNET_IDENTITY_ATTRIBUTE_list_dup (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
131{
132 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
133 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *result_le;
134 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *result;
135 size_t len;
136
137 result = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
138 for (le = attrs->list_head; NULL != le; le = le->next)
139 {
140 result_le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
141 len = sizeof (struct GNUNET_IDENTITY_ATTRIBUTE_Claim) + le->claim->data_size;
142 result_le->claim = GNUNET_malloc (len);
143 GNUNET_memcpy (result_le->claim,
144 le->claim,
145 len);
146 result_le->claim->name = (const char*)&result_le->claim[1];
147 GNUNET_CONTAINER_DLL_insert (result->list_head,
148 result->list_tail,
149 result_le);
150 }
151 return result;
152}
153
154
155void
156GNUNET_IDENTITY_ATTRIBUTE_list_destroy (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
157{
158 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
159 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *tmp_le;
160
161 for (le = attrs->list_head; NULL != le;)
162 {
163 GNUNET_free (le->claim);
164 tmp_le = le;
165 le = le->next;
166 GNUNET_free (tmp_le);
167 }
168 GNUNET_free (attrs);
169
170}
171
172size_t
173GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
174{
175 return sizeof (struct Attribute)
176 + strlen (attr->name)
177 + attr->data_size;
178}
179
180size_t
181GNUNET_IDENTITY_ATTRIBUTE_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
182 char *result)
183{
184 size_t data_len_ser;
185 size_t name_len;
186 struct Attribute *attr_ser;
187 char* write_ptr;
188
189 attr_ser = (struct Attribute*)result;
190 attr_ser->attribute_type = htons (attr->type);
191 attr_ser->attribute_version = htonl (attr->version);
192 name_len = strlen (attr->name);
193 attr_ser->name_len = htons (name_len);
194 write_ptr = (char*)&attr_ser[1];
195 GNUNET_memcpy (write_ptr, attr->name, name_len);
196 write_ptr += name_len;
197 //TODO plugin-ize
198 //data_len_ser = plugin->serialize_attribute_value (attr,
199 // &attr_ser[1]);
200 data_len_ser = attr->data_size;
201 GNUNET_memcpy (write_ptr, attr->data, attr->data_size);
202 attr_ser->data_size = htons (data_len_ser);
203
204 return sizeof (struct Attribute) + strlen (attr->name) + attr->data_size;
205}
206
207struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
208GNUNET_IDENTITY_ATTRIBUTE_deserialize (const char* data,
209 size_t data_size)
210{
211 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
212 struct Attribute *attr_ser;
213 size_t data_len;
214 size_t name_len;
215 char* write_ptr;
216
217 if (data_size < sizeof (struct Attribute))
218 return NULL;
219
220 attr_ser = (struct Attribute*)data;
221 data_len = ntohs (attr_ser->data_size);
222 name_len = ntohs (attr_ser->name_len);
223 attr = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_ATTRIBUTE_Claim)
224 + data_len + name_len + 1);
225 attr->type = ntohs (attr_ser->attribute_type);
226 attr->version = ntohl (attr_ser->attribute_version);
227 attr->data_size = ntohs (attr_ser->data_size);
228
229 write_ptr = (char*)&attr[1];
230 GNUNET_memcpy (write_ptr,
231 &attr_ser[1],
232 name_len);
233 write_ptr[name_len] = '\0';
234 attr->name = write_ptr;
235
236 write_ptr += name_len + 1;
237 GNUNET_memcpy (write_ptr,
238 (char*)&attr_ser[1] + name_len,
239 attr->data_size);
240 attr->data = write_ptr;
241 return attr;
242
243}
244
245/* end of identity_attribute.c */
diff --git a/src/identity-attribute/identity_attribute.h b/src/identity-attribute/identity_attribute.h
new file mode 100644
index 000000000..046321807
--- /dev/null
+++ b/src/identity-attribute/identity_attribute.h
@@ -0,0 +1,56 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @author Martin Schanzenbach
22 * @file identity-provider/identity_attribute.h
23 * @brief GNUnet Identity Provider library
24 *
25 */
26#ifndef IDENTITY_ATTRIBUTE_H
27#define IDENTITY_ATTRIBUTE_H
28
29#include "gnunet_identity_provider_service.h"
30
31struct Attribute
32{
33 /**
34 * Attribute type
35 */
36 uint32_t attribute_type;
37
38 /**
39 * Attribute version
40 */
41 uint32_t attribute_version;
42
43 /**
44 * Name length
45 */
46 uint32_t name_len;
47
48 /**
49 * Data size
50 */
51 uint32_t data_size;
52
53 //followed by data_size Attribute value data
54};
55
56#endif
diff --git a/src/identity-attribute/plugin_identity_attribute_gnuid.c b/src/identity-attribute/plugin_identity_attribute_gnuid.c
new file mode 100644
index 000000000..ba460d0a5
--- /dev/null
+++ b/src/identity-attribute/plugin_identity_attribute_gnuid.c
@@ -0,0 +1,184 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2013, 2014, 2016 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21/**
22 * @file identity-provider/plugin_identity_attribute_gnuid.c
23 * @brief identity attribute plugin to provide the API for fundamental
24 * attribute types.
25 *
26 * @author Martin Schanzenbach
27 */
28#include "platform.h"
29#include "gnunet_util_lib.h"
30#include "gnunet_identity_attribute_plugin.h"
31#include <inttypes.h>
32
33
34/**
35 * Convert the 'value' of an attribute to a string.
36 *
37 * @param cls closure, unused
38 * @param type type of the attribute
39 * @param data value in binary encoding
40 * @param data_size number of bytes in @a data
41 * @return NULL on error, otherwise human-readable representation of the value
42 */
43static char *
44gnuid_value_to_string (void *cls,
45 uint32_t type,
46 const void *data,
47 size_t data_size)
48{
49
50 switch (type)
51 {
52 case GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING:
53 return GNUNET_strndup (data, data_size);
54 default:
55 return NULL;
56 }
57}
58
59
60/**
61 * Convert human-readable version of a 'value' of an attribute to the binary
62 * representation.
63 *
64 * @param cls closure, unused
65 * @param type type of the attribute
66 * @param s human-readable string
67 * @param data set to value in binary encoding (will be allocated)
68 * @param data_size set to number of bytes in @a data
69 * @return #GNUNET_OK on success
70 */
71static int
72gnuid_string_to_value (void *cls,
73 uint32_t type,
74 const char *s,
75 void **data,
76 size_t *data_size)
77{
78 if (NULL == s)
79 return GNUNET_SYSERR;
80 switch (type)
81 {
82
83 case GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING:
84 *data = GNUNET_strdup (s);
85 *data_size = strlen (s);
86 return GNUNET_OK;
87 default:
88 return GNUNET_SYSERR;
89 }
90}
91
92
93/**
94 * Mapping of attribute type numbers to human-readable
95 * attribute type names.
96 */
97static struct {
98 const char *name;
99 uint32_t number;
100} gnuid_name_map[] = {
101 { "STRING", GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING },
102 { NULL, UINT32_MAX }
103};
104
105
106/**
107 * Convert a type name to the corresponding number.
108 *
109 * @param cls closure, unused
110 * @param gnuid_typename name to convert
111 * @return corresponding number, UINT32_MAX on error
112 */
113static uint32_t
114gnuid_typename_to_number (void *cls,
115 const char *gnuid_typename)
116{
117 unsigned int i;
118
119 i=0;
120 while ( (NULL != gnuid_name_map[i].name) &&
121 (0 != strcasecmp (gnuid_typename,
122 gnuid_name_map[i].name)) )
123 i++;
124 return gnuid_name_map[i].number;
125}
126
127
128/**
129 * Convert a type number (i.e. 1) to the corresponding type string
130 *
131 * @param cls closure, unused
132 * @param type number of a type to convert
133 * @return corresponding typestring, NULL on error
134 */
135static const char *
136gnuid_number_to_typename (void *cls,
137 uint32_t type)
138{
139 unsigned int i;
140
141 i=0;
142 while ( (NULL != gnuid_name_map[i].name) &&
143 (type != gnuid_name_map[i].number) )
144 i++;
145 return gnuid_name_map[i].name;
146}
147
148
149/**
150 * Entry point for the plugin.
151 *
152 * @param cls NULL
153 * @return the exported block API
154 */
155void *
156libgnunet_plugin_attribute_type_gnuid_init (void *cls)
157{
158 struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions *api;
159
160 api = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions);
161 api->value_to_string = &gnuid_value_to_string;
162 api->string_to_value = &gnuid_string_to_value;
163 api->typename_to_number = &gnuid_typename_to_number;
164 api->number_to_typename = &gnuid_number_to_typename;
165 return api;
166}
167
168
169/**
170 * Exit point from the plugin.
171 *
172 * @param cls the return value from #libgnunet_plugin_block_test_init()
173 * @return NULL
174 */
175void *
176libgnunet_plugin_attribute_type_gnuid_done (void *cls)
177{
178 struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions *api = cls;
179
180 GNUNET_free (api);
181 return NULL;
182}
183
184/* end of plugin_identity_attribute_type_gnuid.c */
diff --git a/src/identity-provider/Makefile.am b/src/identity-provider/Makefile.am
index 7c2bb9646..3b072e59d 100644
--- a/src/identity-provider/Makefile.am
+++ b/src/identity-provider/Makefile.am
@@ -12,6 +12,15 @@ if USE_COVERAGE
12 XLIB = -lgcov 12 XLIB = -lgcov
13endif 13endif
14 14
15if HAVE_SQLITE
16SQLITE_PLUGIN = libgnunet_plugin_identity_provider_sqlite.la
17endif
18
19EXTRA_DIST = \
20 test_idp_defaults.conf \
21 test_idp.conf \
22 $(check_SCRIPTS)
23
15pkgcfgdir= $(pkgdatadir)/config.d/ 24pkgcfgdir= $(pkgdatadir)/config.d/
16 25
17libexecdir= $(pkglibdir)/libexec/ 26libexecdir= $(pkglibdir)/libexec/
@@ -22,26 +31,50 @@ pkgcfg_DATA = \
22lib_LTLIBRARIES = \ 31lib_LTLIBRARIES = \
23 libgnunetidentityprovider.la 32 libgnunetidentityprovider.la
24plugin_LTLIBRARIES = \ 33plugin_LTLIBRARIES = \
25 libgnunet_plugin_rest_identity_provider.la 34 libgnunet_plugin_rest_identity_provider.la \
35 libgnunet_plugin_gnsrecord_identity_provider.la \
36 $(SQLITE_PLUGIN)
26 37
27bin_PROGRAMS = \ 38bin_PROGRAMS = \
28 gnunet-identity-token 39 gnunet-idp
29 40
30libexec_PROGRAMS = \ 41libexec_PROGRAMS = \
31 gnunet-service-identity-provider 42 gnunet-service-identity-provider
32 43
44libgnunet_plugin_gnsrecord_identity_provider_la_SOURCES = \
45 plugin_gnsrecord_identity_provider.c
46libgnunet_plugin_gnsrecord_identity_provider_la_LIBADD = \
47 $(top_builddir)/src/util/libgnunetutil.la \
48 $(LTLIBINTL)
49libgnunet_plugin_gnsrecord_identity_provider_la_LDFLAGS = \
50 $(GN_PLUGIN_LDFLAGS)
51
52libgnunet_plugin_identity_provider_sqlite_la_SOURCES = \
53 plugin_identity_provider_sqlite.c
54libgnunet_plugin_identity_provider_sqlite_la_LIBADD = \
55 libgnunetidentityprovider.la \
56 $(top_builddir)/src/sq/libgnunetsq.la \
57 $(top_builddir)/src/statistics/libgnunetstatistics.la \
58 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 \
59 $(LTLIBINTL)
60libgnunet_plugin_identity_provider_sqlite_la_LDFLAGS = \
61 $(GN_PLUGIN_LDFLAGS)
62
63
64
33gnunet_service_identity_provider_SOURCES = \ 65gnunet_service_identity_provider_SOURCES = \
34 gnunet-service-identity-provider.c \ 66 gnunet-service-identity-provider.c
35 identity_token.c
36gnunet_service_identity_provider_LDADD = \ 67gnunet_service_identity_provider_LDADD = \
37 $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ 68 $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
38 $(top_builddir)/src/util/libgnunetutil.la \ 69 $(top_builddir)/src/util/libgnunetutil.la \
39 $(top_builddir)/src/namestore/libgnunetnamestore.la \ 70 $(top_builddir)/src/namestore/libgnunetnamestore.la \
40 $(top_builddir)/src/identity/libgnunetidentity.la \ 71 $(top_builddir)/src/identity/libgnunetidentity.la \
41 $(top_builddir)/src/statistics/libgnunetstatistics.la \ 72 $(top_builddir)/src/statistics/libgnunetstatistics.la \
73 $(top_builddir)/src/credential/libgnunetcredential.la \
74 $(top_builddir)/src/identity-attribute/libgnunetidentityattribute.la \
75 libgnunetidentityprovider.la \
42 $(top_builddir)/src/gns/libgnunetgns.la \ 76 $(top_builddir)/src/gns/libgnunetgns.la \
43 $(GN_LIBINTL) \ 77 $(GN_LIBINTL)
44 -ljansson
45 78
46libgnunetidentityprovider_la_SOURCES = \ 79libgnunetidentityprovider_la_SOURCES = \
47 identity_provider_api.c \ 80 identity_provider_api.c \
@@ -60,16 +93,30 @@ libgnunet_plugin_rest_identity_provider_la_LIBADD = \
60 libgnunetidentityprovider.la \ 93 libgnunetidentityprovider.la \
61 $(top_builddir)/src/rest/libgnunetrest.la \ 94 $(top_builddir)/src/rest/libgnunetrest.la \
62 $(top_builddir)/src/jsonapi/libgnunetjsonapi.la \ 95 $(top_builddir)/src/jsonapi/libgnunetjsonapi.la \
96 $(top_builddir)/src/identity-attribute/libgnunetidentityattribute.la \
63 $(top_builddir)/src/namestore/libgnunetnamestore.la \ 97 $(top_builddir)/src/namestore/libgnunetnamestore.la \
64 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \ 98 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
65 $(LTLIBINTL) -ljansson -lmicrohttpd 99 $(LTLIBINTL) -ljansson -lmicrohttpd
66libgnunet_plugin_rest_identity_provider_la_LDFLAGS = \ 100libgnunet_plugin_rest_identity_provider_la_LDFLAGS = \
67 $(GN_PLUGIN_LDFLAGS) 101 $(GN_PLUGIN_LDFLAGS)
68 102
69 103gnunet_idp_SOURCES = \
70gnunet_identity_token_SOURCES = \ 104 gnunet-idp.c
71 gnunet-identity-token.c 105gnunet_idp_LDADD = \
72gnunet_identity_token_LDADD = \
73 $(top_builddir)/src/util/libgnunetutil.la \ 106 $(top_builddir)/src/util/libgnunetutil.la \
74 -ljansson -lmicrohttpd \ 107 $(top_builddir)/src/namestore/libgnunetnamestore.la \
108 libgnunetidentityprovider.la \
109 $(top_builddir)/src/identity/libgnunetidentity.la \
110 $(top_builddir)/src/identity-attribute/libgnunetidentityattribute.la \
75 $(GN_LIBINTL) 111 $(GN_LIBINTL)
112
113check_SCRIPTS = \
114 test_idp_attribute.sh \
115 test_idp_issue.sh \
116 test_idp_consume.sh \
117 test_idp_revoke.sh
118
119if ENABLE_TEST_RUN
120 AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset XDG_CONFIG_HOME;
121 TESTS = $(check_SCRIPTS)
122endif
diff --git a/src/identity-provider/gnunet-identity-token.c b/src/identity-provider/gnunet-identity-token.c
deleted file mode 100644
index 30b63bfc4..000000000
--- a/src/identity-provider/gnunet-identity-token.c
+++ /dev/null
@@ -1,179 +0,0 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @author Martin Schanzenbach
22 * @file src/identity-provider/gnunet-service-identity-provider.c
23 * @brief Identity Token Service
24 *
25 */
26
27#include "platform.h"
28#include "gnunet_util_lib.h"
29#include <jansson.h>
30#include "gnunet_signatures.h"
31
32/**
33 * The token
34 */
35static char* token;
36
37/**
38 * Weather to print the token
39 */
40static int print_token;
41
42static void
43run (void *cls,
44 char *const *args,
45 const char *cfgfile,
46 const struct GNUNET_CONFIGURATION_Handle *c)
47{
48 char *payload;
49 char *header;
50 //Get token parts
51 const char *header_b64;
52 const char *payload_b64;
53 const char *signature_b32;
54 const char *keystring;
55 char *data;
56 json_t *payload_json;
57 json_t *keystring_json;
58 json_error_t error;
59 struct GNUNET_CRYPTO_EcdsaPublicKey key;
60 struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
61 struct GNUNET_CRYPTO_EcdsaSignature sig;
62
63 if (NULL == token)
64 {
65 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
66 _("Option `-t' is required\n"));
67 return;
68 }
69 header_b64 = strtok (token, ".");
70 payload_b64 = strtok (NULL, ".");
71 signature_b32 = strtok (NULL, ".");
72 if ( (NULL == header_b64) ||
73 (NULL == payload_b64) ||
74 (NULL == signature_b32) )
75 {
76 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
77 _("Token `%s' is malformed\n"),
78 token);
79 GNUNET_free (token);
80 token = NULL;
81 return;
82 }
83
84 //Decode payload
85 GNUNET_STRINGS_base64_decode (payload_b64,
86 strlen (payload_b64),
87 &payload);
88 //Decode header
89 GNUNET_STRINGS_base64_decode (header_b64,
90 strlen (header_b64),
91 &header);
92
93
94 GNUNET_asprintf(&data,
95 "%s,%s",
96 header_b64,
97 payload_b64);
98 char *val = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + strlen (data));
99 purpose = (struct GNUNET_CRYPTO_EccSignaturePurpose*)val;
100 purpose->size = htonl(sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + strlen (data));
101 purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
102 GNUNET_memcpy (&purpose[1], data, strlen(data));
103 GNUNET_free (data);
104 GNUNET_free (token);
105 token = NULL;
106
107 if (print_token)
108 printf ("Token:\nHeader:\t\t%s\nPayload:\t%s\n",
109 header,
110 payload);
111 GNUNET_free (header);
112
113 payload_json = json_loads (payload, 0, &error);
114 GNUNET_free (payload);
115
116 if ((NULL == payload_json) || (! json_is_object (payload_json)) )
117 {
118 GNUNET_free (val);
119 return;
120 }
121 keystring_json = json_object_get (payload_json, "iss");
122 if (! json_is_string (keystring_json))
123 {
124 GNUNET_free (val);
125 return;
126 }
127 keystring = json_string_value (keystring_json);
128 if (GNUNET_OK !=
129 GNUNET_CRYPTO_ecdsa_public_key_from_string (keystring,
130 strlen (keystring),
131 &key))
132 {
133 GNUNET_free (val);
134 return;
135 }
136 GNUNET_STRINGS_string_to_data (signature_b32,
137 strlen (signature_b32),
138 &sig,
139 sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
140
141 if (print_token)
142 printf ("Signature:\t%s\n",
143 keystring);
144
145 if (GNUNET_OK !=
146 GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN,
147 purpose,
148 &sig,
149 &key))
150 printf("Signature not OK!\n");
151 else
152 printf("Signature OK!\n");
153 GNUNET_free (val);
154 return;
155}
156
157
158int
159main(int argc, char *const argv[])
160{
161 struct GNUNET_GETOPT_CommandLineOption options[] = {
162
163 GNUNET_GETOPT_option_string ('t',
164 "token",
165 NULL,
166 gettext_noop ("GNUid token"),
167 &token),
168
169 GNUNET_GETOPT_option_flag ('p',
170 "print",
171 gettext_noop ("Print token contents"),
172 &print_token),
173
174 GNUNET_GETOPT_OPTION_END
175 };
176 return GNUNET_PROGRAM_run (argc, argv, "ct",
177 "ct", options,
178 &run, NULL);
179}
diff --git a/src/identity-provider/gnunet-idp.c b/src/identity-provider/gnunet-idp.c
new file mode 100644
index 000000000..18a5676c0
--- /dev/null
+++ b/src/identity-provider/gnunet-idp.c
@@ -0,0 +1,413 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @author Martin Schanzenbach
22 * @file src/identity-provider/gnunet-idp.c
23 * @brief Identity Provider utility
24 *
25 */
26
27#include "platform.h"
28#include "gnunet_util_lib.h"
29#include "gnunet_namestore_service.h"
30#include "gnunet_identity_provider_service.h"
31#include "gnunet_identity_service.h"
32#include "gnunet_signatures.h"
33
34/**
35 * return value
36 */
37static int ret;
38
39/**
40 * List attribute flag
41 */
42static int list;
43
44/**
45 * Relying party
46 */
47static char* rp;
48
49/**
50 * The attribute
51 */
52static char* attr_name;
53
54/**
55 * Attribute value
56 */
57static char* attr_value;
58
59/**
60 * Attributes to issue
61 */
62static char* issue_attrs;
63
64/**
65 * Ticket to consume
66 */
67static char* consume_ticket;
68
69/**
70 * Ticket to revoke
71 */
72static char* revoke_ticket;
73
74/**
75 * Ego name
76 */
77static char* ego_name;
78
79/**
80 * Identity handle
81 */
82static struct GNUNET_IDENTITY_Handle *identity_handle;
83
84/**
85 * IdP handle
86 */
87static struct GNUNET_IDENTITY_PROVIDER_Handle *idp_handle;
88
89/**
90 * IdP operation
91 */
92static struct GNUNET_IDENTITY_PROVIDER_Operation *idp_op;
93
94/**
95 * Attribute iterator
96 */
97static struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *attr_iterator;
98
99/**
100 * Master ABE key
101 */
102static struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
103
104/**
105 * ego private key
106 */
107static const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey;
108
109/**
110 * rp public key
111 */
112static struct GNUNET_CRYPTO_EcdsaPublicKey rp_key;
113
114/**
115 * Ticket to consume
116 */
117static struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
118
119/**
120 * Attribute list
121 */
122static struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attr_list;
123
124static void
125do_cleanup(void *cls)
126{
127 if (NULL != attr_iterator)
128 GNUNET_IDENTITY_PROVIDER_get_attributes_stop (attr_iterator);
129 if (NULL != idp_handle)
130 GNUNET_IDENTITY_PROVIDER_disconnect (idp_handle);
131 if (NULL != identity_handle)
132 GNUNET_IDENTITY_disconnect (identity_handle);
133 if (NULL != abe_key)
134 GNUNET_free (abe_key);
135 if (NULL != attr_list)
136 GNUNET_free (attr_list);
137}
138
139static void
140ticket_issue_cb (void* cls,
141 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
142{
143 char* ticket_str;
144 if (NULL != ticket) {
145 ticket_str = GNUNET_STRINGS_data_to_string_alloc (ticket,
146 sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
147 printf("%s\n",
148 ticket_str);
149 GNUNET_free (ticket_str);
150 }
151 GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
152}
153
154static void
155store_attr_cont (void *cls,
156 int32_t success,
157 const char*emsg)
158{
159 if (GNUNET_SYSERR == success) {
160 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
161 "%s\n", emsg);
162 }
163 GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
164}
165
166static void
167process_attrs (void *cls,
168 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
169 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
170{
171 if (NULL == identity)
172 {
173 GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
174 return;
175 }
176 if (NULL == attr)
177 {
178 ret = 1;
179 return;
180 }
181 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
182 "%s: %s\n", attr->name, (char*)attr->data);
183}
184
185
186static void
187iter_error (void *cls)
188{
189 attr_iterator = NULL;
190 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
191 "Failed to iterate over attributes\n");
192 GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
193}
194
195static void
196process_rvk (void *cls, int success, const char* msg)
197{
198 if (GNUNET_OK != success)
199 {
200 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
201 "Revocation failed.\n");
202 ret = 1;
203 }
204 GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
205}
206
207static void
208iter_finished (void *cls)
209{
210 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
211
212 attr_iterator = NULL;
213 if (list)
214 {
215 GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
216 return;
217 }
218
219 if (issue_attrs)
220 {
221 idp_op = GNUNET_IDENTITY_PROVIDER_ticket_issue (idp_handle,
222 pkey,
223 &rp_key,
224 attr_list,
225 &ticket_issue_cb,
226 NULL);
227 return;
228 }
229 if (consume_ticket)
230 {
231 idp_op = GNUNET_IDENTITY_PROVIDER_ticket_consume (idp_handle,
232 pkey,
233 &ticket,
234 &process_attrs,
235 NULL);
236 return;
237 }
238 if (revoke_ticket)
239 {
240 idp_op = GNUNET_IDENTITY_PROVIDER_ticket_revoke (idp_handle,
241 pkey,
242 &ticket,
243 &process_rvk,
244 NULL);
245 return;
246 }
247 attr = GNUNET_IDENTITY_ATTRIBUTE_claim_new (attr_name,
248 GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING,
249 attr_value,
250 strlen (attr_value) + 1);
251 idp_op = GNUNET_IDENTITY_PROVIDER_attribute_store (idp_handle,
252 pkey,
253 attr,
254 &store_attr_cont,
255 NULL);
256
257
258}
259
260static void
261iter_cb (void *cls,
262 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
263 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
264{
265 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
266 char *attrs_tmp;
267 char *attr_str;
268
269 if (issue_attrs)
270 {
271 attrs_tmp = GNUNET_strdup (issue_attrs);
272 attr_str = strtok (attrs_tmp, ",");
273 while (NULL != attr_str) {
274 if (0 != strcmp (attr_str, attr->name)) {
275 attr_str = strtok (NULL, ",");
276 continue;
277 }
278 le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
279 le->claim = GNUNET_IDENTITY_ATTRIBUTE_claim_new (attr->name,
280 attr->type,
281 attr->data,
282 attr->data_size);
283 GNUNET_CONTAINER_DLL_insert (attr_list->list_head,
284 attr_list->list_tail,
285 le);
286 break;
287 }
288 GNUNET_free (attrs_tmp);
289 } else if (list) {
290 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
291 "%s: %s\n", attr->name, (char*)attr->data);
292 }
293 GNUNET_IDENTITY_PROVIDER_get_attributes_next (attr_iterator);
294}
295
296static void
297ego_cb (void *cls,
298 struct GNUNET_IDENTITY_Ego *ego,
299 void **ctx,
300 const char *name)
301{
302 if (NULL == name)
303 return;
304 if (0 != strcmp (name, ego_name))
305 return;
306 pkey = GNUNET_IDENTITY_ego_get_private_key (ego);
307
308 if (NULL != rp)
309 GNUNET_CRYPTO_ecdsa_public_key_from_string (rp,
310 strlen (rp),
311 &rp_key);
312 if (NULL != consume_ticket)
313 GNUNET_STRINGS_string_to_data (consume_ticket,
314 strlen (consume_ticket),
315 &ticket,
316 sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
317 if (NULL != revoke_ticket)
318 GNUNET_STRINGS_string_to_data (revoke_ticket,
319 strlen (revoke_ticket),
320 &ticket,
321 sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
322
323
324 attr_list = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
325
326 attr_iterator = GNUNET_IDENTITY_PROVIDER_get_attributes_start (idp_handle,
327 pkey,
328 &iter_error,
329 NULL,
330 &iter_cb,
331 NULL,
332 &iter_finished,
333 NULL);
334
335
336}
337
338static void
339run (void *cls,
340 char *const *args,
341 const char *cfgfile,
342 const struct GNUNET_CONFIGURATION_Handle *c)
343{
344 ret = 0;
345 if (NULL == ego_name)
346 {
347 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
348 _("Ego is required\n"));
349 return;
350 }
351
352 idp_handle = GNUNET_IDENTITY_PROVIDER_connect (c);
353 //Get Ego
354 identity_handle = GNUNET_IDENTITY_connect (c,
355 &ego_cb,
356 NULL);
357
358
359}
360
361
362int
363main(int argc, char *const argv[])
364{
365 struct GNUNET_GETOPT_CommandLineOption options[] = {
366
367 GNUNET_GETOPT_option_string ('a',
368 "add",
369 NULL,
370 gettext_noop ("Add attribute"),
371 &attr_name),
372
373 GNUNET_GETOPT_option_string ('V',
374 "value",
375 NULL,
376 gettext_noop ("Attribute value"),
377 &attr_value),
378 GNUNET_GETOPT_option_string ('e',
379 "ego",
380 NULL,
381 gettext_noop ("Ego"),
382 &ego_name),
383 GNUNET_GETOPT_option_string ('r',
384 "rp",
385 NULL,
386 gettext_noop ("Audience (relying party)"),
387 &rp),
388 GNUNET_GETOPT_option_flag ('D',
389 "dump",
390 gettext_noop ("List attributes for Ego"),
391 &list),
392 GNUNET_GETOPT_option_string ('i',
393 "issue",
394 NULL,
395 gettext_noop ("Issue a ticket"),
396 &issue_attrs),
397 GNUNET_GETOPT_option_string ('C',
398 "consume",
399 NULL,
400 gettext_noop ("Consume a ticket"),
401 &consume_ticket),
402 GNUNET_GETOPT_option_string ('R',
403 "revoke",
404 NULL,
405 gettext_noop ("Revoke a ticket"),
406 &revoke_ticket),
407 GNUNET_GETOPT_OPTION_END
408 };
409 GNUNET_PROGRAM_run (argc, argv, "ct",
410 "ct", options,
411 &run, NULL);
412 return ret;
413}
diff --git a/src/identity-provider/gnunet-service-identity-provider.c b/src/identity-provider/gnunet-service-identity-provider.c
index 53fd02c9f..a5c178aa5 100644
--- a/src/identity-provider/gnunet-service-identity-provider.c
+++ b/src/identity-provider/gnunet-service-identity-provider.c
@@ -30,12 +30,13 @@
30#include "gnunet_identity_service.h" 30#include "gnunet_identity_service.h"
31#include "gnunet_gnsrecord_lib.h" 31#include "gnunet_gnsrecord_lib.h"
32#include "gnunet_namestore_service.h" 32#include "gnunet_namestore_service.h"
33#include "gnunet_credential_service.h"
33#include "gnunet_statistics_service.h" 34#include "gnunet_statistics_service.h"
34#include "gnunet_gns_service.h" 35#include "gnunet_gns_service.h"
36#include "gnunet_identity_provider_plugin.h"
37#include "gnunet_identity_attribute_lib.h"
35#include "gnunet_signatures.h" 38#include "gnunet_signatures.h"
36#include "identity_provider.h" 39#include "identity_provider.h"
37#include "identity_token.h"
38#include <inttypes.h>
39 40
40/** 41/**
41 * First pass state 42 * First pass state
@@ -58,24 +59,19 @@
58#define DEFAULT_TOKEN_EXPIRATION_INTERVAL GNUNET_TIME_UNIT_HOURS 59#define DEFAULT_TOKEN_EXPIRATION_INTERVAL GNUNET_TIME_UNIT_HOURS
59 60
60/** 61/**
61 * Service state (to detect initial update pass) 62 * Identity handle
62 */
63static int state;
64
65/**
66 * Head of ego entry DLL
67 */ 63 */
68static struct EgoEntry *ego_head; 64static struct GNUNET_IDENTITY_Handle *identity_handle;
69 65
70/** 66/**
71 * Tail of ego entry DLL 67 * Database handle
72 */ 68 */
73static struct EgoEntry *ego_tail; 69static struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *TKT_database;
74 70
75/** 71/**
76 * Identity handle 72 * Name of DB plugin
77 */ 73 */
78static struct GNUNET_IDENTITY_Handle *identity_handle; 74static char *db_lib_name;
79 75
80/** 76/**
81 * Token expiration interval 77 * Token expiration interval
@@ -93,6 +89,16 @@ static struct GNUNET_NAMESTORE_Handle *ns_handle;
93static struct GNUNET_GNS_Handle *gns_handle; 89static struct GNUNET_GNS_Handle *gns_handle;
94 90
95/** 91/**
92 * Credential handle
93 */
94static struct GNUNET_CREDENTIAL_Handle *credential_handle;
95
96/**
97 * Stats handle
98 */
99static struct GNUNET_STATISTICS_Handle *stats_handle;
100
101/**
96 * Namestore qe 102 * Namestore qe
97 */ 103 */
98static struct GNUNET_NAMESTORE_QueueEntry *ns_qe; 104static struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
@@ -112,11 +118,6 @@ static struct GNUNET_SCHEDULER_Task *timeout_task;
112 */ 118 */
113static struct GNUNET_SCHEDULER_Task *update_task; 119static struct GNUNET_SCHEDULER_Task *update_task;
114 120
115/**
116 * Timeout for next update pass
117 */
118static struct GNUNET_TIME_Relative min_rel_exp;
119
120 121
121/** 122/**
122 * Currently processed token 123 * Currently processed token
@@ -134,43 +135,260 @@ static char* label;
134static char* scopes; 135static char* scopes;
135 136
136/** 137/**
137 * Expiration for processed token 138 * Handle to the statistics service.
138 */ 139 */
139static uint64_t rd_exp; 140static struct GNUNET_STATISTICS_Handle *stats;
140 141
141/** 142/**
142 * ECDHE Privkey for processed token metadata 143 * Our configuration.
143 */ 144 */
144static struct GNUNET_CRYPTO_EcdhePrivateKey ecdhe_privkey; 145static const struct GNUNET_CONFIGURATION_Handle *cfg;
145 146
146/** 147/**
147 * Handle to the statistics service. 148 * An idp client
148 */ 149 */
149static struct GNUNET_STATISTICS_Handle *stats; 150struct IdpClient;
150 151
151/** 152/**
152 * Our configuration. 153 * A ticket iteration operation.
153 */ 154 */
154static const struct GNUNET_CONFIGURATION_Handle *cfg; 155struct TicketIteration
156{
157 /**
158 * DLL
159 */
160 struct TicketIteration *next;
161
162 /**
163 * DLL
164 */
165 struct TicketIteration *prev;
166
167 /**
168 * Client which intiated this zone iteration
169 */
170 struct IdpClient *client;
171
172 /**
173 * Key of the identity we are iterating over.
174 */
175 struct GNUNET_CRYPTO_EcdsaPublicKey identity;
176
177 /**
178 * Identity is audience
179 */
180 uint32_t is_audience;
181
182 /**
183 * The operation id fot the iteration in the response for the client
184 */
185 uint32_t r_id;
186
187 /**
188 * Offset of the iteration used to address next result of the
189 * iteration in the store
190 *
191 * Initialy set to 0 in handle_iteration_start
192 * Incremented with by every call to handle_iteration_next
193 */
194 uint32_t offset;
195
196};
197
198
199
200/**
201 * Callback after an ABE bootstrap
202 *
203 * @param cls closure
204 * @param abe_key the ABE key that exists or was created
205 */
206typedef void
207(*AbeBootstrapResult) (void *cls,
208 struct GNUNET_CRYPTO_AbeMasterKey *abe_key);
155 209
156 210
157struct ExchangeHandle 211struct AbeBootstrapHandle
158{ 212{
213 /**
214 * Function to call when finished
215 */
216 AbeBootstrapResult proc;
159 217
160 /** 218 /**
161 * Client connection 219 * Callback closure
220 */
221 char *proc_cls;
222
223 /**
224 * Key of the zone we are iterating over.
225 */
226 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
227
228 /**
229 * Namestore Queue Entry
230 */
231 struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
232
233 /**
234 * The issuer egos ABE master key
235 */
236 struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
237};
238
239/**
240 * An attribute iteration operation.
241 */
242struct AttributeIterator
243{
244 /**
245 * Next element in the DLL
246 */
247 struct AttributeIterator *next;
248
249 /**
250 * Previous element in the DLL
251 */
252 struct AttributeIterator *prev;
253
254 /**
255 * IDP client which intiated this zone iteration
256 */
257 struct IdpClient *client;
258
259 /**
260 * Key of the zone we are iterating over.
261 */
262 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
263
264 /**
265 * The issuer egos ABE master key
266 */
267 struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
268
269 /**
270 * Namestore iterator
271 */
272 struct GNUNET_NAMESTORE_ZoneIterator *ns_it;
273
274 /**
275 * The operation id fot the zone iteration in the response for the client
276 */
277 uint32_t request_id;
278
279};
280
281
282
283/**
284 * An idp client
285 */
286struct IdpClient
287{
288
289 /**
290 * The client
162 */ 291 */
163 struct GNUNET_SERVICE_Client *client; 292 struct GNUNET_SERVICE_Client *client;
164 293
165 /** 294 /**
166 * Ticket 295 * Message queue for transmission to @e client
296 */
297 struct GNUNET_MQ_Handle *mq;
298
299 /**
300 * Head of the DLL of
301 * Attribute iteration operations in
302 * progress initiated by this client
303 */
304 struct AttributeIterator *op_head;
305
306 /**
307 * Tail of the DLL of
308 * Attribute iteration operations
309 * in progress initiated by this client
310 */
311 struct AttributeIterator *op_tail;
312
313 /**
314 * Head of DLL of ticket iteration ops
315 */
316 struct TicketIteration *ticket_iter_head;
317
318 /**
319 * Tail of DLL of ticket iteration ops
320 */
321 struct TicketIteration *ticket_iter_tail;
322
323
324 /**
325 * Head of DLL of ticket revocation ops
326 */
327 struct TicketRevocationHandle *revocation_list_head;
328
329 /**
330 * Tail of DLL of ticket revocation ops
331 */
332 struct TicketRevocationHandle *revocation_list_tail;
333};
334
335
336
337struct AttributeStoreHandle
338{
339
340 /**
341 * Client connection
342 */
343 struct IdpClient *client;
344
345 /**
346 * Identity
347 */
348 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
349
350 /**
351 * Identity pubkey
352 */
353 struct GNUNET_CRYPTO_EcdsaPublicKey identity_pkey;
354
355 /**
356 * The issuer egos ABE master key
357 */
358 struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
359
360 /**
361 * QueueEntry
362 */
363 struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
364
365 /**
366 * The attribute to store
367 */
368 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *claim;
369
370 /**
371 * request id
372 */
373 uint32_t r_id;
374};
375
376
377/* Prototype */
378struct ParallelLookup;
379
380struct ConsumeTicketHandle
381{
382
383 /**
384 * Client connection
167 */ 385 */
168 struct TokenTicket *ticket; 386 struct IdpClient *client;
169 387
170 /** 388 /**
171 * Token returned 389 * Ticket
172 */ 390 */
173 struct IdentityToken *token; 391 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
174 392
175 /** 393 /**
176 * LookupRequest 394 * LookupRequest
@@ -180,86 +398,173 @@ struct ExchangeHandle
180 /** 398 /**
181 * Audience Key 399 * Audience Key
182 */ 400 */
183 struct GNUNET_CRYPTO_EcdsaPrivateKey aud_privkey; 401 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
402
403 /**
404 * Audience Key
405 */
406 struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
184 407
185 /** 408 /**
186 * Label to return 409 * Lookup DLL
187 */ 410 */
188 char *label; 411 struct ParallelLookup *parallel_lookups_head;
412
413 /**
414 * Lookup DLL
415 */
416 struct ParallelLookup *parallel_lookups_tail;
417
418 /**
419 * Kill task
420 */
421 struct GNUNET_SCHEDULER_Task *kill_task;
189 422
190 /** 423 /**
424 * The ABE key
425 */
426 struct GNUNET_CRYPTO_AbeKey *key;
427
428 /**
429 * Attributes
430 */
431 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
432
433 /**
434 * Lookup time
435 */
436 struct GNUNET_TIME_Absolute lookup_start_time;
437
438 /**
191 * request id 439 * request id
192 */ 440 */
193 uint32_t r_id; 441 uint32_t r_id;
194}; 442};
195 443
196struct IssueHandle 444/**
445 * Handle for a parallel GNS lookup job
446 */
447struct ParallelLookup
448{
449 /* DLL */
450 struct ParallelLookup *next;
451
452 /* DLL */
453 struct ParallelLookup *prev;
454
455 /* The GNS request */
456 struct GNUNET_GNS_LookupRequest *lookup_request;
457
458 /* The handle the return to */
459 struct ConsumeTicketHandle *handle;
460
461 /**
462 * Lookup time
463 */
464 struct GNUNET_TIME_Absolute lookup_start_time;
465
466 /* The label to look up */
467 char *label;
468};
469
470/**
471 * Ticket revocation request handle
472 */
473struct TicketRevocationHandle
197{ 474{
475 /**
476 * DLL
477 */
478 struct TicketRevocationHandle *next;
479
480 /**
481 * DLL
482 */
483 struct TicketRevocationHandle *prev;
198 484
199 /** 485 /**
200 * Client connection 486 * Client connection
201 */ 487 */
202 struct GNUNET_SERVICE_Client *client; 488 struct IdpClient *client;
489
490 /**
491 * Attributes to reissue
492 */
493 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
494
495 /**
496 * Attributes to revoke
497 */
498 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *rvk_attrs;
203 499
204 /** 500 /**
205 * Issuer Key 501 * Issuer Key
206 */ 502 */
207 struct GNUNET_CRYPTO_EcdsaPrivateKey iss_key; 503 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
208 504
209 /** 505 /**
210 * Issue pubkey 506 * Ticket to issue
211 */ 507 */
212 struct GNUNET_CRYPTO_EcdsaPublicKey iss_pkey; 508 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
213 509
214 /** 510 /**
215 * Audience Key 511 * QueueEntry
216 */ 512 */
217 struct GNUNET_CRYPTO_EcdsaPublicKey aud_key; 513 struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
218 514
219 /** 515 /**
220 * Expiration 516 * Namestore iterator
221 */ 517 */
222 struct GNUNET_TIME_Absolute expiration; 518 struct GNUNET_NAMESTORE_ZoneIterator *ns_it;
223 519
224 /** 520 /**
225 * Scopes 521 * The ABE master key
226 */ 522 */
227 char *scopes; 523 struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
228 524
229 /** 525 /**
230 * nonce 526 * Offset
231 */ 527 */
232 uint64_t nonce; 528 uint32_t offset;
233 529
234 /** 530 /**
235 * NS iterator 531 * request id
236 */ 532 */
237 struct GNUNET_NAMESTORE_ZoneIterator *ns_it; 533 uint32_t r_id;
534};
535
536
537
538/**
539 * Ticket issue request handle
540 */
541struct TicketIssueHandle
542{
238 543
239 /** 544 /**
240 * Attribute map 545 * Client connection
241 */ 546 */
242 struct GNUNET_CONTAINER_MultiHashMap *attr_map; 547 struct IdpClient *client;
243 548
244 /** 549 /**
245 * Token 550 * Attributes to issue
246 */ 551 */
247 struct IdentityToken *token; 552 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
248 553
249 /** 554 /**
250 * Ticket 555 * Issuer Key
251 */ 556 */
252 struct TokenTicket *ticket; 557 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
253 558
254 /** 559 /**
255 * QueueEntry 560 * Ticket to issue
256 */ 561 */
257 struct GNUNET_NAMESTORE_QueueEntry *ns_qe; 562 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
258 563
259 /** 564 /**
260 * The label the token is stored under 565 * QueueEntry
261 */ 566 */
262 char *label; 567 struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
263 568
264 /** 569 /**
265 * request id 570 * request id
@@ -267,6 +572,7 @@ struct IssueHandle
267 uint32_t r_id; 572 uint32_t r_id;
268}; 573};
269 574
575
270/** 576/**
271 * DLL for ego handles to egos containing the ID_ATTRS in a map in json_t format 577 * DLL for ego handles to egos containing the ID_ATTRS in a map in json_t format
272 * 578 *
@@ -293,988 +599,1362 @@ struct EgoEntry
293 */ 599 */
294 struct GNUNET_CONTAINER_MultiHashMap *attr_map; 600 struct GNUNET_CONTAINER_MultiHashMap *attr_map;
295 601
296 /**
297 * Attributes are old and should be updated if GNUNET_YES
298 */
299 int attributes_dirty;
300}; 602};
301 603
302/** 604/**
303 * Continuation for token store call 605 * Cleanup task
606 */
607static void
608cleanup()
609{
610 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
611 "Cleaning up\n");
612 if (NULL != stats)
613 {
614 GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
615 stats = NULL;
616 }
617 GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name,
618 TKT_database));
619 GNUNET_free (db_lib_name);
620 db_lib_name = NULL;
621 if (NULL != timeout_task)
622 GNUNET_SCHEDULER_cancel (timeout_task);
623 if (NULL != update_task)
624 GNUNET_SCHEDULER_cancel (update_task);
625 if (NULL != identity_handle)
626 GNUNET_IDENTITY_disconnect (identity_handle);
627 if (NULL != gns_handle)
628 GNUNET_GNS_disconnect (gns_handle);
629 if (NULL != credential_handle)
630 GNUNET_CREDENTIAL_disconnect (credential_handle);
631 if (NULL != ns_it)
632 GNUNET_NAMESTORE_zone_iteration_stop (ns_it);
633 if (NULL != ns_qe)
634 GNUNET_NAMESTORE_cancel (ns_qe);
635 if (NULL != ns_handle)
636 GNUNET_NAMESTORE_disconnect (ns_handle);
637 if (NULL != stats_handle)
638 GNUNET_STATISTICS_destroy (stats_handle, GNUNET_NO);
639 if (NULL != token)
640 GNUNET_free (token);
641 if (NULL != label)
642 GNUNET_free (label);
643
644}
645
646/**
647 * Shutdown task
304 * 648 *
305 * @param cls NULL 649 * @param cls NULL
306 * @param success error code 650 * @param tc task context
307 * @param emsg error message 651 */
652static void
653do_shutdown (void *cls)
654{
655 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
656 "Shutting down...\n");
657 cleanup();
658}
659
660/**
661 * Finished storing newly bootstrapped ABE key
308 */ 662 */
309static void 663static void
310store_token_cont (void *cls, 664bootstrap_store_cont (void *cls,
311 int32_t success, 665 int32_t success,
312 const char *emsg) 666 const char *emsg)
313{ 667{
314 ns_qe = NULL; 668 struct AbeBootstrapHandle *abh = cls;
315 if (GNUNET_SYSERR == success) 669 if (GNUNET_SYSERR == success)
316 { 670 {
317 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 671 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
318 "Failed to update token: %s\n", 672 "Failed to bootstrap ABE master %s\n",
319 emsg); 673 emsg);
674 abh->proc (abh->proc_cls, NULL);
675 GNUNET_free (abh->abe_key);
676 GNUNET_free (abh);
320 return; 677 return;
321 } 678 }
322 GNUNET_NAMESTORE_zone_iterator_next (ns_it); 679 abh->proc (abh->proc_cls, abh->abe_key);
680 GNUNET_free (abh);
323} 681}
324 682
683/**
684 * Generates and stores a new ABE key
685 */
686static void
687bootstrap_store_task (void *cls)
688{
689 struct AbeBootstrapHandle *abh = cls;
690 struct GNUNET_GNSRECORD_Data rd[1];
691 char *key;
692
693 rd[0].data_size = GNUNET_CRYPTO_cpabe_serialize_master_key (abh->abe_key,
694 (void**)&key);
695 rd[0].data = key;
696 rd[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_MASTER;
697 rd[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION | GNUNET_GNSRECORD_RF_PRIVATE;
698 rd[0].expiration_time = GNUNET_TIME_UNIT_HOURS.rel_value_us; //TODO sane?
699 abh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
700 &abh->identity,
701 "+",
702 1,
703 rd,
704 &bootstrap_store_cont,
705 abh);
706 GNUNET_free (key);
707}
325 708
326/** 709/**
327 * This function updates the old token with new attributes, 710 * Error checking for ABE master
328 * removes deleted attributes and expiration times.
329 *
330 * @param cls the ego entry
331 */ 711 */
332static void 712static void
333handle_token_update (void *cls) 713bootstrap_abe_error (void *cls)
334{ 714{
335 char *token_metadata; 715 struct AbeBootstrapHandle *abh = cls;
336 char *write_ptr; 716 GNUNET_free (abh);
337 char *enc_token_str; 717 abh->proc (abh->proc_cls, NULL);
338 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key; 718 GNUNET_free (abh);
339 struct GNUNET_CRYPTO_EcdsaPublicKey pub_key; 719}
340 struct GNUNET_CRYPTO_EcdhePrivateKey *new_ecdhe_privkey;
341 struct EgoEntry *ego_entry = cls;
342 struct GNUNET_GNSRECORD_Data token_record[2];
343 struct GNUNET_HashCode key_hash;
344 struct GNUNET_TIME_Relative token_rel_exp;
345 struct GNUNET_TIME_Relative token_ttl;
346 struct GNUNET_TIME_Absolute token_exp;
347 struct GNUNET_TIME_Absolute token_nbf;
348 struct GNUNET_TIME_Absolute new_exp;
349 struct GNUNET_TIME_Absolute new_iat;
350 struct GNUNET_TIME_Absolute new_nbf;
351 struct IdentityToken *new_token;
352 struct TokenAttr *cur_value;
353 struct TokenAttr *attr;
354 size_t token_metadata_len;
355
356 priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
357 GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
358 &pub_key);
359
360 //Note: We need the token expiration time here. Not the record expiration
361 //time.
362 //There are two types of tokens: Token that expire on GNS level with
363 //an absolute expiration time. Those are basically tokens that will
364 //be automatically revoked on (record)expiration.
365 //Tokens stored with relative expiration times will expire on the token level (token expiration)
366 //but this service will reissue new tokens that can be retrieved from GNS
367 //automatically.
368
369 for (attr = token->attr_head; NULL != attr; attr = attr->next)
370 {
371 if (0 == strcmp (attr->name, "exp"))
372 {
373 GNUNET_assert (1 == sscanf (attr->val_head->value,
374 "%"SCNu64,
375 &token_exp.abs_value_us));
376 } else if (0 == strcmp (attr->name, "nbf")) {
377 GNUNET_assert (1 == sscanf (attr->val_head->value,
378 "%"SCNu64,
379 &token_nbf.abs_value_us));
380 }
381 }
382 token_rel_exp = GNUNET_TIME_absolute_get_difference (token_nbf, token_exp);
383 720
384 token_ttl = GNUNET_TIME_absolute_get_remaining (token_exp); 721
385 if (0 != GNUNET_TIME_absolute_get_remaining (token_exp).rel_value_us) 722/**
386 { 723 * Handle ABE lookup in namestore
387 //This token is not yet expired! Save and skip 724 */
388 if (min_rel_exp.rel_value_us > token_ttl.rel_value_us) 725static void
389 { 726bootstrap_abe_result (void *cls,
390 min_rel_exp = token_ttl; 727 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
391 } 728 const char *label,
392 GNUNET_free (token); 729 unsigned int rd_count,
393 token = NULL; 730 const struct GNUNET_GNSRECORD_Data *rd)
394 GNUNET_free (label); 731{
395 label = NULL; 732 struct AbeBootstrapHandle *abh = cls;
396 GNUNET_free (scopes); 733 struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
397 scopes = NULL; 734 int i;
398 GNUNET_NAMESTORE_zone_iterator_next (ns_it); 735
736 for (i=0;i<rd_count;i++) {
737 if (GNUNET_GNSRECORD_TYPE_ABE_MASTER != rd[i].record_type)
738 continue;
739 abe_key = GNUNET_CRYPTO_cpabe_deserialize_master_key (rd[i].data,
740 rd[i].data_size);
741 abh->proc (abh->proc_cls, abe_key);
742 GNUNET_free (abh);
399 return; 743 return;
400 } 744 }
401 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 745
402 "Token is expired. Create a new one\n"); 746 //No ABE master found, bootstrapping...
403 new_token = token_create (&pub_key, 747 abh->abe_key = GNUNET_CRYPTO_cpabe_create_master_key ();
404 &token->aud_key); 748 GNUNET_SCHEDULER_add_now (&bootstrap_store_task, abh);
405 new_exp = GNUNET_TIME_relative_to_absolute (token_rel_exp); 749}
406 new_nbf = GNUNET_TIME_absolute_get (); 750
407 new_iat = new_nbf; 751/**
408 for (attr = token->attr_head; NULL != attr; attr = attr->next) 752 * Bootstrap ABE master if it does not yet exists.
753 * Will call the AbeBootstrapResult processor when done.
754 * will always recreate the ABE key of GNUNET_YES == recreate
755 */
756static void
757bootstrap_abe (const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
758 AbeBootstrapResult proc,
759 void* cls,
760 int recreate)
761{
762 struct AbeBootstrapHandle *abh;
763
764 abh = GNUNET_new (struct AbeBootstrapHandle);
765 abh->proc = proc;
766 abh->proc_cls = cls;
767 abh->identity = *identity;
768 if (GNUNET_YES == recreate)
409 { 769 {
410 if (0 == strcmp (attr->name, "exp")) 770 abh->abe_key = GNUNET_CRYPTO_cpabe_create_master_key ();
411 { 771 GNUNET_SCHEDULER_add_now (&bootstrap_store_task, abh);
412 token_add_attr_int (new_token, attr->name, new_exp.abs_value_us); 772 } else {
413 } 773 abh->ns_qe = GNUNET_NAMESTORE_records_lookup (ns_handle,
414 else if (0 == strcmp (attr->name, "nbf")) 774 identity,
415 { 775 "+",
416 token_add_attr_int (new_token, attr->name, new_nbf.abs_value_us); 776 &bootstrap_abe_error,
417 } 777 abh,
418 else if (0 == strcmp (attr->name, "iat")) 778 &bootstrap_abe_result,
419 { 779 abh);
420 token_add_attr_int (new_token, attr->name, new_iat.abs_value_us);
421 }
422 else if ((0 == strcmp (attr->name, "iss"))
423 || (0 == strcmp (attr->name, "aud")))
424 {
425 //Omit
426 }
427 else if (0 == strcmp (attr->name, "sub"))
428 {
429 token_add_attr (new_token,
430 attr->name,
431 attr->val_head->value);
432 }
433 else
434 {
435 GNUNET_CRYPTO_hash (attr->name,
436 strlen (attr->name),
437 &key_hash);
438 //Check if attr still exists. omit of not
439 if (GNUNET_NO !=
440 GNUNET_CONTAINER_multihashmap_contains (ego_entry->attr_map,
441 &key_hash))
442 {
443 cur_value = GNUNET_CONTAINER_multihashmap_get (ego_entry->attr_map,
444 &key_hash);
445 GNUNET_assert (NULL != cur_value);
446 GNUNET_CONTAINER_DLL_insert (new_token->attr_head,
447 new_token->attr_tail,
448 cur_value);
449 }
450 }
451 } 780 }
452
453 // reassemble and set
454 GNUNET_assert (token_serialize (new_token,
455 priv_key,
456 &new_ecdhe_privkey,
457 &enc_token_str));
458
459 token_record[0].data = enc_token_str;
460 token_record[0].data_size = strlen (enc_token_str) + 1;
461 token_record[0].expiration_time = rd_exp; //Old expiration time
462 token_record[0].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN;
463 token_record[0].flags = GNUNET_GNSRECORD_RF_NONE;
464
465 //Meta
466 token_metadata_len = sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey)
467 + sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)
468 + strlen (scopes) + 1; //With 0-Terminator
469 token_metadata = GNUNET_malloc (token_metadata_len);
470 write_ptr = token_metadata;
471 GNUNET_memcpy (token_metadata, new_ecdhe_privkey, sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey));
472 write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey);
473 GNUNET_memcpy (write_ptr, &token->aud_key, sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
474 write_ptr += sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey);
475 GNUNET_memcpy (write_ptr, scopes, strlen (scopes) + 1); //with 0-Terminator;
476
477 token_record[1].data = token_metadata;
478 token_record[1].data_size = token_metadata_len;
479 token_record[1].expiration_time = rd_exp;
480 token_record[1].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA;
481 token_record[1].flags = GNUNET_GNSRECORD_RF_PRIVATE;
482
483 ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
484 priv_key,
485 label,
486 2,
487 token_record,
488 &store_token_cont,
489 ego_entry);
490 token_destroy (new_token);
491 token_destroy (token);
492 GNUNET_free (new_ecdhe_privkey);
493 GNUNET_free (enc_token_str);
494 token = NULL;
495 GNUNET_free (label);
496 label = NULL;
497 GNUNET_free (scopes);
498 scopes = NULL;
499} 781}
500 782
501 783
784
785static int
786create_sym_key_from_ecdh(const struct GNUNET_HashCode *new_key_hash,
787 struct GNUNET_CRYPTO_SymmetricSessionKey *skey,
788 struct GNUNET_CRYPTO_SymmetricInitializationVector *iv)
789{
790 struct GNUNET_CRYPTO_HashAsciiEncoded new_key_hash_str;
791
792 GNUNET_CRYPTO_hash_to_enc (new_key_hash,
793 &new_key_hash_str);
794 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating symmetric rsa key from %s\n", (char*)&new_key_hash_str);
795 static const char ctx_key[] = "gnuid-aes-ctx-key";
796 GNUNET_CRYPTO_kdf (skey, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
797 new_key_hash, sizeof (struct GNUNET_HashCode),
798 ctx_key, strlen (ctx_key),
799 NULL, 0);
800 static const char ctx_iv[] = "gnuid-aes-ctx-iv";
801 GNUNET_CRYPTO_kdf (iv, sizeof (struct GNUNET_CRYPTO_SymmetricInitializationVector),
802 new_key_hash, sizeof (struct GNUNET_HashCode),
803 ctx_iv, strlen (ctx_iv),
804 NULL, 0);
805 return GNUNET_OK;
806}
807
502static void 808static void
503update_identities(void *cls); 809cleanup_ticket_issue_handle (struct TicketIssueHandle *handle)
810{
811 if (NULL != handle->attrs)
812 GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->attrs);
813 if (NULL != handle->ns_qe)
814 GNUNET_NAMESTORE_cancel (handle->ns_qe);
815 GNUNET_free (handle);
816}
504 817
505 818
506/** 819static void
507 * 820send_ticket_result (struct IdpClient *client,
508 * Cleanup attr_map 821 uint32_t r_id,
509 * 822 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
510 * @param cls NULL 823 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
511 * @param key the key 824{
512 * @param value the json_t attribute value 825 struct TicketResultMessage *irm;
513 * @return #GNUNET_YES 826 struct GNUNET_MQ_Envelope *env;
514 */ 827 struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket_buf;
515static int 828
516clear_ego_attrs (void *cls, 829 /* store ticket in DB */
517 const struct GNUNET_HashCode *key, 830 if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls,
518 void *value) 831 ticket,
519{ 832 attrs))
520 struct TokenAttr *attr = value;
521 struct TokenAttrValue *val;
522 struct TokenAttrValue *tmp_val;
523 for (val = attr->val_head; NULL != val;)
524 { 833 {
525 tmp_val = val->next; 834 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
526 GNUNET_CONTAINER_DLL_remove (attr->val_head, 835 "Unable to store ticket after issue\n");
527 attr->val_tail, 836 GNUNET_break (0);
528 val);
529 GNUNET_free (val->value);
530 GNUNET_free (val);
531 val = tmp_val;
532 } 837 }
533 GNUNET_free (attr->name);
534 GNUNET_free (attr);
535 838
536 return GNUNET_YES; 839 env = GNUNET_MQ_msg_extra (irm,
840 sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket),
841 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT);
842 ticket_buf = (struct GNUNET_IDENTITY_PROVIDER_Ticket *)&irm[1];
843 *ticket_buf = *ticket;
844 irm->id = htonl (r_id);
845 GNUNET_MQ_send (client->mq,
846 env);
537} 847}
538 848
539
540static void 849static void
541token_collect_error_cb (void *cls) 850store_ticket_issue_cont (void *cls,
851 int32_t success,
852 const char *emsg)
542{ 853{
543 struct EgoEntry *ego_entry = cls; 854 struct TicketIssueHandle *handle = cls;
855
856 handle->ns_qe = NULL;
857 if (GNUNET_SYSERR == success)
858 {
859 cleanup_ticket_issue_handle (handle);
860 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
861 "Unknown Error\n");
862 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
863 return;
864 }
865 send_ticket_result (handle->client,
866 handle->r_id,
867 &handle->ticket,
868 handle->attrs);
869 cleanup_ticket_issue_handle (handle);
870}
871
872
873
874int
875serialize_abe_keyinfo2 (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
876 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
877 const struct GNUNET_CRYPTO_AbeKey *rp_key,
878 struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
879 char **result)
880{
881 struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
882 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
883 char *enc_keyinfo;
884 char *serialized_key;
885 char *buf;
886 char *write_ptr;
887 char attrs_str_len;
888 ssize_t size;
889
890 struct GNUNET_CRYPTO_SymmetricSessionKey skey;
891 struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
892 struct GNUNET_HashCode new_key_hash;
893 ssize_t enc_size;
894
895 size = GNUNET_CRYPTO_cpabe_serialize_key (rp_key,
896 (void**)&serialized_key);
897 attrs_str_len = 0;
898 for (le = attrs->list_head; NULL != le; le = le->next) {
899 attrs_str_len += strlen (le->claim->name) + 1;
900 }
901 buf = GNUNET_malloc (attrs_str_len + size);
902 write_ptr = buf;
903 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
904 "Writing attributes\n");
905 for (le = attrs->list_head; NULL != le; le = le->next) {
906 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
907 "%s\n", le->claim->name);
544 908
545 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
546 ">>> Updating Ego failed!\n");
547 //Clear attribute map for ego
548 GNUNET_CONTAINER_multihashmap_iterate (ego_entry->attr_map,
549 &clear_ego_attrs,
550 ego_entry);
551 GNUNET_CONTAINER_multihashmap_clear (ego_entry->attr_map);
552 update_task = GNUNET_SCHEDULER_add_now (&update_identities,
553 ego_entry->next);
554 909
910 GNUNET_memcpy (write_ptr,
911 le->claim->name,
912 strlen (le->claim->name));
913 write_ptr[strlen (le->claim->name)] = ',';
914 write_ptr += strlen (le->claim->name) + 1;
915 }
916 write_ptr--;
917 write_ptr[0] = '\0'; //replace last , with a 0-terminator
918 write_ptr++;
919 GNUNET_memcpy (write_ptr,
920 serialized_key,
921 size);
922 GNUNET_free (serialized_key);
923 // ECDH keypair E = eG
924 *ecdh_privkey = GNUNET_CRYPTO_ecdhe_key_create();
925 GNUNET_CRYPTO_ecdhe_key_get_public (*ecdh_privkey,
926 &ecdh_pubkey);
927 enc_keyinfo = GNUNET_malloc (size + attrs_str_len);
928 // Derived key K = H(eB)
929 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (*ecdh_privkey,
930 &ticket->audience,
931 &new_key_hash));
932 create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
933 enc_size = GNUNET_CRYPTO_symmetric_encrypt (buf,
934 size + attrs_str_len,
935 &skey, &iv,
936 enc_keyinfo);
937 *result = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)+
938 enc_size);
939 GNUNET_memcpy (*result,
940 &ecdh_pubkey,
941 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
942 GNUNET_memcpy (*result + sizeof (struct GNUNET_CRYPTO_EcdhePublicKey),
943 enc_keyinfo,
944 enc_size);
945 GNUNET_free (enc_keyinfo);
946 GNUNET_free (buf);
947 return sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)+enc_size;
555} 948}
556 949
557 950
951
558static void 952static void
559token_collect_finished_cb (void *cls) 953issue_ticket_after_abe_bootstrap (void *cls,
954 struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
560{ 955{
561 struct EgoEntry *ego_entry = cls; 956 struct TicketIssueHandle *ih = cls;
957 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
958 struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
959 struct GNUNET_GNSRECORD_Data code_record[1];
960 struct GNUNET_CRYPTO_AbeKey *rp_key;
961 char *code_record_data;
962 char **attrs;
963 char *label;
964 char *policy;
965 int attrs_len;
966 int i;
967 size_t code_record_len;
562 968
563 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 969 //Create new ABE key for RP
564 ">>> Updating Ego finished\n"); 970 attrs_len = 0;
565 //Clear attribute map for ego 971 for (le = ih->attrs->list_head; NULL != le; le = le->next)
566 GNUNET_CONTAINER_multihashmap_iterate (ego_entry->attr_map, 972 attrs_len++;
567 &clear_ego_attrs, 973 attrs = GNUNET_malloc ((attrs_len + 1)*sizeof (char*));
568 ego_entry); 974 i = 0;
569 GNUNET_CONTAINER_multihashmap_clear (ego_entry->attr_map); 975 for (le = ih->attrs->list_head; NULL != le; le = le->next) {
570 update_task = GNUNET_SCHEDULER_add_now (&update_identities, 976 GNUNET_asprintf (&policy, "%s_%lu",
571 ego_entry->next); 977 le->claim->name,
978 le->claim->version);
979 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
980 "Adding attribute to key: %s\n",
981 policy);
982 attrs[i] = policy;
983 i++;
984 }
985 attrs[i] = NULL;
986 rp_key = GNUNET_CRYPTO_cpabe_create_key (abe_key,
987 attrs);
988
989 //TODO review this wireformat
990 code_record_len = serialize_abe_keyinfo2 (&ih->ticket,
991 ih->attrs,
992 rp_key,
993 &ecdhe_privkey,
994 &code_record_data);
995 code_record[0].data = code_record_data;
996 code_record[0].data_size = code_record_len;
997 code_record[0].expiration_time = GNUNET_TIME_UNIT_DAYS.rel_value_us;
998 code_record[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_KEY;
999 code_record[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
1000
1001 label = GNUNET_STRINGS_data_to_string_alloc (&ih->ticket.rnd,
1002 sizeof (uint64_t));
1003 //Publish record
1004 ih->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
1005 &ih->identity,
1006 label,
1007 1,
1008 code_record,
1009 &store_ticket_issue_cont,
1010 ih);
1011 //for (; i > 0; i--)
1012 // GNUNET_free (attrs[i-1]);
1013 GNUNET_free (ecdhe_privkey);
1014 GNUNET_free (label);
1015 GNUNET_free (attrs);
1016 GNUNET_free (code_record_data);
1017 GNUNET_CRYPTO_cpabe_delete_key (rp_key,
1018 GNUNET_YES);
1019 GNUNET_CRYPTO_cpabe_delete_master_key (abe_key);
572} 1020}
573 1021
574 1022
575/** 1023/**
1024 * Checks a ticket issue message
576 * 1025 *
577 * Update all ID_TOKEN records for an identity and store them 1026 * @param cls client sending the message
578 * 1027 * @param im message of type `struct TicketIssueMessage`
579 * @param cls the identity entry 1028 * @return #GNUNET_OK if @a im is well-formed
580 * @param zone the identity
581 * @param lbl the name of the record
582 * @param rd_count number of records
583 * @param rd record data
584 */ 1029 */
585static void 1030static int
586token_collect (void *cls, 1031check_issue_ticket_message(void *cls,
587 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, 1032 const struct IssueTicketMessage *im)
588 const char *lbl, 1033{
589 unsigned int rd_count, 1034 uint16_t size;
590 const struct GNUNET_GNSRECORD_Data *rd)
591{
592 struct EgoEntry *ego_entry = cls;
593 const struct GNUNET_GNSRECORD_Data *token_record;
594 const struct GNUNET_GNSRECORD_Data *token_metadata_record;
595 struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key;
596 struct GNUNET_CRYPTO_EcdhePrivateKey *priv_key;
597
598 //There should be only a single record for a token under a label
599 if (2 != rd_count)
600 {
601 GNUNET_NAMESTORE_zone_iterator_next (ns_it);
602 return;
603 }
604 1035
605 if (rd[0].record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA) 1036 size = ntohs (im->header.size);
606 { 1037 if (size <= sizeof (struct IssueTicketMessage))
607 token_metadata_record = &rd[0];
608 token_record = &rd[1];
609 }
610 else
611 {
612 token_record = &rd[0];
613 token_metadata_record = &rd[1];
614 }
615 if (token_metadata_record->record_type != GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA)
616 {
617 GNUNET_NAMESTORE_zone_iterator_next (ns_it);
618 return;
619 }
620 if (token_record->record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN)
621 { 1038 {
622 GNUNET_NAMESTORE_zone_iterator_next (ns_it); 1039 GNUNET_break (0);
623 return; 1040 return GNUNET_SYSERR;
624 } 1041 }
1042 return GNUNET_OK;
1043}
1044
625 1045
626 //Get metadata and decrypt token 1046/**
627 priv_key = (struct GNUNET_CRYPTO_EcdhePrivateKey *)token_metadata_record->data; 1047 *
628 ecdhe_privkey = *priv_key; 1048 * Handler for ticket issue message
629 aud_key = (struct GNUNET_CRYPTO_EcdsaPublicKey *)&priv_key[1]; 1049 *
630 scopes = GNUNET_strdup ((char*) aud_key+sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)); 1050 * @param cls unused
1051 * @param client who sent the message
1052 * @param message the message
1053 */
1054static void
1055handle_issue_ticket_message (void *cls,
1056 const struct IssueTicketMessage *im)
1057{
1058 struct TicketIssueHandle *ih;
1059 struct IdpClient *idp = cls;
1060 size_t attrs_len;
1061
1062 ih = GNUNET_new (struct TicketIssueHandle);
1063 attrs_len = ntohs (im->attr_len);
1064 ih->attrs = GNUNET_IDENTITY_ATTRIBUTE_list_deserialize ((char*)&im[1], attrs_len);
1065 ih->r_id = ntohl (im->id);
1066 ih->client = idp;
1067 ih->identity = im->identity;
1068 GNUNET_CRYPTO_ecdsa_key_get_public (&ih->identity,
1069 &ih->ticket.identity);
1070 ih->ticket.audience = im->rp;
1071 ih->ticket.rnd =
1072 GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG,
1073 UINT64_MAX);
1074 bootstrap_abe (&ih->identity, &issue_ticket_after_abe_bootstrap, ih, GNUNET_NO);
1075 GNUNET_SERVICE_client_continue (idp->client);
631 1076
632 token_parse2 (token_record->data, 1077}
633 &ecdhe_privkey,
634 aud_key,
635 &token);
636 1078
637 label = GNUNET_strdup (lbl); 1079/**********************************************************
638 rd_exp = token_record->expiration_time; 1080 * Revocation
1081 **********************************************************/
639 1082
640 GNUNET_SCHEDULER_add_now (&handle_token_update, 1083/**
641 ego_entry); 1084 * Cleanup revoke handle
1085 */
1086static void
1087cleanup_revoke_ticket_handle (struct TicketRevocationHandle *handle)
1088{
1089 if (NULL != handle->attrs)
1090 GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->attrs);
1091 if (NULL != handle->rvk_attrs)
1092 GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->rvk_attrs);
1093 if (NULL != handle->abe_key)
1094 GNUNET_CRYPTO_cpabe_delete_master_key (handle->abe_key);
1095 if (NULL != handle->ns_qe)
1096 GNUNET_NAMESTORE_cancel (handle->ns_qe);
1097 if (NULL != handle->ns_it)
1098 GNUNET_NAMESTORE_zone_iteration_stop (handle->ns_it);
1099 GNUNET_free (handle);
642} 1100}
643 1101
644 1102
1103/**
1104 * Send revocation result
1105 */
645static void 1106static void
646attribute_collect_error_cb (void *cls) 1107send_revocation_finished (struct TicketRevocationHandle *rh,
1108 uint32_t success)
647{ 1109{
648 struct EgoEntry *ego_entry = cls; 1110 struct GNUNET_MQ_Envelope *env;
1111 struct RevokeTicketResultMessage *trm;
649 1112
650 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1113 env = GNUNET_MQ_msg (trm,
651 ">>> Updating Attributes failed!\n"); 1114 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT);
652 ego_entry->attributes_dirty = GNUNET_NO; 1115 trm->id = htonl (rh->r_id);
653 update_task = GNUNET_SCHEDULER_add_now (&update_identities, 1116 trm->success = htonl (success);
654 ego_entry); 1117 GNUNET_MQ_send (rh->client->mq,
1118 env);
1119 GNUNET_CONTAINER_DLL_remove (rh->client->revocation_list_head,
1120 rh->client->revocation_list_tail,
1121 rh);
655} 1122}
656 1123
657 1124
1125/**
1126 * Process ticket from database
1127 *
1128 * @param cls struct TicketIterationProcResult
1129 * @param ticket the ticket
1130 * @param attrs the attributes
1131 */
1132static void
1133ticket_reissue_proc (void *cls,
1134 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
1135 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
1136
658static void 1137static void
659attribute_collect_finished_cb (void *cls) 1138revocation_reissue_tickets (struct TicketRevocationHandle *rh);
1139
1140
1141static void reissue_next (void *cls)
660{ 1142{
661 struct EgoEntry *ego_entry = cls; 1143 struct TicketRevocationHandle *rh = cls;
1144 revocation_reissue_tickets (rh);
1145}
662 1146
663 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1147
664 ">>> Updating Attributes finished\n"); 1148static void
665 ego_entry->attributes_dirty = GNUNET_NO; 1149reissue_ticket_cont (void *cls,
666 update_task = GNUNET_SCHEDULER_add_now (&update_identities, 1150 int32_t success,
667 ego_entry); 1151 const char *emsg)
1152{
1153 struct TicketRevocationHandle *rh = cls;
1154
1155 rh->ns_qe = NULL;
1156 if (GNUNET_SYSERR == success)
1157 {
1158 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
1159 "Unknown Error\n");
1160 send_revocation_finished (rh, GNUNET_SYSERR);
1161 cleanup_revoke_ticket_handle (rh);
1162 return;
1163 }
1164 rh->offset++;
1165 GNUNET_SCHEDULER_add_now (&reissue_next, rh);
668} 1166}
669 1167
670 1168
671/** 1169/**
1170 * Process ticket from database
672 * 1171 *
673 * Collect all ID_ATTR records for an identity and store them 1172 * @param cls struct TicketIterationProcResult
674 * 1173 * @param ticket the ticket
675 * @param cls the identity entry 1174 * @param attrs the attributes
676 * @param zone the identity
677 * @param lbl the name of the record
678 * @param rd_count number of records
679 * @param rd record data
680 *
681 */ 1175 */
682static void 1176static void
683attribute_collect (void *cls, 1177ticket_reissue_proc (void *cls,
684 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, 1178 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
685 const char *lbl, 1179 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
686 unsigned int rd_count, 1180{
687 const struct GNUNET_GNSRECORD_Data *rd) 1181 struct TicketRevocationHandle *rh = cls;
688{ 1182 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
689 struct EgoEntry *ego_entry = cls; 1183 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le_rollover;
690 struct GNUNET_HashCode key; 1184 struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
691 struct TokenAttr *attr; 1185 struct GNUNET_GNSRECORD_Data code_record[1];
692 struct TokenAttrValue *val; 1186 struct GNUNET_CRYPTO_AbeKey *rp_key;
693 char *val_str; 1187 char *code_record_data;
1188 char **attr_arr;
1189 char *label;
1190 char *policy;
1191 int attrs_len;
694 int i; 1192 int i;
1193 int reissue_ticket;
1194 size_t code_record_len;
1195
695 1196
696 if (0 == rd_count) 1197 if (NULL == ticket)
697 { 1198 {
698 GNUNET_NAMESTORE_zone_iterator_next (ns_it); 1199 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1200 "Iteration done\n");
699 return; 1201 return;
700 } 1202 }
701 GNUNET_CRYPTO_hash (lbl, 1203
702 strlen (lbl), 1204 if (0 == memcmp (&ticket->audience,
703 &key); 1205 &rh->ticket.audience,
704 if (1 == rd_count) 1206 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
705 { 1207 {
706 if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR) 1208 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
707 { 1209 "Do not reissue for this identity.!\n");
708 val_str = GNUNET_GNSRECORD_value_to_string (rd->record_type,
709 rd->data,
710 rd->data_size);
711 attr = GNUNET_malloc (sizeof (struct TokenAttr));
712 attr->name = GNUNET_strdup (lbl);
713 val = GNUNET_malloc (sizeof (struct TokenAttrValue));
714 val->value = val_str;
715 GNUNET_CONTAINER_DLL_insert (attr->val_head,
716 attr->val_tail,
717 val);
718 GNUNET_assert (GNUNET_OK ==
719 GNUNET_CONTAINER_multihashmap_put (ego_entry->attr_map,
720 &key,
721 attr,
722 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
723 }
724 1210
725 GNUNET_NAMESTORE_zone_iterator_next (ns_it); 1211 rh->offset++;
1212 GNUNET_SCHEDULER_add_now (&reissue_next, rh);
726 return; 1213 return;
727 } 1214 }
728 1215
729 attr = GNUNET_malloc (sizeof (struct TokenAttr)); 1216 /*
730 attr->name = GNUNET_strdup (lbl); 1217 * Check if any attribute of this ticket intersects with a rollover attribute
731 for (i = 0; i < rd_count; i++) 1218 */
1219 reissue_ticket = GNUNET_NO;
1220 for (le = attrs->list_head; NULL != le; le = le->next)
732 { 1221 {
733 if (rd[i].record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR) 1222 for (le_rollover = rh->rvk_attrs->list_head;
1223 NULL != le_rollover;
1224 le_rollover = le_rollover->next)
734 { 1225 {
735 val_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type, 1226 if (0 == strcmp (le_rollover->claim->name,
736 rd[i].data, 1227 le->claim->name))
737 rd[i].data_size); 1228 {
738 val = GNUNET_malloc (sizeof (struct TokenAttrValue)); 1229 reissue_ticket = GNUNET_YES;
739 val->value = val_str; 1230 le->claim->version = le_rollover->claim->version;
740 GNUNET_CONTAINER_DLL_insert (attr->val_head, 1231 }
741 attr->val_tail,
742 val);
743 } 1232 }
744 } 1233 }
745 GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (ego_entry->attr_map,
746 &key,
747 attr,
748 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
749 GNUNET_NAMESTORE_zone_iterator_next (ns_it);
750}
751
752/**
753 *
754 * Update identity information for ego. If attribute map is
755 * dirty, first update the attributes.
756 *
757 * @param cls the ego to update
758 */
759static void
760update_identities(void *cls)
761{
762 struct EgoEntry *next_ego = cls;
763 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
764 1234
765 update_task = NULL; 1235 if (GNUNET_NO == reissue_ticket)
766 if (NULL == next_ego)
767 { 1236 {
768 if (min_rel_exp.rel_value_us < MIN_WAIT_TIME.rel_value_us)
769 min_rel_exp = MIN_WAIT_TIME;
770 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1237 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
771 ">>> Finished. Rescheduling in %"SCNu64"\n", 1238 "Skipping ticket.\n");
772 min_rel_exp.rel_value_us); 1239
773 ns_it = NULL; 1240 rh->offset++;
774 //finished -> reschedule 1241 GNUNET_SCHEDULER_add_now (&reissue_next, rh);
775 update_task = GNUNET_SCHEDULER_add_delayed (min_rel_exp, 1242
776 &update_identities, 1243
777 ego_head);
778 min_rel_exp.rel_value_us = 0;
779 return; 1244 return;
780 } 1245 }
781 priv_key = GNUNET_IDENTITY_ego_get_private_key (next_ego->ego);
782 if (GNUNET_YES == next_ego->attributes_dirty)
783 {
784 //Starting over. We must update the Attributes for they might have changed.
785 ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
786 priv_key,
787 &attribute_collect_error_cb,
788 next_ego,
789 &attribute_collect,
790 next_ego,
791 &attribute_collect_finished_cb,
792 next_ego);
793 1246
1247 //Create new ABE key for RP
1248 attrs_len = 0;
1249
1250 /* If this is the RP we want to revoke attributes of, the do so */
1251
1252 for (le = attrs->list_head; NULL != le; le = le->next)
1253 attrs_len++;
1254 attr_arr = GNUNET_malloc ((attrs_len + 1)*sizeof (char*));
1255 i = 0;
1256 for (le = attrs->list_head; NULL != le; le = le->next) {
1257 GNUNET_asprintf (&policy, "%s_%lu",
1258 le->claim->name,
1259 le->claim->version);
1260 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1261 "Recreating key with %s\n", policy);
1262 attr_arr[i] = policy;
1263 i++;
1264 }
1265 attr_arr[i] = NULL;
1266 rp_key = GNUNET_CRYPTO_cpabe_create_key (rh->abe_key,
1267 attr_arr);
1268
1269 //TODO review this wireformat
1270 code_record_len = serialize_abe_keyinfo2 (ticket,
1271 attrs,
1272 rp_key,
1273 &ecdhe_privkey,
1274 &code_record_data);
1275 code_record[0].data = code_record_data;
1276 code_record[0].data_size = code_record_len;
1277 code_record[0].expiration_time = GNUNET_TIME_UNIT_DAYS.rel_value_us;
1278 code_record[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_KEY;
1279 code_record[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
1280
1281 label = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
1282 sizeof (uint64_t));
1283 //Publish record
1284 rh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
1285 &rh->identity,
1286 label,
1287 1,
1288 code_record,
1289 &reissue_ticket_cont,
1290 rh);
1291 //for (; i > 0; i--)
1292 // GNUNET_free (attr_arr[i-1]);
1293 GNUNET_free (ecdhe_privkey);
1294 GNUNET_free (label);
1295 GNUNET_free (attr_arr);
1296 GNUNET_free (code_record_data);
1297 GNUNET_CRYPTO_cpabe_delete_key (rp_key, GNUNET_YES);
1298}
1299
1300
1301/* Prototype for below function */
1302static void
1303attr_reenc_cont (void *cls,
1304 int32_t success,
1305 const char *emsg);
1306
1307static void
1308revocation_reissue_tickets (struct TicketRevocationHandle *rh)
1309{
1310 int ret;
1311 /* Done, issue new keys */
1312 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1313 "Revocation Phase III: Reissuing Tickets\n");
1314 if (GNUNET_SYSERR == (ret = TKT_database->iterate_tickets (TKT_database->cls,
1315 &rh->ticket.identity,
1316 GNUNET_NO,
1317 rh->offset,
1318 &ticket_reissue_proc,
1319 rh)))
1320 {
1321 GNUNET_break (0);
794 } 1322 }
795 else 1323 if (GNUNET_NO == ret)
796 { 1324 {
797 //Ego will be dirty next time 1325 send_revocation_finished (rh, GNUNET_OK);
798 next_ego->attributes_dirty = GNUNET_YES; 1326 cleanup_revoke_ticket_handle (rh);
799 ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle, 1327 return;
800 priv_key,
801 &token_collect_error_cb,
802 next_ego,
803 &token_collect,
804 next_ego,
805 &token_collect_finished_cb,
806 next_ego);
807 } 1328 }
808} 1329}
809 1330
810
811/** 1331/**
812 * Function called initially to start update task 1332 * Revoke next attribte by reencryption with
1333 * new ABE master
813 */ 1334 */
814static void 1335static void
815init_cont () 1336reenc_next_attribute (struct TicketRevocationHandle *rh)
816{ 1337{
817 GNUNET_log (GNUNET_ERROR_TYPE_INFO, ">>> Starting Service\n"); 1338 struct GNUNET_GNSRECORD_Data rd[1];
818 //Initially iterate all itenties and refresh all tokens 1339 char* buf;
819 update_task = GNUNET_SCHEDULER_add_now (&update_identities, 1340 char* enc_buf;
820 ego_head); 1341 size_t enc_size;
1342 char* rd_buf;
1343 size_t buf_size;
1344 char* policy;
1345 uint32_t attr_ver;
1346
1347 if (NULL == rh->attrs->list_head)
1348 {
1349 revocation_reissue_tickets (rh);
1350 return;
1351 }
1352 buf_size = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (rh->attrs->list_head->claim);
1353 buf = GNUNET_malloc (buf_size);
1354 GNUNET_IDENTITY_ATTRIBUTE_serialize (rh->attrs->list_head->claim,
1355 buf);
1356 rh->attrs->list_head->claim->version++;
1357 GNUNET_asprintf (&policy, "%s_%lu",
1358 rh->attrs->list_head->claim->name,
1359 rh->attrs->list_head->claim->version);
1360 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1361 "Encrypting with policy %s\n", policy);
1362 /**
1363 * Encrypt the attribute value and store in namestore
1364 */
1365 enc_size = GNUNET_CRYPTO_cpabe_encrypt (buf,
1366 buf_size,
1367 policy, //Policy
1368 rh->abe_key,
1369 (void**)&enc_buf);
1370 GNUNET_free (buf);
1371 GNUNET_free (policy);
1372 rd[0].data_size = enc_size + sizeof (uint32_t);
1373 rd_buf = GNUNET_malloc (rd[0].data_size);
1374 attr_ver = htonl (rh->attrs->list_head->claim->version);
1375 GNUNET_memcpy (rd_buf,
1376 &attr_ver,
1377 sizeof (uint32_t));
1378 GNUNET_memcpy (rd_buf+sizeof (uint32_t),
1379 enc_buf,
1380 enc_size);
1381 rd[0].data = rd_buf;
1382 rd[0].record_type = GNUNET_GNSRECORD_TYPE_ID_ATTR;
1383 rd[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
1384 rd[0].expiration_time = GNUNET_TIME_UNIT_HOURS.rel_value_us; //TODO sane?
1385 rh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
1386 &rh->identity,
1387 rh->attrs->list_head->claim->name,
1388 1,
1389 rd,
1390 &attr_reenc_cont,
1391 rh);
1392 GNUNET_free (enc_buf);
1393 GNUNET_free (rd_buf);
821} 1394}
822 1395
823
824/** 1396/**
825 * Initial ego collection function. 1397 * Namestore callback after revoked attribute
826 * 1398 * is stored
827 * @param cls NULL
828 * @param ego ego
829 * @param ctx context
830 * @param identifier ego name
831 */ 1399 */
832static void 1400static void
833list_ego (void *cls, 1401attr_reenc_cont (void *cls,
834 struct GNUNET_IDENTITY_Ego *ego, 1402 int32_t success,
835 void **ctx, 1403 const char *emsg)
836 const char *identifier)
837{ 1404{
838 struct EgoEntry *new_entry; 1405 struct TicketRevocationHandle *rh = cls;
839 if ((NULL == ego) && (STATE_INIT == state)) 1406 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
1407
1408 if (GNUNET_SYSERR == success)
840 { 1409 {
841 state = STATE_POST_INIT; 1410 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
842 init_cont (); 1411 "Failed to reencrypt attribute %s\n",
1412 emsg);
1413 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
843 return; 1414 return;
844 } 1415 }
845 if (STATE_INIT == state) { 1416 if (NULL == rh->attrs->list_head)
846 new_entry = GNUNET_malloc (sizeof (struct EgoEntry)); 1417 {
847 new_entry->ego = ego; 1418 revocation_reissue_tickets (rh);
848 new_entry->attr_map = GNUNET_CONTAINER_multihashmap_create (5, 1419 return;
849 GNUNET_NO);
850 new_entry->attributes_dirty = GNUNET_YES;
851 GNUNET_CONTAINER_DLL_insert_tail(ego_head, ego_tail, new_entry);
852 } 1420 }
1421 le = rh->attrs->list_head;
1422 GNUNET_CONTAINER_DLL_remove (rh->attrs->list_head,
1423 rh->attrs->list_tail,
1424 le);
1425 GNUNET_assert (NULL != rh->rvk_attrs);
1426 GNUNET_CONTAINER_DLL_insert (rh->rvk_attrs->list_head,
1427 rh->rvk_attrs->list_tail,
1428 le);
1429
1430
1431 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1432 "Re-encrypting next attribute\n");
1433 reenc_next_attribute (rh);
853} 1434}
854 1435
855/** 1436
856 * Cleanup task
857 */
858static void 1437static void
859cleanup() 1438process_attributes_to_update (void *cls,
1439 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
1440 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
860{ 1441{
861 struct EgoEntry *ego_entry; 1442 struct TicketRevocationHandle *rh = cls;
862 struct EgoEntry *ego_tmp;
863 1443
1444 rh->attrs = GNUNET_IDENTITY_ATTRIBUTE_list_dup (attrs);
864 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1445 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
865 "Cleaning up\n"); 1446 "Revocation Phase I: Collecting attributes\n");
866 if (NULL != stats) 1447 /* Reencrypt all attributes with new key */
1448 if (NULL == rh->attrs->list_head)
867 { 1449 {
868 GNUNET_STATISTICS_destroy (stats, GNUNET_NO); 1450 /* No attributes to reencrypt */
869 stats = NULL; 1451 send_revocation_finished (rh, GNUNET_OK);
1452 cleanup_revoke_ticket_handle (rh);
1453 return;
1454 } else {
1455 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1456 "Revocation Phase II: Re-encrypting attributes\n");
1457 reenc_next_attribute (rh);
870 } 1458 }
871 1459
872 if (NULL != timeout_task) 1460}
873 GNUNET_SCHEDULER_cancel (timeout_task);
874 if (NULL != update_task)
875 GNUNET_SCHEDULER_cancel (update_task);
876 if (NULL != identity_handle)
877 GNUNET_IDENTITY_disconnect (identity_handle);
878 if (NULL != gns_handle)
879 GNUNET_GNS_disconnect (gns_handle);
880 if (NULL != ns_it)
881 GNUNET_NAMESTORE_zone_iteration_stop (ns_it);
882 if (NULL != ns_qe)
883 GNUNET_NAMESTORE_cancel (ns_qe);
884 if (NULL != ns_handle)
885 GNUNET_NAMESTORE_disconnect (ns_handle);
886 if (NULL != token)
887 GNUNET_free (token);
888 if (NULL != label)
889 GNUNET_free (label);
890 1461
891 for (ego_entry = ego_head;
892 NULL != ego_entry;)
893 {
894 ego_tmp = ego_entry;
895 if (0 != GNUNET_CONTAINER_multihashmap_size (ego_tmp->attr_map))
896 {
897 GNUNET_CONTAINER_multihashmap_iterate (ego_tmp->attr_map,
898 &clear_ego_attrs,
899 ego_tmp);
900 1462
901 } 1463
902 GNUNET_CONTAINER_multihashmap_destroy (ego_tmp->attr_map); 1464static void
903 ego_entry = ego_entry->next; 1465get_ticket_after_abe_bootstrap (void *cls,
904 GNUNET_free (ego_tmp); 1466 struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
905 } 1467{
1468 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1469 "Finished ABE bootstrap\n");
1470 struct TicketRevocationHandle *rh = cls;
1471 rh->abe_key = abe_key;
1472 TKT_database->get_ticket_attributes (TKT_database->cls,
1473 &rh->ticket,
1474 &process_attributes_to_update,
1475 rh);
906} 1476}
907 1477
908/** 1478/**
909 * Shutdown task 1479 * Checks a ticket revocation message
910 * 1480 *
911 * @param cls NULL 1481 * @param cls client sending the message
912 * @param tc task context 1482 * @param im message of type `struct RevokeTicketMessage`
1483 * @return #GNUNET_OK if @a im is well-formed
913 */ 1484 */
914static void 1485static int
915do_shutdown (void *cls) 1486check_revoke_ticket_message(void *cls,
1487 const struct RevokeTicketMessage *im)
916{ 1488{
917 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1489 uint16_t size;
918 "Shutting down...\n");
919 cleanup();
920}
921
922 1490
923static struct GNUNET_MQ_Envelope* 1491 size = ntohs (im->header.size);
924create_exchange_result_message (const char* token, 1492 if (size <= sizeof (struct RevokeTicketMessage))
925 const char* label, 1493 {
926 uint64_t ticket_nonce, 1494 GNUNET_break (0);
927 uint64_t id) 1495 return GNUNET_SYSERR;
928{ 1496 }
929 struct GNUNET_MQ_Envelope *env; 1497 return GNUNET_OK;
930 struct ExchangeResultMessage *erm;
931 uint16_t token_len = strlen (token) + 1;
932
933 env = GNUNET_MQ_msg_extra (erm,
934 token_len,
935 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT);
936 erm->ticket_nonce = htonl (ticket_nonce);
937 erm->id = id;
938 GNUNET_memcpy (&erm[1], token, token_len);
939 return env;
940} 1498}
941 1499/**
942 1500 *
943static struct GNUNET_MQ_Envelope* 1501 * Handler for ticket revocation message
944create_issue_result_message (const char* label, 1502 *
945 const char* ticket, 1503 * @param cls unused
946 const char* token, 1504 * @param client who sent the message
947 uint64_t id) 1505 * @param message the message
1506 */
1507static void
1508handle_revoke_ticket_message (void *cls,
1509 const struct RevokeTicketMessage *rm)
948{ 1510{
949 struct GNUNET_MQ_Envelope *env; 1511 struct TicketRevocationHandle *rh;
950 struct IssueResultMessage *irm; 1512 struct IdpClient *idp = cls;
951 char *tmp_str; 1513 struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket;
952 size_t len; 1514
1515 rh = GNUNET_new (struct TicketRevocationHandle);
1516 ticket = (struct GNUNET_IDENTITY_PROVIDER_Ticket*)&rm[1];
1517 rh->rvk_attrs = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
1518 rh->ticket = *ticket;
1519 rh->r_id = ntohl (rm->id);
1520 rh->client = idp;
1521 rh->identity = rm->identity;
1522 GNUNET_CRYPTO_ecdsa_key_get_public (&rh->identity,
1523 &rh->ticket.identity);
1524 GNUNET_CONTAINER_DLL_insert (idp->revocation_list_head,
1525 idp->revocation_list_tail,
1526 rh);
1527 bootstrap_abe (&rh->identity, &get_ticket_after_abe_bootstrap, rh, GNUNET_NO);
1528 GNUNET_SERVICE_client_continue (idp->client);
953 1529
954 GNUNET_asprintf (&tmp_str, "%s,%s,%s", label, ticket, token);
955 len = strlen (tmp_str) + 1;
956 env = GNUNET_MQ_msg_extra (irm,
957 len,
958 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT);
959 irm->id = id;
960 GNUNET_memcpy (&irm[1], tmp_str, strlen (tmp_str) + 1);
961 GNUNET_free (tmp_str);
962 return env;
963} 1530}
964 1531
965static void
966cleanup_issue_handle (struct IssueHandle *handle)
967{
968 if (NULL != handle->attr_map)
969 GNUNET_CONTAINER_multihashmap_destroy (handle->attr_map);
970 if (NULL != handle->scopes)
971 GNUNET_free (handle->scopes);
972 if (NULL != handle->token)
973 token_destroy (handle->token);
974 if (NULL != handle->ticket)
975 ticket_destroy (handle->ticket);
976 if (NULL != handle->label)
977 GNUNET_free (handle->label);
978 GNUNET_free (handle);
979}
980 1532
981static void 1533static void
982store_token_issue_cont (void *cls, 1534cleanup_consume_ticket_handle (struct ConsumeTicketHandle *handle)
983 int32_t success,
984 const char *emsg)
985{ 1535{
986 struct IssueHandle *handle = cls; 1536 if (NULL != handle->key)
987 struct GNUNET_MQ_Envelope *env; 1537 GNUNET_CRYPTO_cpabe_delete_key (handle->key,
988 char *ticket_str; 1538 GNUNET_YES);
989 char *token_str; 1539 if (NULL != handle->attrs)
990 1540 GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->attrs);
991 handle->ns_qe = NULL; 1541 GNUNET_free (handle);
992 if (GNUNET_SYSERR == success)
993 {
994 cleanup_issue_handle (handle);
995 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
996 "Unknown Error\n");
997 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
998 return;
999 }
1000 if (GNUNET_OK != ticket_serialize (handle->ticket,
1001 &handle->iss_key,
1002 &ticket_str))
1003 {
1004 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
1005 "Error serializing ticket\n");
1006 cleanup_issue_handle (handle);
1007 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
1008 return;
1009 }
1010 if (GNUNET_OK != token_to_string (handle->token,
1011 &handle->iss_key,
1012 &token_str))
1013 {
1014 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
1015 "Error serializing token\n");
1016 GNUNET_free (ticket_str);
1017 cleanup_issue_handle (handle);
1018 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
1019 return;
1020 }
1021 env = create_issue_result_message (handle->label,
1022 ticket_str,
1023 token_str,
1024 handle->r_id);
1025 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(handle->client),
1026 env);
1027 cleanup_issue_handle (handle);
1028 GNUNET_free (ticket_str);
1029 GNUNET_free (token_str);
1030} 1542}
1031 1543
1032 1544
1545
1033/** 1546/**
1034 * Build a token and store it 1547 * Checks a ticket consume message
1035 * 1548 *
1036 * @param cls the IssueHandle 1549 * @param cls client sending the message
1550 * @param im message of type `struct ConsumeTicketMessage`
1551 * @return #GNUNET_OK if @a im is well-formed
1037 */ 1552 */
1038static void 1553static int
1039sign_and_return_token (void *cls) 1554check_consume_ticket_message(void *cls,
1555 const struct ConsumeTicketMessage *cm)
1040{ 1556{
1041 struct GNUNET_CRYPTO_EcdsaPublicKey pub_key; 1557 uint16_t size;
1042 struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
1043 struct IssueHandle *handle = cls;
1044 struct GNUNET_GNSRECORD_Data token_record[2];
1045 char *nonce_str;
1046 char *enc_token_str;
1047 char *token_metadata;
1048 char* write_ptr;
1049 uint64_t time;
1050 uint64_t exp_time;
1051 size_t token_metadata_len;
1052
1053 //Remote nonce
1054 nonce_str = NULL;
1055 GNUNET_asprintf (&nonce_str, "%lu", handle->nonce);
1056 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Request nonce: %s\n", nonce_str);
1057
1058 GNUNET_CRYPTO_ecdsa_key_get_public (&handle->iss_key,
1059 &pub_key);
1060 handle->ticket = ticket_create (handle->nonce,
1061 &pub_key,
1062 handle->label,
1063 &handle->aud_key);
1064
1065 time = GNUNET_TIME_absolute_get().abs_value_us;
1066 exp_time = time + token_expiration_interval.rel_value_us;
1067
1068 token_add_attr_int (handle->token, "nbf", time);
1069 token_add_attr_int (handle->token, "iat", time);
1070 token_add_attr_int (handle->token, "exp", exp_time);
1071 token_add_attr (handle->token, "nonce", nonce_str);
1072
1073 //Token in a serialized encrypted format
1074 GNUNET_assert (token_serialize (handle->token,
1075 &handle->iss_key,
1076 &ecdhe_privkey,
1077 &enc_token_str));
1078
1079 //Token record E,E_K (Token)
1080 token_record[0].data = enc_token_str;
1081 token_record[0].data_size = strlen (enc_token_str) + 1;
1082 token_record[0].expiration_time = exp_time;
1083 token_record[0].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN;
1084 token_record[0].flags = GNUNET_GNSRECORD_RF_NONE;
1085
1086
1087 token_metadata_len = sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey)
1088 + sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)
1089 + strlen (handle->scopes) + 1; //With 0-Terminator
1090 token_metadata = GNUNET_malloc (token_metadata_len);
1091 write_ptr = token_metadata;
1092 GNUNET_memcpy (token_metadata, ecdhe_privkey, sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey));
1093 write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey);
1094 GNUNET_memcpy (write_ptr, &handle->aud_key, sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
1095 write_ptr += sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey);
1096 GNUNET_memcpy (write_ptr, handle->scopes, strlen (handle->scopes) + 1); //with 0-Terminator;
1097
1098 token_record[1].data = token_metadata;
1099 token_record[1].data_size = token_metadata_len;
1100 token_record[1].expiration_time = exp_time;
1101 token_record[1].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA;
1102 token_record[1].flags = GNUNET_GNSRECORD_RF_PRIVATE;
1103
1104 //Persist token
1105 handle->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
1106 &handle->iss_key,
1107 handle->label,
1108 2,
1109 token_record,
1110 &store_token_issue_cont,
1111 handle);
1112 GNUNET_free (ecdhe_privkey);
1113 GNUNET_free (nonce_str);
1114 GNUNET_free (enc_token_str);
1115 GNUNET_free (token_metadata);
1116}
1117 1558
1559 size = ntohs (cm->header.size);
1560 if (size <= sizeof (struct ConsumeTicketMessage))
1561 {
1562 GNUNET_break (0);
1563 return GNUNET_SYSERR;
1564 }
1565 return GNUNET_OK;
1566}
1118 1567
1119static void 1568static void
1120attr_collect_error (void *cls) 1569process_parallel_lookup2 (void *cls, uint32_t rd_count,
1570 const struct GNUNET_GNSRECORD_Data *rd)
1121{ 1571{
1122 struct IssueHandle *handle = cls; 1572 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1573 "Parallel lookup finished (count=%u)\n", rd_count);
1574 struct ParallelLookup *parallel_lookup = cls;
1575 struct ConsumeTicketHandle *handle = parallel_lookup->handle;
1576 struct ConsumeTicketResultMessage *crm;
1577 struct GNUNET_MQ_Envelope *env;
1578 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *attr_le;
1579 struct GNUNET_TIME_Absolute decrypt_duration;
1580 char *data;
1581 char *data_tmp;
1582 ssize_t attr_len;
1583 size_t attrs_len;
1584
1585 GNUNET_CONTAINER_DLL_remove (handle->parallel_lookups_head,
1586 handle->parallel_lookups_tail,
1587 parallel_lookup);
1588 GNUNET_free (parallel_lookup->label);
1589
1590 GNUNET_STATISTICS_update (stats_handle,
1591 "attribute_lookup_time_total",
1592 GNUNET_TIME_absolute_get_duration (parallel_lookup->lookup_start_time).rel_value_us,
1593 GNUNET_YES);
1594 GNUNET_STATISTICS_update (stats_handle,
1595 "attribute_lookups_count",
1596 1,
1597 GNUNET_YES);
1598
1599
1600 GNUNET_free (parallel_lookup);
1601 if (1 != rd_count)
1602 GNUNET_break(0);//TODO
1603 if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR)
1604 {
1605 decrypt_duration = GNUNET_TIME_absolute_get ();
1606 attr_len = GNUNET_CRYPTO_cpabe_decrypt (rd->data + sizeof (uint32_t),
1607 rd->data_size - sizeof (uint32_t),
1608 handle->key,
1609 (void**)&data);
1610 if (GNUNET_SYSERR != attr_len)
1611 {
1612 GNUNET_STATISTICS_update (stats_handle,
1613 "abe_decrypt_time_total",
1614 GNUNET_TIME_absolute_get_duration (decrypt_duration).rel_value_us,
1615 GNUNET_YES);
1616 GNUNET_STATISTICS_update (stats_handle,
1617 "abe_decrypt_count",
1618 1,
1619 GNUNET_YES);
1620
1621 attr_le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
1622 attr_le->claim = GNUNET_IDENTITY_ATTRIBUTE_deserialize (data,
1623 attr_len);
1624 attr_le->claim->version = ntohl(*(uint32_t*)rd->data);
1625 GNUNET_CONTAINER_DLL_insert (handle->attrs->list_head,
1626 handle->attrs->list_tail,
1627 attr_le);
1628 GNUNET_free (data);
1629 }
1630 }
1631 if (NULL != handle->parallel_lookups_head)
1632 return; //Wait for more
1633 /* Else we are done */
1634
1635 /* Store ticket in DB */
1636 if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls,
1637 &handle->ticket,
1638 handle->attrs))
1639 {
1640 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1641 "Unable to store ticket after consume\n");
1642 GNUNET_break (0);
1643 }
1123 1644
1124 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding attribute Error!\n"); 1645 GNUNET_SCHEDULER_cancel (handle->kill_task);
1125 handle->ns_it = NULL; 1646 attrs_len = GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (handle->attrs);
1126 GNUNET_SCHEDULER_add_now (&sign_and_return_token, handle); 1647 env = GNUNET_MQ_msg_extra (crm,
1648 attrs_len,
1649 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT);
1650 crm->id = htonl (handle->r_id);
1651 crm->attrs_len = htons (attrs_len);
1652 crm->identity = handle->ticket.identity;
1653 data_tmp = (char *) &crm[1];
1654 GNUNET_IDENTITY_ATTRIBUTE_list_serialize (handle->attrs,
1655 data_tmp);
1656 GNUNET_MQ_send (handle->client->mq, env);
1657 cleanup_consume_ticket_handle (handle);
1127} 1658}
1128 1659
1129 1660void
1130static void 1661abort_parallel_lookups2 (void *cls)
1131attr_collect_finished (void *cls)
1132{ 1662{
1133 struct IssueHandle *handle = cls; 1663 struct ConsumeTicketHandle *handle = cls;
1664 struct ParallelLookup *lu;
1665 struct ParallelLookup *tmp;
1666 struct AttributeResultMessage *arm;
1667 struct GNUNET_MQ_Envelope *env;
1668
1669 for (lu = handle->parallel_lookups_head;
1670 NULL != lu;) {
1671 GNUNET_GNS_lookup_cancel (lu->lookup_request);
1672 GNUNET_free (lu->label);
1673 tmp = lu->next;
1674 GNUNET_CONTAINER_DLL_remove (handle->parallel_lookups_head,
1675 handle->parallel_lookups_tail,
1676 lu);
1677 GNUNET_free (lu);
1678 lu = tmp;
1679 }
1680 env = GNUNET_MQ_msg (arm,
1681 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT);
1682 arm->id = htonl (handle->r_id);
1683 arm->attr_len = htons (0);
1684 GNUNET_MQ_send (handle->client->mq, env);
1134 1685
1135 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute END: \n");
1136 handle->ns_it = NULL;
1137 GNUNET_SCHEDULER_add_now (&sign_and_return_token, handle);
1138} 1686}
1139 1687
1140 1688
1141/**
1142 * Collect attributes for token
1143 */
1144static void 1689static void
1145attr_collect (void *cls, 1690process_consume_abe_key (void *cls, uint32_t rd_count,
1146 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, 1691 const struct GNUNET_GNSRECORD_Data *rd)
1147 const char *label,
1148 unsigned int rd_count,
1149 const struct GNUNET_GNSRECORD_Data *rd)
1150{ 1692{
1151 struct IssueHandle *handle = cls; 1693 struct ConsumeTicketHandle *handle = cls;
1152 int i; 1694 struct GNUNET_HashCode new_key_hash;
1153 char* data; 1695 struct GNUNET_CRYPTO_SymmetricSessionKey enc_key;
1154 struct GNUNET_HashCode key; 1696 struct GNUNET_CRYPTO_SymmetricInitializationVector enc_iv;
1155 1697 struct GNUNET_CRYPTO_EcdhePublicKey *ecdh_key;
1156 GNUNET_CRYPTO_hash (label, 1698 struct ParallelLookup *parallel_lookup;
1157 strlen (label), 1699 size_t size;
1158 &key); 1700 char *buf;
1159 1701 char *scope;
1160 if (0 == rd_count || 1702 char *lookup_query;
1161 ( (NULL != handle->attr_map) && 1703
1162 (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains (handle->attr_map, 1704 handle->lookup_request = NULL;
1163 &key)) 1705 if (1 != rd_count)
1164 )
1165 )
1166 { 1706 {
1167 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 1707 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1708 "Number of keys %d != 1.",
1709 rd_count);
1710 cleanup_consume_ticket_handle (handle);
1711 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
1168 return; 1712 return;
1169 } 1713 }
1170 1714
1171 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n", label); 1715 //Decrypt
1716 ecdh_key = (struct GNUNET_CRYPTO_EcdhePublicKey *)rd->data;
1717
1718 buf = GNUNET_malloc (rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
1719
1720 //Calculate symmetric key from ecdh parameters
1721 GNUNET_assert (GNUNET_OK ==
1722 GNUNET_CRYPTO_ecdsa_ecdh (&handle->identity,
1723 ecdh_key,
1724 &new_key_hash));
1725 create_sym_key_from_ecdh (&new_key_hash,
1726 &enc_key,
1727 &enc_iv);
1728 size = GNUNET_CRYPTO_symmetric_decrypt (rd->data + sizeof (struct GNUNET_CRYPTO_EcdhePublicKey),
1729 rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey),
1730 &enc_key,
1731 &enc_iv,
1732 buf);
1172 1733
1173 if (1 == rd_count) 1734 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1174 { 1735 "Decrypted bytes: %zd Expected bytes: %zd\n",
1175 if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR) 1736 size, rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
1176 { 1737 GNUNET_STATISTICS_update (stats_handle,
1177 data = GNUNET_GNSRECORD_value_to_string (rd->record_type, 1738 "abe_key_lookup_time_total",
1178 rd->data, 1739 GNUNET_TIME_absolute_get_duration (handle->lookup_start_time).rel_value_us,
1179 rd->data_size); 1740 GNUNET_YES);
1180 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding value: %s\n", data); 1741 GNUNET_STATISTICS_update (stats_handle,
1181 token_add_attr (handle->token, 1742 "abe_key_lookups_count",
1182 label, 1743 1,
1183 data); 1744 GNUNET_YES);
1184 GNUNET_free (data); 1745 scopes = GNUNET_strdup (buf);
1185 } 1746 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1186 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 1747 "Scopes %s\n", scopes);
1187 return; 1748 handle->key = GNUNET_CRYPTO_cpabe_deserialize_key ((void*)(buf + strlen (scopes) + 1),
1188 } 1749 rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)
1750 - strlen (scopes) - 1);
1189 1751
1190 i = 0; 1752 for (scope = strtok (scopes, ","); NULL != scope; scope = strtok (NULL, ","))
1191 for (; i < rd_count; i++)
1192 { 1753 {
1193 if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR) 1754 GNUNET_asprintf (&lookup_query,
1194 { 1755 "%s.gnu",
1195 data = GNUNET_GNSRECORD_value_to_string (rd[i].record_type, 1756 scope);
1196 rd[i].data, 1757 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1197 rd[i].data_size); 1758 "Looking up %s\n", lookup_query);
1198 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding value: %s\n", data); 1759 parallel_lookup = GNUNET_new (struct ParallelLookup);
1199 token_add_attr (handle->token, label, data); 1760 parallel_lookup->handle = handle;
1200 GNUNET_free (data); 1761 parallel_lookup->label = GNUNET_strdup (scope);
1201 } 1762 parallel_lookup->lookup_start_time = GNUNET_TIME_absolute_get();
1763 parallel_lookup->lookup_request
1764 = GNUNET_GNS_lookup (gns_handle,
1765 lookup_query,
1766 &handle->ticket.identity,
1767 GNUNET_GNSRECORD_TYPE_ID_ATTR,
1768 GNUNET_GNS_LO_DEFAULT,
1769 &process_parallel_lookup2,
1770 parallel_lookup);
1771 GNUNET_CONTAINER_DLL_insert (handle->parallel_lookups_head,
1772 handle->parallel_lookups_tail,
1773 parallel_lookup);
1774 GNUNET_free (lookup_query);
1202 } 1775 }
1776 GNUNET_free (scopes);
1777 GNUNET_free (buf);
1778 handle->kill_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES,3),
1779 &abort_parallel_lookups2,
1780 handle);
1781}
1203 1782
1204 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 1783
1784/**
1785 *
1786 * Handler for ticket issue message
1787 *
1788 * @param cls unused
1789 * @param client who sent the message
1790 * @param message the message
1791 */
1792static void
1793handle_consume_ticket_message (void *cls,
1794 const struct ConsumeTicketMessage *cm)
1795{
1796 struct ConsumeTicketHandle *ch;
1797 struct IdpClient *idp = cls;
1798 char* lookup_query;
1799 char* rnd_label;
1800
1801 ch = GNUNET_new (struct ConsumeTicketHandle);
1802 ch->r_id = ntohl (cm->id);
1803 ch->client = idp;
1804 ch->identity = cm->identity;
1805 ch->attrs = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
1806 GNUNET_CRYPTO_ecdsa_key_get_public (&ch->identity,
1807 &ch->identity_pub);
1808 ch->ticket = *((struct GNUNET_IDENTITY_PROVIDER_Ticket*)&cm[1]);
1809 rnd_label = GNUNET_STRINGS_data_to_string_alloc (&ch->ticket.rnd,
1810 sizeof (uint64_t));
1811 GNUNET_asprintf (&lookup_query,
1812 "%s.gnu",
1813 rnd_label);
1814 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1815 "Looking for ABE key under %s\n", lookup_query);
1816 ch->lookup_start_time = GNUNET_TIME_absolute_get ();
1817 ch->lookup_request
1818 = GNUNET_GNS_lookup (gns_handle,
1819 lookup_query,
1820 &ch->ticket.identity,
1821 GNUNET_GNSRECORD_TYPE_ABE_KEY,
1822 GNUNET_GNS_LO_DEFAULT,
1823 &process_consume_abe_key,
1824 ch);
1825 GNUNET_free (rnd_label);
1826 GNUNET_free (lookup_query);
1827 GNUNET_SERVICE_client_continue (idp->client);
1205} 1828}
1206 1829
1207static void 1830static void
1208cleanup_exchange_handle (struct ExchangeHandle *handle) 1831cleanup_as_handle (struct AttributeStoreHandle *handle)
1209{ 1832{
1210 if (NULL != handle->ticket) 1833 if (NULL != handle->claim)
1211 ticket_destroy (handle->ticket); 1834 GNUNET_free (handle->claim);
1212 if (NULL != handle->token) 1835 if (NULL != handle->abe_key)
1213 token_destroy (handle->token); 1836 GNUNET_CRYPTO_cpabe_delete_master_key (handle->abe_key);
1214 GNUNET_free (handle); 1837 GNUNET_free (handle);
1215} 1838}
1216 1839
1217static void 1840static void
1218process_lookup_result (void *cls, uint32_t rd_count, 1841attr_store_cont (void *cls,
1219 const struct GNUNET_GNSRECORD_Data *rd) 1842 int32_t success,
1843 const char *emsg)
1220{ 1844{
1221 struct ExchangeHandle *handle = cls; 1845 struct AttributeStoreHandle *as_handle = cls;
1222 struct GNUNET_MQ_Envelope *env; 1846 struct GNUNET_MQ_Envelope *env;
1223 char* token_str; 1847 struct AttributeStoreResultMessage *acr_msg;
1224 char* record_str;
1225 1848
1226 handle->lookup_request = NULL; 1849 if (GNUNET_SYSERR == success)
1227 if (2 != rd_count)
1228 { 1850 {
1229 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1851 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1230 "Number of tokens %d != 2.", 1852 "Failed to store attribute %s\n",
1231 rd_count); 1853 emsg);
1232 cleanup_exchange_handle (handle); 1854 cleanup_as_handle (as_handle);
1233 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); 1855 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
1234 return; 1856 return;
1235 } 1857 }
1236 1858
1237 record_str = 1859 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1238 GNUNET_GNSRECORD_value_to_string (GNUNET_GNSRECORD_TYPE_ID_TOKEN, 1860 "Sending ATTRIBUTE_STORE_RESPONSE message\n");
1239 rd->data, 1861 env = GNUNET_MQ_msg (acr_msg,
1240 rd->data_size); 1862 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE_RESPONSE);
1241 1863 acr_msg->id = htonl (as_handle->r_id);
1242 //Decrypt and parse 1864 acr_msg->op_result = htonl (GNUNET_OK);
1243 GNUNET_assert (GNUNET_OK == token_parse (record_str, 1865 GNUNET_MQ_send (as_handle->client->mq,
1244 &handle->aud_privkey,
1245 &handle->token));
1246
1247 //Readable
1248 GNUNET_assert (GNUNET_OK == token_to_string (handle->token,
1249 &handle->aud_privkey,
1250 &token_str));
1251
1252 env = create_exchange_result_message (token_str,
1253 handle->label,
1254 handle->ticket->payload->nonce,
1255 handle->r_id);
1256 GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(handle->client),
1257 env); 1866 env);
1258 cleanup_exchange_handle (handle); 1867 cleanup_as_handle (as_handle);
1259 GNUNET_free (record_str); 1868}
1260 GNUNET_free (token_str); 1869
1870static void
1871attr_store_task (void *cls)
1872{
1873 struct AttributeStoreHandle *as_handle = cls;
1874 struct GNUNET_GNSRECORD_Data rd[1];
1875 char* buf;
1876 char* policy;
1877 char* enc_buf;
1878 char* rd_buf;
1879 size_t enc_size;
1880 size_t buf_size;
1881 uint32_t attr_ver;
1882
1883 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1884 "Storing attribute\n");
1885 buf_size = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (as_handle->claim);
1886 buf = GNUNET_malloc (buf_size);
1887
1888 GNUNET_IDENTITY_ATTRIBUTE_serialize (as_handle->claim,
1889 buf);
1890
1891 GNUNET_asprintf (&policy,
1892 "%s_%lu",
1893 as_handle->claim->name,
1894 as_handle->claim->version);
1895 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1896 "Encrypting with policy %s\n", policy);
1897 /**
1898 * Encrypt the attribute value and store in namestore
1899 */
1900 enc_size = GNUNET_CRYPTO_cpabe_encrypt (buf,
1901 buf_size,
1902 policy, //Policy
1903 as_handle->abe_key,
1904 (void**)&enc_buf);
1905 GNUNET_free (buf);
1906 GNUNET_free (policy);
1907 rd[0].data_size = enc_size + sizeof (uint32_t);
1908 rd_buf = GNUNET_malloc (rd[0].data_size);
1909 attr_ver = htonl (as_handle->claim->version);
1910 GNUNET_memcpy (rd_buf,
1911 &attr_ver,
1912 sizeof (uint32_t));
1913 GNUNET_memcpy (rd_buf+sizeof (uint32_t),
1914 enc_buf,
1915 enc_size);
1916 rd[0].data = rd_buf;
1917 rd[0].record_type = GNUNET_GNSRECORD_TYPE_ID_ATTR;
1918 rd[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
1919 rd[0].expiration_time = GNUNET_TIME_UNIT_HOURS.rel_value_us; //TODO sane?
1920 as_handle->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
1921 &as_handle->identity,
1922 as_handle->claim->name,
1923 1,
1924 rd,
1925 &attr_store_cont,
1926 as_handle);
1927 GNUNET_free (enc_buf);
1928 GNUNET_free (rd_buf);
1929}
1930
1931
1932static void
1933store_after_abe_bootstrap (void *cls,
1934 struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
1935{
1936 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1937 "Finished ABE bootstrap\n");
1938 struct AttributeStoreHandle *ash = cls;
1939 ash->abe_key = abe_key;
1940 GNUNET_SCHEDULER_add_now (&attr_store_task, ash);
1261} 1941}
1262 1942
1263/** 1943/**
1264 * Checks a exchange message 1944 * Checks a store message
1265 * 1945 *
1266 * @param cls client sending the message 1946 * @param cls client sending the message
1267 * @param xm message of type `struct ExchangeMessage` 1947 * @param sam message of type `struct AttributeStoreMessage`
1268 * @return #GNUNET_OK if @a xm is well-formed 1948 * @return #GNUNET_OK if @a im is well-formed
1269 */ 1949 */
1270static int 1950static int
1271check_exchange_message (void *cls, 1951check_attribute_store_message(void *cls,
1272 const struct ExchangeMessage *xm) 1952 const struct AttributeStoreMessage *sam)
1273{ 1953{
1274 uint16_t size; 1954 uint16_t size;
1275 1955
1276 size = ntohs (xm->header.size); 1956 size = ntohs (sam->header.size);
1277 if (size <= sizeof (struct ExchangeMessage)) 1957 if (size <= sizeof (struct AttributeStoreMessage))
1278 { 1958 {
1279 GNUNET_break (0); 1959 GNUNET_break (0);
1280 return GNUNET_SYSERR; 1960 return GNUNET_SYSERR;
@@ -1282,301 +1962,492 @@ check_exchange_message (void *cls,
1282 return GNUNET_OK; 1962 return GNUNET_OK;
1283} 1963}
1284 1964
1965
1285/** 1966/**
1286 * 1967 *
1287 * Handler for exchange message 1968 * Handler for store message
1288 * 1969 *
1289 * @param cls unused 1970 * @param cls unused
1290 * @param client who sent the message 1971 * @param client who sent the message
1291 * @param message the message 1972 * @param message the message
1292 */ 1973 */
1293static void 1974static void
1294handle_exchange_message (void *cls, 1975handle_attribute_store_message (void *cls,
1295 const struct ExchangeMessage *xm) 1976 const struct AttributeStoreMessage *sam)
1296{ 1977{
1297 struct ExchangeHandle *xchange_handle; 1978 struct AttributeStoreHandle *as_handle;
1298 struct GNUNET_SERVICE_Client *client = cls; 1979 struct IdpClient *idp = cls;
1299 const char *ticket; 1980 size_t data_len;
1300 char *lookup_query;
1301
1302 ticket = (const char *) &xm[1];
1303 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1981 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1304 "Received EXCHANGE of `%s' from client\n", 1982 "Received ATTRIBUTE_STORE message\n");
1305 ticket); 1983
1306 xchange_handle = GNUNET_malloc (sizeof (struct ExchangeHandle)); 1984 data_len = ntohs (sam->attr_len);
1307 xchange_handle->aud_privkey = xm->aud_privkey; 1985
1308 xchange_handle->r_id = xm->id; 1986 as_handle = GNUNET_new (struct AttributeStoreHandle);
1309 if (GNUNET_SYSERR == ticket_parse (ticket, 1987 as_handle->claim = GNUNET_IDENTITY_ATTRIBUTE_deserialize ((char*)&sam[1],
1310 &xchange_handle->aud_privkey, 1988 data_len);
1311 &xchange_handle->ticket)) 1989
1312 { 1990 as_handle->r_id = ntohl (sam->id);
1313 GNUNET_free (xchange_handle); 1991 as_handle->identity = sam->identity;
1314 GNUNET_SERVICE_client_drop (client); 1992 GNUNET_CRYPTO_ecdsa_key_get_public (&sam->identity,
1315 return; 1993 &as_handle->identity_pkey);
1316 }
1317 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking for token under %s\n",
1318 xchange_handle->ticket->payload->label);
1319 GNUNET_asprintf (&lookup_query,
1320 "%s.gnu",
1321 xchange_handle->ticket->payload->label);
1322 GNUNET_SERVICE_client_continue (client);
1323 xchange_handle->client = client;
1324 xchange_handle->lookup_request
1325 = GNUNET_GNS_lookup (gns_handle,
1326 lookup_query,
1327 &xchange_handle->ticket->payload->identity_key,
1328 GNUNET_GNSRECORD_TYPE_ID_TOKEN,
1329 GNUNET_GNS_LO_LOCAL_MASTER,
1330 &process_lookup_result,
1331 xchange_handle);
1332 GNUNET_free (lookup_query);
1333 1994
1995 GNUNET_SERVICE_client_continue (idp->client);
1996 as_handle->client = idp;
1997 bootstrap_abe (&as_handle->identity, &store_after_abe_bootstrap, as_handle, GNUNET_NO);
1334} 1998}
1335 1999
2000static void
2001cleanup_iter_handle (struct AttributeIterator *ai)
2002{
2003 if (NULL != ai->abe_key)
2004 GNUNET_CRYPTO_cpabe_delete_master_key (ai->abe_key);
2005 GNUNET_CONTAINER_DLL_remove (ai->client->op_head,
2006 ai->client->op_tail,
2007 ai);
2008 GNUNET_free (ai);
2009}
1336 2010
1337static void 2011static void
1338find_existing_token_error (void *cls) 2012attr_iter_error (void *cls)
1339{ 2013{
1340 struct IssueHandle *handle = cls; 2014 struct AttributeIterator *ai = cls;
1341 cleanup_issue_handle (handle); 2015 //TODO
1342 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error looking for existing token\n"); 2016 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2017 "Failed to iterate over attributes\n");
2018 cleanup_iter_handle (ai);
1343 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); 2019 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
1344} 2020}
1345 2021
2022static void
2023attr_iter_finished (void *cls)
2024{
2025 struct AttributeIterator *ai = cls;
2026 struct GNUNET_MQ_Envelope *env;
2027 struct AttributeResultMessage *arm;
2028
2029 env = GNUNET_MQ_msg (arm,
2030 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT);
2031 arm->id = htonl (ai->request_id);
2032 arm->attr_len = htons (0);
2033 GNUNET_MQ_send (ai->client->mq, env);
2034 cleanup_iter_handle (ai);
2035}
1346 2036
1347static void 2037static void
1348find_existing_token_finished (void *cls) 2038attr_iter_cb (void *cls,
2039 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
2040 const char *label,
2041 unsigned int rd_count,
2042 const struct GNUNET_GNSRECORD_Data *rd)
1349{ 2043{
1350 struct IssueHandle *handle = cls; 2044 struct AttributeIterator *ai = cls;
1351 uint64_t rnd_key; 2045 struct AttributeResultMessage *arm;
2046 struct GNUNET_CRYPTO_AbeKey *key;
2047 struct GNUNET_MQ_Envelope *env;
2048 ssize_t msg_extra_len;
2049 char* attr_ser;
2050 char* attrs[2];
2051 char* data_tmp;
2052 char* policy;
2053 uint32_t attr_ver;
2054
2055 if (rd_count != 1)
2056 {
2057 GNUNET_NAMESTORE_zone_iterator_next (ai->ns_it);
2058 return;
2059 }
1352 2060
2061 if (GNUNET_GNSRECORD_TYPE_ID_ATTR != rd->record_type) {
2062 GNUNET_NAMESTORE_zone_iterator_next (ai->ns_it);
2063 return;
2064 }
2065 attr_ver = ntohl(*((uint32_t*)rd->data));
2066 GNUNET_asprintf (&policy, "%s_%lu",
2067 label, attr_ver);
2068 attrs[0] = policy;
2069 attrs[1] = 0;
2070 key = GNUNET_CRYPTO_cpabe_create_key (ai->abe_key,
2071 attrs);
2072 msg_extra_len = GNUNET_CRYPTO_cpabe_decrypt (rd->data+sizeof (uint32_t),
2073 rd->data_size-sizeof (uint32_t),
2074 key,
2075 (void**)&attr_ser);
2076
2077 GNUNET_CRYPTO_cpabe_delete_key (key,
2078 GNUNET_YES);
2079 //GNUNET_free (policy);
1353 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2080 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1354 ">>> No existing token found\n"); 2081 "Found attribute: %s\n", label);
1355 rnd_key = 2082 env = GNUNET_MQ_msg_extra (arm,
1356 GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG, 2083 msg_extra_len,
1357 UINT64_MAX); 2084 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT);
1358 GNUNET_STRINGS_base64_encode ((char*)&rnd_key, 2085 arm->id = htonl (ai->request_id);
1359 sizeof (uint64_t), 2086 arm->attr_len = htons (msg_extra_len);
1360 &handle->label); 2087 GNUNET_CRYPTO_ecdsa_key_get_public (zone,
1361 handle->ns_it = NULL; 2088 &arm->identity);
1362 handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle, 2089 data_tmp = (char *) &arm[1];
1363 &handle->iss_key, 2090 GNUNET_memcpy (data_tmp,
1364 &attr_collect_error, 2091 attr_ser,
1365 handle, 2092 msg_extra_len);
1366 &attr_collect, 2093 GNUNET_MQ_send (ai->client->mq, env);
1367 handle, 2094 GNUNET_free (attr_ser);
1368 &attr_collect_finished, 2095 GNUNET_CRYPTO_cpabe_delete_master_key (ai->abe_key);
1369 handle); 2096 ai->abe_key = NULL;
2097}
2098
2099
2100void
2101iterate_after_abe_bootstrap (void *cls,
2102 struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
2103{
2104 struct AttributeIterator *ai = cls;
2105 ai->abe_key = abe_key;
2106 ai->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
2107 &ai->identity,
2108 &attr_iter_error,
2109 ai,
2110 &attr_iter_cb,
2111 ai,
2112 &attr_iter_finished,
2113 ai);
1370} 2114}
1371 2115
2116void
2117iterate_next_after_abe_bootstrap (void *cls,
2118 struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
2119{
2120 struct AttributeIterator *ai = cls;
2121 ai->abe_key = abe_key;
2122 GNUNET_NAMESTORE_zone_iterator_next (ai->ns_it);
2123}
2124
2125
1372 2126
1373/** 2127/**
2128 * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ITERATION_START message
1374 * 2129 *
1375 * Look for existing token 2130 * @param cls the client sending the message
1376 * 2131 * @param zis_msg message from the client
1377 * @param cls the identity entry 2132 */
1378 * @param zone the identity 2133static void
1379 * @param lbl the name of the record 2134handle_iteration_start (void *cls,
1380 * @param rd_count number of records 2135 const struct AttributeIterationStartMessage *ais_msg)
1381 * @param rd record data 2136{
2137 struct IdpClient *idp = cls;
2138 struct AttributeIterator *ai;
2139
2140 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2141 "Received ATTRIBUTE_ITERATION_START message\n");
2142 ai = GNUNET_new (struct AttributeIterator);
2143 ai->request_id = ntohl (ais_msg->id);
2144 ai->client = idp;
2145 ai->identity = ais_msg->identity;
2146
2147 GNUNET_CONTAINER_DLL_insert (idp->op_head,
2148 idp->op_tail,
2149 ai);
2150 bootstrap_abe (&ai->identity, &iterate_after_abe_bootstrap, ai, GNUNET_NO);
2151 GNUNET_SERVICE_client_continue (idp->client);
2152}
2153
2154
2155/**
2156 * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ITERATION_STOP message
1382 * 2157 *
2158 * @param cls the client sending the message
2159 * @param ais_msg message from the client
1383 */ 2160 */
1384static void 2161static void
1385find_existing_token (void *cls, 2162handle_iteration_stop (void *cls,
1386 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, 2163 const struct AttributeIterationStopMessage *ais_msg)
1387 const char *lbl, 2164{
1388 unsigned int rd_count, 2165 struct IdpClient *idp = cls;
1389 const struct GNUNET_GNSRECORD_Data *rd) 2166 struct AttributeIterator *ai;
1390{ 2167 uint32_t rid;
1391 struct IssueHandle *handle = cls;
1392 const struct GNUNET_GNSRECORD_Data *token_metadata_record;
1393 struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key;
1394 struct GNUNET_HashCode key;
1395 int scope_count_token;
1396 char *scope;
1397 char *tmp_scopes;
1398 2168
1399 //There should be only a single record for a token under a label 2169 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1400 if (2 != rd_count) 2170 "Received `%s' message\n",
2171 "ATTRIBUTE_ITERATION_STOP");
2172 rid = ntohl (ais_msg->id);
2173 for (ai = idp->op_head; NULL != ai; ai = ai->next)
2174 if (ai->request_id == rid)
2175 break;
2176 if (NULL == ai)
1401 { 2177 {
1402 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 2178 GNUNET_break (0);
2179 GNUNET_SERVICE_client_drop (idp->client);
1403 return; 2180 return;
1404 } 2181 }
2182 GNUNET_CONTAINER_DLL_remove (idp->op_head,
2183 idp->op_tail,
2184 ai);
2185 GNUNET_free (ai);
2186 GNUNET_SERVICE_client_continue (idp->client);
2187}
1405 2188
1406 if (rd[0].record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA) 2189
1407 { 2190/**
1408 token_metadata_record = &rd[0]; 2191 * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT message
1409 } 2192 *
1410 else 2193 * @param cls the client sending the message
1411 { 2194 * @param message message from the client
1412 token_metadata_record = &rd[1]; 2195 */
1413 } 2196static void
1414 if (token_metadata_record->record_type != GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA) 2197handle_iteration_next (void *cls,
2198 const struct AttributeIterationNextMessage *ais_msg)
2199{
2200 struct IdpClient *idp = cls;
2201 struct AttributeIterator *ai;
2202 uint32_t rid;
2203
2204 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2205 "Received ATTRIBUTE_ITERATION_NEXT message\n");
2206 rid = ntohl (ais_msg->id);
2207 for (ai = idp->op_head; NULL != ai; ai = ai->next)
2208 if (ai->request_id == rid)
2209 break;
2210 if (NULL == ai)
1415 { 2211 {
1416 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 2212 GNUNET_break (0);
2213 GNUNET_SERVICE_client_drop (idp->client);
1417 return; 2214 return;
1418 } 2215 }
1419 ecdhe_privkey = *((struct GNUNET_CRYPTO_EcdhePrivateKey *)token_metadata_record->data); 2216 bootstrap_abe (&ai->identity,
1420 aud_key = 2217 &iterate_next_after_abe_bootstrap,
1421 (struct GNUNET_CRYPTO_EcdsaPublicKey *)(token_metadata_record->data+sizeof(struct GNUNET_CRYPTO_EcdhePrivateKey)); 2218 ai,
1422 tmp_scopes = GNUNET_strdup ((char*) aud_key+sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)); 2219 GNUNET_NO);
2220 GNUNET_SERVICE_client_continue (idp->client);
2221}
1423 2222
1424 if (0 != memcmp (aud_key, &handle->aud_key, 2223/**
1425 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey))) 2224 * Ticket iteration processor result
2225 */
2226enum ZoneIterationResult
2227{
2228 /**
2229 * Iteration start.
2230 */
2231 IT_START = 0,
2232
2233 /**
2234 * Found tickets,
2235 * Continue to iterate with next iteration_next call
2236 */
2237 IT_SUCCESS_MORE_AVAILABLE = 1,
2238
2239 /**
2240 * Iteration complete
2241 */
2242 IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE = 2
2243};
2244
2245
2246/**
2247 * Context for ticket iteration
2248 */
2249struct TicketIterationProcResult
2250{
2251 /**
2252 * The ticket iteration handle
2253 */
2254 struct TicketIteration *ti;
2255
2256 /**
2257 * Iteration result: iteration done?
2258 * #IT_SUCCESS_MORE_AVAILABLE: if there may be more results overall but
2259 * we got one for now and have sent it to the client
2260 * #IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE: if there are no further results,
2261 * #IT_START: if we are still trying to find a result.
2262 */
2263 int res_iteration_finished;
2264
2265};
2266
2267static void
2268cleanup_ticket_iter_handle (struct TicketIteration *ti)
2269{
2270 GNUNET_free (ti);
2271}
2272
2273/**
2274 * Process ticket from database
2275 *
2276 * @param cls struct TicketIterationProcResult
2277 * @param ticket the ticket
2278 * @param attrs the attributes
2279 */
2280static void
2281ticket_iterate_proc (void *cls,
2282 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
2283 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
2284{
2285 struct TicketIterationProcResult *proc = cls;
2286
2287 if (NULL == ticket)
1426 { 2288 {
1427 char *tmp2 = GNUNET_STRINGS_data_to_string_alloc (aud_key,
1428 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
1429 //Audience does not match!
1430 char *tmp = GNUNET_GNSRECORD_value_to_string (GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA,
1431 token_metadata_record->data,
1432 token_metadata_record->data_size);
1433 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2289 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1434 "Token does not match audience %s vs %s. Moving on\n", 2290 "Iteration done\n");
1435 tmp2, 2291 proc->res_iteration_finished = IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE;
1436 tmp);
1437 GNUNET_free (tmp_scopes);
1438 GNUNET_free (tmp2);
1439 GNUNET_free (tmp);
1440 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
1441 return; 2292 return;
1442 } 2293 }
2294 proc->res_iteration_finished = IT_SUCCESS_MORE_AVAILABLE;
2295 send_ticket_result (proc->ti->client,
2296 proc->ti->r_id,
2297 ticket,
2298 attrs);
1443 2299
1444 scope = strtok (tmp_scopes, ","); 2300}
1445 scope_count_token = 0; 2301
1446 while (NULL != scope) 2302/**
1447 { 2303 * Perform ticket iteration step
1448 GNUNET_CRYPTO_hash (scope, 2304 *
1449 strlen (scope), 2305 * @param ti ticket iterator to process
1450 &key); 2306 */
2307static void
2308run_ticket_iteration_round (struct TicketIteration *ti)
2309{
2310 struct TicketIterationProcResult proc;
2311 struct GNUNET_MQ_Envelope *env;
2312 struct TicketResultMessage *trm;
2313 int ret;
1451 2314
1452 if ((NULL != handle->attr_map) && 2315 memset (&proc, 0, sizeof (proc));
1453 (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains (handle->attr_map, &key))) 2316 proc.ti = ti;
2317 proc.res_iteration_finished = IT_START;
2318 while (IT_START == proc.res_iteration_finished)
2319 {
2320 if (GNUNET_SYSERR ==
2321 (ret = TKT_database->iterate_tickets (TKT_database->cls,
2322 &ti->identity,
2323 ti->is_audience,
2324 ti->offset,
2325 &ticket_iterate_proc,
2326 &proc)))
1454 { 2327 {
1455 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2328 GNUNET_break (0);
1456 "Issued token does not include `%s'. Moving on\n", scope); 2329 break;
1457 GNUNET_free (tmp_scopes);
1458 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
1459 return;
1460 } 2330 }
1461 scope_count_token++; 2331 if (GNUNET_NO == ret)
1462 scope = strtok (NULL, ","); 2332 proc.res_iteration_finished = IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE;
2333 ti->offset++;
1463 } 2334 }
1464 GNUNET_free (tmp_scopes); 2335 if (IT_SUCCESS_MORE_AVAILABLE == proc.res_iteration_finished)
1465 //All scopes in token are also in request. Now
1466 //Check length
1467 if ((NULL != handle->attr_map) &&
1468 (GNUNET_CONTAINER_multihashmap_size (handle->attr_map) == scope_count_token))
1469 { 2336 {
1470 //We have an existing token 2337 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1471 handle->label = GNUNET_strdup (lbl); 2338 "More results available\n");
1472 handle->ns_it = NULL; 2339 return; /* more later */
1473 handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
1474 &handle->iss_key,
1475 &attr_collect_error,
1476 handle,
1477 &attr_collect,
1478 handle,
1479 &attr_collect_finished,
1480 handle);
1481
1482 return;
1483 } 2340 }
1484 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 2341 /* send empty response to indicate end of list */
1485 "Nuber of attributes in token do not match request\n"); 2342 env = GNUNET_MQ_msg (trm,
1486 //No luck 2343 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT);
1487 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 2344 trm->id = htonl (ti->r_id);
2345 GNUNET_MQ_send (ti->client->mq,
2346 env);
2347 GNUNET_CONTAINER_DLL_remove (ti->client->ticket_iter_head,
2348 ti->client->ticket_iter_tail,
2349 ti);
2350 cleanup_ticket_iter_handle (ti);
1488} 2351}
1489 2352
1490/** 2353/**
1491 * Checks an issue message 2354 * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START message
1492 * 2355 *
1493 * @param cls client sending the message 2356 * @param cls the client sending the message
1494 * @param im message of type `struct IssueMessage` 2357 * @param tis_msg message from the client
1495 * @return #GNUNET_OK if @a im is well-formed
1496 */ 2358 */
1497static int 2359static void
1498check_issue_message(void *cls, 2360handle_ticket_iteration_start (void *cls,
1499 const struct IssueMessage *im) 2361 const struct TicketIterationStartMessage *tis_msg)
1500{ 2362{
1501 uint16_t size; 2363 struct IdpClient *client = cls;
2364 struct TicketIteration *ti;
1502 2365
1503 size = ntohs (im->header.size); 2366 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1504 if (size <= sizeof (struct IssueMessage)) 2367 "Received TICKET_ITERATION_START message\n");
1505 { 2368 ti = GNUNET_new (struct TicketIteration);
1506 GNUNET_break (0); 2369 ti->r_id = ntohl (tis_msg->id);
1507 return GNUNET_SYSERR; 2370 ti->offset = 0;
1508 } 2371 ti->client = client;
1509 scopes = (char *) &im[1]; 2372 ti->identity = tis_msg->identity;
1510 if ('\0' != scopes[size - sizeof (struct IssueMessage) - 1]) 2373 ti->is_audience = ntohl (tis_msg->is_audience);
2374
2375 GNUNET_CONTAINER_DLL_insert (client->ticket_iter_head,
2376 client->ticket_iter_tail,
2377 ti);
2378 run_ticket_iteration_round (ti);
2379 GNUNET_SERVICE_client_continue (client->client);
2380}
2381
2382
2383/**
2384 * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP message
2385 *
2386 * @param cls the client sending the message
2387 * @param tis_msg message from the client
2388 */
2389static void
2390handle_ticket_iteration_stop (void *cls,
2391 const struct TicketIterationStopMessage *tis_msg)
2392{
2393 struct IdpClient *client = cls;
2394 struct TicketIteration *ti;
2395 uint32_t rid;
2396
2397 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2398 "Received `%s' message\n",
2399 "TICKET_ITERATION_STOP");
2400 rid = ntohl (tis_msg->id);
2401 for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
2402 if (ti->r_id == rid)
2403 break;
2404 if (NULL == ti)
1511 { 2405 {
1512 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1513 "Malformed scopes received!\n");
1514 GNUNET_break (0); 2406 GNUNET_break (0);
1515 return GNUNET_SYSERR; 2407 GNUNET_SERVICE_client_drop (client->client);
2408 return;
1516 } 2409 }
1517 return GNUNET_OK; 2410 GNUNET_CONTAINER_DLL_remove (client->ticket_iter_head,
2411 client->ticket_iter_tail,
2412 ti);
2413 cleanup_ticket_iter_handle (ti);
2414 GNUNET_SERVICE_client_continue (client->client);
1518} 2415}
1519 2416
2417
1520/** 2418/**
2419 * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT message
1521 * 2420 *
1522 * Handler for issue message 2421 * @param cls the client sending the message
1523 * 2422 * @param message message from the client
1524 * @param cls unused
1525 * @param client who sent the message
1526 * @param message the message
1527 */ 2423 */
1528static void 2424static void
1529handle_issue_message (void *cls, 2425handle_ticket_iteration_next (void *cls,
1530 const struct IssueMessage *im) 2426 const struct TicketIterationNextMessage *tis_msg)
1531{ 2427{
1532 const char *scopes; 2428 struct IdpClient *client = cls;
1533 char *scopes_tmp; 2429 struct TicketIteration *ti;
1534 char *scope; 2430 uint32_t rid;
1535 struct GNUNET_HashCode key;
1536 struct IssueHandle *issue_handle;
1537 struct GNUNET_SERVICE_Client *client = cls;
1538
1539 scopes = (const char *) &im[1];
1540 issue_handle = GNUNET_malloc (sizeof (struct IssueHandle));
1541 issue_handle->attr_map = GNUNET_CONTAINER_multihashmap_create (5,
1542 GNUNET_NO);
1543 scopes_tmp = GNUNET_strdup (scopes);
1544 2431
1545 for (scope = strtok (scopes_tmp, ","); NULL != scope; scope = strtok (NULL, ",")) 2432 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2433 "Received TICKET_ITERATION_NEXT message\n");
2434 rid = ntohl (tis_msg->id);
2435 for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
2436 if (ti->r_id == rid)
2437 break;
2438 if (NULL == ti)
1546 { 2439 {
1547 GNUNET_CRYPTO_hash (scope, 2440 GNUNET_break (0);
1548 strlen (scope), 2441 GNUNET_SERVICE_client_drop (client->client);
1549 &key); 2442 return;
1550 GNUNET_CONTAINER_multihashmap_put (issue_handle->attr_map,
1551 &key,
1552 scope,
1553 GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE);
1554 } 2443 }
1555 GNUNET_free (scopes_tmp); 2444 run_ticket_iteration_round (ti);
1556 issue_handle->r_id = im->id; 2445 GNUNET_SERVICE_client_continue (client->client);
1557 issue_handle->aud_key = im->aud_key;
1558 issue_handle->iss_key = im->iss_key;
1559 GNUNET_CRYPTO_ecdsa_key_get_public (&im->iss_key,
1560 &issue_handle->iss_pkey);
1561 issue_handle->expiration = GNUNET_TIME_absolute_ntoh (im->expiration);
1562 issue_handle->nonce = ntohl (im->nonce);
1563 GNUNET_SERVICE_client_continue (client);
1564 issue_handle->client = client;
1565 issue_handle->scopes = GNUNET_strdup (scopes);
1566 issue_handle->token = token_create (&issue_handle->iss_pkey,
1567 &issue_handle->aud_key);
1568
1569 issue_handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
1570 &im->iss_key,
1571 &find_existing_token_error,
1572 issue_handle,
1573 &find_existing_token,
1574 issue_handle,
1575 &find_existing_token_finished,
1576 issue_handle);
1577} 2446}
1578 2447
1579 2448
2449
2450
1580/** 2451/**
1581 * Main function that will be run 2452 * Main function that will be run
1582 * 2453 *
@@ -1590,6 +2461,7 @@ run (void *cls,
1590 const struct GNUNET_CONFIGURATION_Handle *c, 2461 const struct GNUNET_CONFIGURATION_Handle *c,
1591 struct GNUNET_SERVICE_Handle *server) 2462 struct GNUNET_SERVICE_Handle *server)
1592{ 2463{
2464 char *database;
1593 cfg = c; 2465 cfg = c;
1594 2466
1595 stats = GNUNET_STATISTICS_create ("identity-provider", cfg); 2467 stats = GNUNET_STATISTICS_create ("identity-provider", cfg);
@@ -1606,10 +2478,38 @@ run (void *cls,
1606 { 2478 {
1607 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "error connecting to gns"); 2479 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "error connecting to gns");
1608 } 2480 }
1609 2481 credential_handle = GNUNET_CREDENTIAL_connect (cfg);
2482 if (NULL == credential_handle)
2483 {
2484 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "error connecting to credential");
2485 }
1610 identity_handle = GNUNET_IDENTITY_connect (cfg, 2486 identity_handle = GNUNET_IDENTITY_connect (cfg,
1611 &list_ego, 2487 NULL,
1612 NULL); 2488 NULL);
2489 stats_handle = GNUNET_STATISTICS_create ("identity-provider",
2490 cfg);
2491 /* Loading DB plugin */
2492 if (GNUNET_OK !=
2493 GNUNET_CONFIGURATION_get_value_string (cfg,
2494 "identity-provider",
2495 "database",
2496 &database))
2497 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2498 "No database backend configured\n");
2499 GNUNET_asprintf (&db_lib_name,
2500 "libgnunet_plugin_identity_provider_%s",
2501 database);
2502 TKT_database = GNUNET_PLUGIN_load (db_lib_name,
2503 (void *) cfg);
2504 GNUNET_free (database);
2505 if (NULL == TKT_database)
2506 {
2507 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2508 "Could not load database backend `%s'\n",
2509 db_lib_name);
2510 GNUNET_SCHEDULER_shutdown ();
2511 return;
2512 }
1613 2513
1614 if (GNUNET_OK == 2514 if (GNUNET_OK ==
1615 GNUNET_CONFIGURATION_get_value_time (cfg, 2515 GNUNET_CONFIGURATION_get_value_time (cfg,
@@ -1640,9 +2540,39 @@ client_disconnect_cb (void *cls,
1640 struct GNUNET_SERVICE_Client *client, 2540 struct GNUNET_SERVICE_Client *client,
1641 void *app_ctx) 2541 void *app_ctx)
1642{ 2542{
2543 struct IdpClient *idp = app_ctx;
2544 struct AttributeIterator *ai;
2545 struct TicketIteration *ti;
2546 struct TicketRevocationHandle *rh;
2547
2548 //TODO other operations
2549
1643 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2550 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1644 "Client %p disconnected\n", 2551 "Client %p disconnected\n",
1645 client); 2552 client);
2553
2554 while (NULL != (ai = idp->op_head))
2555 {
2556 GNUNET_CONTAINER_DLL_remove (idp->op_head,
2557 idp->op_tail,
2558 ai);
2559 GNUNET_free (ai);
2560 }
2561 while (NULL != (rh = idp->revocation_list_head))
2562 {
2563 GNUNET_CONTAINER_DLL_remove (idp->revocation_list_head,
2564 idp->revocation_list_tail,
2565 rh);
2566 cleanup_revoke_ticket_handle (rh);
2567 }
2568 while (NULL != (ti = idp->ticket_iter_head))
2569 {
2570 GNUNET_CONTAINER_DLL_remove (idp->ticket_iter_head,
2571 idp->ticket_iter_tail,
2572 ti);
2573 cleanup_ticket_iter_handle (ti);
2574 }
2575 GNUNET_free (idp);
1646} 2576}
1647 2577
1648 2578
@@ -1659,10 +2589,14 @@ client_connect_cb (void *cls,
1659 struct GNUNET_SERVICE_Client *client, 2589 struct GNUNET_SERVICE_Client *client,
1660 struct GNUNET_MQ_Handle *mq) 2590 struct GNUNET_MQ_Handle *mq)
1661{ 2591{
2592 struct IdpClient *idp;
1662 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2593 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1663 "Client %p connected\n", 2594 "Client %p connected\n",
1664 client); 2595 client);
1665 return client; 2596 idp = GNUNET_new (struct IdpClient);
2597 idp->client = client;
2598 idp->mq = mq;
2599 return idp;
1666} 2600}
1667 2601
1668 2602
@@ -1677,13 +2611,45 @@ GNUNET_SERVICE_MAIN
1677 &client_connect_cb, 2611 &client_connect_cb,
1678 &client_disconnect_cb, 2612 &client_disconnect_cb,
1679 NULL, 2613 NULL,
1680 GNUNET_MQ_hd_var_size (issue_message, 2614 GNUNET_MQ_hd_var_size (attribute_store_message,
1681 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE, 2615 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE,
1682 struct IssueMessage, 2616 struct AttributeStoreMessage,
2617 NULL),
2618 GNUNET_MQ_hd_fixed_size (iteration_start,
2619 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_START,
2620 struct AttributeIterationStartMessage,
2621 NULL),
2622 GNUNET_MQ_hd_fixed_size (iteration_next,
2623 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT,
2624 struct AttributeIterationNextMessage,
2625 NULL),
2626 GNUNET_MQ_hd_fixed_size (iteration_stop,
2627 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP,
2628 struct AttributeIterationStopMessage,
2629 NULL),
2630 GNUNET_MQ_hd_var_size (issue_ticket_message,
2631 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_TICKET,
2632 struct IssueTicketMessage,
2633 NULL),
2634 GNUNET_MQ_hd_var_size (consume_ticket_message,
2635 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET,
2636 struct ConsumeTicketMessage,
1683 NULL), 2637 NULL),
1684 GNUNET_MQ_hd_var_size (exchange_message, 2638 GNUNET_MQ_hd_fixed_size (ticket_iteration_start,
1685 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE, 2639 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START,
1686 struct ExchangeMessage, 2640 struct TicketIterationStartMessage,
2641 NULL),
2642 GNUNET_MQ_hd_fixed_size (ticket_iteration_next,
2643 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT,
2644 struct TicketIterationNextMessage,
2645 NULL),
2646 GNUNET_MQ_hd_fixed_size (ticket_iteration_stop,
2647 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP,
2648 struct TicketIterationStopMessage,
2649 NULL),
2650 GNUNET_MQ_hd_var_size (revoke_ticket_message,
2651 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET,
2652 struct RevokeTicketMessage,
1687 NULL), 2653 NULL),
1688 GNUNET_MQ_handler_end()); 2654 GNUNET_MQ_handler_end());
1689/* end of gnunet-service-identity-provider.c */ 2655/* end of gnunet-service-identity-provider.c */
diff --git a/src/identity-provider/identity-provider.conf b/src/identity-provider/identity-provider.conf
index bac8e69ed..7ee5e50d8 100644
--- a/src/identity-provider/identity-provider.conf
+++ b/src/identity-provider/identity-provider.conf
@@ -10,3 +10,7 @@ UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-identity-provider.sock
10UNIX_MATCH_UID = NO 10UNIX_MATCH_UID = NO
11UNIX_MATCH_GID = YES 11UNIX_MATCH_GID = YES
12TOKEN_EXPIRATION_INTERVAL = 30 m 12TOKEN_EXPIRATION_INTERVAL = 30 m
13DATABASE = sqlite
14
15[identity-provider-sqlite]
16FILENAME = $GNUNET_DATA_HOME/identity-provider/sqlite.db
diff --git a/src/identity-provider/identity_provider.h b/src/identity-provider/identity_provider.h
index 6fe6102c8..be9fdc6f5 100644
--- a/src/identity-provider/identity_provider.h
+++ b/src/identity-provider/identity_provider.h
@@ -34,34 +34,157 @@
34GNUNET_NETWORK_STRUCT_BEGIN 34GNUNET_NETWORK_STRUCT_BEGIN
35 35
36/** 36/**
37 * The token 37 * Use to store an identity attribute
38 */ 38 */
39struct GNUNET_IDENTITY_PROVIDER_Token 39struct AttributeStoreMessage
40{ 40{
41 /** 41 /**
42 * The JWT representation of the identity token 42 * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT
43 */
44 struct GNUNET_MessageHeader header;
45
46 /**
47 * Unique identifier for this request (for key collisions).
43 */ 48 */
44 char *data; 49 uint32_t id GNUNET_PACKED;
50
51 /**
52 * The length of the attribute
53 */
54 uint32_t attr_len GNUNET_PACKED;
55
56 /**
57 * Identity
58 */
59 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
60
61 /* followed by the serialized attribute */
62
45}; 63};
46 64
47/** 65/**
48 * The ticket 66 * Attribute store response message
49 */ 67 */
50struct GNUNET_IDENTITY_PROVIDER_Ticket 68struct AttributeStoreResultMessage
51{ 69{
52 /** 70 /**
53 * The Base64 representation of the ticket 71 * Message header
72 */
73 struct GNUNET_MessageHeader header;
74
75 /**
76 * Unique identifier for this request (for key collisions).
77 */
78 uint32_t id GNUNET_PACKED;
79
80 /**
81 * #GNUNET_SYSERR on failure, #GNUNET_OK on success
82 */
83 int32_t op_result GNUNET_PACKED;
84
85};
86
87/**
88 * Attribute is returned from the idp.
89 */
90struct AttributeResultMessage
91{
92 /**
93 * Message header
94 */
95 struct GNUNET_MessageHeader header;
96
97 /**
98 * Unique identifier for this request (for key collisions).
99 */
100 uint32_t id GNUNET_PACKED;
101
102 /**
103 * Length of serialized attribute data
104 */
105 uint16_t attr_len GNUNET_PACKED;
106
107 /**
108 * always zero (for alignment)
109 */
110 uint16_t reserved GNUNET_PACKED;
111
112 /**
113 * The public key of the identity.
114 */
115 struct GNUNET_CRYPTO_EcdsaPublicKey identity;
116
117 /* followed by:
118 * serialized attribute data
119 */
120};
121
122
123/**
124 * Start a attribute iteration for the given identity
125 */
126struct AttributeIterationStartMessage
127{
128 /**
129 * Message
130 */
131 struct GNUNET_MessageHeader header;
132
133 /**
134 * Unique identifier for this request (for key collisions).
135 */
136 uint32_t id GNUNET_PACKED;
137
138 /**
139 * Identity.
140 */
141 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
142
143};
144
145
146/**
147 * Ask for next result of attribute iteration for the given operation
148 */
149struct AttributeIterationNextMessage
150{
151 /**
152 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT
153 */
154 struct GNUNET_MessageHeader header;
155
156 /**
157 * Unique identifier for this request (for key collisions).
158 */
159 uint32_t id GNUNET_PACKED;
160
161};
162
163
164/**
165 * Stop attribute iteration for the given operation
166 */
167struct AttributeIterationStopMessage
168{
169 /**
170 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP
171 */
172 struct GNUNET_MessageHeader header;
173
174 /**
175 * Unique identifier for this request (for key collisions).
54 */ 176 */
55 char *data; 177 uint32_t id GNUNET_PACKED;
178
56}; 179};
57 180
58/** 181/**
59 * Answer from service to client after issue operation 182 * Start a ticket iteration for the given identity
60 */ 183 */
61struct IssueResultMessage 184struct TicketIterationStartMessage
62{ 185{
63 /** 186 /**
64 * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE 187 * Message
65 */ 188 */
66 struct GNUNET_MessageHeader header; 189 struct GNUNET_MessageHeader header;
67 190
@@ -70,18 +193,25 @@ struct IssueResultMessage
70 */ 193 */
71 uint32_t id GNUNET_PACKED; 194 uint32_t id GNUNET_PACKED;
72 195
73 /* followed by 0-terminated label,ticket,token */ 196 /**
197 * Identity.
198 */
199 struct GNUNET_CRYPTO_EcdsaPublicKey identity;
74 200
201 /**
202 * Identity is audience or issuer
203 */
204 uint32_t is_audience GNUNET_PACKED;
75}; 205};
76 206
77 207
78/** 208/**
79 * Ticket exchange message. 209 * Ask for next result of ticket iteration for the given operation
80 */ 210 */
81struct ExchangeResultMessage 211struct TicketIterationNextMessage
82{ 212{
83 /** 213 /**
84 * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE 214 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT
85 */ 215 */
86 struct GNUNET_MessageHeader header; 216 struct GNUNET_MessageHeader header;
87 217
@@ -90,25 +220,35 @@ struct ExchangeResultMessage
90 */ 220 */
91 uint32_t id GNUNET_PACKED; 221 uint32_t id GNUNET_PACKED;
92 222
223};
224
225
226/**
227 * Stop ticket iteration for the given operation
228 */
229struct TicketIterationStopMessage
230{
93 /** 231 /**
94 * Nonce found in ticket. NBO 232 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP
95 * 0 on error.
96 */ 233 */
97 uint64_t ticket_nonce GNUNET_PACKED; 234 struct GNUNET_MessageHeader header;
98 235
99 /* followed by 0-terminated token */ 236 /**
237 * Unique identifier for this request (for key collisions).
238 */
239 uint32_t id GNUNET_PACKED;
100 240
101}; 241};
102 242
103 243
104 244
105/** 245/**
106 * Client requests IdP to issue token. 246 * Ticket issue message
107 */ 247 */
108struct IssueMessage 248struct IssueTicketMessage
109{ 249{
110 /** 250 /**
111 * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT 251 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
112 */ 252 */
113 struct GNUNET_MessageHeader header; 253 struct GNUNET_MessageHeader header;
114 254
@@ -117,40 +257,98 @@ struct IssueMessage
117 */ 257 */
118 uint32_t id GNUNET_PACKED; 258 uint32_t id GNUNET_PACKED;
119 259
260 /**
261 * Identity.
262 */
263 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
120 264
121 /** 265 /**
122 * Issuer identity private key 266 * Requesting party.
123 */ 267 */
124 struct GNUNET_CRYPTO_EcdsaPrivateKey iss_key; 268 struct GNUNET_CRYPTO_EcdsaPublicKey rp;
125 269
126 /** 270 /**
127 * Audience public key 271 * length of serialized attribute list
128 */ 272 */
129 struct GNUNET_CRYPTO_EcdsaPublicKey aud_key; 273 uint32_t attr_len GNUNET_PACKED;
130 274
275 //Followed by a serialized attribute list
276};
277
278/**
279 * Ticket revoke message
280 */
281struct RevokeTicketMessage
282{
131 /** 283 /**
132 * Nonce 284 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
133 */ 285 */
134 uint64_t nonce; 286 struct GNUNET_MessageHeader header;
135 287
136 /** 288 /**
137 * Expiration of token in NBO. 289 * Unique identifier for this request (for key collisions).
138 */ 290 */
139 struct GNUNET_TIME_AbsoluteNBO expiration; 291 uint32_t id GNUNET_PACKED;
140 292
293 /**
294 * Identity.
295 */
296 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
141 297
142 /* followed by 0-terminated comma-separated scope list */ 298 /**
299 * length of serialized attribute list
300 */
301 uint32_t attrs_len GNUNET_PACKED;
143 302
303 //Followed by a ticket and serialized attribute list
304};
305
306/**
307 * Ticket revoke message
308 */
309struct RevokeTicketResultMessage
310{
311 /**
312 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
313 */
314 struct GNUNET_MessageHeader header;
315
316 /**
317 * Unique identifier for this request (for key collisions).
318 */
319 uint32_t id GNUNET_PACKED;
320
321 /**
322 * Revocation result
323 */
324 uint32_t success GNUNET_PACKED;
144}; 325};
145 326
146 327
147/** 328/**
148 * Use to exchange a ticket for a token 329 * Ticket result message
149 */ 330 */
150struct ExchangeMessage 331struct TicketResultMessage
151{ 332{
152 /** 333 /**
153 * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT 334 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT
335 */
336 struct GNUNET_MessageHeader header;
337
338 /**
339 * Unique identifier for this request (for key collisions).
340 */
341 uint32_t id GNUNET_PACKED;
342
343};
344
345/**
346 * Ticket consume message
347 */
348struct ConsumeTicketMessage
349{
350 /**
351 * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
154 */ 352 */
155 struct GNUNET_MessageHeader header; 353 struct GNUNET_MessageHeader header;
156 354
@@ -160,15 +358,50 @@ struct ExchangeMessage
160 uint32_t id GNUNET_PACKED; 358 uint32_t id GNUNET_PACKED;
161 359
162 /** 360 /**
163 * Audience identity private key 361 * Identity.
362 */
363 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
364
365 //Followed by a serialized ticket
366};
367
368/**
369 * Attribute list is returned from the idp.
370 */
371struct ConsumeTicketResultMessage
372{
373 /**
374 * Message header
375 */
376 struct GNUNET_MessageHeader header;
377
378 /**
379 * Unique identifier for this request (for key collisions).
380 */
381 uint32_t id GNUNET_PACKED;
382
383 /**
384 * Length of serialized attribute data
164 */ 385 */
165 struct GNUNET_CRYPTO_EcdsaPrivateKey aud_privkey; 386 uint16_t attrs_len GNUNET_PACKED;
166 387
167 /* followed by 0-terminated ticket string */ 388 /**
389 * always zero (for alignment)
390 */
391 uint16_t reserved GNUNET_PACKED;
168 392
393 /**
394 * The public key of the identity.
395 */
396 struct GNUNET_CRYPTO_EcdsaPublicKey identity;
397
398 /* followed by:
399 * serialized attributes data
400 */
169}; 401};
170 402
171 403
404
172GNUNET_NETWORK_STRUCT_END 405GNUNET_NETWORK_STRUCT_END
173 406
174#endif 407#endif
diff --git a/src/identity-provider/identity_provider_api.c b/src/identity-provider/identity_provider_api.c
index 845d1f753..6fc8d228a 100644
--- a/src/identity-provider/identity_provider_api.c
+++ b/src/identity-provider/identity_provider_api.c
@@ -29,12 +29,12 @@
29#include "gnunet_protocols.h" 29#include "gnunet_protocols.h"
30#include "gnunet_mq_lib.h" 30#include "gnunet_mq_lib.h"
31#include "gnunet_identity_provider_service.h" 31#include "gnunet_identity_provider_service.h"
32#include "gnunet_identity_attribute_lib.h"
32#include "identity_provider.h" 33#include "identity_provider.h"
33 34
34#define LOG(kind,...) GNUNET_log_from (kind, "identity-api",__VA_ARGS__) 35#define LOG(kind,...) GNUNET_log_from (kind, "identity-api",__VA_ARGS__)
35 36
36 37
37
38/** 38/**
39 * Handle for an operation with the service. 39 * Handle for an operation with the service.
40 */ 40 */
@@ -63,16 +63,24 @@ struct GNUNET_IDENTITY_PROVIDER_Operation
63 const struct GNUNET_MessageHeader *msg; 63 const struct GNUNET_MessageHeader *msg;
64 64
65 /** 65 /**
66 * Continuation to invoke with the result of the transmission; @e cb 66 * Continuation to invoke after attribute store call
67 * will be NULL in this case. 67 */
68 GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus as_cb;
69
70 /**
71 * Attribute result callback
72 */
73 GNUNET_IDENTITY_PROVIDER_AttributeResult ar_cb;
74
75 /**
76 * Revocation result callback
68 */ 77 */
69 GNUNET_IDENTITY_PROVIDER_ExchangeCallback ex_cb; 78 GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus rvk_cb;
70 79
71 /** 80 /**
72 * Continuation to invoke with the result of the transmission for 81 * Ticket result callback
73 * 'issue' operations (@e cont will be NULL in this case).
74 */ 82 */
75 GNUNET_IDENTITY_PROVIDER_IssueCallback iss_cb; 83 GNUNET_IDENTITY_PROVIDER_TicketCallback tr_cb;
76 84
77 /** 85 /**
78 * Envelope with the message for this queue entry. 86 * Envelope with the message for this queue entry.
@@ -91,6 +99,140 @@ struct GNUNET_IDENTITY_PROVIDER_Operation
91 99
92}; 100};
93 101
102/**
103 * Handle for a ticket iterator operation
104 */
105struct GNUNET_IDENTITY_PROVIDER_TicketIterator
106{
107
108 /**
109 * Kept in a DLL.
110 */
111 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *next;
112
113 /**
114 * Kept in a DLL.
115 */
116 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *prev;
117
118 /**
119 * Main handle to access the idp.
120 */
121 struct GNUNET_IDENTITY_PROVIDER_Handle *h;
122
123 /**
124 * Function to call on completion.
125 */
126 GNUNET_SCHEDULER_TaskCallback finish_cb;
127
128 /**
129 * Closure for @e error_cb.
130 */
131 void *finish_cb_cls;
132
133 /**
134 * The continuation to call with the results
135 */
136 GNUNET_IDENTITY_PROVIDER_TicketCallback tr_cb;
137
138 /**
139 * Closure for @e tr_cb.
140 */
141 void *cls;
142
143 /**
144 * Function to call on errors.
145 */
146 GNUNET_SCHEDULER_TaskCallback error_cb;
147
148 /**
149 * Closure for @e error_cb.
150 */
151 void *error_cb_cls;
152
153 /**
154 * Envelope of the message to send to the service, if not yet
155 * sent.
156 */
157 struct GNUNET_MQ_Envelope *env;
158
159 /**
160 * The operation id this zone iteration operation has
161 */
162 uint32_t r_id;
163
164};
165
166
167/**
168 * Handle for a attribute iterator operation
169 */
170struct GNUNET_IDENTITY_PROVIDER_AttributeIterator
171{
172
173 /**
174 * Kept in a DLL.
175 */
176 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *next;
177
178 /**
179 * Kept in a DLL.
180 */
181 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *prev;
182
183 /**
184 * Main handle to access the idp.
185 */
186 struct GNUNET_IDENTITY_PROVIDER_Handle *h;
187
188 /**
189 * Function to call on completion.
190 */
191 GNUNET_SCHEDULER_TaskCallback finish_cb;
192
193 /**
194 * Closure for @e error_cb.
195 */
196 void *finish_cb_cls;
197
198 /**
199 * The continuation to call with the results
200 */
201 GNUNET_IDENTITY_PROVIDER_AttributeResult proc;
202
203 /**
204 * Closure for @e proc.
205 */
206 void *proc_cls;
207
208 /**
209 * Function to call on errors.
210 */
211 GNUNET_SCHEDULER_TaskCallback error_cb;
212
213 /**
214 * Closure for @e error_cb.
215 */
216 void *error_cb_cls;
217
218 /**
219 * Envelope of the message to send to the service, if not yet
220 * sent.
221 */
222 struct GNUNET_MQ_Envelope *env;
223
224 /**
225 * Private key of the zone.
226 */
227 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
228
229 /**
230 * The operation id this zone iteration operation has
231 */
232 uint32_t r_id;
233
234};
235
94 236
95/** 237/**
96 * Handle for the service. 238 * Handle for the service.
@@ -123,6 +265,27 @@ struct GNUNET_IDENTITY_PROVIDER_Handle
123 struct GNUNET_IDENTITY_PROVIDER_Operation *op_tail; 265 struct GNUNET_IDENTITY_PROVIDER_Operation *op_tail;
124 266
125 /** 267 /**
268 * Head of active iterations
269 */
270 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it_head;
271
272 /**
273 * Tail of active iterations
274 */
275 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it_tail;
276
277 /**
278 * Head of active iterations
279 */
280 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *ticket_it_head;
281
282 /**
283 * Tail of active iterations
284 */
285 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *ticket_it_tail;
286
287
288 /**
126 * Currently pending transmission request, or NULL for none. 289 * Currently pending transmission request, or NULL for none.
127 */ 290 */
128 struct GNUNET_CLIENT_TransmitHandle *th; 291 struct GNUNET_CLIENT_TransmitHandle *th;
@@ -197,6 +360,26 @@ force_reconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *handle)
197} 360}
198 361
199/** 362/**
363 * Free @a it.
364 *
365 * @param it entry to free
366 */
367static void
368free_it (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it)
369{
370 struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
371
372 GNUNET_CONTAINER_DLL_remove (h->it_head,
373 h->it_tail,
374 it);
375 if (NULL != it->env)
376 GNUNET_MQ_discard (it->env);
377 GNUNET_free (it);
378}
379
380
381
382/**
200 * Generic error handler, called with the appropriate error code and 383 * Generic error handler, called with the appropriate error code and
201 * the same closure specified at the creation of the message queue. 384 * the same closure specified at the creation of the message queue.
202 * Not every message queue implementation supports an error handler. 385 * Not every message queue implementation supports an error handler.
@@ -213,22 +396,68 @@ mq_error_handler (void *cls,
213} 396}
214 397
215/** 398/**
216 * Check validity of message received from the service 399 * Handle an incoming message of type
400 * #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE
401 *
402 * @param cls
403 * @param msg the message we received
404 */
405static void
406handle_attribute_store_response (void *cls,
407 const struct AttributeStoreResultMessage *msg)
408{
409 struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
410 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
411 uint32_t r_id = ntohl (msg->id);
412 int res;
413 const char *emsg;
414
415 for (op = h->op_head; NULL != op; op = op->next)
416 if (op->r_id == r_id)
417 break;
418 if (NULL == op)
419 return;
420
421 res = ntohl (msg->op_result);
422 LOG (GNUNET_ERROR_TYPE_DEBUG,
423 "Received ATTRIBUTE_STORE_RESPONSE with result %d\n",
424 res);
425
426 /* TODO: add actual error message to response... */
427 if (GNUNET_SYSERR == res)
428 emsg = _("failed to store record\n");
429 else
430 emsg = NULL;
431 if (NULL != op->as_cb)
432 op->as_cb (op->cls,
433 res,
434 emsg);
435 GNUNET_CONTAINER_DLL_remove (h->op_head,
436 h->op_tail,
437 op);
438 GNUNET_free (op);
439
440}
441
442
443/**
444 * Handle an incoming message of type
445 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT
217 * 446 *
218 * @param cls the `struct GNUNET_IDENTITY_PROVIDER_Handle *` 447 * @param cls
219 * @param result_msg the incoming message 448 * @param msg the message we received
449 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
220 */ 450 */
221static int 451static int
222check_exchange_result (void *cls, 452check_consume_ticket_result (void *cls,
223 const struct ExchangeResultMessage *erm) 453 const struct ConsumeTicketResultMessage *msg)
224{ 454{
225 char *str; 455 size_t msg_len;
226 size_t size = ntohs (erm->header.size) - sizeof (*erm); 456 size_t attrs_len;
227
228 457
229 str = (char *) &erm[1]; 458 msg_len = ntohs (msg->header.size);
230 if ( (size > sizeof (struct ExchangeResultMessage)) && 459 attrs_len = ntohs (msg->attrs_len);
231 ('\0' != str[size - sizeof (struct ExchangeResultMessage) - 1]) ) 460 if (msg_len != sizeof (struct ConsumeTicketResultMessage) + attrs_len)
232 { 461 {
233 GNUNET_break (0); 462 GNUNET_break (0);
234 return GNUNET_SYSERR; 463 return GNUNET_SYSERR;
@@ -238,20 +467,85 @@ check_exchange_result (void *cls,
238 467
239 468
240/** 469/**
241 * Check validity of message received from the service 470 * Handle an incoming message of type
471 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT
472 *
473 * @param cls
474 * @param msg the message we received
475 */
476static void
477handle_consume_ticket_result (void *cls,
478 const struct ConsumeTicketResultMessage *msg)
479{
480 struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
481 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
482 size_t attrs_len;
483 uint32_t r_id = ntohl (msg->id);
484
485 attrs_len = ntohs (msg->attrs_len);
486 LOG (GNUNET_ERROR_TYPE_DEBUG,
487 "Processing attribute result.\n");
488
489
490 for (op = h->op_head; NULL != op; op = op->next)
491 if (op->r_id == r_id)
492 break;
493 if (NULL == op)
494 return;
495
496 {
497 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
498 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
499 attrs = GNUNET_IDENTITY_ATTRIBUTE_list_deserialize ((char*)&msg[1],
500 attrs_len);
501 if (NULL != op->ar_cb)
502 {
503 if (NULL == attrs)
504 {
505 op->ar_cb (op->cls,
506 &msg->identity,
507 NULL);
508 }
509 else
510 {
511 for (le = attrs->list_head; NULL != le; le = le->next)
512 op->ar_cb (op->cls,
513 &msg->identity,
514 le->claim);
515 GNUNET_IDENTITY_ATTRIBUTE_list_destroy (attrs);
516 }
517 }
518 op->ar_cb (op->cls,
519 NULL,
520 NULL);
521 GNUNET_CONTAINER_DLL_remove (h->op_head,
522 h->op_tail,
523 op);
524 GNUNET_free (op);
525 return;
526 }
527 GNUNET_assert (0);
528}
529
530
531/**
532 * Handle an incoming message of type
533 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT
242 * 534 *
243 * @param cls the `struct GNUNET_IDENTITY_PROVIDER_Handle *` 535 * @param cls
244 * @param result_msg the incoming message 536 * @param msg the message we received
537 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
245 */ 538 */
246static int 539static int
247check_result (void *cls, 540check_attribute_result (void *cls,
248 const struct IssueResultMessage *irm) 541 const struct AttributeResultMessage *msg)
249{ 542{
250 char *str; 543 size_t msg_len;
251 size_t size = ntohs (irm->header.size) - sizeof (*irm); 544 size_t attr_len;
252 str = (char*) &irm[1]; 545
253 if ( (size > sizeof (struct IssueResultMessage)) && 546 msg_len = ntohs (msg->header.size);
254 ('\0' != str[size - sizeof (struct IssueResultMessage) - 1]) ) 547 attr_len = ntohs (msg->attr_len);
548 if (msg_len != sizeof (struct AttributeResultMessage) + attr_len)
255 { 549 {
256 GNUNET_break (0); 550 GNUNET_break (0);
257 return GNUNET_SYSERR; 551 return GNUNET_SYSERR;
@@ -259,102 +553,225 @@ check_result (void *cls,
259 return GNUNET_OK; 553 return GNUNET_OK;
260} 554}
261 555
556
262/** 557/**
263 * Handler for messages received from the GNS service 558 * Handle an incoming message of type
559 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT
264 * 560 *
265 * @param cls the `struct GNUNET_GNS_Handle *` 561 * @param cls
266 * @param loookup_msg the incoming message 562 * @param msg the message we received
267 */ 563 */
268static void 564static void
269handle_exchange_result (void *cls, 565handle_attribute_result (void *cls,
270 const struct ExchangeResultMessage *erm) 566 const struct AttributeResultMessage *msg)
271{ 567{
272 struct GNUNET_IDENTITY_PROVIDER_Handle *handle = cls; 568 static struct GNUNET_CRYPTO_EcdsaPrivateKey identity_dummy;
569 struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
570 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it;
273 struct GNUNET_IDENTITY_PROVIDER_Operation *op; 571 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
274 struct GNUNET_IDENTITY_PROVIDER_Token token; 572 size_t attr_len;
275 uint64_t ticket_nonce; 573 uint32_t r_id = ntohl (msg->id);
276 uint32_t r_id = ntohl (erm->id); 574
277 char *str; 575 attr_len = ntohs (msg->attr_len);
278 576 LOG (GNUNET_ERROR_TYPE_DEBUG,
279 for (op = handle->op_head; NULL != op; op = op->next) 577 "Processing attribute result.\n");
578
579
580 for (it = h->it_head; NULL != it; it = it->next)
581 if (it->r_id == r_id)
582 break;
583 for (op = h->op_head; NULL != op; op = op->next)
280 if (op->r_id == r_id) 584 if (op->r_id == r_id)
281 break; 585 break;
282 if (NULL == op) 586 if ((NULL == it) && (NULL == op))
283 return; 587 return;
284 str = GNUNET_strdup ((char*)&erm[1]);
285 op = handle->op_head;
286 GNUNET_CONTAINER_DLL_remove (handle->op_head,
287 handle->op_tail,
288 op);
289 token.data = str;
290 ticket_nonce = ntohl (erm->ticket_nonce);
291 if (NULL != op->ex_cb)
292 op->ex_cb (op->cls, &token, ticket_nonce);
293 GNUNET_free (str);
294 GNUNET_free (op);
295 588
589 if ( (0 == (memcmp (&msg->identity,
590 &identity_dummy,
591 sizeof (identity_dummy)))) )
592 {
593 if ((NULL == it) && (NULL == op))
594 {
595 GNUNET_break (0);
596 force_reconnect (h);
597 return;
598 }
599 if (NULL != it)
600 {
601 if (NULL != it->finish_cb)
602 it->finish_cb (it->finish_cb_cls);
603 free_it (it);
604 }
605 if (NULL != op)
606 {
607 if (NULL != op->ar_cb)
608 op->ar_cb (op->cls,
609 NULL,
610 NULL);
611 GNUNET_CONTAINER_DLL_remove (h->op_head,
612 h->op_tail,
613 op);
614 GNUNET_free (op);
615
616 }
617 return;
618 }
619
620 {
621 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
622 attr = GNUNET_IDENTITY_ATTRIBUTE_deserialize ((char*)&msg[1],
623 attr_len);
624 if (NULL != it)
625 {
626 if (NULL != it->proc)
627 it->proc (it->proc_cls,
628 &msg->identity,
629 attr);
630 } else if (NULL != op)
631 {
632 if (NULL != op->ar_cb)
633 op->ar_cb (op->cls,
634 &msg->identity,
635 attr);
636
637 }
638 GNUNET_free (attr);
639 return;
640 }
641 GNUNET_assert (0);
296} 642}
297 643
298/** 644/**
299 * Handler for messages received from the GNS service 645 * Handle an incoming message of type
646 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT
300 * 647 *
301 * @param cls the `struct GNUNET_GNS_Handle *` 648 * @param cls
302 * @param loookup_msg the incoming message 649 * @param msg the message we received
650 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
651 */
652static int
653check_ticket_result (void *cls,
654 const struct TicketResultMessage *msg)
655{
656 size_t msg_len;
657
658 msg_len = ntohs (msg->header.size);
659 if (msg_len < sizeof (struct TicketResultMessage))
660 {
661 GNUNET_break (0);
662 return GNUNET_SYSERR;
663 }
664 return GNUNET_OK;
665}
666
667
668
669/**
670 * Handle an incoming message of type
671 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT
672 *
673 * @param cls
674 * @param msg the message we received
303 */ 675 */
304static void 676static void
305handle_result (void *cls, 677handle_ticket_result (void *cls,
306 const struct IssueResultMessage *irm) 678 const struct TicketResultMessage *msg)
307{ 679{
308 struct GNUNET_IDENTITY_PROVIDER_Handle *handle = cls; 680 struct GNUNET_IDENTITY_PROVIDER_Handle *handle = cls;
309 struct GNUNET_IDENTITY_PROVIDER_Operation *op; 681 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
310 struct GNUNET_IDENTITY_PROVIDER_Token token; 682 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it;
311 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket; 683 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket;
312 uint32_t r_id = ntohl (irm->id); 684 uint32_t r_id = ntohl (msg->id);
313 char *str; 685 size_t msg_len;
314 char *label_str;
315 char *ticket_str;
316 char *token_str;
317 686
318 for (op = handle->op_head; NULL != op; op = op->next) 687 for (op = handle->op_head; NULL != op; op = op->next)
319 if (op->r_id == r_id) 688 if (op->r_id == r_id)
320 break; 689 break;
321 if (NULL == op) 690 for (it = handle->ticket_it_head; NULL != it; it = it->next)
691 if (it->r_id == r_id)
692 break;
693 if ((NULL == op) && (NULL == it))
322 return; 694 return;
323 str = GNUNET_strdup ((char*)&irm[1]); 695 msg_len = ntohs (msg->header.size);
324 label_str = strtok (str, ","); 696 if (NULL != op)
325
326 if (NULL == label_str)
327 { 697 {
328 GNUNET_free (str); 698 GNUNET_CONTAINER_DLL_remove (handle->op_head,
329 GNUNET_break (0); 699 handle->op_tail,
700 op);
701 if (msg_len == sizeof (struct TicketResultMessage))
702 {
703 if (NULL != op->tr_cb)
704 op->tr_cb (op->cls, NULL);
705 } else {
706 ticket = (struct GNUNET_IDENTITY_PROVIDER_Ticket *)&msg[1];
707 if (NULL != op->tr_cb)
708 op->tr_cb (op->cls, ticket);
709 }
710 GNUNET_free (op);
330 return; 711 return;
331 } 712 } else if (NULL != it) {
332 ticket_str = strtok (NULL, ","); 713 if (msg_len == sizeof (struct TicketResultMessage))
333 if (NULL == ticket_str) 714 {
334 { 715 if (NULL != it->tr_cb)
335 GNUNET_free (str); 716 GNUNET_CONTAINER_DLL_remove (handle->ticket_it_head,
336 GNUNET_break (0); 717 handle->ticket_it_tail,
718 it);
719 it->finish_cb (it->finish_cb_cls);
720 GNUNET_free (it);
721 } else {
722 ticket = (struct GNUNET_IDENTITY_PROVIDER_Ticket *)&msg[1];
723 if (NULL != it->tr_cb)
724 it->tr_cb (it->cls, ticket);
725 }
337 return; 726 return;
338 } 727 }
339 token_str = strtok (NULL, ","); 728 GNUNET_break (0);
340 if (NULL == token_str) 729}
730
731/**
732 * Handle an incoming message of type
733 * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT
734 *
735 * @param cls
736 * @param msg the message we received
737 */
738static void
739handle_revoke_ticket_result (void *cls,
740 const struct RevokeTicketResultMessage *msg)
741{
742 struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
743 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
744 uint32_t r_id = ntohl (msg->id);
745 int32_t success;
746
747 LOG (GNUNET_ERROR_TYPE_DEBUG,
748 "Processing revocation result.\n");
749
750
751 for (op = h->op_head; NULL != op; op = op->next)
752 if (op->r_id == r_id)
753 break;
754 if (NULL == op)
755 return;
756 success = ntohl (msg->success);
341 { 757 {
342 GNUNET_free (str); 758 if (NULL != op->rvk_cb)
343 GNUNET_break (0); 759 {
760 op->rvk_cb (op->cls,
761 success,
762 NULL);
763 }
764 GNUNET_CONTAINER_DLL_remove (h->op_head,
765 h->op_tail,
766 op);
767 GNUNET_free (op);
344 return; 768 return;
345 } 769 }
346 GNUNET_CONTAINER_DLL_remove (handle->op_head, 770 GNUNET_assert (0);
347 handle->op_tail,
348 op);
349 ticket.data = ticket_str;
350 token.data = token_str;
351 if (NULL != op->iss_cb)
352 op->iss_cb (op->cls, label_str, &ticket, &token);
353 GNUNET_free (str);
354 GNUNET_free (op);
355
356} 771}
357 772
773
774
358/** 775/**
359 * Try again to connect to the service. 776 * Try again to connect to the service.
360 * 777 *
@@ -364,14 +781,26 @@ static void
364reconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h) 781reconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h)
365{ 782{
366 struct GNUNET_MQ_MessageHandler handlers[] = { 783 struct GNUNET_MQ_MessageHandler handlers[] = {
367 GNUNET_MQ_hd_var_size (result, 784 GNUNET_MQ_hd_fixed_size (attribute_store_response,
368 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT, 785 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE_RESPONSE,
369 struct IssueResultMessage, 786 struct AttributeStoreResultMessage,
787 h),
788 GNUNET_MQ_hd_var_size (attribute_result,
789 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT,
790 struct AttributeResultMessage,
370 h), 791 h),
371 GNUNET_MQ_hd_var_size (exchange_result, 792 GNUNET_MQ_hd_var_size (ticket_result,
372 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT, 793 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT,
373 struct ExchangeResultMessage, 794 struct TicketResultMessage,
374 h), 795 h),
796 GNUNET_MQ_hd_var_size (consume_ticket_result,
797 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT,
798 struct ConsumeTicketResultMessage,
799 h),
800 GNUNET_MQ_hd_fixed_size (revoke_ticket_result,
801 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT,
802 struct RevokeTicketResultMessage,
803 h),
375 GNUNET_MQ_handler_end () 804 GNUNET_MQ_handler_end ()
376 }; 805 };
377 struct GNUNET_IDENTITY_PROVIDER_Operation *op; 806 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
@@ -417,111 +846,6 @@ GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
417 846
418 847
419/** 848/**
420 * Issue an identity token
421 *
422 * @param id identity service to query
423 * @param service_name for which service is an identity wanted
424 * @param cb function to call with the result (will only be called once)
425 * @param cb_cls closure for @a cb
426 * @return handle to abort the operation
427 */
428struct GNUNET_IDENTITY_PROVIDER_Operation *
429GNUNET_IDENTITY_PROVIDER_issue_token (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
430 const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss_key,
431 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
432 const char* scopes,
433 struct GNUNET_TIME_Absolute expiration,
434 uint64_t nonce,
435 GNUNET_IDENTITY_PROVIDER_IssueCallback cb,
436 void *cb_cls)
437{
438 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
439 struct IssueMessage *im;
440 size_t slen;
441
442 slen = strlen (scopes) + 1;
443 if (slen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (struct IssueMessage))
444 {
445 GNUNET_break (0);
446 return NULL;
447 }
448 op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
449 op->h = id;
450 op->iss_cb = cb;
451 op->cls = cb_cls;
452 op->r_id = id->r_id_gen++;
453 op->env = GNUNET_MQ_msg_extra (im,
454 slen,
455 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE);
456 im->id = op->r_id;
457 im->iss_key = *iss_key;
458 im->aud_key = *aud_key;
459 im->nonce = htonl (nonce);
460 im->expiration = GNUNET_TIME_absolute_hton (expiration);
461 GNUNET_memcpy (&im[1], scopes, slen);
462 GNUNET_CONTAINER_DLL_insert_tail (id->op_head,
463 id->op_tail,
464 op);
465 if (NULL != id->mq)
466 GNUNET_MQ_send_copy (id->mq,
467 op->env);
468 return op;
469}
470
471
472/**
473 * Exchange a token ticket for a token
474 *
475 * @param id identity provider service
476 * @param ticket ticket to exchange
477 * @param cont function to call once the operation finished
478 * @param cont_cls closure for @a cont
479 * @return handle to abort the operation
480 */
481struct GNUNET_IDENTITY_PROVIDER_Operation *
482GNUNET_IDENTITY_PROVIDER_exchange_ticket (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
483 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
484 const struct GNUNET_CRYPTO_EcdsaPrivateKey *aud_privkey,
485 GNUNET_IDENTITY_PROVIDER_ExchangeCallback cont,
486 void *cont_cls)
487{
488 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
489 struct ExchangeMessage *em;
490 size_t slen;
491 char *ticket_str;
492
493 ticket_str = GNUNET_IDENTITY_PROVIDER_ticket_to_string (ticket);
494
495 slen = strlen (ticket_str) + 1;
496 if (slen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (struct ExchangeMessage))
497 {
498 GNUNET_free (ticket_str);
499 GNUNET_break (0);
500 return NULL;
501 }
502 op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
503 op->h = id;
504 op->ex_cb = cont;
505 op->cls = cont_cls;
506 op->r_id = id->r_id_gen++;
507 op->env = GNUNET_MQ_msg_extra (em,
508 slen,
509 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE);
510 em->aud_privkey = *aud_privkey;
511 em->id = htonl (op->r_id);
512 GNUNET_memcpy (&em[1], ticket_str, slen);
513 GNUNET_free (ticket_str);
514 GNUNET_CONTAINER_DLL_insert_tail (id->op_head,
515 id->op_tail,
516 op);
517 if (NULL != id->mq)
518 GNUNET_MQ_send_copy (id->mq,
519 op->env);
520 return op;
521}
522
523
524/**
525 * Cancel an operation. Note that the operation MAY still 849 * Cancel an operation. Note that the operation MAY still
526 * be executed; this merely cancels the continuation; if the request 850 * be executed; this merely cancels the continuation; if the request
527 * was already transmitted, the service may still choose to complete 851 * was already transmitted, the service may still choose to complete
@@ -566,80 +890,483 @@ GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h)
566} 890}
567 891
568/** 892/**
569 * Convenience API 893 * Store an attribute. If the attribute is already present,
894 * it is replaced with the new attribute.
895 *
896 * @param h handle to the identity provider
897 * @param pkey private key of the identity
898 * @param name the attribute name
899 * @param value the attribute value
900 * @param cont continuation to call when done
901 * @param cont_cls closure for @a cont
902 * @return handle to abort the request
903 */
904struct GNUNET_IDENTITY_PROVIDER_Operation *
905GNUNET_IDENTITY_PROVIDER_attribute_store (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
906 const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
907 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
908 GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cont,
909 void *cont_cls)
910{
911 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
912 struct AttributeStoreMessage *sam;
913 size_t attr_len;
914
915 op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
916 op->h = h;
917 op->as_cb = cont;
918 op->cls = cont_cls;
919 op->r_id = h->r_id_gen++;
920 GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
921 h->op_tail,
922 op);
923 attr_len = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (attr);
924 op->env = GNUNET_MQ_msg_extra (sam,
925 attr_len,
926 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE);
927 sam->identity = *pkey;
928 sam->id = htonl (op->r_id);
929
930 GNUNET_IDENTITY_ATTRIBUTE_serialize (attr,
931 (char*)&sam[1]);
932
933 sam->attr_len = htons (attr_len);
934 if (NULL != h->mq)
935 GNUNET_MQ_send_copy (h->mq,
936 op->env);
937 return op;
938
939}
940
941
942/**
943 * List all attributes for a local identity.
944 * This MUST lock the `struct GNUNET_IDENTITY_PROVIDER_Handle`
945 * for any other calls than #GNUNET_IDENTITY_PROVIDER_get_attributes_next() and
946 * #GNUNET_IDENTITY_PROVIDER_get_attributes_stop. @a proc will be called once
947 * immediately, and then again after
948 * #GNUNET_IDENTITY_PROVIDER_get_attributes_next() is invoked.
949 *
950 * On error (disconnect), @a error_cb will be invoked.
951 * On normal completion, @a finish_cb proc will be
952 * invoked.
953 *
954 * @param h handle to the idp
955 * @param identity identity to access
956 * @param error_cb function to call on error (i.e. disconnect),
957 * the handle is afterwards invalid
958 * @param error_cb_cls closure for @a error_cb
959 * @param proc function to call on each attribute; it
960 * will be called repeatedly with a value (if available)
961 * @param proc_cls closure for @a proc
962 * @param finish_cb function to call on completion
963 * the handle is afterwards invalid
964 * @param finish_cb_cls closure for @a finish_cb
965 * @return an iterator handle to use for iteration
966 */
967struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *
968GNUNET_IDENTITY_PROVIDER_get_attributes_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
969 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
970 GNUNET_SCHEDULER_TaskCallback error_cb,
971 void *error_cb_cls,
972 GNUNET_IDENTITY_PROVIDER_AttributeResult proc,
973 void *proc_cls,
974 GNUNET_SCHEDULER_TaskCallback finish_cb,
975 void *finish_cb_cls)
976{
977 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it;
978 struct GNUNET_MQ_Envelope *env;
979 struct AttributeIterationStartMessage *msg;
980 uint32_t rid;
981
982 rid = h->r_id_gen++;
983 it = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator);
984 it->h = h;
985 it->error_cb = error_cb;
986 it->error_cb_cls = error_cb_cls;
987 it->finish_cb = finish_cb;
988 it->finish_cb_cls = finish_cb_cls;
989 it->proc = proc;
990 it->proc_cls = proc_cls;
991 it->r_id = rid;
992 it->identity = *identity;
993 GNUNET_CONTAINER_DLL_insert_tail (h->it_head,
994 h->it_tail,
995 it);
996 env = GNUNET_MQ_msg (msg,
997 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_START);
998 msg->id = htonl (rid);
999 msg->identity = *identity;
1000 if (NULL == h->mq)
1001 it->env = env;
1002 else
1003 GNUNET_MQ_send (h->mq,
1004 env);
1005 return it;
1006}
1007
1008
1009/**
1010 * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_get_attributes_start
1011 * for the next record.
1012 *
1013 * @param it the iterator
570 */ 1014 */
1015void
1016GNUNET_IDENTITY_PROVIDER_get_attributes_next (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it)
1017{
1018 struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
1019 struct AttributeIterationNextMessage *msg;
1020 struct GNUNET_MQ_Envelope *env;
1021
1022 env = GNUNET_MQ_msg (msg,
1023 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT);
1024 msg->id = htonl (it->r_id);
1025 GNUNET_MQ_send (h->mq,
1026 env);
1027}
571 1028
572 1029
573/** 1030/**
574 * Destroy token 1031 * Stops iteration and releases the idp handle for further calls. Must
1032 * be called on any iteration that has not yet completed prior to calling
1033 * #GNUNET_IDENTITY_PROVIDER_disconnect.
575 * 1034 *
576 * @param token the token 1035 * @param it the iterator
577 */ 1036 */
578void 1037void
579GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token) 1038GNUNET_IDENTITY_PROVIDER_get_attributes_stop (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it)
1039{
1040 struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
1041 struct GNUNET_MQ_Envelope *env;
1042 struct AttributeIterationStopMessage *msg;
1043
1044 if (NULL != h->mq)
1045 {
1046 env = GNUNET_MQ_msg (msg,
1047 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP);
1048 msg->id = htonl (it->r_id);
1049 GNUNET_MQ_send (h->mq,
1050 env);
1051 }
1052 free_it (it);
1053}
1054
1055
1056/** TODO
1057 * Issues a ticket to another identity. The identity may use
1058 * @GNUNET_IDENTITY_PROVIDER_authorization_ticket_consume to consume the ticket
1059 * and retrieve the attributes specified in the AttributeList.
1060 *
1061 * @param h the identity provider to use
1062 * @param iss the issuing identity
1063 * @param rp the subject of the ticket (the relying party)
1064 * @param attr the attributes that the relying party is given access to
1065 * @param cb the callback
1066 * @param cb_cls the callback closure
1067 * @return handle to abort the operation
1068 */
1069struct GNUNET_IDENTITY_PROVIDER_Operation *
1070GNUNET_IDENTITY_PROVIDER_ticket_issue (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
1071 const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
1072 const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
1073 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
1074 GNUNET_IDENTITY_PROVIDER_TicketCallback cb,
1075 void *cb_cls)
1076{
1077 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
1078 struct IssueTicketMessage *tim;
1079 size_t attr_len;
1080
1081 op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
1082 op->h = h;
1083 op->tr_cb = cb;
1084 op->cls = cb_cls;
1085 op->r_id = h->r_id_gen++;
1086 GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
1087 h->op_tail,
1088 op);
1089 attr_len = GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (attrs);
1090 op->env = GNUNET_MQ_msg_extra (tim,
1091 attr_len,
1092 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_TICKET);
1093 tim->identity = *iss;
1094 tim->rp = *rp;
1095 tim->id = htonl (op->r_id);
1096
1097 GNUNET_IDENTITY_ATTRIBUTE_list_serialize (attrs,
1098 (char*)&tim[1]);
1099
1100 tim->attr_len = htons (attr_len);
1101 if (NULL != h->mq)
1102 GNUNET_MQ_send_copy (h->mq,
1103 op->env);
1104 return op;
1105}
1106
1107/**
1108 * Consumes an issued ticket. The ticket is persisted
1109 * and used to retrieve identity information from the issuer
1110 *
1111 * @param id the identity provider to use
1112 * @param identity the identity that is the subject of the issued ticket (the relying party)
1113 * @param ticket the issued ticket to consume
1114 * @param cb the callback to call
1115 * @param cb_cls the callback closure
1116 * @return handle to abort the operation
1117 */
1118struct GNUNET_IDENTITY_PROVIDER_Operation *
1119GNUNET_IDENTITY_PROVIDER_ticket_consume (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
1120 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
1121 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
1122 GNUNET_IDENTITY_PROVIDER_AttributeResult cb,
1123 void *cb_cls)
580{ 1124{
581 GNUNET_assert (NULL != token); 1125 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
582 if (NULL != token->data) 1126 struct ConsumeTicketMessage *ctm;
583 GNUNET_free (token->data); 1127
584 GNUNET_free (token); 1128 op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
1129 op->h = h;
1130 op->ar_cb = cb;
1131 op->cls = cb_cls;
1132 op->r_id = h->r_id_gen++;
1133 GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
1134 h->op_tail,
1135 op);
1136 op->env = GNUNET_MQ_msg_extra (ctm,
1137 sizeof (const struct GNUNET_IDENTITY_PROVIDER_Ticket),
1138 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET);
1139 ctm->identity = *identity;
1140 ctm->id = htonl (op->r_id);
1141
1142 GNUNET_memcpy ((char*)&ctm[1],
1143 ticket,
1144 sizeof (const struct GNUNET_IDENTITY_PROVIDER_Ticket));
1145
1146 if (NULL != h->mq)
1147 GNUNET_MQ_send_copy (h->mq,
1148 op->env);
1149 return op;
1150
585} 1151}
586 1152
1153
587/** 1154/**
588 * Returns string representation of token. A JSON-Web-Token. 1155 * Lists all tickets that have been issued to remote
1156 * identites (relying parties)
589 * 1157 *
590 * @param token the token 1158 * @param h the identity provider to use
591 * @return The JWT (must be freed) 1159 * @param identity the issuing identity
1160 * @param error_cb function to call on error (i.e. disconnect),
1161 * the handle is afterwards invalid
1162 * @param error_cb_cls closure for @a error_cb
1163 * @param proc function to call on each ticket; it
1164 * will be called repeatedly with a value (if available)
1165 * @param proc_cls closure for @a proc
1166 * @param finish_cb function to call on completion
1167 * the handle is afterwards invalid
1168 * @param finish_cb_cls closure for @a finish_cb
1169 * @return an iterator handle to use for iteration
592 */ 1170 */
593char * 1171struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
594GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token) 1172GNUNET_IDENTITY_PROVIDER_ticket_iteration_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
1173 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
1174 GNUNET_SCHEDULER_TaskCallback error_cb,
1175 void *error_cb_cls,
1176 GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
1177 void *proc_cls,
1178 GNUNET_SCHEDULER_TaskCallback finish_cb,
1179 void *finish_cb_cls)
595{ 1180{
596 return GNUNET_strdup (token->data); 1181 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it;
1182 struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
1183 struct GNUNET_MQ_Envelope *env;
1184 struct TicketIterationStartMessage *msg;
1185 uint32_t rid;
1186
1187 GNUNET_CRYPTO_ecdsa_key_get_public (identity,
1188 &identity_pub);
1189 rid = h->r_id_gen++;
1190 it = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_TicketIterator);
1191 it->h = h;
1192 it->error_cb = error_cb;
1193 it->error_cb_cls = error_cb_cls;
1194 it->finish_cb = finish_cb;
1195 it->finish_cb_cls = finish_cb_cls;
1196 it->tr_cb = proc;
1197 it->cls = proc_cls;
1198 it->r_id = rid;
1199 GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head,
1200 h->ticket_it_tail,
1201 it);
1202 env = GNUNET_MQ_msg (msg,
1203 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START);
1204 msg->id = htonl (rid);
1205 msg->identity = identity_pub;
1206 msg->is_audience = htonl (GNUNET_NO);
1207 if (NULL == h->mq)
1208 it->env = env;
1209 else
1210 GNUNET_MQ_send (h->mq,
1211 env);
1212 return it;
1213
597} 1214}
598 1215
1216
599/** 1217/**
600 * Returns string representation of ticket. Base64-Encoded 1218 * Lists all tickets that have been issued to remote
1219 * identites (relying parties)
601 * 1220 *
602 * @param ticket the ticket 1221 * @param id the identity provider to use
603 * @return the Base64-Encoded ticket 1222 * @param identity the issuing identity
1223 * @param error_cb function to call on error (i.e. disconnect),
1224 * the handle is afterwards invalid
1225 * @param error_cb_cls closure for @a error_cb
1226 * @param proc function to call on each ticket; it
1227 * will be called repeatedly with a value (if available)
1228 * @param proc_cls closure for @a proc
1229 * @param finish_cb function to call on completion
1230 * the handle is afterwards invalid
1231 * @param finish_cb_cls closure for @a finish_cb
1232 * @return an iterator handle to use for iteration
604 */ 1233 */
605char * 1234struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
606GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) 1235GNUNET_IDENTITY_PROVIDER_ticket_iteration_start_rp (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
1236 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
1237 GNUNET_SCHEDULER_TaskCallback error_cb,
1238 void *error_cb_cls,
1239 GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
1240 void *proc_cls,
1241 GNUNET_SCHEDULER_TaskCallback finish_cb,
1242 void *finish_cb_cls)
607{ 1243{
608 return GNUNET_strdup (ticket->data); 1244 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it;
1245 struct GNUNET_MQ_Envelope *env;
1246 struct TicketIterationStartMessage *msg;
1247 uint32_t rid;
1248
1249 rid = h->r_id_gen++;
1250 it = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_TicketIterator);
1251 it->h = h;
1252 it->error_cb = error_cb;
1253 it->error_cb_cls = error_cb_cls;
1254 it->finish_cb = finish_cb;
1255 it->finish_cb_cls = finish_cb_cls;
1256 it->tr_cb = proc;
1257 it->cls = proc_cls;
1258 it->r_id = rid;
1259 GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head,
1260 h->ticket_it_tail,
1261 it);
1262 env = GNUNET_MQ_msg (msg,
1263 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START);
1264 msg->id = htonl (rid);
1265 msg->identity = *identity;
1266 msg->is_audience = htonl (GNUNET_YES);
1267 if (NULL == h->mq)
1268 it->env = env;
1269 else
1270 GNUNET_MQ_send (h->mq,
1271 env);
1272 return it;
1273
1274
609} 1275}
610 1276
611/** 1277/**
612 * Created a ticket from a string (Base64 encoded ticket) 1278 * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_ticket_iteration_start
1279 * for the next record.
613 * 1280 *
614 * @param input Base64 encoded ticket 1281 * @param it the iterator
615 * @param ticket pointer where the ticket is stored
616 * @return GNUNET_OK
617 */ 1282 */
618int 1283void
619GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input, 1284GNUNET_IDENTITY_PROVIDER_ticket_iteration_next (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it)
620 struct GNUNET_IDENTITY_PROVIDER_Ticket **ticket)
621{ 1285{
622 *ticket = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket)); 1286 struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
623 (*ticket)->data = GNUNET_strdup (input); 1287 struct TicketIterationNextMessage *msg;
624 return GNUNET_OK; 1288 struct GNUNET_MQ_Envelope *env;
1289
1290 env = GNUNET_MQ_msg (msg,
1291 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT);
1292 msg->id = htonl (it->r_id);
1293 GNUNET_MQ_send (h->mq,
1294 env);
625} 1295}
626 1296
627 1297
628/** 1298/**
629 * Destroys a ticket 1299 * Stops iteration and releases the idp handle for further calls. Must
1300 * be called on any iteration that has not yet completed prior to calling
1301 * #GNUNET_IDENTITY_PROVIDER_disconnect.
630 * 1302 *
631 * @param ticket the ticket to destroy 1303 * @param it the iterator
632 */ 1304 */
633void 1305void
634GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) 1306GNUNET_IDENTITY_PROVIDER_ticket_iteration_stop (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it)
635{ 1307{
636 GNUNET_assert (NULL != ticket); 1308 struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
637 if (NULL != ticket->data) 1309 struct GNUNET_MQ_Envelope *env;
638 GNUNET_free (ticket->data); 1310 struct TicketIterationStopMessage *msg;
639 GNUNET_free (ticket); 1311
1312 if (NULL != h->mq)
1313 {
1314 env = GNUNET_MQ_msg (msg,
1315 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP);
1316 msg->id = htonl (it->r_id);
1317 GNUNET_MQ_send (h->mq,
1318 env);
1319 }
1320 GNUNET_free (it);
640} 1321}
641 1322
1323/**
1324 * Revoked an issued ticket. The relying party will be unable to retrieve
1325 * updated attributes.
1326 *
1327 * @param id the identity provider to use
1328 * @param identity the issuing identity
1329 * @param ticket the ticket to revoke
1330 * @param cb the callback
1331 * @param cb_cls the callback closure
1332 * @return handle to abort the operation
1333 */
1334struct GNUNET_IDENTITY_PROVIDER_Operation *
1335GNUNET_IDENTITY_PROVIDER_ticket_revoke (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
1336 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
1337 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
1338 GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cb,
1339 void *cb_cls)
1340{
1341 struct GNUNET_IDENTITY_PROVIDER_Operation *op;
1342 struct GNUNET_MQ_Envelope *env;
1343 struct RevokeTicketMessage *msg;
1344 uint32_t rid;
642 1345
1346 rid = h->r_id_gen++;
1347 op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
1348 op->h = h;
1349 op->rvk_cb = cb;
1350 op->cls = cb_cls;
1351 op->r_id = rid;
1352 GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
1353 h->op_tail,
1354 op);
1355 env = GNUNET_MQ_msg_extra (msg,
1356 sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket),
1357 GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET);
1358 msg->id = htonl (rid);
1359 msg->identity = *identity;
1360 memcpy (&msg[1],
1361 ticket,
1362 sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
1363 if (NULL == h->mq)
1364 op->env = env;
1365 else
1366 GNUNET_MQ_send (h->mq,
1367 env);
1368 return op;
1369}
643 1370
644 1371
645 1372
diff --git a/src/identity-provider/identity_token.c b/src/identity-provider/identity_token.c
deleted file mode 100644
index 31249840b..000000000
--- a/src/identity-provider/identity_token.c
+++ /dev/null
@@ -1,964 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20
21/**
22 * @file identity-provider/identity_token.c
23 * @brief helper library to manage identity tokens
24 * @author Martin Schanzenbach
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28#include "gnunet_signatures.h"
29#include "identity_token.h"
30#include <jansson.h>
31#include <inttypes.h>
32
33#define JWT_ALG "alg"
34
35#define JWT_ALG_VALUE "ED512"
36
37#define JWT_TYP "typ"
38
39#define JWT_TYP_VALUE "jwt"
40
41/**
42 * Crypto helper functions
43 */
44
45static int
46create_sym_key_from_ecdh(const struct GNUNET_HashCode *new_key_hash,
47 struct GNUNET_CRYPTO_SymmetricSessionKey *skey,
48 struct GNUNET_CRYPTO_SymmetricInitializationVector *iv)
49{
50 struct GNUNET_CRYPTO_HashAsciiEncoded new_key_hash_str;
51
52 GNUNET_CRYPTO_hash_to_enc (new_key_hash,
53 &new_key_hash_str);
54 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating symmetric rsa key from %s\n", (char*)&new_key_hash_str);
55 static const char ctx_key[] = "gnuid-aes-ctx-key";
56 GNUNET_CRYPTO_kdf (skey, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
57 new_key_hash, sizeof (struct GNUNET_HashCode),
58 ctx_key, strlen (ctx_key),
59 NULL, 0);
60 static const char ctx_iv[] = "gnuid-aes-ctx-iv";
61 GNUNET_CRYPTO_kdf (iv, sizeof (struct GNUNET_CRYPTO_SymmetricInitializationVector),
62 new_key_hash, sizeof (struct GNUNET_HashCode),
63 ctx_iv, strlen (ctx_iv),
64 NULL, 0);
65 return GNUNET_OK;
66}
67
68
69
70/**
71 * Decrypts data part from a token code
72 */
73static int
74decrypt_str_ecdhe (const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
75 const struct GNUNET_CRYPTO_EcdhePublicKey *ecdh_key,
76 const char *cyphertext,
77 size_t cyphertext_len,
78 char **result_str)
79{
80 struct GNUNET_HashCode new_key_hash;
81 struct GNUNET_CRYPTO_SymmetricSessionKey enc_key;
82 struct GNUNET_CRYPTO_SymmetricInitializationVector enc_iv;
83
84 char *str_buf = GNUNET_malloc (cyphertext_len);
85 size_t str_size;
86
87 //Calculate symmetric key from ecdh parameters
88 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdsa_ecdh (priv_key,
89 ecdh_key,
90 &new_key_hash));
91
92 create_sym_key_from_ecdh (&new_key_hash,
93 &enc_key,
94 &enc_iv);
95
96 str_size = GNUNET_CRYPTO_symmetric_decrypt (cyphertext,
97 cyphertext_len,
98 &enc_key,
99 &enc_iv,
100 str_buf);
101 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
102 "Decrypted bytes: %zd Expected bytes: %zd\n",
103 str_size,
104 cyphertext_len);
105 if (-1 == str_size)
106 {
107 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ECDH invalid\n");
108 GNUNET_free (str_buf);
109 return GNUNET_SYSERR;
110 }
111 *result_str = GNUNET_malloc (str_size+1);
112 GNUNET_memcpy (*result_str, str_buf, str_size);
113 (*result_str)[str_size] = '\0';
114 GNUNET_free (str_buf);
115 return GNUNET_OK;
116
117}
118
119/**
120 * Decrypt string using pubkey and ECDHE
121*/
122static int
123decrypt_str_ecdhe2 (const struct GNUNET_CRYPTO_EcdhePrivateKey *ecdh_privkey,
124 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
125 const char *ciphertext,
126 size_t ciphertext_len,
127 char **plaintext)
128{
129 struct GNUNET_CRYPTO_SymmetricSessionKey skey;
130 struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
131 struct GNUNET_HashCode new_key_hash;
132
133 //This is true see documentation for GNUNET_CRYPTO_symmetric_encrypt
134 *plaintext = GNUNET_malloc (ciphertext_len);
135
136 // Derived key K = H(eB)
137 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (ecdh_privkey,
138 aud_key,
139 &new_key_hash));
140 create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
141 GNUNET_CRYPTO_symmetric_decrypt (ciphertext,
142 ciphertext_len,
143 &skey, &iv,
144 *plaintext);
145 return GNUNET_OK;
146}
147
148
149/**
150 * Encrypt string using pubkey and ECDHE
151 * Returns ECDHE pubkey to be used for decryption
152 */
153static int
154encrypt_str_ecdhe (const char *plaintext,
155 const struct GNUNET_CRYPTO_EcdsaPublicKey *pub_key,
156 char **cyphertext,
157 struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
158 struct GNUNET_CRYPTO_EcdhePublicKey *ecdh_pubkey)
159{
160 struct GNUNET_CRYPTO_SymmetricSessionKey skey;
161 struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
162 struct GNUNET_HashCode new_key_hash;
163 ssize_t enc_size;
164
165 // ECDH keypair E = eG
166 *ecdh_privkey = GNUNET_CRYPTO_ecdhe_key_create();
167 GNUNET_CRYPTO_ecdhe_key_get_public (*ecdh_privkey,
168 ecdh_pubkey);
169
170 //This is true see documentation for GNUNET_CRYPTO_symmetric_encrypt
171 *cyphertext = GNUNET_malloc (strlen (plaintext));
172
173 // Derived key K = H(eB)
174 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (*ecdh_privkey,
175 pub_key,
176 &new_key_hash));
177 create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
178 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypting string %s\n (len=%zd)",
179 plaintext,
180 strlen (plaintext));
181 enc_size = GNUNET_CRYPTO_symmetric_encrypt (plaintext,
182 strlen (plaintext),
183 &skey, &iv,
184 *cyphertext);
185 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypted (len=%zd)", enc_size);
186 return GNUNET_OK;
187}
188
189
190/**
191 * Identity Token API
192 */
193
194
195/**
196 * Create an Identity Token
197 *
198 * @param type the JSON API resource type
199 * @param id the JSON API resource id
200 * @return a new JSON API resource or NULL on error.
201 */
202struct IdentityToken*
203token_create (const struct GNUNET_CRYPTO_EcdsaPublicKey* iss,
204 const struct GNUNET_CRYPTO_EcdsaPublicKey* aud)
205{
206 struct IdentityToken *token;
207 char* audience;
208 char* issuer;
209
210 issuer = GNUNET_STRINGS_data_to_string_alloc (iss,
211 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
212 audience = GNUNET_STRINGS_data_to_string_alloc (aud,
213 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
214
215 token = GNUNET_malloc (sizeof (struct IdentityToken));
216 token_add_attr (token, "iss", issuer);
217 token_add_attr (token, "aud", audience);
218 token_add_attr (token, "sub", issuer);
219 token->aud_key = *aud;
220 GNUNET_free (issuer);
221 GNUNET_free (audience);
222 return token;
223}
224
225void
226token_destroy (struct IdentityToken *token)
227{
228 struct TokenAttr *attr;
229 struct TokenAttr *tmp_attr;
230 struct TokenAttrValue *val;
231 struct TokenAttrValue *tmp_val;
232
233 for (attr = token->attr_head; NULL != attr;)
234 {
235 tmp_attr = attr->next;
236 GNUNET_CONTAINER_DLL_remove (token->attr_head,
237 token->attr_tail,
238 attr);
239 for (val = attr->val_head; NULL != val;)
240 {
241 tmp_val = val->next;
242 GNUNET_CONTAINER_DLL_remove (attr->val_head,
243 attr->val_tail,
244 val);
245 if (NULL != val->value)
246 GNUNET_free (val->value);
247 GNUNET_free (val);
248 val = tmp_val;
249 }
250 GNUNET_free (attr->name);
251 GNUNET_free (attr);
252 attr = tmp_attr;
253 }
254
255
256 GNUNET_free (token);
257}
258
259void
260token_add_attr (struct IdentityToken *token,
261 const char* key,
262 const char* value)
263{
264 struct TokenAttr *attr;
265 struct TokenAttrValue *new_val;
266 GNUNET_assert (NULL != token);
267
268 new_val = GNUNET_malloc (sizeof (struct TokenAttrValue));
269 new_val->value = GNUNET_strdup (value);
270 for (attr = token->attr_head; NULL != attr; attr = attr->next)
271 {
272 if (0 == strcmp (key, attr->name))
273 break;
274 }
275
276 if (NULL == attr)
277 {
278 attr = GNUNET_malloc (sizeof (struct TokenAttr));
279 attr->name = GNUNET_strdup (key);
280 GNUNET_CONTAINER_DLL_insert (token->attr_head,
281 token->attr_tail,
282 attr);
283 }
284
285 GNUNET_CONTAINER_DLL_insert (attr->val_head,
286 attr->val_tail,
287 new_val);
288}
289
290void
291token_add_attr_int (struct IdentityToken *token,
292 const char* key,
293 uint64_t value)
294{
295 struct TokenAttr *attr;
296 struct TokenAttrValue *new_val;
297 GNUNET_assert (NULL != token);
298
299 new_val = GNUNET_malloc (sizeof (struct TokenAttrValue));
300 new_val->int_value = value;
301 for (attr = token->attr_head; NULL != attr; attr = attr->next)
302 {
303 if (0 == strcmp (key, attr->name))
304 break;
305 }
306
307 if (NULL == attr)
308 {
309 attr = GNUNET_malloc (sizeof (struct TokenAttr));
310 attr->name = GNUNET_strdup (key);
311 GNUNET_CONTAINER_DLL_insert (token->attr_head,
312 token->attr_tail,
313 attr);
314 }
315
316 GNUNET_CONTAINER_DLL_insert (attr->val_head,
317 attr->val_tail,
318 new_val);
319}
320
321static void
322parse_json_payload(const char* payload_base64,
323 struct IdentityToken *token)
324{
325 const char *key;
326 const json_t *value;
327 const json_t *arr_value;
328 char *payload;
329 int idx;
330 json_t *payload_json;
331 json_error_t err_json;
332
333 GNUNET_STRINGS_base64_decode (payload_base64,
334 strlen (payload_base64),
335 &payload);
336 //TODO signature and aud key
337 payload_json = json_loads (payload, JSON_DECODE_ANY, &err_json);
338
339 json_object_foreach (payload_json, key, value)
340 {
341 if (json_is_array (value))
342 {
343 json_array_foreach (value, idx, arr_value)
344 {
345 if (json_is_integer (arr_value))
346 token_add_attr_int (token, key,
347 json_integer_value (arr_value));
348 else
349 token_add_attr (token,
350 key,
351 json_string_value (arr_value));
352 }
353 } else {
354 if (json_is_integer (value))
355 token_add_attr_int (token, key,
356 json_integer_value (value));
357 else
358 token_add_attr (token, key, json_string_value (value));
359 }
360 }
361
362 json_decref (payload_json);
363 GNUNET_free (payload);
364}
365
366int
367token_parse2 (const char* raw_data,
368 const struct GNUNET_CRYPTO_EcdhePrivateKey *priv_key,
369 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
370 struct IdentityToken **result)
371{
372 char *enc_token_str;
373 char *tmp_buf;
374 char *token_str;
375 char *enc_token;
376 char *payload_base64;
377 size_t enc_token_len;
378
379 GNUNET_asprintf (&tmp_buf, "%s", raw_data);
380 strtok (tmp_buf, ",");
381 enc_token_str = strtok (NULL, ",");
382
383 enc_token_len = GNUNET_STRINGS_base64_decode (enc_token_str,
384 strlen (enc_token_str),
385 &enc_token);
386 if (GNUNET_OK != decrypt_str_ecdhe2 (priv_key,
387 aud_key,
388 enc_token,
389 enc_token_len,
390 &token_str))
391 {
392 GNUNET_free (tmp_buf);
393 GNUNET_free (enc_token);
394 return GNUNET_SYSERR;
395 }
396
397 GNUNET_assert (NULL != strtok (token_str, "."));
398 payload_base64 = strtok (NULL, ".");
399
400 *result = GNUNET_malloc (sizeof (struct IdentityToken));
401 parse_json_payload (payload_base64, *result);
402
403 (*result)->aud_key = *aud_key;
404 GNUNET_free (enc_token);
405 GNUNET_free (token_str);
406 GNUNET_free (tmp_buf);
407 return GNUNET_OK;
408}
409
410int
411token_parse (const char* raw_data,
412 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
413 struct IdentityToken **result)
414{
415 char *ecdh_pubkey_str;
416 char *enc_token_str;
417 char *tmp_buf;
418 char *token_str;
419 char *enc_token;
420 char *payload_base64;
421 size_t enc_token_len;
422 struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
423
424 GNUNET_asprintf (&tmp_buf, "%s", raw_data);
425 ecdh_pubkey_str = strtok (tmp_buf, ",");
426 enc_token_str = strtok (NULL, ",");
427
428 GNUNET_assert (NULL != ecdh_pubkey_str);
429 GNUNET_assert (NULL != enc_token_str);
430
431 GNUNET_STRINGS_string_to_data (ecdh_pubkey_str,
432 strlen (ecdh_pubkey_str),
433 &ecdh_pubkey,
434 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
435 enc_token_len = GNUNET_STRINGS_base64_decode (enc_token_str,
436 strlen (enc_token_str),
437 &enc_token);
438 if (GNUNET_OK != decrypt_str_ecdhe (priv_key,
439 &ecdh_pubkey,
440 enc_token,
441 enc_token_len,
442 &token_str))
443 {
444 GNUNET_free (tmp_buf);
445 GNUNET_free (enc_token);
446 return GNUNET_SYSERR;
447 }
448
449 GNUNET_assert (NULL != strtok (token_str, "."));
450 payload_base64 = strtok (NULL, ".");
451
452 *result = GNUNET_malloc (sizeof (struct IdentityToken));
453 parse_json_payload (payload_base64, *result);
454
455 GNUNET_free (enc_token);
456 GNUNET_free (token_str);
457 GNUNET_free (tmp_buf);
458 return GNUNET_OK;
459}
460
461static char*
462create_json_payload (const struct IdentityToken *token)
463{
464 struct TokenAttr *attr;
465 struct TokenAttrValue *val;
466 json_t *root;
467 char *json_str;
468
469 root = json_object();
470 for (attr = token->attr_head; NULL != attr; attr = attr->next)
471 {
472 for (val = attr->val_head; NULL != val; val = val->next)
473 {
474 if (NULL != val->value)
475 {
476 json_object_set_new (root,
477 attr->name,
478 json_string (val->value));
479 } else {
480 json_object_set_new (root,
481 attr->name,
482 json_integer (val->int_value));
483 }
484 }
485 }
486 json_str = json_dumps (root, JSON_INDENT(1));
487 json_decref (root);
488 return json_str;
489}
490
491static char*
492create_json_header(void)
493{
494 json_t *root;
495 char *json_str;
496
497 root = json_object ();
498 json_object_set_new (root, JWT_ALG, json_string (JWT_ALG_VALUE));
499 json_object_set_new (root, JWT_TYP, json_string (JWT_TYP_VALUE));
500
501 json_str = json_dumps (root, JSON_INDENT(1));
502 json_decref (root);
503 return json_str;
504}
505
506int
507token_to_string (const struct IdentityToken *token,
508 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
509 char **result)
510{
511 char *payload_str;
512 char *header_str;
513 char *payload_base64;
514 char *header_base64;
515 char *padding;
516 char *signature_target;
517 char *signature_str;
518 struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
519 header_str = create_json_header();
520 GNUNET_STRINGS_base64_encode (header_str,
521 strlen (header_str),
522 &header_base64);
523 //Remove GNUNET padding of base64
524 padding = strtok(header_base64, "=");
525 while (NULL != padding)
526 padding = strtok(NULL, "=");
527
528 payload_str = create_json_payload (token);
529 GNUNET_STRINGS_base64_encode (payload_str,
530 strlen (payload_str),
531 &payload_base64);
532
533 //Remove GNUNET padding of base64
534 padding = strtok(payload_base64, "=");
535 while (NULL != padding)
536 padding = strtok(NULL, "=");
537
538 GNUNET_asprintf (&signature_target, "%s,%s", header_base64, payload_base64);
539 purpose =
540 GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
541 strlen (signature_target));
542 purpose->size =
543 htonl (strlen (signature_target) + sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
544 purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
545 GNUNET_memcpy (&purpose[1], signature_target, strlen (signature_target));
546 if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_sign (priv_key,
547 purpose,
548 (struct GNUNET_CRYPTO_EcdsaSignature *)&token->signature))
549 {
550 GNUNET_free (signature_target);
551 GNUNET_free (payload_str);
552 GNUNET_free (payload_base64);
553 GNUNET_free (header_base64);
554 GNUNET_free (purpose);
555 return GNUNET_SYSERR;
556 }
557
558 GNUNET_STRINGS_base64_encode ((const char*)&token->signature,
559 sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
560 &signature_str);
561 GNUNET_asprintf (result, "%s.%s.%s",
562 header_base64, payload_base64, signature_str);
563 GNUNET_free (signature_target);
564 GNUNET_free (payload_str);
565 GNUNET_free (header_str);
566 GNUNET_free (signature_str);
567 GNUNET_free (payload_base64);
568 GNUNET_free (header_base64);
569 GNUNET_free (purpose);
570 return GNUNET_OK;
571}
572
573int
574token_serialize (const struct IdentityToken *token,
575 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
576 struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
577 char **result)
578{
579 char *token_str;
580 char *enc_token;
581 char *dh_key_str;
582 char *enc_token_base64;
583 struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
584
585 GNUNET_assert (GNUNET_OK == token_to_string (token,
586 priv_key,
587 &token_str));
588
589 GNUNET_assert (GNUNET_OK == encrypt_str_ecdhe (token_str,
590 &token->aud_key,
591 &enc_token,
592 ecdh_privkey,
593 &ecdh_pubkey));
594 GNUNET_STRINGS_base64_encode (enc_token,
595 strlen (token_str),
596 &enc_token_base64);
597 dh_key_str = GNUNET_STRINGS_data_to_string_alloc (&ecdh_pubkey,
598 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
599 GNUNET_asprintf (result, "%s,%s", dh_key_str, enc_token_base64);
600 GNUNET_free (dh_key_str);
601 GNUNET_free (enc_token_base64);
602 GNUNET_free (enc_token);
603 GNUNET_free (token_str);
604 return GNUNET_OK;
605}
606
607struct TokenTicketPayload*
608ticket_payload_create (uint64_t nonce,
609 const struct GNUNET_CRYPTO_EcdsaPublicKey* identity_pkey,
610 const char* lbl_str)
611{
612 struct TokenTicketPayload* payload;
613
614 payload = GNUNET_malloc (sizeof (struct TokenTicketPayload));
615 payload->nonce = nonce;
616 payload->identity_key = *identity_pkey;
617 GNUNET_asprintf (&payload->label, lbl_str, strlen (lbl_str));
618 return payload;
619}
620
621void
622ticket_payload_destroy (struct TokenTicketPayload* payload)
623{
624 if (NULL != payload->label)
625 GNUNET_free (payload->label);
626 GNUNET_free (payload);
627}
628
629void
630ticket_payload_serialize (struct TokenTicketPayload *payload,
631 char **result)
632{
633 char* identity_key_str;
634
635 identity_key_str = GNUNET_STRINGS_data_to_string_alloc (&payload->identity_key,
636 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
637
638 GNUNET_asprintf (result,
639 "{\"nonce\": \"%"SCNu64"\",\"identity\": \"%s\",\"label\": \"%s\"}",
640 payload->nonce, identity_key_str, payload->label);
641 GNUNET_free (identity_key_str);
642
643}
644
645
646/**
647 * Create the token code
648 * The data is encrypted with a share ECDH derived secret using B (aud_key)
649 * and e (ecdh_privkey)
650 * The ticket also contains E (ecdh_pubkey) and a signature over the
651 * data and E
652 */
653struct TokenTicket*
654ticket_create (uint64_t nonce,
655 const struct GNUNET_CRYPTO_EcdsaPublicKey* identity_pkey,
656 const char* lbl_str,
657 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key)
658{
659 struct TokenTicket *ticket;
660 struct TokenTicketPayload *code_payload;
661
662 ticket = GNUNET_malloc (sizeof (struct TokenTicket));
663 code_payload = ticket_payload_create (nonce,
664 identity_pkey,
665 lbl_str);
666 ticket->aud_key = *aud_key;
667 ticket->payload = code_payload;
668
669
670 return ticket;
671}
672
673void
674ticket_destroy (struct TokenTicket *ticket)
675{
676 ticket_payload_destroy (ticket->payload);
677 GNUNET_free (ticket);
678}
679
680int
681ticket_serialize (struct TokenTicket *ticket,
682 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
683 char **result)
684{
685 char *code_payload_str;
686 char *enc_ticket_payload;
687 char *ticket_payload_str;
688 char *ticket_sig_str;
689 char *ticket_str;
690 char *dh_key_str;
691 char *write_ptr;
692 struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
693
694 struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
695
696 ticket_payload_serialize (ticket->payload,
697 &code_payload_str);
698
699 GNUNET_assert (GNUNET_OK == encrypt_str_ecdhe (code_payload_str,
700 &ticket->aud_key,
701 &enc_ticket_payload,
702 &ecdhe_privkey,
703 &ticket->ecdh_pubkey));
704
705 GNUNET_free (ecdhe_privkey);
706
707 purpose =
708 GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
709 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) + //E
710 strlen (code_payload_str)); // E_K (code_str)
711 purpose->size =
712 htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
713 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
714 strlen (code_payload_str));
715 purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET);
716 write_ptr = (char*) &purpose[1];
717 GNUNET_memcpy (write_ptr,
718 &ticket->ecdh_pubkey,
719 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
720 write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePublicKey);
721 GNUNET_memcpy (write_ptr, enc_ticket_payload, strlen (code_payload_str));
722 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdsa_sign (priv_key,
723 purpose,
724 &ticket->signature));
725 GNUNET_STRINGS_base64_encode (enc_ticket_payload,
726 strlen (code_payload_str),
727 &ticket_payload_str);
728 ticket_sig_str = GNUNET_STRINGS_data_to_string_alloc (&ticket->signature,
729 sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
730
731 dh_key_str = GNUNET_STRINGS_data_to_string_alloc (&ticket->ecdh_pubkey,
732 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
733 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using ECDH pubkey %s to encrypt\n", dh_key_str);
734 GNUNET_asprintf (&ticket_str, "{\"data\": \"%s\", \"ecdh\": \"%s\", \"signature\": \"%s\"}",
735 ticket_payload_str, dh_key_str, ticket_sig_str);
736 GNUNET_STRINGS_base64_encode (ticket_str, strlen (ticket_str), result);
737 GNUNET_free (dh_key_str);
738 GNUNET_free (purpose);
739 GNUNET_free (ticket_str);
740 GNUNET_free (ticket_sig_str);
741 GNUNET_free (code_payload_str);
742 GNUNET_free (enc_ticket_payload);
743 GNUNET_free (ticket_payload_str);
744 return GNUNET_OK;
745}
746
747int
748ticket_payload_parse(const char *raw_data,
749 ssize_t data_len,
750 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
751 const struct GNUNET_CRYPTO_EcdhePublicKey *ecdhe_pkey,
752 struct TokenTicketPayload **result)
753{
754 const char* label_str;
755 const char* nonce_str;
756 const char* identity_key_str;
757
758 json_t *root;
759 json_t *label_json;
760 json_t *identity_json;
761 json_t *nonce_json;
762 json_error_t err_json;
763 char* data_str;
764 uint64_t nonce;
765 struct GNUNET_CRYPTO_EcdsaPublicKey id_pkey;
766
767 if (GNUNET_OK != decrypt_str_ecdhe (priv_key,
768 ecdhe_pkey,
769 raw_data,
770 data_len,
771 &data_str))
772 {
773 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Data decryption failed\n");
774 return GNUNET_SYSERR;
775 }
776
777 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Data: %s\n", data_str);
778 root = json_loads (data_str, JSON_DECODE_ANY, &err_json);
779 if (!root)
780 {
781 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
782 "Error parsing data: %s\n", err_json.text);
783 GNUNET_free (data_str);
784 return GNUNET_SYSERR;
785 }
786
787 identity_json = json_object_get (root, "identity");
788 if (!json_is_string (identity_json))
789 {
790 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
791 "Error parsing data: %s\n", err_json.text);
792 json_decref (root);
793 GNUNET_free (data_str);
794 return GNUNET_SYSERR;
795 }
796 identity_key_str = json_string_value (identity_json);
797 GNUNET_STRINGS_string_to_data (identity_key_str,
798 strlen (identity_key_str),
799 &id_pkey,
800 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
801
802
803 label_json = json_object_get (root, "label");
804 if (!json_is_string (label_json))
805 {
806 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
807 "Error parsing data: %s\n", err_json.text);
808 json_decref (root);
809 GNUNET_free (data_str);
810 return GNUNET_SYSERR;
811 }
812
813 label_str = json_string_value (label_json);
814 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found label: %s\n", label_str);
815
816 nonce_json = json_object_get (root, "nonce");
817 if (!json_is_string (label_json))
818 {
819 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
820 "Error parsing data: %s\n", err_json.text);
821 json_decref (root);
822 GNUNET_free (data_str);
823 return GNUNET_SYSERR;
824 }
825
826 nonce_str = json_string_value (nonce_json);
827 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found nonce: %s\n", nonce_str);
828
829 GNUNET_assert (0 != sscanf (nonce_str, "%"SCNu64, &nonce));
830
831 *result = ticket_payload_create (nonce,
832 (const struct GNUNET_CRYPTO_EcdsaPublicKey*)&id_pkey,
833 label_str);
834 GNUNET_free (data_str);
835 json_decref (root);
836 return GNUNET_OK;
837
838}
839
840int
841ticket_parse (const char *raw_data,
842 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
843 struct TokenTicket **result)
844{
845 const char* enc_data_str;
846 const char* ecdh_enc_str;
847 const char* signature_enc_str;
848
849 json_t *root;
850 json_t *signature_json;
851 json_t *ecdh_json;
852 json_t *enc_data_json;
853 json_error_t err_json;
854 char* enc_data;
855 char* ticket_decoded;
856 char* write_ptr;
857 size_t enc_data_len;
858 struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
859 struct TokenTicket *ticket;
860 struct TokenTicketPayload *ticket_payload;
861
862 ticket_decoded = NULL;
863 GNUNET_STRINGS_base64_decode (raw_data, strlen (raw_data), &ticket_decoded);
864 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ticket: %s\n", ticket_decoded);
865 root = json_loads (ticket_decoded, JSON_DECODE_ANY, &err_json);
866 if (!root)
867 {
868 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
869 "%s\n", err_json.text);
870 return GNUNET_SYSERR;
871 }
872
873 signature_json = json_object_get (root, "signature");
874 ecdh_json = json_object_get (root, "ecdh");
875 enc_data_json = json_object_get (root, "data");
876
877 signature_enc_str = json_string_value (signature_json);
878 ecdh_enc_str = json_string_value (ecdh_json);
879 enc_data_str = json_string_value (enc_data_json);
880
881 ticket = GNUNET_malloc (sizeof (struct TokenTicket));
882
883 if (GNUNET_OK != GNUNET_STRINGS_string_to_data (ecdh_enc_str,
884 strlen (ecdh_enc_str),
885 &ticket->ecdh_pubkey,
886 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)))
887 {
888 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ECDH PKEY %s invalid in data\n", ecdh_enc_str);
889 json_decref (root);
890 GNUNET_free (ticket);
891 return GNUNET_SYSERR;
892 }
893 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using ECDH pubkey %s for data decryption\n", ecdh_enc_str);
894 if (GNUNET_OK != GNUNET_STRINGS_string_to_data (signature_enc_str,
895 strlen (signature_enc_str),
896 &ticket->signature,
897 sizeof (struct GNUNET_CRYPTO_EcdsaSignature)))
898 {
899 json_decref (root);
900 GNUNET_free (ticket_decoded);
901 GNUNET_free (ticket);
902 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ECDH signature invalid in data\n");
903 return GNUNET_SYSERR;
904 }
905
906 enc_data_len = GNUNET_STRINGS_base64_decode (enc_data_str,
907 strlen (enc_data_str),
908 &enc_data);
909
910
911 if (GNUNET_OK != ticket_payload_parse (enc_data,
912 enc_data_len,
913 priv_key,
914 (const struct GNUNET_CRYPTO_EcdhePublicKey*)&ticket->ecdh_pubkey,
915 &ticket_payload))
916 {
917 json_decref (root);
918 GNUNET_free (enc_data);
919 GNUNET_free (ticket_decoded);
920 GNUNET_free (ticket);
921 return GNUNET_SYSERR;
922 }
923
924 ticket->payload = ticket_payload;
925 purpose =
926 GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
927 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) + //E
928 enc_data_len); // E_K (code_str)
929 purpose->size =
930 htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
931 sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
932 enc_data_len);
933 purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET);
934 write_ptr = (char*) &purpose[1];
935 GNUNET_memcpy (write_ptr, &ticket->ecdh_pubkey, sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
936 write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePublicKey);
937 GNUNET_memcpy (write_ptr, enc_data, enc_data_len);
938
939 if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET,
940 purpose,
941 &ticket->signature,
942 &ticket_payload->identity_key))
943 {
944 ticket_destroy (ticket);
945 GNUNET_free (ticket_decoded);
946 json_decref (root);
947 GNUNET_free (purpose);
948 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
949 "Error verifying signature for ticket\n");
950 return GNUNET_SYSERR;
951 }
952 *result = ticket;
953 GNUNET_free (purpose);
954
955 GNUNET_free (enc_data);
956 GNUNET_free (ticket_decoded);
957 json_decref (root);
958 return GNUNET_OK;
959
960}
961
962
963
964/* end of identity_token.c */
diff --git a/src/identity-provider/identity_token.h b/src/identity-provider/identity_token.h
deleted file mode 100644
index 7ded6662e..000000000
--- a/src/identity-provider/identity_token.h
+++ /dev/null
@@ -1,346 +0,0 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20/**
21 * @author Martin Schanzenbach
22 * @file identity-provider/identity_token.h
23 * @brief GNUnet Identity Provider library
24 *
25 */
26#ifndef IDENTITY_TOKEN_H
27#define IDENTITY_TOKEN_H
28
29#include "gnunet_crypto_lib.h"
30#include <jansson.h>
31
32struct IdentityToken
33{
34 /**
35 * DLL
36 */
37 struct TokenAttr *attr_head;
38
39 /**
40 * DLL
41 */
42 struct TokenAttr *attr_tail;
43
44 /**
45 * Token Signature
46 */
47 struct GNUNET_CRYPTO_EcdsaSignature signature;
48
49 /**
50 * Audience Pubkey
51 */
52 struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
53};
54
55struct TokenAttr
56{
57 /**
58 * DLL
59 */
60 struct TokenAttr *next;
61
62 /**
63 * DLL
64 */
65 struct TokenAttr *prev;
66
67 /**
68 * Attribute name
69 */
70 char *name;
71
72 /**
73 * Attribute value DLL
74 */
75 struct TokenAttrValue *val_head;
76
77 /**
78 * Attribute value DLL
79 */
80 struct TokenAttrValue *val_tail;
81
82};
83
84struct TokenAttrValue
85{
86 /**
87 * DLL
88 */
89 struct TokenAttrValue *next;
90
91 /**
92 * DLL
93 */
94 struct TokenAttrValue *prev;
95
96 /**
97 * Attribute value
98 */
99 char *value;
100
101 /**
102 * Attribute int value
103 * used if NULL == value
104 */
105 uint64_t int_value;
106};
107
108struct TokenTicketPayload
109{
110 /**
111 * Nonce
112 */
113 uint64_t nonce;
114
115 /**
116 * Label
117 */
118 char *label;
119
120 /**
121 * Issuing Identity
122 */
123 struct GNUNET_CRYPTO_EcdsaPublicKey identity_key;
124};
125
126
127struct TokenTicket
128{
129 /**
130 * Meta info
131 */
132 struct TokenTicketPayload *payload;
133
134 /**
135 * ECDH Pubkey
136 */
137 struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
138
139 /**
140 * Signature
141 */
142 struct GNUNET_CRYPTO_EcdsaSignature signature;
143
144 /**
145 * Target identity
146 */
147 struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
148};
149
150
151
152/**
153 * Create an identity token
154 *
155 * @param iss the issuer string for the token
156 * @param aud the audience of the token
157 *
158 * @return a new token
159 */
160struct IdentityToken*
161token_create (const struct GNUNET_CRYPTO_EcdsaPublicKey *iss,
162 const struct GNUNET_CRYPTO_EcdsaPublicKey* aud);
163
164/**
165 * Destroy an identity token
166 *
167 * @param token the token to destroy
168 */
169void
170token_destroy (struct IdentityToken*token);
171
172/**
173 * Add a new key value pair to the token
174 *
175 * @param token the token to modify
176 * @param key the key
177 * @param value the value
178 */
179void
180token_add_attr (struct IdentityToken *token,
181 const char* key,
182 const char* value);
183
184/**
185 * Add a new key value pair to the token
186 *
187 * @param token the token to modify
188 * @param key the key
189 * @param value the value
190 */
191void
192token_add_attr_int (struct IdentityToken *token,
193 const char* key,
194 uint64_t value);
195
196
197
198/**
199 * Add a value to a TokenAttribute
200 *
201 * @param attr the token attribute
202 * @param value value to add
203 */
204 void
205 token_attr_add_value (const struct TokenAttr *attr,
206 const char *value);
207
208/**
209 * Add a new key value pair to the token with the value as json
210 *
211 * @param the token to modify
212 * @param key the key
213 * @param value the value
214 *
215 */
216 void
217 token_add_json (const struct IdentityToken *token,
218 const char* key,
219 json_t* value);
220
221/**
222 * Serialize a token. The token will be signed and base64 according to the
223 * JWT format. The signature is base32-encoded ECDSA.
224 * The resulting JWT is encrypted using
225 * ECDHE for the audience and Base64
226 * encoded in result. The audience requires the ECDHE public key P
227 * to decrypt the token T. The key P is included in the result and prepended
228 * before the token
229 *
230 * @param token the token to serialize
231 * @param priv_key the private key used to sign the token
232 * @param ecdhe_privkey the ECDHE private key used to encrypt the token
233 * @param result P,Base64(E(T))
234 *
235 * @return GNUNET_OK on success
236 */
237 int
238 token_serialize (const struct IdentityToken*token,
239 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
240 struct GNUNET_CRYPTO_EcdhePrivateKey **ecdhe_privkey,
241 char **result);
242
243/**
244 * Parses the serialized token and returns a token
245 *
246 * @param data the serialized token
247 * @param priv_key the private key of the audience
248 * @param result the token
249 *
250 * @return GNUNET_OK on success
251 */
252 int
253 token_parse (const char* data,
254 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
255 struct IdentityToken **result);
256
257/**
258 * Parses the serialized token and returns a token
259 * This variant is intended for the party that issued the token and also
260 * wants to decrypt the serialized token.
261 *
262 * @param data the serialized token
263 * @param priv_key the private (!) ECDHE key
264 * @param aud_key the identity of the audience
265 * @param result the token
266 *
267 * @return GNUNET_OK on success
268 */
269int
270token_parse2 (const char* data,
271 const struct GNUNET_CRYPTO_EcdhePrivateKey *priv_key,
272 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
273 struct IdentityToken **result);
274
275
276/**
277 *
278 * Returns a JWT-string representation of the token
279 *
280 * @param token the token
281 * @param priv_key the private key used to sign the JWT
282 * @param result the JWT
283 *
284 * @return GNUNET_OK on success
285 */
286 int
287 token_to_string (const struct IdentityToken *token,
288 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
289 char **result);
290
291/**
292 *
293 * Creates a ticket that can be exchanged by the audience for
294 * the token. The token must be placed under the label
295 *
296 * @param nonce nonce provided by the audience that requested the ticket
297 * @param iss_pkey the issuer pubkey used to sign the ticket
298 * @param label the label encoded in the ticket
299 * @param aud_ley the audience pubkey used to encrypt the ticket payload
300 *
301 * @return the ticket
302 */
303struct TokenTicket*
304ticket_create (uint64_t nonce,
305 const struct GNUNET_CRYPTO_EcdsaPublicKey* iss_pkey,
306 const char* lbl_str,
307 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key);
308
309/**
310 * Serialize a ticket. Returns the Base64 representation of the ticket.
311 * Format: Base64( { payload: E(Payload), ecdhe: K, signature: signature } )
312 *
313 * @param ticket the ticket to serialize
314 * @param priv_key the issuer private key to sign the ticket payload
315 * @param result the serialized ticket
316 *
317 * @return GNUNET_OK on success
318 */
319 int
320 ticket_serialize (struct TokenTicket *ticket,
321 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
322 char **result);
323
324/**
325 * Destroys a ticket
326 *
327 * @param the ticket to destroy
328 */
329void
330ticket_destroy (struct TokenTicket *ticket);
331
332/**
333 * Parses a serialized ticket
334 *
335 * @param data the serialized ticket
336 * @param priv_key the audience private key
337 * @param ticket the ticket
338 *
339 * @return GNUNET_OK on success
340 */
341int
342ticket_parse (const char* raw_data,
343 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
344 struct TokenTicket **ticket);
345
346#endif
diff --git a/src/identity-provider/jwt.c b/src/identity-provider/jwt.c
new file mode 100644
index 000000000..c8bc67806
--- /dev/null
+++ b/src/identity-provider/jwt.c
@@ -0,0 +1,172 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010-2015 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20
21/**
22 * @file identity-provider/jwt.c
23 * @brief helper library for JSON-Web-Tokens
24 * @author Martin Schanzenbach
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28#include "gnunet_signatures.h"
29#include "identity_attribute.h"
30#include <jansson.h>
31
32
33#define JWT_ALG "alg"
34
35/*TODO is this the correct way to define new algs? */
36#define JWT_ALG_VALUE "ED512"
37
38#define JWT_TYP "typ"
39
40#define JWT_TYP_VALUE "jwt"
41
42static char*
43create_jwt_header(void)
44{
45 json_t *root;
46 char *json_str;
47
48 root = json_object ();
49 json_object_set_new (root, JWT_ALG, json_string (JWT_ALG_VALUE));
50 json_object_set_new (root, JWT_TYP, json_string (JWT_TYP_VALUE));
51
52 json_str = json_dumps (root, JSON_INDENT(1));
53 json_decref (root);
54 return json_str;
55}
56
57/**
58 * Create a JWT from a ticket and attributes
59 *
60 * @param ticket the ticket
61 * @param attrs the attribute list
62 * @return a new base64-encoded JWT string.
63 */
64char*
65jwt_create (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
66 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs,
67 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key)
68{
69 struct GNUNET_IDENTITY_PROVIDER_AttributeListEntry *le;
70 struct GNUNET_CRYPTO_EcdsaSignature signature;
71 struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
72 char* audience;
73 char* issuer;
74 char* header;
75 char* padding;
76 char* body_str;
77 char* result;
78 char* header_base64;
79 char* body_base64;
80 char* signature_target;
81 char* signature_base64;
82 json_t* body;
83
84 /* TODO maybe we should use a local identity here */
85 issuer = GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
86 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
87 audience = GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
88 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
89 header = create_jwt_header ();
90 body = json_object ();
91 /* TODO who is the issuer? local IdP or subject ? See self-issued tokens? */
92 json_object_set_new (body,
93 "iss", json_string (issuer));
94 json_object_set_new (body,
95 "sub", json_string (issuer));
96 /* TODO what should be in here exactly? */
97 json_object_set_new (body,
98 "aud", json_string (audience));
99 for (le = attrs->list_head; NULL != le; le = le->next)
100 {
101 /**
102 * TODO here we should have a function that
103 * calls the Attribute plugins to create a
104 * json representation for its value
105 */
106 json_object_set_new (body,
107 le->attribute->name,
108 json_string (le->attribute->data));
109 }
110 body_str = json_dumps (body, JSON_INDENT(0));
111 json_decref (body);
112
113 GNUNET_STRINGS_base64_encode (header,
114 strlen (header),
115 &header_base64);
116 //Remove GNUNET padding of base64
117 padding = strtok(header_base64, "=");
118 while (NULL != padding)
119 padding = strtok(NULL, "=");
120
121 GNUNET_STRINGS_base64_encode (body_str,
122 strlen (body_str),
123 &body_base64);
124
125 //Remove GNUNET padding of base64
126 padding = strtok(body_base64, "=");
127 while (NULL != padding)
128 padding = strtok(NULL, "=");
129
130 GNUNET_free (issuer);
131 GNUNET_free (audience);
132
133 /**
134 * TODO
135 * Creating the JWT signature. This might not be
136 * standards compliant, check.
137 */
138 GNUNET_asprintf (&signature_target, "%s,%s", header_base64, body_base64);
139
140 purpose =
141 GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
142 strlen (signature_target));
143 purpose->size =
144 htonl (strlen (signature_target) + sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
145 purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
146 GNUNET_memcpy (&purpose[1], signature_target, strlen (signature_target));
147 if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_sign (priv_key,
148 purpose,
149 (struct GNUNET_CRYPTO_EcdsaSignature *)&signature))
150 {
151 GNUNET_free (signature_target);
152 GNUNET_free (body_str);
153 GNUNET_free (body_base64);
154 GNUNET_free (header_base64);
155 GNUNET_free (purpose);
156 return NULL;
157 }
158 GNUNET_STRINGS_base64_encode ((const char*)&signature,
159 sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
160 &signature_base64);
161 GNUNET_asprintf (&result, "%s.%s.%s",
162 header_base64, body_base64, signature_base64);
163
164 GNUNET_free (signature_target);
165 GNUNET_free (header);
166 GNUNET_free (body_str);
167 GNUNET_free (signature_base64);
168 GNUNET_free (body_base64);
169 GNUNET_free (header_base64);
170 GNUNET_free (purpose);
171 return result;
172}
diff --git a/src/identity/plugin_gnsrecord_identity.c b/src/identity-provider/plugin_gnsrecord_identity_provider.c
index c26c04074..ad5a95dc7 100644
--- a/src/identity/plugin_gnsrecord_identity.c
+++ b/src/identity-provider/plugin_gnsrecord_identity_provider.c
@@ -54,9 +54,13 @@ value_to_string (void *cls,
54 switch (type) 54 switch (type)
55 { 55 {
56 case GNUNET_GNSRECORD_TYPE_ID_ATTR: 56 case GNUNET_GNSRECORD_TYPE_ID_ATTR:
57 case GNUNET_GNSRECORD_TYPE_ID_TOKEN: 57 return GNUNET_STRINGS_data_to_string_alloc (data, data_size);
58 case GNUNET_GNSRECORD_TYPE_ID_TOKEN: //DEPRECATED
58 return GNUNET_strndup (data, data_size); 59 return GNUNET_strndup (data, data_size);
59 case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA: 60 case GNUNET_GNSRECORD_TYPE_ABE_KEY:
61 case GNUNET_GNSRECORD_TYPE_ABE_MASTER:
62 return GNUNET_STRINGS_data_to_string_alloc (data, data_size);
63 case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA: //DEPRECATED
60 ecdhe_privkey = data; 64 ecdhe_privkey = data;
61 audience_pubkey = data+sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey); 65 audience_pubkey = data+sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey);
62 scopes = (char*) audience_pubkey+(sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)); 66 scopes = (char*) audience_pubkey+(sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
@@ -106,12 +110,22 @@ string_to_value (void *cls,
106 switch (type) 110 switch (type)
107 { 111 {
108 case GNUNET_GNSRECORD_TYPE_ID_ATTR: 112 case GNUNET_GNSRECORD_TYPE_ID_ATTR:
113 return GNUNET_STRINGS_string_to_data (s,
114 strlen (s),
115 *data,
116 *data_size);
109 case GNUNET_GNSRECORD_TYPE_ID_TOKEN: 117 case GNUNET_GNSRECORD_TYPE_ID_TOKEN:
110 *data = GNUNET_strdup (s); 118 *data = GNUNET_strdup (s);
111 *data_size = strlen (s); 119 *data_size = strlen (s);
112 return GNUNET_OK; 120 return GNUNET_OK;
121 case GNUNET_GNSRECORD_TYPE_ABE_KEY:
122 case GNUNET_GNSRECORD_TYPE_ABE_MASTER:
123 return GNUNET_STRINGS_string_to_data (s,
124 strlen (s),
125 *data,
126 *data_size);
113 case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA: 127 case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA:
114 tmp_tok = GNUNET_strdup (s); 128 tmp_tok = GNUNET_strdup (s);
115 ecdhe_str = strtok (tmp_tok, ";"); 129 ecdhe_str = strtok (tmp_tok, ";");
116 if (NULL == ecdhe_str) 130 if (NULL == ecdhe_str)
117 { 131 {
@@ -160,15 +174,17 @@ string_to_value (void *cls,
160 * Mapping of record type numbers to human-readable 174 * Mapping of record type numbers to human-readable
161 * record type names. 175 * record type names.
162 */ 176 */
163 static struct { 177static struct {
164 const char *name; 178 const char *name;
165 uint32_t number; 179 uint32_t number;
166 } name_map[] = { 180} name_map[] = {
167 { "ID_ATTR", GNUNET_GNSRECORD_TYPE_ID_ATTR }, 181 { "ID_ATTR", GNUNET_GNSRECORD_TYPE_ID_ATTR },
168 { "ID_TOKEN", GNUNET_GNSRECORD_TYPE_ID_TOKEN }, 182 { "ID_TOKEN", GNUNET_GNSRECORD_TYPE_ID_TOKEN },
169 { "ID_TOKEN_METADATA", GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA }, 183 { "ABE_KEY", GNUNET_GNSRECORD_TYPE_ABE_KEY },
170 { NULL, UINT32_MAX } 184 { "ABE_MASTER", GNUNET_GNSRECORD_TYPE_ABE_MASTER },
171 }; 185 { "ID_TOKEN_METADATA", GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA },
186 { NULL, UINT32_MAX }
187};
172 188
173 189
174/** 190/**
@@ -220,7 +236,7 @@ number_to_typename (void *cls,
220 * @return the exported block API 236 * @return the exported block API
221 */ 237 */
222void * 238void *
223libgnunet_plugin_gnsrecord_identity_init (void *cls) 239libgnunet_plugin_gnsrecord_identity_provider_init (void *cls)
224{ 240{
225 struct GNUNET_GNSRECORD_PluginFunctions *api; 241 struct GNUNET_GNSRECORD_PluginFunctions *api;
226 242
@@ -240,7 +256,7 @@ libgnunet_plugin_gnsrecord_identity_init (void *cls)
240 * @return NULL 256 * @return NULL
241 */ 257 */
242void * 258void *
243libgnunet_plugin_gnsrecord_identity_done (void *cls) 259libgnunet_plugin_gnsrecord_identity_provider_done (void *cls)
244{ 260{
245 struct GNUNET_GNSRECORD_PluginFunctions *api = cls; 261 struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
246 262
diff --git a/src/identity-provider/plugin_identity_provider_sqlite.c b/src/identity-provider/plugin_identity_provider_sqlite.c
new file mode 100644
index 000000000..594e4788d
--- /dev/null
+++ b/src/identity-provider/plugin_identity_provider_sqlite.c
@@ -0,0 +1,736 @@
1 /*
2 * This file is part of GNUnet
3 * Copyright (C) 2009-2017 GNUnet e.V.
4 *
5 * GNUnet is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published
7 * by the Free Software Foundation; either version 3, or (at your
8 * option) any later version.
9 *
10 * GNUnet is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with GNUnet; see the file COPYING. If not, write to the
17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21/**
22 * @file identity-provider/plugin_identity_provider_sqlite.c
23 * @brief sqlite-based idp backend
24 * @author Martin Schanzenbach
25 */
26
27#include "platform.h"
28#include "gnunet_identity_provider_service.h"
29#include "gnunet_identity_provider_plugin.h"
30#include "gnunet_identity_attribute_lib.h"
31#include "gnunet_sq_lib.h"
32#include <sqlite3.h>
33
34/**
35 * After how many ms "busy" should a DB operation fail for good? A
36 * low value makes sure that we are more responsive to requests
37 * (especially PUTs). A high value guarantees a higher success rate
38 * (SELECTs in iterate can take several seconds despite LIMIT=1).
39 *
40 * The default value of 1s should ensure that users do not experience
41 * huge latencies while at the same time allowing operations to
42 * succeed with reasonable probability.
43 */
44#define BUSY_TIMEOUT_MS 1000
45
46
47/**
48 * Log an error message at log-level 'level' that indicates
49 * a failure of the command 'cmd' on file 'filename'
50 * with the message given by strerror(errno).
51 */
52#define LOG_SQLITE(db, level, cmd) do { GNUNET_log_from (level, "identity-provider", _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, sqlite3_errmsg(db->dbh)); } while(0)
53
54#define LOG(kind,...) GNUNET_log_from (kind, "identity-provider-sqlite", __VA_ARGS__)
55
56
57/**
58 * Context for all functions in this plugin.
59 */
60struct Plugin
61{
62
63 const struct GNUNET_CONFIGURATION_Handle *cfg;
64
65 /**
66 * Database filename.
67 */
68 char *fn;
69
70 /**
71 * Native SQLite database handle.
72 */
73 sqlite3 *dbh;
74
75 /**
76 * Precompiled SQL to store ticket.
77 */
78 sqlite3_stmt *store_ticket;
79
80 /**
81 * Precompiled SQL to delete existing ticket.
82 */
83 sqlite3_stmt *delete_ticket;
84
85 /**
86 * Precompiled SQL to iterate tickets.
87 */
88 sqlite3_stmt *iterate_tickets;
89
90 /**
91 * Precompiled SQL to get ticket attributes.
92 */
93 sqlite3_stmt *get_ticket_attrs;
94
95 /**
96 * Precompiled SQL to iterate tickets by audience.
97 */
98 sqlite3_stmt *iterate_tickets_by_audience;
99};
100
101
102/**
103 * @brief Prepare a SQL statement
104 *
105 * @param dbh handle to the database
106 * @param zSql SQL statement, UTF-8 encoded
107 * @param ppStmt set to the prepared statement
108 * @return 0 on success
109 */
110static int
111sq_prepare (sqlite3 *dbh,
112 const char *zSql,
113 sqlite3_stmt **ppStmt)
114{
115 char *dummy;
116 int result;
117
118 result =
119 sqlite3_prepare_v2 (dbh,
120 zSql,
121 strlen (zSql),
122 ppStmt,
123 (const char **) &dummy);
124 LOG (GNUNET_ERROR_TYPE_DEBUG,
125 "Prepared `%s' / %p: %d\n",
126 zSql,
127 *ppStmt,
128 result);
129 return result;
130}
131
132/**
133 * Create our database indices.
134 *
135 * @param dbh handle to the database
136 */
137static void
138create_indices (sqlite3 * dbh)
139{
140 /* create indices */
141 if ( (SQLITE_OK !=
142 sqlite3_exec (dbh,
143 "CREATE INDEX IF NOT EXISTS identity_reverse ON identity001tickets (identity,audience)",
144 NULL, NULL, NULL)) ||
145 (SQLITE_OK !=
146 sqlite3_exec (dbh,
147 "CREATE INDEX IF NOT EXISTS it_iter ON identity001tickets (rnd)",
148 NULL, NULL, NULL)) )
149 LOG (GNUNET_ERROR_TYPE_ERROR,
150 "Failed to create indices: %s\n",
151 sqlite3_errmsg (dbh));
152}
153
154
155
156#if 0
157#define CHECK(a) GNUNET_break(a)
158#define ENULL NULL
159#else
160#define ENULL &e
161#define ENULL_DEFINED 1
162#define CHECK(a) if (! (a)) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "%s\n", e); sqlite3_free(e); }
163#endif
164
165
166/**
167 * Initialize the database connections and associated
168 * data structures (create tables and indices
169 * as needed as well).
170 *
171 * @param plugin the plugin context (state for this module)
172 * @return #GNUNET_OK on success
173 */
174static int
175database_setup (struct Plugin *plugin)
176{
177 sqlite3_stmt *stmt;
178 char *afsdir;
179#if ENULL_DEFINED
180 char *e;
181#endif
182
183 if (GNUNET_OK !=
184 GNUNET_CONFIGURATION_get_value_filename (plugin->cfg,
185 "identity-provider-sqlite",
186 "FILENAME",
187 &afsdir))
188 {
189 GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
190 "identity-provider-sqlite",
191 "FILENAME");
192 return GNUNET_SYSERR;
193 }
194 if (GNUNET_OK !=
195 GNUNET_DISK_file_test (afsdir))
196 {
197 if (GNUNET_OK !=
198 GNUNET_DISK_directory_create_for_file (afsdir))
199 {
200 GNUNET_break (0);
201 GNUNET_free (afsdir);
202 return GNUNET_SYSERR;
203 }
204 }
205 /* afsdir should be UTF-8-encoded. If it isn't, it's a bug */
206 plugin->fn = afsdir;
207
208 /* Open database and precompile statements */
209 if (sqlite3_open (plugin->fn, &plugin->dbh) != SQLITE_OK)
210 {
211 LOG (GNUNET_ERROR_TYPE_ERROR,
212 _("Unable to initialize SQLite: %s.\n"),
213 sqlite3_errmsg (plugin->dbh));
214 return GNUNET_SYSERR;
215 }
216 CHECK (SQLITE_OK ==
217 sqlite3_exec (plugin->dbh,
218 "PRAGMA temp_store=MEMORY", NULL, NULL,
219 ENULL));
220 CHECK (SQLITE_OK ==
221 sqlite3_exec (plugin->dbh,
222 "PRAGMA synchronous=NORMAL", NULL, NULL,
223 ENULL));
224 CHECK (SQLITE_OK ==
225 sqlite3_exec (plugin->dbh,
226 "PRAGMA legacy_file_format=OFF", NULL, NULL,
227 ENULL));
228 CHECK (SQLITE_OK ==
229 sqlite3_exec (plugin->dbh,
230 "PRAGMA auto_vacuum=INCREMENTAL", NULL,
231 NULL, ENULL));
232 CHECK (SQLITE_OK ==
233 sqlite3_exec (plugin->dbh,
234 "PRAGMA encoding=\"UTF-8\"", NULL,
235 NULL, ENULL));
236 CHECK (SQLITE_OK ==
237 sqlite3_exec (plugin->dbh,
238 "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL,
239 ENULL));
240 CHECK (SQLITE_OK ==
241 sqlite3_exec (plugin->dbh,
242 "PRAGMA page_size=4092", NULL, NULL,
243 ENULL));
244
245 CHECK (SQLITE_OK ==
246 sqlite3_busy_timeout (plugin->dbh,
247 BUSY_TIMEOUT_MS));
248
249
250 /* Create table */
251 CHECK (SQLITE_OK ==
252 sq_prepare (plugin->dbh,
253 "SELECT 1 FROM sqlite_master WHERE tbl_name = 'identity001tickets'",
254 &stmt));
255 if ((sqlite3_step (stmt) == SQLITE_DONE) &&
256 (sqlite3_exec
257 (plugin->dbh,
258 "CREATE TABLE identity001tickets ("
259 " identity BLOB NOT NULL DEFAULT '',"
260 " audience BLOB NOT NULL DEFAULT '',"
261 " rnd INT8 NOT NULL DEFAULT '',"
262 " attributes BLOB NOT NULL DEFAULT ''"
263 ")",
264 NULL, NULL, NULL) != SQLITE_OK))
265 {
266 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR,
267 "sqlite3_exec");
268 sqlite3_finalize (stmt);
269 return GNUNET_SYSERR;
270 }
271 sqlite3_finalize (stmt);
272
273 create_indices (plugin->dbh);
274
275 if ( (SQLITE_OK !=
276 sq_prepare (plugin->dbh,
277 "INSERT INTO identity001tickets (identity, audience, rnd, attributes)"
278 " VALUES (?, ?, ?, ?)",
279 &plugin->store_ticket)) ||
280 (SQLITE_OK !=
281 sq_prepare (plugin->dbh,
282 "DELETE FROM identity001tickets WHERE identity=? AND rnd=?",
283 &plugin->delete_ticket)) ||
284 (SQLITE_OK !=
285 sq_prepare (plugin->dbh,
286 "SELECT identity,audience,rnd,attributes"
287 " FROM identity001tickets WHERE identity=? AND rnd=?",
288 &plugin->get_ticket_attrs)) ||
289 (SQLITE_OK !=
290 sq_prepare (plugin->dbh,
291 "SELECT identity,audience,rnd,attributes"
292 " FROM identity001tickets WHERE identity=?"
293 " ORDER BY rnd LIMIT 1 OFFSET ?",
294 &plugin->iterate_tickets)) ||
295 (SQLITE_OK !=
296 sq_prepare (plugin->dbh,
297 "SELECT identity,audience,rnd,attributes"
298 " FROM identity001tickets WHERE audience=?"
299 " ORDER BY rnd LIMIT 1 OFFSET ?",
300 &plugin->iterate_tickets_by_audience)) )
301 {
302 LOG_SQLITE (plugin,
303 GNUNET_ERROR_TYPE_ERROR,
304 "precompiling");
305 return GNUNET_SYSERR;
306 }
307 return GNUNET_OK;
308}
309
310
311/**
312 * Shutdown database connection and associate data
313 * structures.
314 * @param plugin the plugin context (state for this module)
315 */
316static void
317database_shutdown (struct Plugin *plugin)
318{
319 int result;
320 sqlite3_stmt *stmt;
321
322 if (NULL != plugin->store_ticket)
323 sqlite3_finalize (plugin->store_ticket);
324 if (NULL != plugin->delete_ticket)
325 sqlite3_finalize (plugin->delete_ticket);
326 if (NULL != plugin->iterate_tickets)
327 sqlite3_finalize (plugin->iterate_tickets);
328 if (NULL != plugin->iterate_tickets_by_audience)
329 sqlite3_finalize (plugin->iterate_tickets_by_audience);
330 if (NULL != plugin->get_ticket_attrs)
331 sqlite3_finalize (plugin->get_ticket_attrs);
332 result = sqlite3_close (plugin->dbh);
333 if (result == SQLITE_BUSY)
334 {
335 LOG (GNUNET_ERROR_TYPE_WARNING,
336 _("Tried to close sqlite without finalizing all prepared statements.\n"));
337 stmt = sqlite3_next_stmt (plugin->dbh,
338 NULL);
339 while (NULL != stmt)
340 {
341 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
342 "sqlite",
343 "Closing statement %p\n",
344 stmt);
345 result = sqlite3_finalize (stmt);
346 if (result != SQLITE_OK)
347 GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
348 "sqlite",
349 "Failed to close statement %p: %d\n",
350 stmt,
351 result);
352 stmt = sqlite3_next_stmt (plugin->dbh,
353 NULL);
354 }
355 result = sqlite3_close (plugin->dbh);
356 }
357 if (SQLITE_OK != result)
358 LOG_SQLITE (plugin,
359 GNUNET_ERROR_TYPE_ERROR,
360 "sqlite3_close");
361
362 GNUNET_free_non_null (plugin->fn);
363}
364
365
366/**
367 * Store a ticket in the database.
368 *
369 * @param cls closure (internal context for the plugin)
370 * @param ticket the ticket to persist
371 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
372 */
373static int
374identity_provider_sqlite_store_ticket (void *cls,
375 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
376 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
377{
378 struct Plugin *plugin = cls;
379 size_t attrs_len;
380 char *attrs_ser;
381 int n;
382
383 {
384 /* First delete duplicates */
385 struct GNUNET_SQ_QueryParam dparams[] = {
386 GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
387 GNUNET_SQ_query_param_uint64 (&ticket->rnd),
388 GNUNET_SQ_query_param_end
389 };
390 if (GNUNET_OK !=
391 GNUNET_SQ_bind (plugin->delete_ticket,
392 dparams))
393 {
394 LOG_SQLITE (plugin,
395 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
396 "sqlite3_bind_XXXX");
397 GNUNET_SQ_reset (plugin->dbh,
398 plugin->delete_ticket);
399 return GNUNET_SYSERR;
400 }
401 n = sqlite3_step (plugin->delete_ticket);
402 GNUNET_SQ_reset (plugin->dbh,
403 plugin->delete_ticket);
404
405 attrs_len = GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (attrs);
406 attrs_ser = GNUNET_malloc (attrs_len);
407 GNUNET_IDENTITY_ATTRIBUTE_list_serialize (attrs,
408 attrs_ser);
409 struct GNUNET_SQ_QueryParam sparams[] = {
410 GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
411 GNUNET_SQ_query_param_auto_from_type (&ticket->audience),
412 GNUNET_SQ_query_param_uint64 (&ticket->rnd),
413 GNUNET_SQ_query_param_fixed_size (attrs_ser, attrs_len),
414 GNUNET_SQ_query_param_end
415 };
416
417 if (GNUNET_OK !=
418 GNUNET_SQ_bind (plugin->store_ticket,
419 sparams))
420 {
421 LOG_SQLITE (plugin,
422 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
423 "sqlite3_bind_XXXX");
424 GNUNET_SQ_reset (plugin->dbh,
425 plugin->store_ticket);
426 return GNUNET_SYSERR;
427 }
428 n = sqlite3_step (plugin->store_ticket);
429 GNUNET_SQ_reset (plugin->dbh,
430 plugin->store_ticket);
431 GNUNET_free (attrs_ser);
432 }
433 switch (n)
434 {
435 case SQLITE_DONE:
436 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
437 "sqlite",
438 "Ticket stored\n");
439 return GNUNET_OK;
440 case SQLITE_BUSY:
441 LOG_SQLITE (plugin,
442 GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
443 "sqlite3_step");
444 return GNUNET_NO;
445 default:
446 LOG_SQLITE (plugin,
447 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
448 "sqlite3_step");
449 return GNUNET_SYSERR;
450 }
451}
452
453
454/**
455 * Store a ticket in the database.
456 *
457 * @param cls closure (internal context for the plugin)
458 * @param ticket the ticket to delete
459 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
460 */
461static int
462identity_provider_sqlite_delete_ticket (void *cls,
463 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
464{
465 struct Plugin *plugin = cls;
466 int n;
467
468 {
469 struct GNUNET_SQ_QueryParam sparams[] = {
470 GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
471 GNUNET_SQ_query_param_uint64 (&ticket->rnd),
472 GNUNET_SQ_query_param_end
473 };
474
475 if (GNUNET_OK !=
476 GNUNET_SQ_bind (plugin->delete_ticket,
477 sparams))
478 {
479 LOG_SQLITE (plugin,
480 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
481 "sqlite3_bind_XXXX");
482 GNUNET_SQ_reset (plugin->dbh,
483 plugin->store_ticket);
484 return GNUNET_SYSERR;
485 }
486 n = sqlite3_step (plugin->delete_ticket);
487 GNUNET_SQ_reset (plugin->dbh,
488 plugin->delete_ticket);
489 }
490 switch (n)
491 {
492 case SQLITE_DONE:
493 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
494 "sqlite",
495 "Ticket deleted\n");
496 return GNUNET_OK;
497 case SQLITE_BUSY:
498 LOG_SQLITE (plugin,
499 GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
500 "sqlite3_step");
501 return GNUNET_NO;
502 default:
503 LOG_SQLITE (plugin,
504 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
505 "sqlite3_step");
506 return GNUNET_SYSERR;
507 }
508}
509
510
511/**
512 * The given 'sqlite' statement has been prepared to be run.
513 * It will return a record which should be given to the iterator.
514 * Runs the statement and parses the returned record.
515 *
516 * @param plugin plugin context
517 * @param stmt to run (and then clean up)
518 * @param iter iterator to call with the result
519 * @param iter_cls closure for @a iter
520 * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
521 */
522static int
523get_ticket_and_call_iterator (struct Plugin *plugin,
524 sqlite3_stmt *stmt,
525 GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
526 void *iter_cls)
527{
528 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
529 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
530 int ret;
531 int sret;
532 size_t attrs_len;
533 char *attrs_ser;
534
535 ret = GNUNET_NO;
536 if (SQLITE_ROW == (sret = sqlite3_step (stmt)))
537 {
538 struct GNUNET_SQ_ResultSpec rs[] = {
539 GNUNET_SQ_result_spec_auto_from_type (&ticket.identity),
540 GNUNET_SQ_result_spec_auto_from_type (&ticket.audience),
541 GNUNET_SQ_result_spec_uint64 (&ticket.rnd),
542 GNUNET_SQ_result_spec_variable_size ((void**)&attrs_ser,
543 &attrs_len),
544 GNUNET_SQ_result_spec_end
545
546 };
547 ret = GNUNET_SQ_extract_result (stmt,
548 rs);
549 if (GNUNET_OK != ret)
550 {
551 GNUNET_break (0);
552 ret = GNUNET_SYSERR;
553 }
554 else
555 {
556 attrs = GNUNET_IDENTITY_ATTRIBUTE_list_deserialize (attrs_ser,
557 attrs_len);
558 if (NULL != iter)
559 iter (iter_cls,
560 &ticket,
561 attrs);
562 GNUNET_IDENTITY_ATTRIBUTE_list_destroy (attrs);
563 ret = GNUNET_YES;
564 }
565 GNUNET_SQ_cleanup_result (rs);
566 }
567 else
568 {
569 if (SQLITE_DONE != sret)
570 LOG_SQLITE (plugin,
571 GNUNET_ERROR_TYPE_ERROR,
572 "sqlite_step");
573 }
574 GNUNET_SQ_reset (plugin->dbh,
575 stmt);
576 return ret;
577}
578
579
580/**
581 * Lookup tickets in the datastore.
582 *
583 * @param cls closure (internal context for the plugin)
584 * @param zone private key of the zone
585 * @param label name of the record in the zone
586 * @param iter function to call with the result
587 * @param iter_cls closure for @a iter
588 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
589 */
590static int
591identity_provider_sqlite_ticket_get_attrs (void *cls,
592 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
593 GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
594 void *iter_cls)
595{
596 struct Plugin *plugin = cls;
597 struct GNUNET_SQ_QueryParam params[] = {
598 GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
599 GNUNET_SQ_query_param_uint64 (&ticket->rnd),
600 GNUNET_SQ_query_param_end
601 };
602
603 if (GNUNET_OK !=
604 GNUNET_SQ_bind (plugin->get_ticket_attrs,
605 params))
606 {
607 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
608 "sqlite3_bind_XXXX");
609 GNUNET_SQ_reset (plugin->dbh,
610 plugin->get_ticket_attrs);
611 return GNUNET_SYSERR;
612 }
613 return get_ticket_and_call_iterator (plugin,
614 plugin->get_ticket_attrs,
615 iter,
616 iter_cls);
617}
618
619
620/**
621 * Iterate over the results for a particular key and zone in the
622 * datastore. Will return at most one result to the iterator.
623 *
624 * @param cls closure (internal context for the plugin)
625 * @param identity the issuing identity or audience (depending on audience switch)
626 * @param audience GNUNET_YES if identity is audience
627 * @param offset offset in the list of all matching records
628 * @param iter function to call with the result
629 * @param iter_cls closure for @a iter
630 * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
631 */
632static int
633identity_provider_sqlite_iterate_tickets (void *cls,
634 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
635 int audience,
636 uint64_t offset,
637 GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
638 void *iter_cls)
639{
640 struct Plugin *plugin = cls;
641 sqlite3_stmt *stmt;
642 int err;
643
644 if (NULL == identity)
645 {
646 GNUNET_break (0);
647 return GNUNET_SYSERR;
648 }
649 struct GNUNET_SQ_QueryParam params[] = {
650 GNUNET_SQ_query_param_auto_from_type (identity),
651 GNUNET_SQ_query_param_uint64 (&offset),
652 GNUNET_SQ_query_param_end
653 };
654 if (GNUNET_YES == audience)
655 {
656 stmt = plugin->iterate_tickets_by_audience;
657 err = GNUNET_SQ_bind (stmt,
658 params);
659 }
660 else
661 {
662 stmt = plugin->iterate_tickets;
663 err = GNUNET_SQ_bind (stmt,
664 params);
665 }
666 if (GNUNET_OK != err)
667 {
668 LOG_SQLITE (plugin,
669 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
670 "sqlite3_bind_XXXX");
671 GNUNET_SQ_reset (plugin->dbh,
672 stmt);
673 return GNUNET_SYSERR;
674 }
675 return get_ticket_and_call_iterator (plugin,
676 stmt,
677 iter,
678 iter_cls);
679}
680
681
682/**
683 * Entry point for the plugin.
684 *
685 * @param cls the "struct GNUNET_IDENTITY_PROVIDER_PluginEnvironment*"
686 * @return NULL on error, otherwise the plugin context
687 */
688void *
689libgnunet_plugin_identity_provider_sqlite_init (void *cls)
690{
691 static struct Plugin plugin;
692 const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
693 struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *api;
694
695 if (NULL != plugin.cfg)
696 return NULL; /* can only initialize once! */
697 memset (&plugin, 0, sizeof (struct Plugin));
698 plugin.cfg = cfg;
699 if (GNUNET_OK != database_setup (&plugin))
700 {
701 database_shutdown (&plugin);
702 return NULL;
703 }
704 api = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_PluginFunctions);
705 api->cls = &plugin;
706 api->store_ticket = &identity_provider_sqlite_store_ticket;
707 api->delete_ticket = &identity_provider_sqlite_delete_ticket;
708 api->iterate_tickets = &identity_provider_sqlite_iterate_tickets;
709 api->get_ticket_attributes = &identity_provider_sqlite_ticket_get_attrs;
710 LOG (GNUNET_ERROR_TYPE_INFO,
711 _("Sqlite database running\n"));
712 return api;
713}
714
715
716/**
717 * Exit point from the plugin.
718 *
719 * @param cls the plugin context (as returned by "init")
720 * @return always NULL
721 */
722void *
723libgnunet_plugin_identity_provider_sqlite_done (void *cls)
724{
725 struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *api = cls;
726 struct Plugin *plugin = api->cls;
727
728 database_shutdown (plugin);
729 plugin->cfg = NULL;
730 GNUNET_free (api);
731 LOG (GNUNET_ERROR_TYPE_DEBUG,
732 "sqlite plugin is finished\n");
733 return NULL;
734}
735
736/* end of plugin_identity_provider_sqlite.c */
diff --git a/src/identity-provider/plugin_rest_identity_provider.c b/src/identity-provider/plugin_rest_identity_provider.c
index 907b28ba9..c27662a0d 100644
--- a/src/identity-provider/plugin_rest_identity_provider.c
+++ b/src/identity-provider/plugin_rest_identity_provider.c
@@ -37,6 +37,7 @@
37#include <jansson.h> 37#include <jansson.h>
38#include <inttypes.h> 38#include <inttypes.h>
39#include "gnunet_signatures.h" 39#include "gnunet_signatures.h"
40#include "gnunet_identity_attribute_lib.h"
40#include "gnunet_identity_provider_service.h" 41#include "gnunet_identity_provider_service.h"
41 42
42/** 43/**
@@ -45,39 +46,40 @@
45#define GNUNET_REST_API_NS_IDENTITY_PROVIDER "/idp" 46#define GNUNET_REST_API_NS_IDENTITY_PROVIDER "/idp"
46 47
47/** 48/**
48 * Issue namespace 49 * Attribute namespace
49 */ 50 */
50#define GNUNET_REST_API_NS_IDENTITY_TOKEN_ISSUE "/idp/issue" 51#define GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES "/idp/attributes"
51 52
52/** 53/**
53 * Check namespace TODO 54 * Ticket namespace
54 */ 55 */
55#define GNUNET_REST_API_NS_IDENTITY_TOKEN_CHECK "/idp/check" 56#define GNUNET_REST_API_NS_IDENTITY_TICKETS "/idp/tickets"
56 57
57/** 58/**
58 * Token namespace 59 * Revoke namespace
59 */ 60 */
60#define GNUNET_REST_API_NS_IDENTITY_OAUTH2_TOKEN "/idp/token" 61#define GNUNET_REST_API_NS_IDENTITY_REVOKE "/idp/revoke"
61 62
62/** 63/**
63 * The parameter name in which the ticket must be provided 64 * Revoke namespace
64 */ 65 */
65#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET "ticket" 66#define GNUNET_REST_API_NS_IDENTITY_CONSUME "/idp/consume"
66 67
67/** 68/**
68 * The parameter name in which the expected nonce must be provided 69 * Attribute key
69 */ 70 */
70#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_EXPECTED_NONCE "expected_nonce" 71#define GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE "attribute"
71 72
72/** 73/**
73 * The parameter name in which the ticket must be provided 74 * Ticket key
74 */ 75 */
75#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TOKEN "token" 76#define GNUNET_REST_JSONAPI_IDENTITY_TICKET "ticket"
77
76 78
77/** 79/**
78 * The URL parameter name in which the nonce must be provided 80 * Value key
79 */ 81 */
80#define GNUNET_IDENTITY_TOKEN_REQUEST_NONCE "nonce" 82#define GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE_VALUE "value"
81 83
82/** 84/**
83 * State while collecting all egos 85 * State while collecting all egos
@@ -89,41 +91,6 @@
89 */ 91 */
90#define ID_REST_STATE_POST_INIT 1 92#define ID_REST_STATE_POST_INIT 1
91 93
92/**
93 * Resource type
94 */
95#define GNUNET_REST_JSONAPI_IDENTITY_TOKEN "token"
96
97/**
98 * URL parameter to create a GNUid token for a specific audience
99 */
100#define GNUNET_REST_JSONAPI_IDENTITY_AUD_REQUEST "audience"
101
102/**
103 * URL parameter to create a GNUid token for a specific issuer (EGO)
104 */
105#define GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST "issuer"
106
107/**
108 * Attributes passed to issue request
109 */
110#define GNUNET_IDENTITY_TOKEN_ATTR_LIST "requested_attrs"
111
112/**
113 * Token expiration string
114 */
115#define GNUNET_IDENTITY_TOKEN_EXP_STRING "expiration"
116
117/**
118 * Error messages
119 */
120#define GNUNET_REST_ERROR_RESOURCE_INVALID "Resource location invalid"
121#define GNUNET_REST_ERROR_NO_DATA "No data"
122
123/**
124 * GNUid token lifetime
125 */
126#define GNUNET_GNUID_TOKEN_EXPIRATION_MICROSECONDS 300000000
127 94
128/** 95/**
129 * The configuration handle 96 * The configuration handle
@@ -198,11 +165,6 @@ struct RequestHandle
198 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key; 165 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
199 166
200 /** 167 /**
201 * Handle to the rest connection
202 */
203 struct GNUNET_REST_RequestHandle *conndata_handle;
204
205 /**
206 * The processing state 168 * The processing state
207 */ 169 */
208 int state; 170 int state;
@@ -213,6 +175,12 @@ struct RequestHandle
213 struct GNUNET_IDENTITY_Handle *identity_handle; 175 struct GNUNET_IDENTITY_Handle *identity_handle;
214 176
215 /** 177 /**
178 * Rest connection
179 */
180 struct GNUNET_REST_RequestHandle *rest_handle;
181
182
183 /**
216 * IDENTITY Operation 184 * IDENTITY Operation
217 */ 185 */
218 struct GNUNET_IDENTITY_Operation *op; 186 struct GNUNET_IDENTITY_Operation *op;
@@ -228,19 +196,14 @@ struct RequestHandle
228 struct GNUNET_IDENTITY_PROVIDER_Operation *idp_op; 196 struct GNUNET_IDENTITY_PROVIDER_Operation *idp_op;
229 197
230 /** 198 /**
231 * Handle to NS service 199 * Attribute iterator
232 */ 200 */
233 struct GNUNET_NAMESTORE_Handle *ns_handle; 201 struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *attr_it;
234 202
235 /** 203 /**
236 * NS iterator 204 * Ticket iterator
237 */ 205 */
238 struct GNUNET_NAMESTORE_ZoneIterator *ns_it; 206 struct GNUNET_IDENTITY_PROVIDER_TicketIterator *ticket_it;
239
240 /**
241 * NS Handle
242 */
243 struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
244 207
245 /** 208 /**
246 * Desired timeout for the lookup (default is no timeout). 209 * Desired timeout for the lookup (default is no timeout).
@@ -285,6 +248,7 @@ struct RequestHandle
285}; 248};
286 249
287 250
251
288/** 252/**
289 * Cleanup lookup handle 253 * Cleanup lookup handle
290 * @param handle Handle to clean up 254 * @param handle Handle to clean up
@@ -302,14 +266,12 @@ cleanup_handle (struct RequestHandle *handle)
302 GNUNET_SCHEDULER_cancel (handle->timeout_task); 266 GNUNET_SCHEDULER_cancel (handle->timeout_task);
303 if (NULL != handle->identity_handle) 267 if (NULL != handle->identity_handle)
304 GNUNET_IDENTITY_disconnect (handle->identity_handle); 268 GNUNET_IDENTITY_disconnect (handle->identity_handle);
269 if (NULL != handle->attr_it)
270 GNUNET_IDENTITY_PROVIDER_get_attributes_stop (handle->attr_it);
271 if (NULL != handle->ticket_it)
272 GNUNET_IDENTITY_PROVIDER_ticket_iteration_stop (handle->ticket_it);
305 if (NULL != handle->idp) 273 if (NULL != handle->idp)
306 GNUNET_IDENTITY_PROVIDER_disconnect (handle->idp); 274 GNUNET_IDENTITY_PROVIDER_disconnect (handle->idp);
307 if (NULL != handle->ns_it)
308 GNUNET_NAMESTORE_zone_iteration_stop (handle->ns_it);
309 if (NULL != handle->ns_qe)
310 GNUNET_NAMESTORE_cancel (handle->ns_qe);
311 if (NULL != handle->ns_handle)
312 GNUNET_NAMESTORE_disconnect (handle->ns_handle);
313 if (NULL != handle->url) 275 if (NULL != handle->url)
314 GNUNET_free (handle->url); 276 GNUNET_free (handle->url);
315 if (NULL != handle->emsg) 277 if (NULL != handle->emsg)
@@ -326,6 +288,12 @@ cleanup_handle (struct RequestHandle *handle)
326 GNUNET_free (handle); 288 GNUNET_free (handle);
327} 289}
328 290
291static void
292cleanup_handle_delayed (void *cls)
293{
294 cleanup_handle (cls);
295}
296
329 297
330/** 298/**
331 * Task run on error, sends error message. Cleans up everything. 299 * Task run on error, sends error message. Cleans up everything.
@@ -363,622 +331,663 @@ do_timeout (void *cls)
363} 331}
364 332
365 333
366/**
367 * Task run on shutdown. Cleans up everything.
368 *
369 * @param cls unused
370 */
371static void 334static void
372do_cleanup_handle_delayed (void *cls) 335collect_error_cb (void *cls)
373{ 336{
374 struct RequestHandle *handle = cls; 337 struct RequestHandle *handle = cls;
375 338
376 cleanup_handle (handle); 339 do_error (handle);
377} 340}
378 341
379
380/**
381 * Get a ticket for identity
382 * @param cls the handle
383 * @param ticket the ticket returned from the idp
384 */
385static void 342static void
386token_creat_cont (void *cls, 343finished_cont (void *cls,
387 const char *label, 344 int32_t success,
388 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket, 345 const char *emsg)
389 const struct GNUNET_IDENTITY_PROVIDER_Token *token)
390{ 346{
391 struct GNUNET_JSONAPI_Resource *json_resource;
392 struct RequestHandle *handle = cls; 347 struct RequestHandle *handle = cls;
393 struct MHD_Response *resp; 348 struct MHD_Response *resp;
394 json_t *ticket_json;
395 json_t *token_json;
396 char *ticket_str;
397 char *token_str;
398 char *result_str;
399 349
400 if (NULL == ticket) 350 resp = GNUNET_REST_create_response (emsg);
351 if (GNUNET_OK != success)
401 { 352 {
402 handle->emsg = GNUNET_strdup ("Error in token issue");
403 GNUNET_SCHEDULER_add_now (&do_error, handle); 353 GNUNET_SCHEDULER_add_now (&do_error, handle);
404 return; 354 return;
405 } 355 }
356 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
357 GNUNET_SCHEDULER_add_now (&cleanup_handle_delayed, handle);
358}
406 359
407 handle->resp_object = GNUNET_JSONAPI_document_new (); 360
408 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET, 361/**
409 label); 362 * Return attributes for identity
410 ticket_str = GNUNET_IDENTITY_PROVIDER_ticket_to_string (ticket); 363 *
411 token_str = GNUNET_IDENTITY_PROVIDER_token_to_string (token); 364 * @param cls the request handle
412 ticket_json = json_string (ticket_str); 365 */
413 token_json = json_string (token_str); 366static void
414 GNUNET_JSONAPI_resource_add_attr (json_resource, 367return_response (void *cls)
415 GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET, 368{
416 ticket_json); 369 char* result_str;
417 GNUNET_JSONAPI_resource_add_attr (json_resource, 370 struct RequestHandle *handle = cls;
418 GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TOKEN, 371 struct MHD_Response *resp;
419 token_json);
420 GNUNET_free (ticket_str);
421 GNUNET_free (token_str);
422 json_decref (ticket_json);
423 json_decref (token_json);
424 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
425 372
426 GNUNET_JSONAPI_document_serialize (handle->resp_object, &result_str); 373 GNUNET_JSONAPI_document_serialize (handle->resp_object, &result_str);
427 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str); 374 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
428 resp = GNUNET_REST_create_response (result_str); 375 resp = GNUNET_REST_create_response (result_str);
429 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK); 376 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
430 GNUNET_free (result_str); 377 GNUNET_free (result_str);
431 GNUNET_SCHEDULER_add_now (&do_cleanup_handle_delayed, handle); 378 cleanup_handle (handle);
379}
380
381
382static void
383collect_finished_cb (void *cls)
384{
385 struct RequestHandle *handle = cls;
386 //Done
387 handle->attr_it = NULL;
388 handle->ticket_it = NULL;
389 GNUNET_SCHEDULER_add_now (&return_response, handle);
432} 390}
433 391
434 392
435/** 393/**
436 * Continueationf for token issue request 394 * Collect all attributes for an ego
437 * 395 *
438 * @param con the Rest handle
439 * @param url the requested url
440 * @param cls the request handle
441 */ 396 */
442static void 397static void
443issue_token_cont (struct GNUNET_REST_RequestHandle *con, 398ticket_collect (void *cls,
444 const char *url, 399 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
445 void *cls)
446{ 400{
447 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key; 401 struct GNUNET_JSONAPI_Resource *json_resource;
448 const char *egoname; 402 struct RequestHandle *handle = cls;
403 json_t *value;
404 char* tmp;
405
406 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding ticket\n");
407 tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
408 sizeof (uint64_t));
409 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_TICKET,
410 tmp);
411 GNUNET_free (tmp);
412 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
413
414 tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
415 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
416 value = json_string (tmp);
417 GNUNET_JSONAPI_resource_add_attr (json_resource,
418 "issuer",
419 value);
420 GNUNET_free (tmp);
421 json_decref (value);
422 tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
423 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
424 value = json_string (tmp);
425 GNUNET_JSONAPI_resource_add_attr (json_resource,
426 "audience",
427 value);
428 GNUNET_free (tmp);
429 json_decref (value);
430 tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
431 sizeof (uint64_t));
432 value = json_string (tmp);
433 GNUNET_JSONAPI_resource_add_attr (json_resource,
434 "rnd",
435 value);
436 GNUNET_free (tmp);
437 json_decref (value);
438 GNUNET_IDENTITY_PROVIDER_ticket_iteration_next (handle->ticket_it);
439}
449 440
441
442
443/**
444 * List tickets for identity request
445 *
446 * @param con_handle the connection handle
447 * @param url the url
448 * @param cls the RequestHandle
449 */
450static void
451list_tickets_cont (struct GNUNET_REST_RequestHandle *con_handle,
452 const char* url,
453 void *cls)
454{
455 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
450 struct RequestHandle *handle = cls; 456 struct RequestHandle *handle = cls;
451 struct EgoEntry *ego_entry; 457 struct EgoEntry *ego_entry;
452 struct GNUNET_HashCode key; 458 char *identity;
453 struct MHD_Response *resp; 459
454 struct GNUNET_CRYPTO_EcdsaPublicKey pub_key; 460 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting tickets for %s.\n",
455 struct GNUNET_CRYPTO_EcdsaPublicKey aud_key; 461 handle->url);
456 struct GNUNET_TIME_Relative etime_rel; 462 if ( strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) >=
457 struct GNUNET_TIME_Absolute exp_time; 463 strlen (handle->url))
458 char *ego_val;
459 char *audience;
460 char *exp_str;
461 char *nonce_str;
462 char *scopes;
463 uint64_t time;
464 uint64_t nonce;
465
466 if (GNUNET_NO == GNUNET_REST_namespace_match (handle->url,
467 GNUNET_REST_API_NS_IDENTITY_TOKEN_ISSUE))
468 {
469 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "URL invalid: %s\n", handle->url);
470 resp = GNUNET_REST_create_response (NULL);
471 handle->proc (handle->proc_cls, resp, MHD_HTTP_BAD_REQUEST);
472 cleanup_handle (handle);
473 return;
474 }
475 egoname = NULL;
476 ego_entry = NULL;
477 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
478 strlen (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST),
479 &key);
480 if ( GNUNET_YES !=
481 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
482 &key) )
483 {
484 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
485 "Issuer not found\n");
486 GNUNET_SCHEDULER_add_now (&do_error, handle);
487 return;
488 }
489 ego_val = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
490 &key);
491 if (NULL == ego_val)
492 { 464 {
465 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
493 GNUNET_SCHEDULER_add_now (&do_error, handle); 466 GNUNET_SCHEDULER_add_now (&do_error, handle);
494 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
495 "Ego invalid: %s\n",
496 ego_val);
497 return; 467 return;
498 } 468 }
469 identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) + 1;
470
499 for (ego_entry = handle->ego_head; 471 for (ego_entry = handle->ego_head;
500 NULL != ego_entry; 472 NULL != ego_entry;
501 ego_entry = ego_entry->next) 473 ego_entry = ego_entry->next)
474 if (0 == strcmp (identity, ego_entry->identifier))
475 break;
476 handle->resp_object = GNUNET_JSONAPI_document_new ();
477
478 if (NULL == ego_entry)
502 { 479 {
503 if (0 != strcmp (ego_val, ego_entry->identifier)) 480 //Done
504 continue; 481 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n",
505 egoname = ego_entry->identifier; 482 identity);
506 break; 483 GNUNET_SCHEDULER_add_now (&return_response, handle);
507 }
508 if ( (NULL == egoname) ||
509 (NULL == ego_entry) )
510 {
511 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
512 "Ego not found: %s\n",
513 ego_val);
514 GNUNET_SCHEDULER_add_now (&do_error, handle);
515 return; 484 return;
516 } 485 }
517 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 486 priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
518 "Ego to issue token for: %s\n", 487 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
519 egoname); 488 handle->ticket_it = GNUNET_IDENTITY_PROVIDER_ticket_iteration_start (handle->idp,
489 priv_key,
490 &collect_error_cb,
491 handle,
492 &ticket_collect,
493 handle,
494 &collect_finished_cb,
495 handle);
496}
497
520 498
499static void
500add_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
501 const char* url,
502 void *cls)
503{
504 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
505 const char* identity;
506 const char* name_str;
507 const char* value_str;
521 508
522 //Meta info 509 struct RequestHandle *handle = cls;
523 GNUNET_CRYPTO_hash (GNUNET_IDENTITY_TOKEN_ATTR_LIST, 510 struct EgoEntry *ego_entry;
524 strlen (GNUNET_IDENTITY_TOKEN_ATTR_LIST), 511 struct MHD_Response *resp;
525 &key); 512 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attribute;
513 struct GNUNET_JSONAPI_Document *json_obj;
514 struct GNUNET_JSONAPI_Resource *json_res;
515 char term_data[handle->rest_handle->data_size+1];
516 json_t *value_json;
517 json_t *data_json;
518 json_error_t err;
519 struct GNUNET_JSON_Specification docspec[] = {
520 GNUNET_JSON_spec_jsonapi_document (&json_obj),
521 GNUNET_JSON_spec_end()
522 };
526 523
527 scopes = NULL; 524 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding an attribute for %s.\n",
528 if ( GNUNET_YES != 525 handle->url);
529 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map, 526 if ( strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) >=
530 &key) ) 527 strlen (handle->url))
531 { 528 {
532 handle->emsg = GNUNET_strdup ("Scopes missing!\n"); 529 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
533 GNUNET_SCHEDULER_add_now (&do_error, handle); 530 GNUNET_SCHEDULER_add_now (&do_error, handle);
534 return; 531 return;
535 } 532 }
536 scopes = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map, 533 identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) + 1;
537 &key); 534
538 535 for (ego_entry = handle->ego_head;
539 536 NULL != ego_entry;
540 //Token audience 537 ego_entry = ego_entry->next)
541 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_AUD_REQUEST, 538 if (0 == strcmp (identity, ego_entry->identifier))
542 strlen (GNUNET_REST_JSONAPI_IDENTITY_AUD_REQUEST), 539 break;
543 &key); 540
544 audience = NULL; 541 if (NULL == ego_entry)
545 if ( GNUNET_YES !=
546 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
547 &key) )
548 { 542 {
549 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 543 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
550 "Audience missing!\n"); 544 "Identity unknown (%s)\n", identity);
551 GNUNET_SCHEDULER_add_now (&do_error, handle); 545 GNUNET_JSONAPI_document_delete (json_obj);
552 return; 546 return;
553 } 547 }
554 audience = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map, 548 identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
555 &key);
556 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
557 "Audience to issue token for: %s\n",
558 audience);
559 549
560 priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego); 550 if (0 >= handle->rest_handle->data_size)
561 GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
562 &pub_key);
563 GNUNET_STRINGS_string_to_data (audience,
564 strlen (audience),
565 &aud_key,
566 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
567
568 //Remote nonce
569 nonce_str = NULL;
570 GNUNET_CRYPTO_hash (GNUNET_IDENTITY_TOKEN_REQUEST_NONCE,
571 strlen (GNUNET_IDENTITY_TOKEN_REQUEST_NONCE),
572 &key);
573 if ( GNUNET_YES !=
574 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
575 &key) )
576 { 551 {
577 handle->emsg = GNUNET_strdup ("Request nonce missing!\n");
578 GNUNET_SCHEDULER_add_now (&do_error, handle); 552 GNUNET_SCHEDULER_add_now (&do_error, handle);
579 return; 553 return;
580 } 554 }
581 nonce_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map, 555
582 &key); 556 term_data[handle->rest_handle->data_size] = '\0';
583 GNUNET_assert (NULL != nonce_str); 557 GNUNET_memcpy (term_data,
584 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 558 handle->rest_handle->data,
585 "Request nonce: %s\n", 559 handle->rest_handle->data_size);
586 nonce_str); 560 data_json = json_loads (term_data,
587 GNUNET_assert (1 == sscanf (nonce_str, "%"SCNu64, &nonce)); 561 JSON_DECODE_ANY,
588 562 &err);
589 //Get expiration for token from URL parameter 563 GNUNET_assert (GNUNET_OK ==
590 GNUNET_CRYPTO_hash (GNUNET_IDENTITY_TOKEN_EXP_STRING, 564 GNUNET_JSON_parse (data_json, docspec,
591 strlen (GNUNET_IDENTITY_TOKEN_EXP_STRING), 565 NULL, NULL));
592 &key); 566 json_decref (data_json);
593 567 if (NULL == json_obj)
594 exp_str = NULL;
595 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
596 &key))
597 { 568 {
598 exp_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map, 569 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
599 &key); 570 "Unable to parse JSONAPI Object from %s\n",
600 } 571 term_data);
601 if (NULL == exp_str) {
602 handle->emsg = GNUNET_strdup ("No expiration given!\n");
603 GNUNET_SCHEDULER_add_now (&do_error, handle); 572 GNUNET_SCHEDULER_add_now (&do_error, handle);
604 return; 573 return;
605 } 574 }
606 575 if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
607 if (GNUNET_OK !=
608 GNUNET_STRINGS_fancy_time_to_relative (exp_str,
609 &etime_rel))
610 { 576 {
611 handle->emsg = GNUNET_strdup ("Expiration invalid!\n"); 577 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
578 "Cannot create more than 1 resource! (Got %d)\n",
579 GNUNET_JSONAPI_document_resource_count (json_obj));
580 GNUNET_JSONAPI_document_delete (json_obj);
612 GNUNET_SCHEDULER_add_now (&do_error, handle); 581 GNUNET_SCHEDULER_add_now (&do_error, handle);
613 return; 582 return;
614 } 583 }
615 time = GNUNET_TIME_absolute_get().abs_value_us; 584 json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
616 exp_time.abs_value_us = time + etime_rel.rel_value_us; 585 if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
617 586 GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE))
587 {
588 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
589 "Unsupported JSON data type\n");
590 GNUNET_JSONAPI_document_delete (json_obj);
591 resp = GNUNET_REST_create_response (NULL);
592 handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
593 cleanup_handle (handle);
594 return;
595 }
596 name_str = GNUNET_JSONAPI_resource_get_id (json_res);
597 value_json = GNUNET_JSONAPI_resource_read_attr (json_res,
598 "value");
599 value_str = json_string_value (value_json);
600 attribute = GNUNET_IDENTITY_ATTRIBUTE_claim_new (name_str,
601 GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING,
602 value_str,
603 strlen (value_str) + 1);
618 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg); 604 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
619 handle->idp_op = GNUNET_IDENTITY_PROVIDER_issue_token (handle->idp, 605 handle->idp_op = GNUNET_IDENTITY_PROVIDER_attribute_store (handle->idp,
620 priv_key, 606 identity_priv,
621 &aud_key, 607 attribute,
622 scopes, 608 &finished_cont,
623 exp_time, 609 handle);
624 nonce, 610 GNUNET_free (attribute);
625 &token_creat_cont, 611 GNUNET_JSONAPI_document_delete (json_obj);
626 handle);
627
628}
629
630
631/**
632 * Build a GNUid token for identity
633 *
634 * @param cls the request handle
635 */
636static void
637return_token_list (void *cls)
638{
639 char* result_str;
640 struct RequestHandle *handle = cls;
641 struct MHD_Response *resp;
642
643 GNUNET_JSONAPI_document_serialize (handle->resp_object, &result_str);
644 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
645 resp = GNUNET_REST_create_response (result_str);
646 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
647 GNUNET_free (result_str);
648 cleanup_handle (handle);
649} 612}
650 613
651 614
652static void
653token_collect_error_cb (void *cls)
654{
655 struct RequestHandle *handle = cls;
656
657 do_error (handle);
658}
659
660 615
661/** 616/**
662 * Collect all tokens for an ego 617 * Collect all attributes for an ego
663 *
664 * TODO move this into the identity-provider service
665 * 618 *
666 */ 619 */
667static void 620static void
668token_collect (void *cls, 621attr_collect (void *cls,
669 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, 622 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
670 const char *label, 623 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
671 unsigned int rd_count,
672 const struct GNUNET_GNSRECORD_Data *rd);
673
674
675static void
676token_collect_finished_cb (void *cls)
677{ 624{
625 struct GNUNET_JSONAPI_Resource *json_resource;
678 struct RequestHandle *handle = cls; 626 struct RequestHandle *handle = cls;
679 struct EgoEntry *ego_tmp; 627 json_t *value;
680 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key; 628
681 629 if ((NULL == attr->name) || (NULL == attr->data))
682 ego_tmp = handle->ego_head;
683 GNUNET_CONTAINER_DLL_remove (handle->ego_head,
684 handle->ego_tail,
685 ego_tmp);
686 GNUNET_free (ego_tmp->identifier);
687 GNUNET_free (ego_tmp->keystring);
688 GNUNET_free (ego_tmp);
689
690 if (NULL == handle->ego_head)
691 { 630 {
692 //Done 631 GNUNET_IDENTITY_PROVIDER_get_attributes_next (handle->attr_it);
693 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding token END\n");
694 handle->ns_it = NULL;
695 GNUNET_SCHEDULER_add_now (&return_token_list, handle);
696 return; 632 return;
697 } 633 }
698 634
699 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 635 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n",
700 "Next ego: %s\n", 636 attr->name);
701 handle->ego_head->identifier); 637 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE,
702 priv_key = GNUNET_IDENTITY_ego_get_private_key (handle->ego_head->ego); 638 attr->name);
703 handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (handle->ns_handle, 639 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
704 priv_key,
705 &token_collect_error_cb,
706 handle,
707 &token_collect,
708 handle,
709 &token_collect_finished_cb,
710 handle);
711}
712
713
714/**
715 * Collect all tokens for an ego
716 *
717 * TODO move this into the identity-provider service
718 *
719 */
720static void
721token_collect (void *cls,
722 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
723 const char *label,
724 unsigned int rd_count,
725 const struct GNUNET_GNSRECORD_Data *rd)
726{
727 struct RequestHandle *handle = cls;
728 int i;
729 char* data;
730 struct GNUNET_JSONAPI_Resource *json_resource;
731 json_t *issuer;
732 json_t *token;
733
734 for (i = 0; i < rd_count; i++)
735 {
736 if (rd[i].record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN)
737 {
738 data = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
739 rd[i].data,
740 rd[i].data_size);
741 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding token: %s\n", data);
742 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_TOKEN,
743 label);
744 issuer = json_string (handle->ego_head->identifier);
745 GNUNET_JSONAPI_resource_add_attr (json_resource,
746 GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
747 issuer);
748 json_decref (issuer);
749 token = json_string (data);
750 GNUNET_JSONAPI_resource_add_attr (json_resource,
751 GNUNET_REST_JSONAPI_IDENTITY_TOKEN,
752 token);
753 json_decref (token);
754
755 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
756 GNUNET_free (data);
757 }
758 }
759 640
760 GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it); 641 value = json_string (attr->data);
642 GNUNET_JSONAPI_resource_add_attr (json_resource,
643 "value",
644 value);
645 json_decref (value);
646 GNUNET_IDENTITY_PROVIDER_get_attributes_next (handle->attr_it);
761} 647}
762 648
763 649
764 650
765/** 651/**
766 * Respond to OPTIONS request 652 * List attributes for identity request
767 * 653 *
768 * @param con_handle the connection handle 654 * @param con_handle the connection handle
769 * @param url the url 655 * @param url the url
770 * @param cls the RequestHandle 656 * @param cls the RequestHandle
771 */ 657 */
772static void 658static void
773list_token_cont (struct GNUNET_REST_RequestHandle *con_handle, 659list_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
774 const char* url, 660 const char* url,
775 void *cls) 661 void *cls)
776{ 662{
777 char* ego_val;
778 struct GNUNET_HashCode key;
779 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key; 663 const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
780 struct RequestHandle *handle = cls; 664 struct RequestHandle *handle = cls;
781 struct EgoEntry *ego_entry; 665 struct EgoEntry *ego_entry;
782 struct EgoEntry *ego_tmp; 666 char *identity;
783
784 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
785 strlen (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST),
786 &key);
787 667
788 if ( GNUNET_YES != 668 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting attributes for %s.\n",
789 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map, 669 handle->url);
790 &key) ) 670 if ( strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) >=
671 strlen (handle->url))
791 { 672 {
792 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No issuer given.\n"); 673 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
793 GNUNET_SCHEDULER_add_now (&do_error, handle); 674 GNUNET_SCHEDULER_add_now (&do_error, handle);
794 return; 675 return;
795 } 676 }
796 ego_val = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map, 677 identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) + 1;
797 &key); 678
798 GNUNET_assert (NULL != ego_val);
799 //Remove non-matching egos
800 for (ego_entry = handle->ego_head; 679 for (ego_entry = handle->ego_head;
801 NULL != ego_entry;) 680 NULL != ego_entry;
802 { 681 ego_entry = ego_entry->next)
803 ego_tmp = ego_entry; 682 if (0 == strcmp (identity, ego_entry->identifier))
804 ego_entry = ego_entry->next; 683 break;
805 if (0 != strcmp (ego_val, ego_tmp->identifier))
806 {
807 GNUNET_CONTAINER_DLL_remove (handle->ego_head,
808 handle->ego_tail,
809 ego_tmp);
810 GNUNET_free (ego_tmp->identifier);
811 GNUNET_free (ego_tmp->keystring);
812 GNUNET_free (ego_tmp);
813 }
814 }
815 handle->resp_object = GNUNET_JSONAPI_document_new (); 684 handle->resp_object = GNUNET_JSONAPI_document_new ();
816 if (NULL == handle->ego_head) 685
686
687 if (NULL == ego_entry)
817 { 688 {
818 //Done 689 //Done
819 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No results.\n"); 690 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n",
820 GNUNET_SCHEDULER_add_now (&return_token_list, handle); 691 identity);
692 GNUNET_SCHEDULER_add_now (&return_response, handle);
821 return; 693 return;
822 } 694 }
823 priv_key = GNUNET_IDENTITY_ego_get_private_key (handle->ego_head->ego); 695 priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
824 handle->ns_handle = GNUNET_NAMESTORE_connect (cfg); 696 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
825 handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (handle->ns_handle, 697 handle->attr_it = GNUNET_IDENTITY_PROVIDER_get_attributes_start (handle->idp,
826 priv_key, 698 priv_key,
827 &token_collect_error_cb, 699 &collect_error_cb,
828 handle, 700 handle,
829 &token_collect, 701 &attr_collect,
830 handle, 702 handle,
831 &token_collect_finished_cb, 703 &collect_finished_cb,
832 handle); 704 handle);
833
834} 705}
835 706
836/** 707
837 * Return token to requestor
838 *
839 * @param cls request handle
840 * @param token the token
841 */
842static void 708static void
843exchange_cont (void *cls, 709revoke_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
844 const struct GNUNET_IDENTITY_PROVIDER_Token *token, 710 const char* url,
845 uint64_t ticket_nonce) 711 void *cls)
846{ 712{
847 json_t *root; 713 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
714 const char* identity_str;
715 const char* audience_str;
716 const char* rnd_str;
717
848 struct RequestHandle *handle = cls; 718 struct RequestHandle *handle = cls;
719 struct EgoEntry *ego_entry;
849 struct MHD_Response *resp; 720 struct MHD_Response *resp;
850 struct GNUNET_HashCode key; 721 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
851 char* result; 722 struct GNUNET_JSONAPI_Document *json_obj;
852 char* token_str; 723 struct GNUNET_JSONAPI_Resource *json_res;
853 char* nonce_str; 724 struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
854 uint64_t expected_nonce; 725 char term_data[handle->rest_handle->data_size+1];
855 726 json_t *rnd_json;
856 //Get nonce 727 json_t *identity_json;
857 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_EXPECTED_NONCE, 728 json_t *audience_json;
858 strlen (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_EXPECTED_NONCE), 729 json_t *data_json;
859 &key); 730 json_error_t err;
860 731 struct GNUNET_JSON_Specification docspec[] = {
861 if ( GNUNET_NO == 732 GNUNET_JSON_spec_jsonapi_document (&json_obj),
862 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map, 733 GNUNET_JSON_spec_end()
863 &key) ) 734 };
735
736 if (0 >= handle->rest_handle->data_size)
864 { 737 {
865 handle->emsg = GNUNET_strdup ("No nonce given.");
866 GNUNET_SCHEDULER_add_now (&do_error, handle); 738 GNUNET_SCHEDULER_add_now (&do_error, handle);
867 return; 739 return;
868 } 740 }
869 nonce_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
870 &key);
871 GNUNET_assert (NULL != nonce_str);
872 GNUNET_assert (1 == sscanf (nonce_str, "%"SCNu64, &expected_nonce));
873 741
874 if (ticket_nonce != expected_nonce) 742 term_data[handle->rest_handle->data_size] = '\0';
743 GNUNET_memcpy (term_data,
744 handle->rest_handle->data,
745 handle->rest_handle->data_size);
746 data_json = json_loads (term_data,
747 JSON_DECODE_ANY,
748 &err);
749 GNUNET_assert (GNUNET_OK ==
750 GNUNET_JSON_parse (data_json, docspec,
751 NULL, NULL));
752 json_decref (data_json);
753 if (NULL == json_obj)
875 { 754 {
876 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 755 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
877 "Ticket nonce %"SCNu64" does not match expected nonce %"SCNu64"\n", 756 "Unable to parse JSONAPI Object from %s\n",
878 ticket_nonce, expected_nonce); 757 term_data);
879 handle->emsg = GNUNET_strdup ("Ticket nonce does not match expected nonce\n");
880 GNUNET_SCHEDULER_add_now (&do_error, handle); 758 GNUNET_SCHEDULER_add_now (&do_error, handle);
881 return; 759 return;
882 } 760 }
761 if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
762 {
763 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
764 "Cannot create more than 1 resource! (Got %d)\n",
765 GNUNET_JSONAPI_document_resource_count (json_obj));
766 GNUNET_JSONAPI_document_delete (json_obj);
767 GNUNET_SCHEDULER_add_now (&do_error, handle);
768 return;
769 }
770 json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
771 if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
772 GNUNET_REST_JSONAPI_IDENTITY_TICKET))
773 {
774 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
775 "Unsupported JSON data type\n");
776 GNUNET_JSONAPI_document_delete (json_obj);
777 resp = GNUNET_REST_create_response (NULL);
778 handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
779 cleanup_handle (handle);
780 return;
781 }
782 rnd_json = GNUNET_JSONAPI_resource_read_attr (json_res,
783 "rnd");
784 identity_json = GNUNET_JSONAPI_resource_read_attr (json_res,
785 "identity");
786 audience_json = GNUNET_JSONAPI_resource_read_attr (json_res,
787 "audience");
788 rnd_str = json_string_value (rnd_json);
789 identity_str = json_string_value (identity_json);
790 audience_str = json_string_value (audience_json);
791
792 GNUNET_STRINGS_string_to_data (rnd_str,
793 strlen (rnd_str),
794 &ticket.rnd,
795 sizeof (uint64_t));
796 GNUNET_STRINGS_string_to_data (identity_str,
797 strlen (identity_str),
798 &ticket.identity,
799 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
800 GNUNET_STRINGS_string_to_data (audience_str,
801 strlen (audience_str),
802 &ticket.audience,
803 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
883 804
884 root = json_object (); 805 for (ego_entry = handle->ego_head;
885 token_str = GNUNET_IDENTITY_PROVIDER_token_to_string (token); 806 NULL != ego_entry;
886 json_object_set_new (root, "token", json_string (token_str)); 807 ego_entry = ego_entry->next)
887 json_object_set_new (root, "token_type", json_string ("jwt")); 808 {
888 GNUNET_free (token_str); 809 GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
810 &tmp_pk);
811 if (0 == memcmp (&ticket.identity,
812 &tmp_pk,
813 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
814 break;
815 }
816 if (NULL == ego_entry)
817 {
818 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
819 "Identity unknown (%s)\n", identity_str);
820 GNUNET_JSONAPI_document_delete (json_obj);
821 return;
822 }
823 identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
889 824
890 result = json_dumps (root, JSON_INDENT(1)); 825 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
891 resp = GNUNET_REST_create_response (result); 826 handle->idp_op = GNUNET_IDENTITY_PROVIDER_ticket_revoke (handle->idp,
892 GNUNET_free (result); 827 identity_priv,
893 handle->proc (handle->proc_cls, resp, MHD_HTTP_OK); 828 &ticket,
894 cleanup_handle (handle); 829 &finished_cont,
895 json_decref (root); 830 handle);
831 GNUNET_JSONAPI_document_delete (json_obj);
896} 832}
897 833
898
899/**
900 *
901 * Callback called when identity for token exchange has been found
902 *
903 * @param cls request handle
904 * @param ego the identity to use as issuer
905 * @param ctx user context
906 * @param name identity name
907 *
908 */
909static void 834static void
910exchange_token_ticket_cb (void *cls, 835consume_cont (void *cls,
911 struct GNUNET_IDENTITY_Ego *ego, 836 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
912 void **ctx, 837 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
913 const char *name)
914{ 838{
915 struct RequestHandle *handle = cls; 839 struct RequestHandle *handle = cls;
916 struct GNUNET_HashCode key; 840 struct GNUNET_JSONAPI_Resource *json_resource;
917 struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket; 841 json_t *value;
918 char* ticket_str; 842
843 if (NULL == identity)
844 {
845 GNUNET_SCHEDULER_add_now (&return_response, handle);
846 return;
847 }
919 848
920 handle->op = NULL; 849 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n",
850 attr->name);
851 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE,
852 attr->name);
853 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
921 854
922 if (NULL == ego) 855 value = json_string (attr->data);
856 GNUNET_JSONAPI_resource_add_attr (json_resource,
857 "value",
858 value);
859 json_decref (value);
860}
861
862static void
863consume_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
864 const char* url,
865 void *cls)
866{
867 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
868 const char* identity_str;
869 const char* audience_str;
870 const char* rnd_str;
871
872 struct RequestHandle *handle = cls;
873 struct EgoEntry *ego_entry;
874 struct MHD_Response *resp;
875 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
876 struct GNUNET_JSONAPI_Document *json_obj;
877 struct GNUNET_JSONAPI_Resource *json_res;
878 struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
879 char term_data[handle->rest_handle->data_size+1];
880 json_t *rnd_json;
881 json_t *identity_json;
882 json_t *audience_json;
883 json_t *data_json;
884 json_error_t err;
885 struct GNUNET_JSON_Specification docspec[] = {
886 GNUNET_JSON_spec_jsonapi_document (&json_obj),
887 GNUNET_JSON_spec_end()
888 };
889
890 if (0 >= handle->rest_handle->data_size)
923 { 891 {
924 handle->emsg = GNUNET_strdup ("No identity found.");
925 GNUNET_SCHEDULER_add_now (&do_error, handle); 892 GNUNET_SCHEDULER_add_now (&do_error, handle);
926 return; 893 return;
927 } 894 }
928 895
929 //Get ticket 896 term_data[handle->rest_handle->data_size] = '\0';
930 GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET, 897 GNUNET_memcpy (term_data,
931 strlen (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET), 898 handle->rest_handle->data,
932 &key); 899 handle->rest_handle->data_size);
933 900 data_json = json_loads (term_data,
934 if ( GNUNET_NO == 901 JSON_DECODE_ANY,
935 GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map, 902 &err);
936 &key) ) 903 GNUNET_assert (GNUNET_OK ==
904 GNUNET_JSON_parse (data_json, docspec,
905 NULL, NULL));
906 json_decref (data_json);
907 if (NULL == json_obj)
908 {
909 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
910 "Unable to parse JSONAPI Object from %s\n",
911 term_data);
912 GNUNET_SCHEDULER_add_now (&do_error, handle);
913 return;
914 }
915 if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
937 { 916 {
938 handle->emsg = GNUNET_strdup ("No ticket given."); 917 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
918 "Cannot create more than 1 resource! (Got %d)\n",
919 GNUNET_JSONAPI_document_resource_count (json_obj));
920 GNUNET_JSONAPI_document_delete (json_obj);
939 GNUNET_SCHEDULER_add_now (&do_error, handle); 921 GNUNET_SCHEDULER_add_now (&do_error, handle);
940 return; 922 return;
941 } 923 }
942 ticket_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map, 924 json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
943 &key); 925 if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
944 handle->priv_key = GNUNET_IDENTITY_ego_get_private_key (ego); 926 GNUNET_REST_JSONAPI_IDENTITY_TICKET))
945 GNUNET_IDENTITY_PROVIDER_string_to_ticket (ticket_str, 927 {
946 &ticket); 928 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
929 "Unsupported JSON data type\n");
930 GNUNET_JSONAPI_document_delete (json_obj);
931 resp = GNUNET_REST_create_response (NULL);
932 handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
933 cleanup_handle (handle);
934 return;
935 }
936 rnd_json = GNUNET_JSONAPI_resource_read_attr (json_res,
937 "rnd");
938 identity_json = GNUNET_JSONAPI_resource_read_attr (json_res,
939 "identity");
940 audience_json = GNUNET_JSONAPI_resource_read_attr (json_res,
941 "audience");
942 rnd_str = json_string_value (rnd_json);
943 identity_str = json_string_value (identity_json);
944 audience_str = json_string_value (audience_json);
945
946 GNUNET_STRINGS_string_to_data (rnd_str,
947 strlen (rnd_str),
948 &ticket.rnd,
949 sizeof (uint64_t));
950 GNUNET_STRINGS_string_to_data (identity_str,
951 strlen (identity_str),
952 &ticket.identity,
953 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
954 GNUNET_STRINGS_string_to_data (audience_str,
955 strlen (audience_str),
956 &ticket.audience,
957 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
947 958
959 for (ego_entry = handle->ego_head;
960 NULL != ego_entry;
961 ego_entry = ego_entry->next)
962 {
963 GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
964 &tmp_pk);
965 if (0 == memcmp (&ticket.audience,
966 &tmp_pk,
967 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
968 break;
969 }
970 if (NULL == ego_entry)
971 {
972 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
973 "Identity unknown (%s)\n", identity_str);
974 GNUNET_JSONAPI_document_delete (json_obj);
975 return;
976 }
977 identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
978 handle->resp_object = GNUNET_JSONAPI_document_new ();
948 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg); 979 handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
949 handle->idp_op = GNUNET_IDENTITY_PROVIDER_exchange_ticket (handle->idp, 980 handle->idp_op = GNUNET_IDENTITY_PROVIDER_ticket_consume (handle->idp,
950 ticket, 981 identity_priv,
951 handle->priv_key, 982 &ticket,
952 &exchange_cont, 983 &consume_cont,
953 handle); 984 handle);
954 GNUNET_IDENTITY_PROVIDER_ticket_destroy (ticket); 985 GNUNET_JSONAPI_document_delete (json_obj);
955
956} 986}
957 987
958 988
959 989
960/** 990/**
961 * Respond to issue request
962 *
963 * @param con_handle the connection handle
964 * @param url the url
965 * @param cls the RequestHandle
966 */
967static void
968exchange_token_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
969 const char* url,
970 void *cls)
971{
972 struct RequestHandle *handle = cls;
973
974 //Get token from GNS
975 handle->op = GNUNET_IDENTITY_get (handle->identity_handle,
976 "gns-master",
977 &exchange_token_ticket_cb,
978 handle);
979}
980
981/**
982 * Respond to OPTIONS request 991 * Respond to OPTIONS request
983 * 992 *
984 * @param con_handle the connection handle 993 * @param con_handle the connection handle
@@ -1013,15 +1022,17 @@ init_cont (struct RequestHandle *handle)
1013{ 1022{
1014 struct GNUNET_REST_RequestHandlerError err; 1023 struct GNUNET_REST_RequestHandlerError err;
1015 static const struct GNUNET_REST_RequestHandler handlers[] = { 1024 static const struct GNUNET_REST_RequestHandler handlers[] = {
1016 {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_TOKEN_ISSUE, &issue_token_cont}, 1025 {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES, &list_attribute_cont},
1017 //{MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_TOKEN_CHECK, &check_token_cont}, 1026 {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES, &add_attribute_cont},
1018 {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_PROVIDER, &list_token_cont}, 1027 {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_TICKETS, &list_tickets_cont},
1019 {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_IDENTITY_PROVIDER, &options_cont}, 1028 {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_REVOKE, &revoke_ticket_cont},
1020 {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_OAUTH2_TOKEN, &exchange_token_ticket_cont}, 1029 {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_CONSUME, &consume_ticket_cont},
1030 {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_IDENTITY_PROVIDER,
1031 &options_cont},
1021 GNUNET_REST_HANDLER_END 1032 GNUNET_REST_HANDLER_END
1022 }; 1033 };
1023 1034
1024 if (GNUNET_NO == GNUNET_REST_handle_request (handle->conndata_handle, 1035 if (GNUNET_NO == GNUNET_REST_handle_request (handle->rest_handle,
1025 handlers, 1036 handlers,
1026 &err, 1037 &err,
1027 handle)) 1038 handle))
@@ -1104,7 +1115,7 @@ list_ego (void *cls,
1104 * @return GNUNET_OK if request accepted 1115 * @return GNUNET_OK if request accepted
1105 */ 1116 */
1106static void 1117static void
1107rest_identity_process_request(struct GNUNET_REST_RequestHandle *conndata_handle, 1118rest_identity_process_request(struct GNUNET_REST_RequestHandle *rest_handle,
1108 GNUNET_REST_ResultProcessor proc, 1119 GNUNET_REST_ResultProcessor proc,
1109 void *proc_cls) 1120 void *proc_cls)
1110{ 1121{
@@ -1114,10 +1125,9 @@ rest_identity_process_request(struct GNUNET_REST_RequestHandle *conndata_handle,
1114 handle->proc_cls = proc_cls; 1125 handle->proc_cls = proc_cls;
1115 handle->proc = proc; 1126 handle->proc = proc;
1116 handle->state = ID_REST_STATE_INIT; 1127 handle->state = ID_REST_STATE_INIT;
1117 handle->conndata_handle = conndata_handle; 1128 handle->rest_handle = rest_handle;
1118 1129
1119 1130 handle->url = GNUNET_strdup (rest_handle->url);
1120 handle->url = GNUNET_strdup (conndata_handle->url);
1121 if (handle->url[strlen (handle->url)-1] == '/') 1131 if (handle->url[strlen (handle->url)-1] == '/')
1122 handle->url[strlen (handle->url)-1] = '\0'; 1132 handle->url[strlen (handle->url)-1] = '\0';
1123 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1133 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1162,8 +1172,8 @@ libgnunet_plugin_rest_identity_provider_init (void *cls)
1162 MHD_HTTP_METHOD_DELETE, 1172 MHD_HTTP_METHOD_DELETE,
1163 MHD_HTTP_METHOD_OPTIONS); 1173 MHD_HTTP_METHOD_OPTIONS);
1164 1174
1165 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1175 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1166 _("Identity Token REST API initialized\n")); 1176 _("Identity Provider REST API initialized\n"));
1167 return api; 1177 return api;
1168} 1178}
1169 1179
@@ -1184,8 +1194,8 @@ libgnunet_plugin_rest_identity_provider_done (void *cls)
1184 GNUNET_free_non_null (allow_methods); 1194 GNUNET_free_non_null (allow_methods);
1185 GNUNET_free (api); 1195 GNUNET_free (api);
1186 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1196 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1187 "Identity Token REST plugin is finished\n"); 1197 "Identity Provider REST plugin is finished\n");
1188 return NULL; 1198 return NULL;
1189} 1199}
1190 1200
1191/* end of plugin_rest_gns.c */ 1201/* end of plugin_rest_identity_provider.c */
diff --git a/src/identity-provider/test_idp.conf b/src/identity-provider/test_idp.conf
new file mode 100644
index 000000000..2b76c7bf2
--- /dev/null
+++ b/src/identity-provider/test_idp.conf
@@ -0,0 +1,28 @@
1@INLINE@ test_idp_defaults.conf
2
3[PATHS]
4GNUNET_TEST_HOME = /tmp/test-gnunet-idp-peer-1/
5
6[dht]
7AUTOSTART = YES
8
9[rest]
10AUTOSTART = YES
11#PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/restlog
12
13[transport]
14PLUGINS =
15
16[identity-provider]
17AUTOSTART = YES
18#PREFIX = valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=/tmp/idplog
19
20[gns]
21#PREFIX = valgrind --leak-check=full --track-origins=yes
22AUTOSTART = YES
23AUTO_IMPORT_PKEY = YES
24MAX_PARALLEL_BACKGROUND_QUERIES = 10
25DEFAULT_LOOKUP_TIMEOUT = 15 s
26RECORD_PUT_INTERVAL = 1 h
27ZONE_PUBLISH_TIME_WINDOW = 1 h
28DNS_ROOT=PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
diff --git a/src/identity-provider/test_idp.sh b/src/identity-provider/test_idp.sh
new file mode 100755
index 000000000..598d1008c
--- /dev/null
+++ b/src/identity-provider/test_idp.sh
@@ -0,0 +1,31 @@
1#!/bin/bash
2#trap "gnunet-arm -e -c test_idp_lookup.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_idp.conf
27gnunet-identity -C testego -c test_idp.conf
28valgrind gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf
29gnunet-idp -e testego -a name -V John -c test_idp.conf
30gnunet-idp -e testego -D -c test_idp.conf
31gnunet-arm -e -c test_idp.conf
diff --git a/src/identity-provider/test_idp_attribute.sh b/src/identity-provider/test_idp_attribute.sh
new file mode 100755
index 000000000..7f0f06dac
--- /dev/null
+++ b/src/identity-provider/test_idp_attribute.sh
@@ -0,0 +1,40 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_idp.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_idp.conf
27#gnunet-arm -i rest -c test_idp.conf
28gnunet-identity -C testego -c test_idp.conf
29gnunet-identity -C rpego -c test_idp.conf
30TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}')
31gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf
32gnunet-idp -e testego -a name -V John -c test_idp.conf > /dev/null 2>&1
33if test $? != 0
34then
35 echo "Failed."
36 exit 1
37fi
38
39#curl localhost:7776/idp/attributes/testego
40gnunet-arm -e -c test_idp.conf
diff --git a/src/identity-provider/test_idp_consume.sh b/src/identity-provider/test_idp_consume.sh
new file mode 100755
index 000000000..11f6865a4
--- /dev/null
+++ b/src/identity-provider/test_idp_consume.sh
@@ -0,0 +1,43 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_idp.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_idp.conf
27#gnunet-arm -i rest -c test_idp.conf
28gnunet-identity -C testego -c test_idp.conf
29gnunet-identity -C rpego -c test_idp.conf
30SUBJECT_KEY=$(gnunet-identity -d -c test_idp.conf | grep rpego | awk '{print $3}')
31TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}')
32gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf
33gnunet-idp -e testego -a name -V John -c test_idp.conf
34TICKET=$(gnunet-idp -e testego -i "email,name" -r $SUBJECT_KEY -c test_idp.conf | awk '{print $1}')
35gnunet-idp -e rpego -C $TICKET -c test_idp.conf > /dev/null 2>&1
36
37if test $? != 0
38then
39 "Failed."
40 exit 1
41fi
42#curl http://localhost:7776/idp/tickets/testego
43gnunet-arm -e -c test_idp.conf
diff --git a/src/identity-provider/test_idp_defaults.conf b/src/identity-provider/test_idp_defaults.conf
new file mode 100644
index 000000000..10d89c2fb
--- /dev/null
+++ b/src/identity-provider/test_idp_defaults.conf
@@ -0,0 +1,24 @@
1@INLINE@ ../../contrib/no_forcestart.conf
2
3[PATHS]
4GNUNET_TEST_HOME = /tmp/test-gnunet-idp-testing/
5
6[namestore-sqlite]
7FILENAME = $GNUNET_TEST_HOME/namestore/sqlite_test.db
8
9[namecache-sqlite]
10FILENAME=$GNUNET_TEST_HOME/namecache/namecache.db
11
12[identity]
13# Directory where we store information about our egos
14EGODIR = $GNUNET_TEST_HOME/identity/egos/
15
16[dhtcache]
17DATABASE = heap
18
19[transport]
20PLUGINS = tcp
21
22[transport-tcp]
23BINDTO = 127.0.0.1
24
diff --git a/src/identity-provider/test_idp_issue.sh b/src/identity-provider/test_idp_issue.sh
new file mode 100755
index 000000000..90487ee73
--- /dev/null
+++ b/src/identity-provider/test_idp_issue.sh
@@ -0,0 +1,42 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_idp.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_idp.conf
27#gnunet-arm -i rest -c test_idp.conf
28gnunet-identity -C testego -c test_idp.conf
29gnunet-identity -C rpego -c test_idp.conf
30SUBJECT_KEY=$(gnunet-identity -d -c test_idp.conf | grep rpego | awk '{print $3}')
31TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}')
32gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf > /dev/null 2>&1
33gnunet-idp -e testego -a name -V John -c test_idp.conf > /dev/null 2>&1
34#gnunet-idp -e testego -D -c test_idp.conf
35gnunet-idp -e testego -i "email,name" -r $SUBJECT_KEY -c test_idp.conf > /dev/null 2>&1
36if test $? != 0
37then
38 echo "Failed."
39 exit 1
40fi
41#curl http://localhost:7776/idp/attributes/testego
42gnunet-arm -e -c test_idp.conf
diff --git a/src/identity-provider/test_idp_revoke.sh b/src/identity-provider/test_idp_revoke.sh
new file mode 100755
index 000000000..d5c2c3f77
--- /dev/null
+++ b/src/identity-provider/test_idp_revoke.sh
@@ -0,0 +1,60 @@
1#!/bin/bash
2trap "gnunet-arm -e -c test_idp.conf" SIGINT
3
4LOCATION=$(which gnunet-config)
5if [ -z $LOCATION ]
6then
7 LOCATION="gnunet-config"
8fi
9$LOCATION --version 1> /dev/null
10if test $? != 0
11then
12 echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
13 exit 77
14fi
15
16rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
17
18# (1) PKEY1.user -> PKEY2.resu.user
19# (2) PKEY2.resu -> PKEY3
20# (3) PKEY3.user -> PKEY4
21
22
23which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
24
25TEST_ATTR="test"
26gnunet-arm -s -c test_idp.conf
27gnunet-identity -C alice -c test_idp.conf
28gnunet-identity -C bob -c test_idp.conf
29gnunet-identity -C eve -c test_idp.conf
30ALICE_KEY=$(gnunet-identity -d -c test_idp.conf | grep alice | awk '{print $3}')
31BOB_KEY=$(gnunet-identity -d -c test_idp.conf | grep bob | awk '{print $3}')
32EVE_KEY=$(gnunet-identity -d -c test_idp.conf | grep eve | awk '{print $3}')
33
34gnunet-idp -e alice -a email -V john@doe.gnu -c test_idp.conf
35gnunet-idp -e alice -a name -V John -c test_idp.conf
36TICKET_BOB=$(gnunet-idp -e alice -i "email,name" -r $BOB_KEY -c test_idp.conf | awk '{print $1}')
37#gnunet-idp -e bob -C $TICKET_BOB -c test_idp.conf
38TICKET_EVE=$(gnunet-idp -e alice -i "email" -r $EVE_KEY -c test_idp.conf | awk '{print $1}')
39
40
41#echo "Consuming $TICKET"
42#gnunet-idp -e eve -C $TICKET_EVE -c test_idp.conf
43gnunet-idp -e alice -R $TICKET_EVE -c test_idp.conf
44
45gnunet-idp -e eve -C $TICKET_EVE -c test_idp.conf > /dev/null 2>&1
46if test $? == 0
47then
48 echo "Eve can still resolve attributes..."
49 gnunet-arm -e -c test_idp.conf
50 exit 1
51fi
52gnunet-idp -e bob -C $TICKET_BOB -c test_idp.conf > /dev/null 2>&1
53if test $? != 0
54then
55 echo "Bob cannot resolve attributes..."
56 gnunet-arm -e -c test_idp.conf
57 exit 1
58fi
59
60gnunet-arm -e -c test_idp.conf
diff --git a/src/identity/Makefile.am b/src/identity/Makefile.am
index 94e8c5e94..b8e70fffb 100644
--- a/src/identity/Makefile.am
+++ b/src/identity/Makefile.am
@@ -42,8 +42,7 @@ libexec_PROGRAMS = \
42if HAVE_MHD 42if HAVE_MHD
43if HAVE_JSON 43if HAVE_JSON
44plugin_LTLIBRARIES = \ 44plugin_LTLIBRARIES = \
45 libgnunet_plugin_rest_identity.la \ 45 libgnunet_plugin_rest_identity.la
46 libgnunet_plugin_gnsrecord_identity.la
47endif 46endif
48endif 47endif
49 48
@@ -55,14 +54,6 @@ gnunet_service_identity_LDADD = \
55 $(top_builddir)/src/util/libgnunetutil.la \ 54 $(top_builddir)/src/util/libgnunetutil.la \
56 $(GN_LIBINTL) 55 $(GN_LIBINTL)
57 56
58libgnunet_plugin_gnsrecord_identity_la_SOURCES = \
59 plugin_gnsrecord_identity.c
60libgnunet_plugin_gnsrecord_identity_la_LIBADD = \
61 $(top_builddir)/src/util/libgnunetutil.la \
62 $(LTLIBINTL)
63libgnunet_plugin_gnsrecord_identity_la_LDFLAGS = \
64 $(GN_PLUGIN_LDFLAGS)
65
66 57
67libgnunet_plugin_rest_identity_la_SOURCES = \ 58libgnunet_plugin_rest_identity_la_SOURCES = \
68 plugin_rest_identity.c 59 plugin_rest_identity.c
diff --git a/src/identity/plugin_rest_identity.c b/src/identity/plugin_rest_identity.c
index e64b2685a..5f34d0f1b 100644
--- a/src/identity/plugin_rest_identity.c
+++ b/src/identity/plugin_rest_identity.c
@@ -427,9 +427,6 @@ ego_info_response (struct GNUNET_REST_RequestHandle *con,
427 continue; 427 continue;
428 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_EGO, 428 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_EGO,
429 ego_entry->keystring); 429 ego_entry->keystring);
430 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
431 "Egoname: %s\n",
432 ego_entry->identifier);
433 name_str = json_string (ego_entry->identifier); 430 name_str = json_string (ego_entry->identifier);
434 GNUNET_JSONAPI_resource_add_attr ( 431 GNUNET_JSONAPI_resource_add_attr (
435 json_resource, 432 json_resource,
diff --git a/src/include/gnunet_credential_service.h b/src/include/gnunet_credential_service.h
index 9e765c12b..67c2f2b4c 100644
--- a/src/include/gnunet_credential_service.h
+++ b/src/include/gnunet_credential_service.h
@@ -20,6 +20,7 @@
20 20
21/** 21/**
22 * @author Martin Schanzenbach 22 * @author Martin Schanzenbach
23 * @author Adnan Husain
23 * 24 *
24 * @file 25 * @file
25 * API to the Credential service 26 * API to the Credential service
@@ -34,6 +35,7 @@
34 35
35#include "gnunet_util_lib.h" 36#include "gnunet_util_lib.h"
36#include "gnunet_gns_service.h" 37#include "gnunet_gns_service.h"
38#include "gnunet_identity_service.h"
37 39
38#ifdef __cplusplus 40#ifdef __cplusplus
39extern "C" 41extern "C"
@@ -52,7 +54,157 @@ struct GNUNET_CREDENTIAL_Handle;
52/** 54/**
53 * Handle to control a lookup operation. 55 * Handle to control a lookup operation.
54 */ 56 */
55struct GNUNET_CREDENTIAL_LookupRequest; 57struct GNUNET_CREDENTIAL_Request;
58
59/*
60* Enum used for checking whether the issuer has the authority to issue credentials or is just a subject
61*/
62enum GNUNET_CREDENTIAL_CredentialFlags {
63
64 //Subject had credentials before, but have been revoked now
65 GNUNET_CREDENTIAL_FLAG_REVOKED=0,
66
67 //Subject flag indicates that the subject is a holder of this credential and may present it as such
68 GNUNET_CREDENTIAL_FLAG_SUBJECT=1,
69
70 //Issuer flag is used to signify that the subject is allowed to issue this credential and delegate issuance
71 GNUNET_CREDENTIAL_FLAG_ISSUER=2
72
73};
74
75GNUNET_NETWORK_STRUCT_BEGIN
76/**
77 * The attribute delegation record
78 */
79struct GNUNET_CREDENTIAL_DelegationRecord {
80
81 /**
82 * Number of delegation sets in this record
83 */
84 uint32_t set_count;
85
86 /**
87 * Length of delegation sets
88 */
89 uint64_t data_size;
90 /**
91 * Followed by set_count DelegationSetRecords
92 *
93 */
94};
95
96/**
97 * The attribute delegation record
98 */
99struct GNUNET_CREDENTIAL_DelegationRecordSet {
100
101 /**
102 * Public key of the subject this attribute was delegated to
103 */
104 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
105
106 /**
107 * Length of attribute, may be 0
108 */
109 uint32_t subject_attribute_len;
110};
111
112
113GNUNET_NETWORK_STRUCT_END
114
115/**
116 * The attribute delegation record
117 */
118struct GNUNET_CREDENTIAL_DelegationSet {
119
120 /**
121 * Public key of the subject this attribute was delegated to
122 */
123 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
124
125 uint32_t subject_attribute_len;
126
127 /**
128 * The subject attribute
129 */
130 const char *subject_attribute;
131};
132
133
134/**
135 * A delegation
136 */
137struct GNUNET_CREDENTIAL_Delegation {
138
139 /**
140 * The issuer of the delegation
141 */
142 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
143
144 /**
145 * Public key of the subject this attribute was delegated to
146 */
147 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
148
149 /**
150 * Length of the attribute
151 */
152 uint32_t issuer_attribute_len;
153
154 /**
155 * The attribute
156 */
157 const char *issuer_attribute;
158
159 /**
160 * Length of the attribute
161 */
162 uint32_t subject_attribute_len;
163
164 /**
165 * The attribute
166 */
167 const char *subject_attribute;
168};
169
170
171/**
172 * A credential
173 */
174struct GNUNET_CREDENTIAL_Credential {
175
176 /**
177 * The issuer of the credential
178 */
179 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
180
181 /**
182 * Public key of the subject this credential was issued to
183 */
184 struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
185
186 /**
187 * Signature of this credential
188 */
189 struct GNUNET_CRYPTO_EcdsaSignature signature;
190
191 /**
192 * Expiration of this credential
193 */
194 struct GNUNET_TIME_Absolute expiration;
195
196 /**
197 * Length of the attribute
198 */
199 uint32_t issuer_attribute_len;
200
201 /**
202 * The attribute
203 */
204 const char *issuer_attribute;
205
206};
207
56 208
57 209
58/** 210/**
@@ -61,7 +213,7 @@ struct GNUNET_CREDENTIAL_LookupRequest;
61 * @param cfg configuration to use 213 * @param cfg configuration to use
62 * @return handle to the Credential service, or NULL on error 214 * @return handle to the Credential service, or NULL on error
63 */ 215 */
64struct GNUNET_Credential_Handle * 216struct GNUNET_CREDENTIAL_Handle *
65GNUNET_CREDENTIAL_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); 217GNUNET_CREDENTIAL_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
66 218
67 219
@@ -75,56 +227,129 @@ GNUNET_CREDENTIAL_disconnect (struct GNUNET_CREDENTIAL_Handle *handle);
75 227
76 228
77/** 229/**
78 * Iterator called on obtained result for a Credential lookup. 230 * Iterator called on obtained result for an attribute verification.
79 * 231 *
80 * @param cls closure 232 * @param cls closure
81 * @param issuer the issuer chain 233 * @param d_count the number of delegations processed
82 * @param issuer_len length of issuer chain 234 * @param delegation_chain the delegations processed
83 * @param value the value returned 235 * @param c_count the number of credentials found
236 * @param credential the credentials
84 */ 237 */
85typedef void 238typedef void (*GNUNET_CREDENTIAL_CredentialResultProcessor) (void *cls,
86(*GNUNET_CREDENTIAL_LookupResultProcessor) (void *cls, 239 unsigned int d_count,
87 struct GNUNET_IDENTITY_Ego *issuer, 240 struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
88 uint16_t issuer_len, 241 unsigned int c_count,
89 const struct GNUNET_CREDENTIAL_Value *value); 242 struct GNUNET_CREDENTIAL_Credential *credential);
90 243
244/**
245 * Iterator called on obtained result for an attribute delegation.
246 *
247 * @param cls closure
248 * @param success GNUNET_YES if successful
249 * @param result the record data that can be handed to the subject
250 */
251typedef void (*GNUNET_CREDENTIAL_DelegateResultProcessor) (void *cls,
252 uint32_t success);
91 253
92/** 254/**
93 * Perform an asynchronous lookup operation for a credential. 255 * Iterator called on obtained result for an attribute delegation removal.
256 *
257 * @param cls closure
258 * @param success GNUNET_YES if successful
259 * @param result the record data that can be handed to the subject
260 */
261typedef void (*GNUNET_CREDENTIAL_RemoveDelegateResultProcessor) (void *cls,
262 uint32_t success);
263
264
265/**
266 * Performs attribute verification.
267 * Checks if there is a delegation chain from
268 * attribute ``issuer_attribute'' issued by the issuer
269 * with public key ``issuer_key'' maps to the attribute
270 * ``subject_attribute'' claimed by the subject with key
271 * ``subject_key''
94 * 272 *
95 * @param handle handle to the Credential service 273 * @param handle handle to the Credential service
96 * @param credential the credential to look up 274 * @param issuer_key the issuer public key
97 * @param subject Ego to check the credential for 275 * @param issuer_attribute the issuer attribute
276 * @param subject_key the subject public key
277 * @param subject_attribute the attribute claimed by the subject
98 * @param proc function to call on result 278 * @param proc function to call on result
99 * @param proc_cls closure for processor 279 * @param proc_cls closure for processor
100 * @return handle to the queued request 280 * @return handle to the queued request
101 */ 281 */
102struct GNUNET_CREDENTIAL_LookupRequest * 282struct GNUNET_CREDENTIAL_Request*
103GNUNET_CREDENTIAL_lookup (struct GNUNET_CREDENTIAL_Handle *handle, 283GNUNET_CREDENTIAL_verify (struct GNUNET_CREDENTIAL_Handle *handle,
104 const char *credential, 284 const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
105 const struct GNUNET_IDENTITY_Ego *subject, 285 const char *issuer_attribute,
106 GNUNET_CREDENTIAL_LookupResultProcessor proc, 286 const struct GNUNET_CRYPTO_EcdsaPublicKey *subject_key,
287 uint32_t credential_count,
288 const struct GNUNET_CREDENTIAL_Credential *credentials,
289 GNUNET_CREDENTIAL_CredentialResultProcessor proc,
107 void *proc_cls); 290 void *proc_cls);
108 291
292struct GNUNET_CREDENTIAL_Request*
293GNUNET_CREDENTIAL_collect (struct GNUNET_CREDENTIAL_Handle *handle,
294 const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
295 const char *issuer_attribute,
296 const struct GNUNET_CRYPTO_EcdsaPrivateKey *subject_key,
297 GNUNET_CREDENTIAL_CredentialResultProcessor proc,
298 void *proc_cls);
109 299
110/** 300/**
111 * Issue a credential to an identity 301 * Delegate an attribute
112 * 302 *
113 * @param handle handle to the Credential service 303 * @param handle handle to the Credential service
114 * @param issuer the identity that issues the credential 304 * @param issuer the ego that should be used to delegate the attribute
115 * @param subject the subject of the credential 305 * @param attribute the name of the attribute to delegate
116 * @param credential the name of the credential 306 * @param subject the subject of the delegation
117 * @param value the value of the credential 307 * @param delegated_attribute the name of the attribute that is delegated to
308 * @return handle to the queued request
309 */
310struct GNUNET_CREDENTIAL_Request *
311GNUNET_CREDENTIAL_add_delegation (struct GNUNET_CREDENTIAL_Handle *handle,
312 struct GNUNET_IDENTITY_Ego *issuer,
313 const char *attribute,
314 struct GNUNET_CRYPTO_EcdsaPublicKey *subject,
315 const char *delegated_attribute,
316 GNUNET_CREDENTIAL_DelegateResultProcessor proc,
317 void *proc_cls);
318
319/**
320 * Remove a delegation
321 *
322 * @param handle handle to the Credential service
323 * @param issuer the ego that was used to delegate the attribute
324 * @param attribute the name of the attribute that is delegated
118 * @return handle to the queued request 325 * @return handle to the queued request
119 */ 326 */
120struct GNUNET_CREDENTIAL_IssueRequest * 327struct GNUNET_CREDENTIAL_Request *
121GNUNET_CREDENTIAL_issue (struct GNUNET_CREDENTIAL_Handle *handle, 328GNUNET_CREDENTIAL_remove_delegation (struct GNUNET_CREDENTIAL_Handle *handle,
122 struct GNUNET_IDENTITY_Ego *issuer, 329 struct GNUNET_IDENTITY_Ego *issuer,
123 struct GNUNET_IDENTITY_Ego *subject, 330 const char *attribute,
124 const char *credential, 331 GNUNET_CREDENTIAL_RemoveDelegateResultProcessor proc,
125 struct GNUNET_CREDENTIAL_Value *value, 332 void *proc_cls);
126 GNUNET_CREDENTIAL_IssueResultProcessor proc, 333
127 void *proc_cls); 334
335
336/**
337 * Issue an attribute to a subject
338 *
339 * @param handle handle to the Credential service
340 * @param issuer the ego that should be used to issue the attribute
341 * @param subject the subject of the attribute
342 * @param attribute the name of the attribute
343 * @param expiration the TTL of the credential
344 * @return handle to the queued request
345 */
346struct GNUNET_CREDENTIAL_Credential*
347GNUNET_CREDENTIAL_credential_issue (
348 const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
349 struct GNUNET_CRYPTO_EcdsaPublicKey *subject,
350 const char *attribute,
351 struct GNUNET_TIME_Absolute *expiration);
352
128 353
129/** 354/**
130 * Remove a credential 355 * Remove a credential
@@ -135,14 +360,15 @@ GNUNET_CREDENTIAL_issue (struct GNUNET_CREDENTIAL_Handle *handle,
135 * @param credential the name of the credential 360 * @param credential the name of the credential
136 * @return handle to the queued request 361 * @return handle to the queued request
137 */ 362 */
138struct GNUNET_CREDENTIAL_IssueRequest * 363/**
139GNUNET_CREDENTIAL_remove (struct GNUNET_CREDENTIAL_Handle *handle, 364 struct GNUNET_CREDENTIAL_IssueRequest *
140 struct GNUNET_IDENTITY_Ego *issuer, 365 GNUNET_CREDENTIAL_remove (struct GNUNET_CREDENTIAL_Handle *handle,
141 struct GNUNET_IDENTITY_Ego *subject, 366 struct GNUNET_IDENTITY_Ego *issuer,
142 const char *credential, 367 struct GNUNET_IDENTITY_Ego *subject,
143 GNUNET_CREDENTIAL_IssueResultProcessor proc, 368 const char *credential,
144 void *proc_cls); 369 GNUNET_CREDENTIAL_IssueResultProcessor proc,
145 370 void *proc_cls);
371 */
146 372
147 373
148/** 374/**
@@ -151,7 +377,7 @@ GNUNET_CREDENTIAL_remove (struct GNUNET_CREDENTIAL_Handle *handle,
151 * @param lr the lookup request to cancel 377 * @param lr the lookup request to cancel
152 */ 378 */
153void 379void
154GNUNET_CREDENTIAL_lookup_cancel (struct GNUNET_CREDENTIAL_LookupRequest *lr); 380GNUNET_CREDENTIAL_request_cancel (struct GNUNET_CREDENTIAL_Request *vr);
155 381
156 382
157#if 0 /* keep Emacsens' auto-indent happy */ 383#if 0 /* keep Emacsens' auto-indent happy */
diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h
index e886a561c..2fd67ae1b 100644
--- a/src/include/gnunet_crypto_lib.h
+++ b/src/include/gnunet_crypto_lib.h
@@ -395,6 +395,11 @@ struct GNUNET_CRYPTO_PaillierCiphertext
395 unsigned char bits[GNUNET_CRYPTO_PAILLIER_BITS * 2 / 8]; 395 unsigned char bits[GNUNET_CRYPTO_PAILLIER_BITS * 2 / 8];
396}; 396};
397 397
398/**
399 * @brief type for ABE master keys
400 */
401struct GNUNET_CRYPTO_AbeMasterKey;
402
398 403
399/* **************** Functions and Macros ************* */ 404/* **************** Functions and Macros ************* */
400 405
@@ -2137,6 +2142,83 @@ GNUNET_CRYPTO_rsa_verify (const struct GNUNET_HashCode *hash,
2137 const struct GNUNET_CRYPTO_RsaPublicKey *public_key); 2142 const struct GNUNET_CRYPTO_RsaPublicKey *public_key);
2138 2143
2139 2144
2145/**
2146 * @ingroup crypto
2147 * Create a new CP-ABE master key. Caller must free return value.
2148 *
2149 * @return fresh private key; free using #GNUNET_free
2150 */
2151struct GNUNET_CRYPTO_AbeMasterKey *
2152GNUNET_CRYPTO_cpabe_create_master_key (void);
2153void
2154GNUNET_CRYPTO_cpabe_delete_master_key (struct GNUNET_CRYPTO_AbeMasterKey *key);
2155
2156/**
2157 * @ingroup crypto
2158 * Create a new CP-ABE key. Caller must free return value.
2159 *
2160 * @return fresh private key; free using #GNUNET_free
2161 */
2162struct GNUNET_CRYPTO_AbeKey *
2163GNUNET_CRYPTO_cpabe_create_key (struct GNUNET_CRYPTO_AbeMasterKey *msk,
2164 char **attrs);
2165void
2166GNUNET_CRYPTO_cpabe_delete_key (struct GNUNET_CRYPTO_AbeKey *key,
2167 int delete_pub);
2168
2169
2170/**
2171 * @ingroup crypto
2172 * Encrypt a block using sessionkey.
2173 *
2174 * @param block the block to encrypt
2175 * @param size the size of the @a block
2176 * @param sessionkey the key used to encrypt
2177 * @param iv the initialization vector to use, use INITVALUE
2178 * for streams.
2179 * @return the size of the encrypted block, -1 for errors
2180 */
2181ssize_t
2182GNUNET_CRYPTO_cpabe_encrypt (const void *block,
2183 size_t size,
2184 const char *policy,
2185 const struct GNUNET_CRYPTO_AbeMasterKey *key,
2186 void **result);
2187
2188/**
2189 * @ingroup crypto
2190 * Encrypt a block using sessionkey.
2191 *
2192 * @param block the block to encrypt
2193 * @param size the size of the @a block
2194 * @param sessionkey the key used to encrypt
2195 * @param iv the initialization vector to use, use INITVALUE
2196 * for streams.
2197 * @return the size of the encrypted block, -1 for errors
2198 */
2199ssize_t
2200GNUNET_CRYPTO_cpabe_decrypt (const void *block,
2201 size_t size,
2202 const struct GNUNET_CRYPTO_AbeKey *key,
2203 void **result);
2204
2205ssize_t
2206GNUNET_CRYPTO_cpabe_serialize_key (const struct GNUNET_CRYPTO_AbeKey *key,
2207 void **result);
2208
2209struct GNUNET_CRYPTO_AbeKey*
2210GNUNET_CRYPTO_cpabe_deserialize_key (const void *data,
2211 size_t len);
2212
2213ssize_t
2214GNUNET_CRYPTO_cpabe_serialize_master_key (const struct GNUNET_CRYPTO_AbeMasterKey *key,
2215 void **result);
2216
2217struct GNUNET_CRYPTO_AbeMasterKey*
2218GNUNET_CRYPTO_cpabe_deserialize_master_key (const void *data,
2219 size_t len);
2220
2221
2140#if 0 /* keep Emacsens' auto-indent happy */ 2222#if 0 /* keep Emacsens' auto-indent happy */
2141{ 2223{
2142#endif 2224#endif
diff --git a/src/include/gnunet_gnsrecord_lib.h b/src/include/gnunet_gnsrecord_lib.h
index 985ae1f7a..d03b4db3b 100644
--- a/src/include/gnunet_gnsrecord_lib.h
+++ b/src/include/gnunet_gnsrecord_lib.h
@@ -109,9 +109,29 @@ extern "C"
109#define GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA 65546 109#define GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA 65546
110 110
111/** 111/**
112 * Record type for credential
113 */
114#define GNUNET_GNSRECORD_TYPE_CREDENTIAL 65547
115
116/**
117 * Record type for policies
118 */
119#define GNUNET_GNSRECORD_TYPE_POLICY 65548
120
121/**
112 * Record type for reverse lookups 122 * Record type for reverse lookups
113 */ 123 */
114#define GNUNET_GNSRECORD_TYPE_REVERSE 65548 124#define GNUNET_GNSRECORD_TYPE_ATTRIBUTE 65549
125
126/**
127 * Record type for ABE records
128 */
129#define GNUNET_GNSRECORD_TYPE_ABE_KEY 65550
130
131/**
132 * Record type for ABE master keys
133 */
134#define GNUNET_GNSRECORD_TYPE_ABE_MASTER 65551
115 135
116/** 136/**
117 * Flags that can be set for a record. 137 * Flags that can be set for a record.
diff --git a/src/include/gnunet_identity_attribute_lib.h b/src/include/gnunet_identity_attribute_lib.h
new file mode 100644
index 000000000..039b50351
--- /dev/null
+++ b/src/include/gnunet_identity_attribute_lib.h
@@ -0,0 +1,231 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2017 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21/**
22 * @author Martin Schanzenbach
23 *
24 * @file
25 * Identity attribute definitions
26 *
27 * @defgroup identity-provider Identity Provider service
28 * @{
29 */
30#ifndef GNUNET_IDENTITY_ATTRIBUTE_LIB_H
31#define GNUNET_IDENTITY_ATTRIBUTE_LIB_H
32
33#ifdef __cplusplus
34extern "C"
35{
36#if 0 /* keep Emacsens' auto-indent happy */
37}
38#endif
39#endif
40
41#include "gnunet_util_lib.h"
42
43
44/**
45 * No value attribute.
46 */
47#define GNUNET_IDENTITY_ATTRIBUTE_TYPE_NONE 0
48
49/**
50 * String attribute.
51 */
52#define GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING 1
53
54
55
56/**
57 * An attribute.
58 */
59struct GNUNET_IDENTITY_ATTRIBUTE_Claim
60{
61 /**
62 * The name of the attribute. Note "name" must never be individually
63 * free'd
64 */
65 const char* name;
66
67 /**
68 * Type of Claim
69 */
70 uint32_t type;
71
72 /**
73 * Version
74 */
75 uint32_t version;
76
77 /**
78 * Number of bytes in @e data.
79 */
80 size_t data_size;
81
82 /**
83 * Binary value stored as attribute value. Note: "data" must never
84 * be individually 'malloc'ed, but instead always points into some
85 * existing data area.
86 */
87 const void *data;
88
89};
90
91struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList
92{
93 /**
94 * List head
95 */
96 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *list_head;
97
98 /**
99 * List tail
100 */
101 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *list_tail;
102};
103
104struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry
105{
106 /**
107 * DLL
108 */
109 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *prev;
110
111 /**
112 * DLL
113 */
114 struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *next;
115
116 /**
117 * The attribute claim
118 */
119 struct GNUNET_IDENTITY_ATTRIBUTE_Claim *claim;
120};
121
122/**
123 * Create a new attribute claim.
124 *
125 * @param name the attribute name
126 * @param type the attribute type
127 * @param data the attribute value
128 * @param data_size the attribute value size
129 * @return the new attribute
130 */
131struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
132GNUNET_IDENTITY_ATTRIBUTE_claim_new (const char* attr_name,
133 uint32_t type,
134 const void* data,
135 size_t data_size);
136
137
138/**
139 * Get required size for serialization buffer
140 *
141 * @param attrs the attribute list to serialize
142 *
143 * @return the required buffer size
144 */
145size_t
146GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
147
148void
149GNUNET_IDENTITY_ATTRIBUTE_list_destroy (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
150
151
152/**
153 * Serialize an attribute list
154 *
155 * @param attrs the attribute list to serialize
156 * @param result the serialized attribute
157 *
158 * @return length of serialized data
159 */
160size_t
161GNUNET_IDENTITY_ATTRIBUTE_list_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
162 char *result);
163
164/**
165 * Deserialize an attribute list
166 *
167 * @param data the serialized attribute list
168 * @param data_size the length of the serialized data
169 *
170 * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
171 */
172struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *
173GNUNET_IDENTITY_ATTRIBUTE_list_deserialize (const char* data,
174 size_t data_size);
175
176
177/**
178 * Get required size for serialization buffer
179 *
180 * @param attr the attribute to serialize
181 *
182 * @return the required buffer size
183 */
184size_t
185GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr);
186
187
188
189/**
190 * Serialize an attribute
191 *
192 * @param attr the attribute to serialize
193 * @param result the serialized attribute
194 *
195 * @return length of serialized data
196 */
197size_t
198GNUNET_IDENTITY_ATTRIBUTE_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
199 char *result);
200
201/**
202 * Deserialize an attribute
203 *
204 * @param data the serialized attribute
205 * @param data_size the length of the serialized data
206 *
207 * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
208 */
209struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
210GNUNET_IDENTITY_ATTRIBUTE_deserialize (const char* data,
211 size_t data_size);
212
213struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList*
214GNUNET_IDENTITY_ATTRIBUTE_list_dup (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
215
216
217
218#if 0 /* keep Emacsens' auto-indent happy */
219{
220#endif
221#ifdef __cplusplus
222}
223#endif
224
225
226/* ifndef GNUNET_IDENTITY_ATTRIBUTE_LIB_H */
227#endif
228
229/** @} */ /* end of group identity */
230
231/* end of gnunet_identity_attribute_lib.h */
diff --git a/src/include/gnunet_identity_attribute_plugin.h b/src/include/gnunet_identity_attribute_plugin.h
new file mode 100644
index 000000000..edeed57fd
--- /dev/null
+++ b/src/include/gnunet_identity_attribute_plugin.h
@@ -0,0 +1,149 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2012, 2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21/**
22 * @author Martin Schanzenbach
23 *
24 * @file
25 * Plugin API for the idp database backend
26 *
27 * @defgroup identity-provider-plugin IdP service plugin API
28 * Plugin API for the idp database backend
29 * @{
30 */
31#ifndef GNUNET_IDENTITY_ATTRIBUTE_PLUGIN_H
32#define GNUNET_IDENTITY_ATTRIBUTE_PLUGIN_H
33
34#include "gnunet_util_lib.h"
35#include "gnunet_identity_attribute_lib.h"
36
37#ifdef __cplusplus
38extern "C"
39{
40#if 0 /* keep Emacsens' auto-indent happy */
41}
42#endif
43#endif
44
45
46/**
47 * Function called to convert the binary value @a data of an attribute of
48 * type @a type to a human-readable string.
49 *
50 * @param cls closure
51 * @param type type of the attribute
52 * @param data value in binary encoding
53 * @param data_size number of bytes in @a data
54 * @return NULL on error, otherwise human-readable representation of the value
55 */
56typedef char * (*GNUNET_IDENTITY_ATTRIBUTE_ValueToStringFunction) (void *cls,
57 uint32_t type,
58 const void *data,
59 size_t data_size);
60
61
62/**
63 * Function called to convert human-readable version of the value @a s
64 * of an attribute of type @a type to the respective binary
65 * representation.
66 *
67 * @param cls closure
68 * @param type type of the attribute
69 * @param s human-readable string
70 * @param data set to value in binary encoding (will be allocated)
71 * @param data_size set to number of bytes in @a data
72 * @return #GNUNET_OK on success
73 */
74typedef int (*GNUNET_IDENTITY_ATTRIBUTE_StringToValueFunction) (void *cls,
75 uint32_t type,
76 const char *s,
77 void **data,
78 size_t *data_size);
79
80
81/**
82 * Function called to convert a type name to the
83 * corresponding number.
84 *
85 * @param cls closure
86 * @param typename name to convert
87 * @return corresponding number, UINT32_MAX on error
88 */
89typedef uint32_t (*GNUNET_IDENTITY_ATTRIBUTE_TypenameToNumberFunction) (void *cls,
90 const char *typename);
91
92
93/**
94 * Function called to convert a type number (i.e. 1) to the
95 * corresponding type string
96 *
97 * @param cls closure
98 * @param type number of a type to convert
99 * @return corresponding typestring, NULL on error
100 */
101typedef const char * (*GNUNET_IDENTITY_ATTRIBUTE_NumberToTypenameFunction) (void *cls,
102 uint32_t type);
103
104
105/**
106 * Each plugin is required to return a pointer to a struct of this
107 * type as the return value from its entry point.
108 */
109struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions
110{
111
112 /**
113 * Closure for all of the callbacks.
114 */
115 void *cls;
116
117 /**
118 * Conversion to string.
119 */
120 GNUNET_IDENTITY_ATTRIBUTE_ValueToStringFunction value_to_string;
121
122 /**
123 * Conversion to binary.
124 */
125 GNUNET_IDENTITY_ATTRIBUTE_StringToValueFunction string_to_value;
126
127 /**
128 * Typename to number.
129 */
130 GNUNET_IDENTITY_ATTRIBUTE_TypenameToNumberFunction typename_to_number;
131
132 /**
133 * Number to typename.
134 */
135 GNUNET_IDENTITY_ATTRIBUTE_NumberToTypenameFunction number_to_typename;
136
137};
138
139
140#if 0 /* keep Emacsens' auto-indent happy */
141{
142#endif
143#ifdef __cplusplus
144}
145#endif
146
147#endif
148
149/** @} */ /* end of group */
diff --git a/src/include/gnunet_identity_provider_plugin.h b/src/include/gnunet_identity_provider_plugin.h
new file mode 100644
index 000000000..4b5098d58
--- /dev/null
+++ b/src/include/gnunet_identity_provider_plugin.h
@@ -0,0 +1,123 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2012, 2013 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21/**
22 * @author Martin Schanzenbach
23 *
24 * @file
25 * Plugin API for the idp database backend
26 *
27 * @defgroup identity-provider-plugin IdP service plugin API
28 * Plugin API for the idp database backend
29 * @{
30 */
31#ifndef GNUNET_IDENTITY_PROVIDER_PLUGIN_H
32#define GNUNET_IDENTITY_PROVIDER_PLUGIN_H
33
34#include "gnunet_util_lib.h"
35#include "gnunet_identity_provider_service.h"
36
37#ifdef __cplusplus
38extern "C"
39{
40#if 0 /* keep Emacsens' auto-indent happy */
41}
42#endif
43#endif
44
45
46/**
47 * Function called by for each matching ticket.
48 *
49 * @param cls closure
50 * @param ticket the ticket
51 */
52typedef void (*GNUNET_IDENTITY_PROVIDER_TicketIterator) (void *cls,
53 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
54 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
55
56
57/**
58 * @brief struct returned by the initialization function of the plugin
59 */
60struct GNUNET_IDENTITY_PROVIDER_PluginFunctions
61{
62
63 /**
64 * Closure to pass to all plugin functions.
65 */
66 void *cls;
67
68 /**
69 * Store a ticket in the database.
70 *
71 * @param cls closure (internal context for the plugin)
72 * @param ticket the ticket to store
73 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
74 */
75 int (*store_ticket) (void *cls,
76 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
77 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
78
79 /**
80 * Delete a ticket from the database.
81 *
82 * @param cls closure (internal context for the plugin)
83 * @param ticket the ticket to store
84 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
85 */
86 int (*delete_ticket) (void *cls,
87 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
88
89
90
91 /**
92 * Iterate over all tickets
93 *
94 * @param cls closure (internal context for the plugin)
95 * @param identity the identity
96 * @param audience GNUNET_YES if the identity is the audience of the ticket
97 * else it is considered the issuer
98 * @param iter function to call with the result
99 * @param iter_cls closure for @a iter
100 * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
101 */
102 int (*iterate_tickets) (void *cls,
103 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
104 int audience,
105 uint64_t offset,
106 GNUNET_IDENTITY_PROVIDER_TicketIterator iter, void *iter_cls);
107
108 int (*get_ticket_attributes) (void* cls,
109 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
110 GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
111 void *iter_cls);
112};
113
114#if 0 /* keep Emacsens' auto-indent happy */
115{
116#endif
117#ifdef __cplusplus
118}
119#endif
120
121#endif
122
123/** @} */ /* end of group */
diff --git a/src/include/gnunet_identity_provider_service.h b/src/include/gnunet_identity_provider_service.h
index e533f6f8c..6bc05d0f4 100644
--- a/src/include/gnunet_identity_provider_service.h
+++ b/src/include/gnunet_identity_provider_service.h
@@ -39,7 +39,7 @@ extern "C"
39#endif 39#endif
40 40
41#include "gnunet_util_lib.h" 41#include "gnunet_util_lib.h"
42 42#include "gnunet_identity_attribute_lib.h"
43 43
44/** 44/**
45 * Version number of GNUnet Identity Provider API. 45 * Version number of GNUnet Identity Provider API.
@@ -57,169 +57,309 @@ struct GNUNET_IDENTITY_PROVIDER_Handle;
57struct GNUNET_IDENTITY_PROVIDER_Token; 57struct GNUNET_IDENTITY_PROVIDER_Token;
58 58
59/** 59/**
60 * Handle for a ticket 60 * The ticket
61 */ 61 */
62struct GNUNET_IDENTITY_PROVIDER_Ticket; 62struct GNUNET_IDENTITY_PROVIDER_Ticket
63{
64 /**
65 * The ticket issuer
66 */
67 struct GNUNET_CRYPTO_EcdsaPublicKey identity;
68
69 /**
70 * The ticket audience
71 */
72 struct GNUNET_CRYPTO_EcdsaPublicKey audience;
73
74 /**
75 * The ticket random (NBO)
76 */
77 uint64_t rnd;
78};
63 79
64/** 80/**
65 * Handle for an operation with the identity provider service. 81 * Handle for an operation with the identity provider service.
66 */ 82 */
67struct GNUNET_IDENTITY_PROVIDER_Operation; 83struct GNUNET_IDENTITY_PROVIDER_Operation;
68 84
85
69/** 86/**
70 * Method called when a token has been exchanged for a ticket. 87 * Connect to the identity provider service.
71 * On success returns a token
72 * 88 *
73 * @param cls closure 89 * @param cfg Configuration to contact the identity provider service.
74 * @param token the token 90 * @return handle to communicate with identity provider service
75 */ 91 */
76typedef void 92struct GNUNET_IDENTITY_PROVIDER_Handle *
77(*GNUNET_IDENTITY_PROVIDER_ExchangeCallback)(void *cls, 93GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
78 const struct GNUNET_IDENTITY_PROVIDER_Token *token,
79 uint64_t ticket_nonce);
80 94
81/** 95/**
82 * Method called when a token has been issued. 96 * Continuation called to notify client about result of the
83 * On success returns a ticket that can be given to the audience to retrive the 97 * operation.
84 * token
85 * 98 *
86 * @param cls closure 99 * @param cls closure
87 * @param grant the label in GNS pointing to the token 100 * @param success #GNUNET_SYSERR on failure (including timeout/queue drop/failure to validate)
88 * @param ticket the ticket 101 * #GNUNET_NO if content was already there or not found
89 * @param token the issued token 102 * #GNUNET_YES (or other positive value) on success
90 * @param name name assigned by the user for this ego, 103 * @param emsg NULL on success, otherwise an error message
91 * NULL if the user just deleted the ego and it
92 * must thus no longer be used
93 */ 104 */
94typedef void 105typedef void
95(*GNUNET_IDENTITY_PROVIDER_IssueCallback)(void *cls, 106(*GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus) (void *cls,
96 const char *grant, 107 int32_t success,
97 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket, 108 const char *emsg);
98 const struct GNUNET_IDENTITY_PROVIDER_Token *token);
99 109
100 110
101/** 111/**
102 * Connect to the identity provider service. 112 * Store an attribute. If the attribute is already present,
113 * it is replaced with the new attribute.
103 * 114 *
104 * @param cfg Configuration to contact the identity provider service. 115 * @param h handle to the identity provider
105 * @return handle to communicate with identity provider service 116 * @param pkey private key of the identity
117 * @param attr the attribute
118 * @param cont continuation to call when done
119 * @param cont_cls closure for @a cont
120 * @return handle to abort the request
106 */ 121 */
107struct GNUNET_IDENTITY_PROVIDER_Handle * 122struct GNUNET_IDENTITY_PROVIDER_Operation *
108GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); 123GNUNET_IDENTITY_PROVIDER_attribute_store (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
124 const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
125 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
126 GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cont,
127 void *cont_cls);
109 128
110 129
111/** 130/**
112 * Issue a token for a specific audience. 131 * Process an attribute that was stored in the idp.
113 * 132 *
114 * @param id identity provider service to use 133 * @param cls closure
115 * @param iss issuer (identity) 134 * @param attr the attribute
116 * @param aud audience (identity)
117 * @param scope the identity attributes requested, comman separated
118 * @param expiration the token expiration
119 * @param nonce the nonce that will be included in token and ticket
120 * @param cb callback to call with result
121 * @param cb_cls closure
122 * @return handle to abort the operation
123 */ 135 */
124struct GNUNET_IDENTITY_PROVIDER_Operation * 136typedef void
125GNUNET_IDENTITY_PROVIDER_issue_token (struct GNUNET_IDENTITY_PROVIDER_Handle *id, 137(*GNUNET_IDENTITY_PROVIDER_AttributeResult) (void *cls,
126 const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss_key, 138 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
127 const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key, 139 const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr);
128 const char* scope, 140
129 struct GNUNET_TIME_Absolute expiration,
130 uint64_t nonce,
131 GNUNET_IDENTITY_PROVIDER_IssueCallback cb,
132 void *cb_cls);
133 141
134 142
135/** 143/**
136 * Exchange a ticket for a token. Intended to be used by audience that 144 * List all attributes for a local identity.
137 * received a ticket. 145 * This MUST lock the `struct GNUNET_IDENTITY_PROVIDER_Handle`
146 * for any other calls than #GNUNET_IDENTITY_PROVIDER_get_attributes_next() and
147 * #GNUNET_IDENTITY_PROVIDER_get_attributes_stop. @a proc will be called once
148 * immediately, and then again after
149 * #GNUNET_IDENTITY_PROVIDER_get_attributes_next() is invoked.
138 * 150 *
139 * @param id identity provider service to use 151 * On error (disconnect), @a error_cb will be invoked.
140 * @param ticket the ticket to exchange 152 * On normal completion, @a finish_cb proc will be
141 * @param aud_privkey the audience of the ticket 153 * invoked.
142 * @param cont function to call once the operation finished 154 *
143 * @param cont_cls closure for @a cont 155 * @param h handle to the idp
144 * @return handle to abort the operation 156 * @param identity identity to access
157 * @param error_cb function to call on error (i.e. disconnect),
158 * the handle is afterwards invalid
159 * @param error_cb_cls closure for @a error_cb
160 * @param proc function to call on each attribute; it
161 * will be called repeatedly with a value (if available)
162 * @param proc_cls closure for @a proc
163 * @param finish_cb function to call on completion
164 * the handle is afterwards invalid
165 * @param finish_cb_cls closure for @a finish_cb
166 * @return an iterator handle to use for iteration
145 */ 167 */
146struct GNUNET_IDENTITY_PROVIDER_Operation * 168struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *
147GNUNET_IDENTITY_PROVIDER_exchange_ticket (struct GNUNET_IDENTITY_PROVIDER_Handle *id, 169GNUNET_IDENTITY_PROVIDER_get_attributes_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
148 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket, 170 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
149 const struct GNUNET_CRYPTO_EcdsaPrivateKey *aud_privkey, 171 GNUNET_SCHEDULER_TaskCallback error_cb,
150 GNUNET_IDENTITY_PROVIDER_ExchangeCallback cont, 172 void *error_cb_cls,
151 void *cont_cls); 173 GNUNET_IDENTITY_PROVIDER_AttributeResult proc,
174 void *proc_cls,
175 GNUNET_SCHEDULER_TaskCallback finish_cb,
176 void *finish_cb_cls);
152 177
153 178
154/** 179/**
155 * Disconnect from identity provider service. 180 * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_get_attributes_start
181 * for the next record.
156 * 182 *
157 * @param h identity provider service to disconnect 183 * @param it the iterator
158 */ 184 */
159void 185void
160GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h); 186GNUNET_IDENTITY_PROVIDER_get_attributes_next (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it);
161 187
162 188
163/** 189/**
164 * Cancel an identity provider operation. Note that the operation MAY still 190 * Stops iteration and releases the idp handle for further calls. Must
165 * be executed; this merely cancels the continuation; if the request 191 * be called on any iteration that has not yet completed prior to calling
166 * was already transmitted, the service may still choose to complete 192 * #GNUNET_IDENTITY_PROVIDER_disconnect.
167 * the operation.
168 * 193 *
169 * @param op operation to cancel 194 * @param it the iterator
170 */ 195 */
171void 196void
172GNUNET_IDENTITY_PROVIDER_cancel (struct GNUNET_IDENTITY_PROVIDER_Operation *op); 197GNUNET_IDENTITY_PROVIDER_get_attributes_stop (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it);
173 198
174 199
175/** 200/**
176 * Convenience API 201 * Method called when a token has been issued.
202 * On success returns a ticket that can be given to the audience to retrive the
203 * token
204 *
205 * @param cls closure
206 * @param ticket the ticket
177 */ 207 */
208typedef void
209(*GNUNET_IDENTITY_PROVIDER_TicketCallback)(void *cls,
210 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
178 211
179/** 212/**
180 * Destroy token 213 * Issues a ticket to another identity. The identity may use
214 * @GNUNET_IDENTITY_PROVIDER_authorization_ticket_consume to consume the ticket
215 * and retrieve the attributes specified in the AttributeList.
181 * 216 *
182 * @param token the token 217 * @param id the identity provider to use
218 * @param iss the issuing identity
219 * @param rp the subject of the ticket (the relying party)
220 * @param attr the attributes that the relying party is given access to
221 * @param cb the callback
222 * @param cb_cls the callback closure
223 * @return handle to abort the operation
183 */ 224 */
184void 225struct GNUNET_IDENTITY_PROVIDER_Operation *
185GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token); 226GNUNET_IDENTITY_PROVIDER_ticket_issue (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
227 const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
228 const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
229 const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
230 GNUNET_IDENTITY_PROVIDER_TicketCallback cb,
231 void *cb_cls);
186 232
187/** 233/**
188 * Returns string representation of token. A JSON-Web-Token. 234 * Revoked an issued ticket. The relying party will be unable to retrieve
235 * updated attributes.
189 * 236 *
190 * @param token the token 237 * @param id the identity provider to use
191 * @return The JWT (must be freed) 238 * @param identity the issuing identity
239 * @param ticket the ticket to revoke
240 * @param cb the callback
241 * @param cb_cls the callback closure
242 * @return handle to abort the operation
192 */ 243 */
193char * 244struct GNUNET_IDENTITY_PROVIDER_Operation *
194GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token); 245GNUNET_IDENTITY_PROVIDER_ticket_revoke (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
246 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
247 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
248 GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cb,
249 void *cb_cls);
250
251
195 252
196/** 253/**
197 * Returns string representation of ticket. Base64-Encoded 254 * Consumes an issued ticket. The ticket is persisted
255 * and used to retrieve identity information from the issuer
198 * 256 *
199 * @param ticket the ticket 257 * @param id the identity provider to use
200 * @return the Base64-Encoded ticket 258 * @param identity the identity that is the subject of the issued ticket (the audience)
259 * @param ticket the issued ticket to consume
260 * @param cb the callback to call
261 * @param cb_cls the callback closure
262 * @return handle to abort the operation
263 */
264struct GNUNET_IDENTITY_PROVIDER_Operation *
265GNUNET_IDENTITY_PROVIDER_ticket_consume (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
266 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
267 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
268 GNUNET_IDENTITY_PROVIDER_AttributeResult cb,
269 void *cb_cls);
270
271/**
272 * Lists all tickets that have been issued to remote
273 * identites (relying parties)
274 *
275 * @param h the identity provider to use
276 * @param identity the issuing identity
277 * @param error_cb function to call on error (i.e. disconnect),
278 * the handle is afterwards invalid
279 * @param error_cb_cls closure for @a error_cb
280 * @param proc function to call on each ticket; it
281 * will be called repeatedly with a value (if available)
282 * @param proc_cls closure for @a proc
283 * @param finish_cb function to call on completion
284 * the handle is afterwards invalid
285 * @param finish_cb_cls closure for @a finish_cb
286 * @return an iterator handle to use for iteration
287 */
288struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
289GNUNET_IDENTITY_PROVIDER_ticket_iteration_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
290 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
291 GNUNET_SCHEDULER_TaskCallback error_cb,
292 void *error_cb_cls,
293 GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
294 void *proc_cls,
295 GNUNET_SCHEDULER_TaskCallback finish_cb,
296 void *finish_cb_cls);
297
298/**
299 * Lists all tickets that have been issued to remote
300 * identites (relying parties)
301 *
302 * @param id the identity provider to use
303 * @param identity the issuing identity
304 * @param error_cb function to call on error (i.e. disconnect),
305 * the handle is afterwards invalid
306 * @param error_cb_cls closure for @a error_cb
307 * @param proc function to call on each ticket; it
308 * will be called repeatedly with a value (if available)
309 * @param proc_cls closure for @a proc
310 * @param finish_cb function to call on completion
311 * the handle is afterwards invalid
312 * @param finish_cb_cls closure for @a finish_cb
313 * @return an iterator handle to use for iteration
201 */ 314 */
202char * 315struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
203GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket); 316GNUNET_IDENTITY_PROVIDER_ticket_iteration_start_rp (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
317 const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
318 GNUNET_SCHEDULER_TaskCallback error_cb,
319 void *error_cb_cls,
320 GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
321 void *proc_cls,
322 GNUNET_SCHEDULER_TaskCallback finish_cb,
323 void *finish_cb_cls);
204 324
205/** 325/**
206 * Created a ticket from a string (Base64 encoded ticket) 326 * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_ticket_iteration_start
327 * for the next record.
207 * 328 *
208 * @param input Base64 encoded ticket 329 * @param it the iterator
209 * @param ticket pointer where the ticket is stored
210 * @return GNUNET_OK
211 */ 330 */
212int 331void
213GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input, 332GNUNET_IDENTITY_PROVIDER_ticket_iteration_next (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it);
214 struct GNUNET_IDENTITY_PROVIDER_Ticket **ticket);
215 333
216/** 334/**
217 * Destroys a ticket 335 * Stops iteration and releases the idp handle for further calls. Must
336 * be called on any iteration that has not yet completed prior to calling
337 * #GNUNET_IDENTITY_PROVIDER_disconnect.
218 * 338 *
219 * @param ticket the ticket to destroy 339 * @param it the iterator
220 */ 340 */
221void 341void
222GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket); 342GNUNET_IDENTITY_PROVIDER_ticket_iteration_stop (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it);
343
344/**
345 * Disconnect from identity provider service.
346 *
347 * @param h identity provider service to disconnect
348 */
349void
350GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h);
351
352
353/**
354 * Cancel an identity provider operation. Note that the operation MAY still
355 * be executed; this merely cancels the continuation; if the request
356 * was already transmitted, the service may still choose to complete
357 * the operation.
358 *
359 * @param op operation to cancel
360 */
361void
362GNUNET_IDENTITY_PROVIDER_cancel (struct GNUNET_IDENTITY_PROVIDER_Operation *op);
223 363
224#if 0 /* keep Emacsens' auto-indent happy */ 364#if 0 /* keep Emacsens' auto-indent happy */
225{ 365{
diff --git a/src/include/gnunet_jsonapi_lib.h b/src/include/gnunet_jsonapi_lib.h
index f95bff836..2f6b810f0 100644
--- a/src/include/gnunet_jsonapi_lib.h
+++ b/src/include/gnunet_jsonapi_lib.h
@@ -248,7 +248,7 @@ GNUNET_JSONAPI_resource_check_id (const struct GNUNET_JSONAPI_Resource *resource
248 * @param res the JSON resource 248 * @param res the JSON resource
249 * @return the resource id 249 * @return the resource id
250 */ 250 */
251char* 251const char*
252GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource); 252GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource);
253 253
254 254
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 72054913f..6710d749f 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -2620,13 +2620,47 @@ extern "C"
2620 * 2620 *
2621 * IDENTITY PROVIDER MESSAGE TYPES 2621 * IDENTITY PROVIDER MESSAGE TYPES
2622 */ 2622 */
2623#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE 961 2623#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE 961
2624 2624
2625#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE 962 2625#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE_RESPONSE 962
2626 2626
2627#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT 963 2627#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_START 963
2628 2628
2629#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT 964 2629#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP 964
2630
2631#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT 965
2632
2633#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT 966
2634
2635#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_TICKET 967
2636
2637#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT 968
2638
2639#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET 969
2640
2641#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT 970
2642
2643#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET 971
2644
2645#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT 972
2646
2647#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START 973
2648
2649#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP 974
2650
2651#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT 975
2652
2653/**************************************************
2654 *
2655 * CREDENTIAL MESSAGE TYPES
2656 */
2657#define GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY 981
2658
2659#define GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT 982
2660
2661#define GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT 983
2662
2663#define GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT_RESULT 984
2630 2664
2631/******************************************************************************/ 2665/******************************************************************************/
2632 2666
diff --git a/src/include/gnunet_signatures.h b/src/include/gnunet_signatures.h
index c1e0d005c..03bc4575e 100644
--- a/src/include/gnunet_signatures.h
+++ b/src/include/gnunet_signatures.h
@@ -185,6 +185,11 @@ extern "C"
185 */ 185 */
186#define GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET 27 186#define GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET 27
187 187
188/**
189 * Signature for a GNUnet credential
190 */
191#define GNUNET_SIGNATURE_PURPOSE_CREDENTIAL 28
192
188#if 0 /* keep Emacsens' auto-indent happy */ 193#if 0 /* keep Emacsens' auto-indent happy */
189{ 194{
190#endif 195#endif
diff --git a/src/jsonapi/jsonapi_document.c b/src/jsonapi/jsonapi_document.c
index 600b7ee6a..3a60940f6 100644
--- a/src/jsonapi/jsonapi_document.c
+++ b/src/jsonapi/jsonapi_document.c
@@ -332,28 +332,20 @@ GNUNET_JSONAPI_document_to_json (const struct GNUNET_JSONAPI_Document *doc,
332 GNUNET_JSONAPI_KEY_ERRORS, 332 GNUNET_JSONAPI_KEY_ERRORS,
333 res_json); 333 res_json);
334 } else { 334 } else {
335 switch (doc->res_count) 335 if (0 == doc->res_count)
336 { 336 {
337 case 0: 337 res_json = json_null();
338 res_json = json_null(); 338 } else {
339 break; 339 res_json = json_array ();
340 case 1: 340 for (res = doc->res_list_head;
341 res != NULL;
342 res = res->next)
343 {
341 GNUNET_assert (GNUNET_OK == 344 GNUNET_assert (GNUNET_OK ==
342 GNUNET_JSONAPI_resource_to_json (doc->res_list_head, 345 GNUNET_JSONAPI_resource_to_json (res,
343 &res_json)); 346 &res_json_tmp));
344 break; 347 json_array_append_new (res_json, res_json_tmp);
345 default: 348 }
346 res_json = json_array ();
347 for (res = doc->res_list_head;
348 res != NULL;
349 res = res->next)
350 {
351 GNUNET_assert (GNUNET_OK ==
352 GNUNET_JSONAPI_resource_to_json (res,
353 &res_json_tmp));
354 json_array_append (res_json, res_json_tmp);
355 }
356 break;
357 } 349 }
358 json_object_set_new (*root_json, 350 json_object_set_new (*root_json,
359 GNUNET_JSONAPI_KEY_DATA, 351 GNUNET_JSONAPI_KEY_DATA,
diff --git a/src/jsonapi/jsonapi_resource.c b/src/jsonapi/jsonapi_resource.c
index 85bca10ee..be28ad5df 100644
--- a/src/jsonapi/jsonapi_resource.c
+++ b/src/jsonapi/jsonapi_resource.c
@@ -92,9 +92,9 @@ GNUNET_JSONAPI_resource_new (const char *type, const char *id)
92{ 92{
93 struct GNUNET_JSONAPI_Resource *res; 93 struct GNUNET_JSONAPI_Resource *res;
94 94
95 if ( (NULL == type) || (0 == strlen (type)) ) 95 if (NULL == type)
96 return NULL; 96 return NULL;
97 if ( (NULL == id) || (0 == strlen (id)) ) 97 if (NULL == id)
98 return NULL; 98 return NULL;
99 99
100 res = GNUNET_new (struct GNUNET_JSONAPI_Resource); 100 res = GNUNET_new (struct GNUNET_JSONAPI_Resource);
@@ -245,7 +245,7 @@ GNUNET_JSONAPI_resource_check_id (const struct GNUNET_JSONAPI_Resource *resource
245 * @param res the JSON resource 245 * @param res the JSON resource
246 * @return the resource id 246 * @return the resource id
247 */ 247 */
248char* 248const char*
249GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource) 249GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource)
250{ 250{
251 return resource->id; 251 return resource->id;
diff --git a/src/namestore/plugin_rest_namestore.c b/src/namestore/plugin_rest_namestore.c
index 50957a5b4..05776801b 100644
--- a/src/namestore/plugin_rest_namestore.c
+++ b/src/namestore/plugin_rest_namestore.c
@@ -401,11 +401,16 @@ namestore_list_finished (void *cls)
401 struct MHD_Response *resp; 401 struct MHD_Response *resp;
402 402
403 handle->list_it = NULL; 403 handle->list_it = NULL;
404 if (NULL == handle->resp_object)
405 handle->resp_object = GNUNET_JSONAPI_document_new ();
406
404 if (GNUNET_SYSERR == 407 if (GNUNET_SYSERR ==
405 GNUNET_JSONAPI_document_serialize (handle->resp_object, 408 GNUNET_JSONAPI_document_serialize (handle->resp_object,
406 &result)) 409 &result))
407 { 410 {
408 do_error (handle); 411 handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
412 GNUNET_SCHEDULER_add_now (&do_error,
413 handle);
409 return; 414 return;
410 } 415 }
411 resp = GNUNET_REST_create_response (result); 416 resp = GNUNET_REST_create_response (result);
@@ -467,10 +472,10 @@ namestore_list_response (void *cls,
467 if (0 < json_array_size(result_array)) 472 if (0 < json_array_size(result_array))
468 { 473 {
469 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_NAMESTORE_TYPEINFO, 474 json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_NAMESTORE_TYPEINFO,
470 rname); 475 rname);
471 GNUNET_JSONAPI_resource_add_attr (json_resource, 476 GNUNET_JSONAPI_resource_add_attr (json_resource,
472 GNUNET_REST_JSONAPI_NAMESTORE_RECORD, 477 GNUNET_REST_JSONAPI_NAMESTORE_RECORD,
473 result_array); 478 result_array);
474 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource); 479 GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
475 } 480 }
476 481
@@ -767,8 +772,8 @@ namestore_create_cont (struct GNUNET_REST_RequestHandle *con,
767 } 772 }
768 term_data[handle->rest_handle->data_size] = '\0'; 773 term_data[handle->rest_handle->data_size] = '\0';
769 GNUNET_memcpy (term_data, 774 GNUNET_memcpy (term_data,
770 handle->rest_handle->data, 775 handle->rest_handle->data,
771 handle->rest_handle->data_size); 776 handle->rest_handle->data_size);
772 data_js = json_loads (term_data, 777 data_js = json_loads (term_data,
773 JSON_DECODE_ANY, 778 JSON_DECODE_ANY,
774 &err); 779 &err);
@@ -902,7 +907,7 @@ namestore_zkey_cont (struct GNUNET_REST_RequestHandle *con,
902 if ((NULL == handle->zkey_str) || 907 if ((NULL == handle->zkey_str) ||
903 (GNUNET_OK != 908 (GNUNET_OK !=
904 GNUNET_CRYPTO_ecdsa_public_key_from_string (handle->zkey_str, 909 GNUNET_CRYPTO_ecdsa_public_key_from_string (handle->zkey_str,
905 strlen (handle->zkey_str), 910 strlen (handle->zkey_str),
906 &pubkey))) 911 &pubkey)))
907 { 912 {
908 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 913 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1021,13 +1026,13 @@ identity_cb (void *cls,
1021 1026
1022 if (GNUNET_OK != 1027 if (GNUNET_OK !=
1023 GNUNET_JSONAPI_handle_request (handle->rest_handle, 1028 GNUNET_JSONAPI_handle_request (handle->rest_handle,
1024 handlers, 1029 handlers,
1025 &err, 1030 &err,
1026 handle)) 1031 handle))
1027 { 1032 {
1028 handle->response_code = err.error_code; 1033 handle->response_code = err.error_code;
1029 GNUNET_SCHEDULER_add_now (&do_error, 1034 GNUNET_SCHEDULER_add_now (&do_error,
1030 (void *) handle); 1035 (void *) handle);
1031 } 1036 }
1032} 1037}
1033 1038
diff --git a/src/rest/rest.conf b/src/rest/rest.conf
index 6cd013345..b86e6c1a0 100644
--- a/src/rest/rest.conf
+++ b/src/rest/rest.conf
@@ -1,4 +1,5 @@
1[rest] 1[rest]
2UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-rest.sock
2BINARY=gnunet-rest-server 3BINARY=gnunet-rest-server
3REST_PORT=7776 4REST_PORT=7776
4REST_ALLOW_HEADERS=Authorization,Accept,Content-Type 5REST_ALLOW_HEADERS=Authorization,Accept,Content-Type
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index c26e3e84b..cc9ff4745 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -119,11 +119,22 @@ libgnunetutil_la_LIBADD = \
119 $(LTLIBINTL) \ 119 $(LTLIBINTL) \
120 -lltdl $(Z_LIBS) -lunistring $(XLIB) 120 -lltdl $(Z_LIBS) -lunistring $(XLIB)
121 121
122if HAVE_PBC
123if HAVE_ABE
124libgnunetutil_la_SOURCES += \
125 crypto_abe.c
126libgnunetutil_la_LIBADD += \
127 $(ABE_LIBADD) \
128 -lgabe \
129 -lpbc \
130 -lglib-2.0
131endif
132endif
133
122libgnunetutil_la_LDFLAGS = \ 134libgnunetutil_la_LDFLAGS = \
123 $(GN_LIB_LDFLAGS) \ 135 $(GN_LIB_LDFLAGS) \
124 -version-info 13:0:0 136 -version-info 13:0:0
125 137
126
127libgnunetutil_taler_wallet_la_SOURCES = \ 138libgnunetutil_taler_wallet_la_SOURCES = \
128 common_allocation.c \ 139 common_allocation.c \
129 common_endian.c \ 140 common_endian.c \
@@ -553,6 +564,17 @@ test_speedup_SOURCES = \
553test_speedup_LDADD = \ 564test_speedup_LDADD = \
554 libgnunetutil.la 565 libgnunetutil.la
555 566
567if HAVE_PBC
568if HAVE_ABE
569test_crypto_abe_SOURCES = \
570 test_crypto_abe.c
571test_crypto_abe_LDADD = \
572 libgnunetutil.la
573check_PROGRAMS += \
574 test_crypto_abe
575endif
576endif
577
556perf_crypto_hash_SOURCES = \ 578perf_crypto_hash_SOURCES = \
557 perf_crypto_hash.c 579 perf_crypto_hash.c
558perf_crypto_hash_LDADD = \ 580perf_crypto_hash_LDADD = \
diff --git a/src/util/crypto_abe.c b/src/util/crypto_abe.c
new file mode 100644
index 000000000..fcaa826ed
--- /dev/null
+++ b/src/util/crypto_abe.c
@@ -0,0 +1,416 @@
1/*
2 This file is part of GNUnet. Copyright (C) 2001-2014 Christian Grothoff
3 (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19
20*/
21
22/**
23 * @file util/crypto_random.c
24 * @brief functions to gather random numbers
25 * @author Christian Grothoff
26 */
27
28
29#include "platform.h"
30#include <pbc/pbc.h>
31#include <gabe.h>
32
33#include "gnunet_crypto_lib.h"
34
35struct GNUNET_CRYPTO_AbeMasterKey
36{
37 gabe_pub_t* pub;
38 gabe_msk_t* msk;
39};
40
41struct GNUNET_CRYPTO_AbeKey
42{
43 gabe_pub_t* pub;
44 gabe_prv_t* prv;
45};
46
47static int
48init_aes( element_t k, int enc,
49 gcry_cipher_hd_t* handle,
50 struct GNUNET_CRYPTO_SymmetricSessionKey *key,
51 unsigned char* iv)
52{
53 int rc;
54 int key_len;
55 unsigned char* key_buf;
56
57 key_len = element_length_in_bytes(k) < 33 ? 3 : element_length_in_bytes(k);
58 key_buf = (unsigned char*) malloc(key_len);
59 element_to_bytes(key_buf, k);
60
61 memcpy (key->aes_key, key_buf, GNUNET_CRYPTO_AES_KEY_LENGTH);
62 GNUNET_assert (0 ==
63 gcry_cipher_open (handle, GCRY_CIPHER_AES256,
64 GCRY_CIPHER_MODE_CFB, 0));
65 rc = gcry_cipher_setkey (*handle,
66 key->aes_key,
67 sizeof (key->aes_key));
68 GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
69 memset (iv, 0, 16); //TODO make reasonable
70 rc = gcry_cipher_setiv (*handle,
71 iv,
72 16);
73 GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
74
75 free(key_buf);
76 return rc;
77}
78
79static int
80aes_128_cbc_encrypt( char* pt,
81 int size,
82 element_t k,
83 char **ct )
84{
85 gcry_cipher_hd_t handle;
86 struct GNUNET_CRYPTO_SymmetricSessionKey skey;
87 unsigned char iv[16];
88 char* buf;
89 int padding;
90 int buf_size;
91 uint8_t len[4];
92 init_aes(k, 1, &handle, &skey, iv);
93
94 /* TODO make less crufty */
95
96 /* stuff in real length (big endian) before padding */
97 len[0] = (size & 0xff000000)>>24;
98 len[1] = (size & 0xff0000)>>16;
99 len[2] = (size & 0xff00)>>8;
100 len[3] = (size & 0xff)>>0;
101 padding = 16 - ((4+size) % 16);
102 buf_size = 4 + size + padding;
103 buf = GNUNET_malloc (buf_size);
104 GNUNET_memcpy (buf, len, 4);
105 GNUNET_memcpy (buf+4, pt, size);
106 *ct = GNUNET_malloc (buf_size);
107
108 GNUNET_assert (0 == gcry_cipher_encrypt (handle, *ct, buf_size, buf, buf_size));
109 gcry_cipher_close (handle);
110 //AES_cbc_encrypt(pt->data, ct->data, pt->len, &key, iv, AES_ENCRYPT);
111 GNUNET_free (buf);
112 return buf_size;
113}
114
115static int
116aes_128_cbc_decrypt( char* ct,
117 int size,
118 element_t k,
119 char **pt )
120{
121 struct GNUNET_CRYPTO_SymmetricSessionKey skey;
122 gcry_cipher_hd_t handle;
123 unsigned char iv[16];
124 char* tmp;
125 uint32_t len;
126
127 init_aes(k, 1, &handle, &skey, iv);
128
129 tmp = GNUNET_malloc (size);
130
131 //AES_cbc_encrypt(ct->data, pt->data, ct->len, &key, iv, AES_DECRYPT);
132 GNUNET_assert (0 == gcry_cipher_decrypt (handle, tmp, size, ct, size));
133 gcry_cipher_close (handle);
134 /* TODO make less crufty */
135
136 /* get real length */
137 len = 0;
138 len = len
139 | ((tmp[0])<<24) | ((tmp[1])<<16)
140 | ((tmp[2])<<8) | ((tmp[3])<<0);
141 /* truncate any garbage from the padding */
142 *pt = GNUNET_malloc (len);
143 GNUNET_memcpy (*pt, tmp+4, len);
144 GNUNET_free (tmp);
145 return len;
146}
147
148struct GNUNET_CRYPTO_AbeMasterKey*
149GNUNET_CRYPTO_cpabe_create_master_key (void)
150{
151 struct GNUNET_CRYPTO_AbeMasterKey* key;
152 key = GNUNET_new (struct GNUNET_CRYPTO_AbeMasterKey);
153 gabe_setup(&key->pub, &key->msk);
154 GNUNET_assert (NULL != key->pub);
155 GNUNET_assert (NULL != key->msk);
156 return key;
157}
158
159void
160GNUNET_CRYPTO_cpabe_delete_master_key (struct GNUNET_CRYPTO_AbeMasterKey *key)
161{
162 gabe_msk_free (key->msk);
163 gabe_pub_free (key->pub);
164 //GNUNET_free (key->msk);
165 //gabe_msk_free (key->msk); //For some reason free of pub implicit?
166 GNUNET_free (key);
167}
168
169struct GNUNET_CRYPTO_AbeKey*
170GNUNET_CRYPTO_cpabe_create_key (struct GNUNET_CRYPTO_AbeMasterKey *key,
171 char **attrs)
172{
173 struct GNUNET_CRYPTO_AbeKey *prv_key;
174 int size;
175 char *tmp;
176
177 prv_key = GNUNET_new (struct GNUNET_CRYPTO_AbeKey);
178 prv_key->prv = gabe_keygen(key->pub, key->msk, attrs);
179 size = gabe_pub_serialize(key->pub, &tmp);
180 prv_key->pub = gabe_pub_unserialize(tmp, size);
181 GNUNET_free (tmp);
182 GNUNET_assert (NULL != prv_key->prv);
183 return prv_key;
184}
185
186void
187GNUNET_CRYPTO_cpabe_delete_key (struct GNUNET_CRYPTO_AbeKey *key,
188 int delete_pub)
189{
190 //Memory management in gabe is buggy
191 gabe_prv_free (key->prv);
192 if (GNUNET_YES == delete_pub)
193 gabe_pub_free (key->pub);
194 GNUNET_free (key);
195}
196
197ssize_t
198write_cpabe (void **result,
199 uint32_t file_len,
200 char* cph_buf,
201 int cph_buf_len,
202 char* aes_buf,
203 int aes_buf_len)
204{
205 char *ptr;
206 uint32_t *len;
207
208 *result = GNUNET_malloc (12 + cph_buf_len + aes_buf_len);
209 ptr = *result;
210 len = (uint32_t*) ptr;
211 *len = htonl (file_len);
212 ptr += 4;
213 len = (uint32_t*) ptr;
214 *len = htonl (aes_buf_len);
215 ptr += 4;
216 memcpy (ptr, aes_buf, aes_buf_len);
217 ptr += aes_buf_len;
218 len = (uint32_t*) ptr;
219 *len = htonl (cph_buf_len);
220 ptr += 4;
221 memcpy (ptr, cph_buf, cph_buf_len);
222 return 12 + cph_buf_len + aes_buf_len;
223}
224
225ssize_t
226read_cpabe (const void *data,
227 char** cph_buf,
228 int *cph_buf_len,
229 char** aes_buf,
230 int *aes_buf_len)
231{
232 int buf_len;
233 char *ptr;
234 uint32_t *len;
235
236 ptr = (char*)data;
237 len = (uint32_t*)ptr;
238 buf_len = ntohl (*len);
239 ptr += 4;
240 len = (uint32_t*)ptr;
241 *aes_buf_len = ntohl (*len);
242 ptr += 4;
243 *aes_buf = GNUNET_malloc (*aes_buf_len);
244 memcpy(*aes_buf, ptr, *aes_buf_len);
245 ptr += *aes_buf_len;
246 len = (uint32_t*)ptr;
247 *cph_buf_len = ntohl (*len);
248 ptr += 4;
249 *cph_buf = GNUNET_malloc (*cph_buf_len);
250 memcpy(*cph_buf, ptr, *cph_buf_len);
251
252 return buf_len;
253}
254
255ssize_t
256GNUNET_CRYPTO_cpabe_encrypt (const void *block,
257 size_t size,
258 const char *policy,
259 const struct GNUNET_CRYPTO_AbeMasterKey *key,
260 void **result)
261{
262 gabe_cph_t* cph;
263 char* plt;
264 char* cph_buf;
265 char* aes_buf;
266 element_t m;
267 int cph_buf_len;
268 int aes_buf_len;
269 ssize_t result_len;
270
271 if( !(cph = gabe_enc(key->pub, m, (char*)policy)) )
272 return GNUNET_SYSERR;
273 cph_buf_len = gabe_cph_serialize(cph,
274 &cph_buf);
275 gabe_cph_free(cph);
276 GNUNET_free (cph);
277 plt = GNUNET_memdup (block, size);
278 aes_buf_len = aes_128_cbc_encrypt(plt, size, m, &aes_buf);
279 GNUNET_free (plt);
280 element_clear(m);
281 result_len = write_cpabe(result, size, cph_buf, cph_buf_len, aes_buf, aes_buf_len);
282 GNUNET_free(cph_buf);
283 GNUNET_free(aes_buf);
284 return result_len;
285}
286
287ssize_t
288GNUNET_CRYPTO_cpabe_decrypt (const void *block,
289 size_t size,
290 const struct GNUNET_CRYPTO_AbeKey *key,
291 void **result)
292{
293 char* aes_buf;
294 char* cph_buf;
295 gabe_cph_t* cph;
296 element_t m;
297 int cph_buf_size;
298 int aes_buf_size;
299 int plt_len;
300
301 read_cpabe(block, &cph_buf, &cph_buf_size, &aes_buf, &aes_buf_size);
302 cph = gabe_cph_unserialize(key->pub, cph_buf, cph_buf_size);
303 if( !gabe_dec(key->pub, key->prv, cph, m) ) {
304 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
305 "%s\n", gabe_error());
306 GNUNET_free (aes_buf);
307 GNUNET_free (cph_buf);
308 gabe_cph_free(cph);
309 GNUNET_free (cph);
310 element_clear (m);
311 return GNUNET_SYSERR;
312 }
313 gabe_cph_free(cph);
314 GNUNET_free (cph);
315 plt_len = aes_128_cbc_decrypt(aes_buf, aes_buf_size, m, (char**)result);
316 GNUNET_free (cph_buf);
317 GNUNET_free (aes_buf);
318 element_clear (m);
319 //freeing is buggy in gabe
320 //gabe_prv_free (prv);
321 //gabe_pub_free (pub);
322 return plt_len;
323}
324
325ssize_t
326GNUNET_CRYPTO_cpabe_serialize_key (const struct GNUNET_CRYPTO_AbeKey *key,
327 void **result)
328{
329 ssize_t len;
330 char *pub;
331 char *prv;
332 int pub_len;
333 int prv_len;
334
335 pub_len = gabe_pub_serialize (key->pub, &pub);
336 prv_len = gabe_prv_serialize (key->prv, &prv);
337
338 len = pub_len + prv_len + 12;
339 write_cpabe (result, len, pub, pub_len, prv, prv_len);
340
341 GNUNET_free (pub);
342 GNUNET_free (prv);
343
344 return len;
345}
346
347struct GNUNET_CRYPTO_AbeKey*
348GNUNET_CRYPTO_cpabe_deserialize_key (const void *data,
349 size_t len)
350{
351 struct GNUNET_CRYPTO_AbeKey *key;
352 char *pub;
353 char *prv;
354 int prv_len;
355 int pub_len;
356
357 key = GNUNET_new (struct GNUNET_CRYPTO_AbeKey);
358 read_cpabe (data,
359 &pub,
360 &pub_len,
361 &prv,
362 &prv_len);
363 key->pub = gabe_pub_unserialize (pub, pub_len);
364 key->prv = gabe_prv_unserialize (key->pub, prv, prv_len);
365
366 GNUNET_free (pub);
367 GNUNET_free (prv);
368 return key;
369}
370
371ssize_t
372GNUNET_CRYPTO_cpabe_serialize_master_key (const struct GNUNET_CRYPTO_AbeMasterKey *key,
373 void **result)
374{
375 ssize_t len;
376 char *pub;
377 char *msk;
378 int pub_len;
379 int msk_len;
380
381 pub_len = gabe_pub_serialize (key->pub, &pub);
382 msk_len = gabe_msk_serialize (key->msk, &msk);
383
384 len = pub_len + msk_len + 12;
385 write_cpabe (result, len, pub, pub_len, msk, msk_len);
386
387 GNUNET_free (pub);
388 GNUNET_free (msk);
389
390 return len;
391}
392
393struct GNUNET_CRYPTO_AbeMasterKey*
394GNUNET_CRYPTO_cpabe_deserialize_master_key (const void *data,
395 size_t len)
396{
397 struct GNUNET_CRYPTO_AbeMasterKey *key;
398 char *msk;
399 char *pub;
400 int msk_len;
401 int pub_len;
402
403 key = GNUNET_new (struct GNUNET_CRYPTO_AbeMasterKey);
404 read_cpabe (data,
405 &pub,
406 &pub_len,
407 &msk,
408 &msk_len);
409 key->pub = gabe_pub_unserialize (pub, pub_len);
410 key->msk = gabe_msk_unserialize (key->pub, msk, msk_len);
411
412 GNUNET_free (pub);
413 GNUNET_free (msk);
414
415 return key;
416}
diff --git a/src/util/test_crypto_abe.c b/src/util/test_crypto_abe.c
new file mode 100644
index 000000000..cb36dccae
--- /dev/null
+++ b/src/util/test_crypto_abe.c
@@ -0,0 +1,86 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2002, 2003, 2004, 2006 GNUnet e.V.
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19
20*/
21/**
22 * @author Martin Schanzenbach
23 * @file util/test_crypto_abe.c
24 * @brief test for ABE ciphers
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28
29#define TESTSTRING "Hello World!"
30
31static int
32testAbecipher ()
33{
34 struct GNUNET_CRYPTO_AbeMasterKey *msk;
35 struct GNUNET_CRYPTO_AbeKey *key;
36 char *result;
37 char **attrs;
38 int size;
39 char *res;
40 msk = GNUNET_CRYPTO_cpabe_create_master_key ();
41 size = GNUNET_CRYPTO_cpabe_encrypt (TESTSTRING, strlen (TESTSTRING) + 1,
42 "testattr", //Policy
43 msk,
44 (void*)&result);
45 GNUNET_assert (-1 != size);
46 attrs = GNUNET_malloc (2 * sizeof (char*));
47 attrs[0] = "testattr";
48 attrs[1] = NULL;
49 key = GNUNET_CRYPTO_cpabe_create_key (msk,
50 attrs);
51
52 size = GNUNET_CRYPTO_cpabe_decrypt (result, size,
53 key,
54 (void*)&res);
55 if (strlen (TESTSTRING) + 1 != size)
56 {
57 printf ("abeciphertest failed: decryptBlock returned %d\n", size);
58 return 1;
59 }
60 if (0 != strcmp (res, TESTSTRING))
61 {
62 printf ("abeciphertest failed: %s != %s\n", res, TESTSTRING);
63 return 1;
64 }
65 else
66 return 0;
67}
68
69
70int
71main (int argc, char *argv[])
72{
73 int failureCount = 0;
74
75 GNUNET_log_setup ("test-crypto-abe", "WARNING", NULL);
76 failureCount += testAbecipher ();
77
78 if (failureCount != 0)
79 {
80 printf ("%d TESTS FAILED!\n", failureCount);
81 return -1;
82 }
83 return 0;
84}
85
86/* end of test_crypto_aes.c */