diff options
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 @@ | |||
1 | from fedora:26 | ||
2 | |||
3 | # Install the required build tools | ||
4 | RUN 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 | |||
6 | WORKDIR /usr/src | ||
7 | |||
8 | # Install gnurl from source at version gnurl-7.54.0 | ||
9 | RUN git clone https://git.taler.net/gnurl.git --branch gnurl-7.54.0 | ||
10 | WORKDIR /usr/src/gnurl | ||
11 | RUN autoreconf -i | ||
12 | RUN ./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 | ||
20 | RUN make install | ||
21 | WORKDIR /usr/src | ||
22 | |||
23 | RUN dnf -y install wget flex bison | ||
24 | |||
25 | # Install libpbc | ||
26 | RUN wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz | ||
27 | RUN tar xvzpf pbc-0.5.14.tar.gz | ||
28 | WORKDIR /usr/src/pbc-0.5.14 | ||
29 | RUN ./configure --prefix=/usr | ||
30 | RUN make install | ||
31 | WORKDIR /usr/src | ||
32 | |||
33 | RUN dnf -y install glib2-devel | ||
34 | |||
35 | # Install libbswabe | ||
36 | RUN git clone https://github.com/schanzen/libgabe.git | ||
37 | WORKDIR /usr/src/libgabe | ||
38 | RUN ./configure --prefix=/usr | ||
39 | RUN make install | ||
40 | |||
41 | # Install WebUI | ||
42 | WORKDIR /usr/src/ | ||
43 | RUN git clone https://github.com/schanzen/gnunet-webui.git | ||
44 | WORKDIR /usr/src/gnunet-webui | ||
45 | RUN git checkout gnuidentity | ||
46 | |||
47 | RUN mkdir /usr/src/gnunet | ||
48 | WORKDIR /usr/src/gnunet | ||
49 | ADD . . | ||
50 | ARG NUM_JOBS | ||
51 | RUN ./bootstrap | ||
52 | RUN ./configure --prefix=/usr/local | ||
53 | RUN make -j$NUM_JOBS | ||
54 | RUN make install | ||
55 | |||
56 | RUN groupadd gnunetdns | ||
57 | RUN adduser --system -m --home-dir /var/lib/gnunet gnunet | ||
58 | RUN chown gnunet:gnunet /var/lib/gnunet | ||
59 | RUN echo '[arm]\nSYSTEM_ONLY = YES\nUSER_ONLY = NO\n' > /etc/gnunet.conf | ||
60 | |||
61 | ADD docker-entrypoint.sh . | ||
62 | |||
63 | CMD ["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 | ||
449 | PKG_CHECK_MODULES([GLIB], [glib-2.0]) | ||
450 | # check for pbc library | ||
451 | pbc=0 | ||
452 | AC_CHECK_HEADER([pbc/pbc.h],pbc=1) | ||
453 | AC_CHECK_HEADER([gabe.h],abe=1) | ||
454 | AM_CONDITIONAL(HAVE_PBC, [test "$pbc" = 1]) | ||
455 | AM_CONDITIONAL(HAVE_ABE, [test "$abe" = 1]) | ||
456 | if test "x$pbc" = x1 | ||
457 | then | ||
458 | AC_DEFINE([HAVE_PBC],[1],[Have pbc library]) | ||
459 | else | ||
460 | AC_DEFINE([HAVE_PBC],[0],[Lacking pbc library]) | ||
461 | fi | ||
462 | if test "x$abe" = x1 | ||
463 | then | ||
464 | AC_DEFINE([HAVE_ABE],[1],[Have ABE library]) | ||
465 | else | ||
466 | AC_DEFINE([HAVE_ABE],[0],[Lacking ABE library]) | ||
467 | fi | ||
468 | |||
469 | |||
449 | 470 | ||
450 | gst=0 | 471 | gst=0 |
451 | PKG_CHECK_MODULES( | 472 | PKG_CHECK_MODULES( |
@@ -1572,6 +1593,8 @@ src/gnsrecord/Makefile | |||
1572 | src/hello/Makefile | 1593 | src/hello/Makefile |
1573 | src/identity/Makefile | 1594 | src/identity/Makefile |
1574 | src/identity/identity.conf | 1595 | src/identity/identity.conf |
1596 | src/credential/Makefile | ||
1597 | src/credential/credential.conf | ||
1575 | src/include/Makefile | 1598 | src/include/Makefile |
1576 | src/integration-tests/Makefile | 1599 | src/integration-tests/Makefile |
1577 | src/json/Makefile | 1600 | src/json/Makefile |
@@ -1637,6 +1660,7 @@ src/vpn/vpn.conf | |||
1637 | src/zonemaster/Makefile | 1660 | src/zonemaster/Makefile |
1638 | src/zonemaster/zonemaster.conf | 1661 | src/zonemaster/zonemaster.conf |
1639 | src/rest/Makefile | 1662 | src/rest/Makefile |
1663 | src/identity-attribute/Makefile | ||
1640 | src/identity-provider/Makefile | 1664 | src/identity-provider/Makefile |
1641 | pkgconfig/Makefile | 1665 | pkgconfig/Makefile |
1642 | pkgconfig/gnunetarm.pc | 1666 | pkgconfig/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 | ||
2 | gnunet-arm -s > $HOME/gnunet.log 2>&1 | ||
3 | exec 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 | |||
3 | src/arm/gnunet-arm.c | 3 | src/arm/gnunet-arm.c |
4 | src/arm/gnunet-service-arm.c | 4 | src/arm/gnunet-service-arm.c |
5 | src/arm/mockup-service.c | 5 | src/arm/mockup-service.c |
6 | src/ats-tests/ats-testing-experiment.c | ||
7 | src/ats-tests/ats-testing-log.c | ||
8 | src/ats-tests/ats-testing-preferences.c | ||
9 | src/ats-tests/ats-testing-traffic.c | ||
10 | src/ats-tests/ats-testing.c | ||
11 | src/ats-tests/gnunet-ats-sim.c | ||
12 | src/ats-tests/gnunet-solver-eval.c | ||
13 | src/ats-tool/gnunet-ats.c | ||
6 | src/ats/ats_api_connectivity.c | 14 | src/ats/ats_api_connectivity.c |
7 | src/ats/ats_api_performance.c | 15 | src/ats/ats_api_performance.c |
8 | src/ats/ats_api_scanner.c | 16 | src/ats/ats_api_scanner.c |
9 | src/ats/ats_api_scheduling.c | 17 | src/ats/ats_api_scheduling.c |
10 | src/ats/gnunet-ats-solver-eval.c | 18 | src/ats/gnunet-ats-solver-eval.c |
11 | src/ats/gnunet-service-ats_addresses.c | ||
12 | src/ats/gnunet-service-ats.c | 19 | src/ats/gnunet-service-ats.c |
20 | src/ats/gnunet-service-ats_addresses.c | ||
13 | src/ats/gnunet-service-ats_connectivity.c | 21 | src/ats/gnunet-service-ats_connectivity.c |
14 | src/ats/gnunet-service-ats_normalization.c | 22 | src/ats/gnunet-service-ats_normalization.c |
15 | src/ats/gnunet-service-ats_performance.c | 23 | src/ats/gnunet-service-ats_performance.c |
@@ -20,14 +28,6 @@ src/ats/gnunet-service-ats_scheduling.c | |||
20 | src/ats/plugin_ats_mlp.c | 28 | src/ats/plugin_ats_mlp.c |
21 | src/ats/plugin_ats_proportional.c | 29 | src/ats/plugin_ats_proportional.c |
22 | src/ats/plugin_ats_ril.c | 30 | src/ats/plugin_ats_ril.c |
23 | src/ats-tests/ats-testing.c | ||
24 | src/ats-tests/ats-testing-experiment.c | ||
25 | src/ats-tests/ats-testing-log.c | ||
26 | src/ats-tests/ats-testing-preferences.c | ||
27 | src/ats-tests/ats-testing-traffic.c | ||
28 | src/ats-tests/gnunet-ats-sim.c | ||
29 | src/ats-tests/gnunet-solver-eval.c | ||
30 | src/ats-tool/gnunet-ats.c | ||
31 | src/auction/gnunet-auction-create.c | 31 | src/auction/gnunet-auction-create.c |
32 | src/auction/gnunet-auction-info.c | 32 | src/auction/gnunet-auction-info.c |
33 | src/auction/gnunet-auction-join.c | 33 | src/auction/gnunet-auction-join.c |
@@ -39,8 +39,8 @@ src/block/plugin_block_test.c | |||
39 | src/cadet/cadet_api.c | 39 | src/cadet/cadet_api.c |
40 | src/cadet/cadet_test_lib.c | 40 | src/cadet/cadet_test_lib.c |
41 | src/cadet/desirability_table.c | 41 | src/cadet/desirability_table.c |
42 | src/cadet/gnunet-cadet.c | ||
43 | src/cadet/gnunet-cadet-profiler.c | 42 | src/cadet/gnunet-cadet-profiler.c |
43 | src/cadet/gnunet-cadet.c | ||
44 | src/cadet/gnunet-service-cadet.c | 44 | src/cadet/gnunet-service-cadet.c |
45 | src/cadet/gnunet-service-cadet_channel.c | 45 | src/cadet/gnunet-service-cadet_channel.c |
46 | src/cadet/gnunet-service-cadet_connection.c | 46 | src/cadet/gnunet-service-cadet_connection.c |
@@ -56,15 +56,15 @@ src/consensus/gnunet-service-consensus.c | |||
56 | src/consensus/plugin_block_consensus.c | 56 | src/consensus/plugin_block_consensus.c |
57 | src/conversation/conversation_api.c | 57 | src/conversation/conversation_api.c |
58 | src/conversation/conversation_api_call.c | 58 | src/conversation/conversation_api_call.c |
59 | src/conversation/gnunet-conversation.c | ||
60 | src/conversation/gnunet-conversation-test.c | 59 | src/conversation/gnunet-conversation-test.c |
61 | src/conversation/gnunet_gst.c | 60 | src/conversation/gnunet-conversation.c |
62 | src/conversation/gnunet_gst_test.c | ||
63 | src/conversation/gnunet-helper-audio-playback.c | ||
64 | src/conversation/gnunet-helper-audio-playback-gst.c | 61 | src/conversation/gnunet-helper-audio-playback-gst.c |
65 | src/conversation/gnunet-helper-audio-record.c | 62 | src/conversation/gnunet-helper-audio-playback.c |
66 | src/conversation/gnunet-helper-audio-record-gst.c | 63 | src/conversation/gnunet-helper-audio-record-gst.c |
64 | src/conversation/gnunet-helper-audio-record.c | ||
67 | src/conversation/gnunet-service-conversation.c | 65 | src/conversation/gnunet-service-conversation.c |
66 | src/conversation/gnunet_gst.c | ||
67 | src/conversation/gnunet_gst_test.c | ||
68 | src/conversation/microphone.c | 68 | src/conversation/microphone.c |
69 | src/conversation/plugin_gnsrecord_conversation.c | 69 | src/conversation/plugin_gnsrecord_conversation.c |
70 | src/conversation/speaker.c | 70 | src/conversation/speaker.c |
@@ -75,6 +75,13 @@ src/core/gnunet-service-core.c | |||
75 | src/core/gnunet-service-core_kx.c | 75 | src/core/gnunet-service-core_kx.c |
76 | src/core/gnunet-service-core_sessions.c | 76 | src/core/gnunet-service-core_sessions.c |
77 | src/core/gnunet-service-core_typemap.c | 77 | src/core/gnunet-service-core_typemap.c |
78 | src/credential/credential_api.c | ||
79 | src/credential/credential_misc.c | ||
80 | src/credential/credential_serialization.c | ||
81 | src/credential/gnunet-credential.c | ||
82 | src/credential/gnunet-service-credential.c | ||
83 | src/credential/plugin_gnsrecord_credential.c | ||
84 | src/credential/plugin_rest_credential.c | ||
78 | src/curl/curl.c | 85 | src/curl/curl.c |
79 | src/curl/curl_reschedule.c | 86 | src/curl/curl_reschedule.c |
80 | src/datacache/datacache.c | 87 | src/datacache/datacache.c |
@@ -94,7 +101,6 @@ src/dht/dht_api.c | |||
94 | src/dht/dht_test_lib.c | 101 | src/dht/dht_test_lib.c |
95 | src/dht/gnunet-dht-get.c | 102 | src/dht/gnunet-dht-get.c |
96 | src/dht/gnunet-dht-monitor.c | 103 | src/dht/gnunet-dht-monitor.c |
97 | src/dht/gnunet_dht_profiler.c | ||
98 | src/dht/gnunet-dht-put.c | 104 | src/dht/gnunet-dht-put.c |
99 | src/dht/gnunet-service-dht.c | 105 | src/dht/gnunet-service-dht.c |
100 | src/dht/gnunet-service-dht_clients.c | 106 | src/dht/gnunet-service-dht_clients.c |
@@ -103,6 +109,7 @@ src/dht/gnunet-service-dht_hello.c | |||
103 | src/dht/gnunet-service-dht_neighbours.c | 109 | src/dht/gnunet-service-dht_neighbours.c |
104 | src/dht/gnunet-service-dht_nse.c | 110 | src/dht/gnunet-service-dht_nse.c |
105 | src/dht/gnunet-service-dht_routing.c | 111 | src/dht/gnunet-service-dht_routing.c |
112 | src/dht/gnunet_dht_profiler.c | ||
106 | src/dht/plugin_block_dht.c | 113 | src/dht/plugin_block_dht.c |
107 | src/dns/dns_api.c | 114 | src/dns/dns_api.c |
108 | src/dns/dnsparser.c | 115 | src/dns/dnsparser.c |
@@ -117,8 +124,8 @@ src/dv/gnunet-dv.c | |||
117 | src/dv/gnunet-service-dv.c | 124 | src/dv/gnunet-service-dv.c |
118 | src/dv/plugin_transport_dv.c | 125 | src/dv/plugin_transport_dv.c |
119 | src/exit/gnunet-daemon-exit.c | 126 | src/exit/gnunet-daemon-exit.c |
120 | src/exit/gnunet-helper-exit.c | ||
121 | src/exit/gnunet-helper-exit-windows.c | 127 | src/exit/gnunet-helper-exit-windows.c |
128 | src/exit/gnunet-helper-exit.c | ||
122 | src/fragmentation/defragmentation.c | 129 | src/fragmentation/defragmentation.c |
123 | src/fragmentation/fragmentation.c | 130 | src/fragmentation/fragmentation.c |
124 | src/fs/fs_api.c | 131 | src/fs/fs_api.c |
@@ -143,8 +150,8 @@ src/fs/gnunet-auto-share.c | |||
143 | src/fs/gnunet-daemon-fsprofiler.c | 150 | src/fs/gnunet-daemon-fsprofiler.c |
144 | src/fs/gnunet-directory.c | 151 | src/fs/gnunet-directory.c |
145 | src/fs/gnunet-download.c | 152 | src/fs/gnunet-download.c |
146 | src/fs/gnunet-fs.c | ||
147 | src/fs/gnunet-fs-profiler.c | 153 | src/fs/gnunet-fs-profiler.c |
154 | src/fs/gnunet-fs.c | ||
148 | src/fs/gnunet-helper-fs-publish.c | 155 | src/fs/gnunet-helper-fs-publish.c |
149 | src/fs/gnunet-publish.c | 156 | src/fs/gnunet-publish.c |
150 | src/fs/gnunet-search.c | 157 | src/fs/gnunet-search.c |
@@ -162,10 +169,10 @@ src/fs/plugin_block_fs.c | |||
162 | src/gns/gns_api.c | 169 | src/gns/gns_api.c |
163 | src/gns/gnunet-bcd.c | 170 | src/gns/gnunet-bcd.c |
164 | src/gns/gnunet-dns2gns.c | 171 | src/gns/gnunet-dns2gns.c |
165 | src/gns/gnunet-gns.c | ||
166 | src/gns/gnunet-gns-helper-service-w32.c | 172 | src/gns/gnunet-gns-helper-service-w32.c |
167 | src/gns/gnunet-gns-import.c | 173 | src/gns/gnunet-gns-import.c |
168 | src/gns/gnunet-gns-proxy.c | 174 | src/gns/gnunet-gns-proxy.c |
175 | src/gns/gnunet-gns.c | ||
169 | src/gns/gnunet-service-gns.c | 176 | src/gns/gnunet-service-gns.c |
170 | src/gns/gnunet-service-gns_interceptor.c | 177 | src/gns/gnunet-service-gns_interceptor.c |
171 | src/gns/gnunet-service-gns_resolver.c | 178 | src/gns/gnunet-service-gns_resolver.c |
@@ -174,41 +181,44 @@ src/gns/nss/nss_gns_query.c | |||
174 | src/gns/plugin_block_gns.c | 181 | src/gns/plugin_block_gns.c |
175 | src/gns/plugin_gnsrecord_gns.c | 182 | src/gns/plugin_gnsrecord_gns.c |
176 | src/gns/plugin_rest_gns.c | 183 | src/gns/plugin_rest_gns.c |
184 | src/gns/w32nsp-install.c | ||
185 | src/gns/w32nsp-resolve.c | ||
186 | src/gns/w32nsp-uninstall.c | ||
187 | src/gns/w32nsp.c | ||
177 | src/gnsrecord/gnsrecord.c | 188 | src/gnsrecord/gnsrecord.c |
178 | src/gnsrecord/gnsrecord_crypto.c | 189 | src/gnsrecord/gnsrecord_crypto.c |
179 | src/gnsrecord/gnsrecord_misc.c | 190 | src/gnsrecord/gnsrecord_misc.c |
180 | src/gnsrecord/gnsrecord_serialization.c | 191 | src/gnsrecord/gnsrecord_serialization.c |
181 | src/gnsrecord/plugin_gnsrecord_dns.c | 192 | src/gnsrecord/plugin_gnsrecord_dns.c |
182 | src/gns/w32nsp.c | ||
183 | src/gns/w32nsp-install.c | ||
184 | src/gns/w32nsp-resolve.c | ||
185 | src/gns/w32nsp-uninstall.c | ||
186 | src/hello/address.c | 193 | src/hello/address.c |
187 | src/hello/gnunet-hello.c | 194 | src/hello/gnunet-hello.c |
188 | src/hello/hello.c | 195 | src/hello/hello.c |
189 | src/hostlist/gnunet-daemon-hostlist.c | 196 | src/hostlist/gnunet-daemon-hostlist.c |
190 | src/hostlist/gnunet-daemon-hostlist_client.c | 197 | src/hostlist/gnunet-daemon-hostlist_client.c |
191 | src/hostlist/gnunet-daemon-hostlist_server.c | 198 | src/hostlist/gnunet-daemon-hostlist_server.c |
199 | src/identity-attribute/identity_attribute.c | ||
200 | src/identity-attribute/plugin_identity_attribute_type_gnuid.c | ||
201 | src/identity-provider/gnunet-idp.c | ||
202 | src/identity-provider/gnunet-service-identity-provider.c | ||
203 | src/identity-provider/identity_provider_api.c | ||
204 | src/identity-provider/jwt.c | ||
205 | src/identity-provider/plugin_gnsrecord_identity_provider.c | ||
206 | src/identity-provider/plugin_identity_provider_sqlite.c | ||
207 | src/identity-provider/plugin_rest_identity_provider.c | ||
192 | src/identity/gnunet-identity.c | 208 | src/identity/gnunet-identity.c |
193 | src/identity/gnunet-service-identity.c | 209 | src/identity/gnunet-service-identity.c |
194 | src/identity/identity_api.c | 210 | src/identity/identity_api.c |
195 | src/identity/identity_api_lookup.c | 211 | src/identity/identity_api_lookup.c |
196 | src/identity/plugin_gnsrecord_identity.c | ||
197 | src/identity/plugin_rest_identity.c | 212 | src/identity/plugin_rest_identity.c |
198 | src/identity-provider/gnunet-identity-token.c | 213 | src/json/json.c |
199 | src/identity-provider/gnunet-service-identity-provider.c | 214 | src/json/json_generator.c |
200 | src/identity-provider/identity_provider_api.c | 215 | src/json/json_helper.c |
201 | src/identity-provider/identity_token.c | 216 | src/json/json_mhd.c |
202 | src/identity-provider/plugin_rest_identity_provider.c | ||
203 | src/jsonapi/jsonapi.c | 217 | src/jsonapi/jsonapi.c |
204 | src/jsonapi/jsonapi_document.c | 218 | src/jsonapi/jsonapi_document.c |
205 | src/jsonapi/jsonapi_error.c | 219 | src/jsonapi/jsonapi_error.c |
206 | src/jsonapi/jsonapi_relationship.c | 220 | src/jsonapi/jsonapi_relationship.c |
207 | src/jsonapi/jsonapi_resource.c | 221 | src/jsonapi/jsonapi_resource.c |
208 | src/json/json.c | ||
209 | src/json/json_generator.c | ||
210 | src/json/json_helper.c | ||
211 | src/json/json_mhd.c | ||
212 | src/multicast/gnunet-multicast.c | 222 | src/multicast/gnunet-multicast.c |
213 | src/multicast/gnunet-service-multicast.c | 223 | src/multicast/gnunet-service-multicast.c |
214 | src/multicast/multicast_api.c | 224 | src/multicast/multicast_api.c |
@@ -222,8 +232,8 @@ src/namecache/namecache_api.c | |||
222 | src/namecache/plugin_namecache_flat.c | 232 | src/namecache/plugin_namecache_flat.c |
223 | src/namecache/plugin_namecache_postgres.c | 233 | src/namecache/plugin_namecache_postgres.c |
224 | src/namecache/plugin_namecache_sqlite.c | 234 | src/namecache/plugin_namecache_sqlite.c |
225 | src/namestore/gnunet-namestore.c | ||
226 | src/namestore/gnunet-namestore-fcfsd.c | 235 | src/namestore/gnunet-namestore-fcfsd.c |
236 | src/namestore/gnunet-namestore.c | ||
227 | src/namestore/gnunet-service-namestore.c | 237 | src/namestore/gnunet-service-namestore.c |
228 | src/namestore/namestore_api.c | 238 | src/namestore/namestore_api.c |
229 | src/namestore/namestore_api_monitor.c | 239 | src/namestore/namestore_api_monitor.c |
@@ -238,10 +248,10 @@ src/nat-auto/gnunet-service-nat-auto.c | |||
238 | src/nat-auto/gnunet-service-nat-auto_legacy.c | 248 | src/nat-auto/gnunet-service-nat-auto_legacy.c |
239 | src/nat-auto/nat_auto_api.c | 249 | src/nat-auto/nat_auto_api.c |
240 | src/nat-auto/nat_auto_api_test.c | 250 | src/nat-auto/nat_auto_api_test.c |
241 | src/nat/gnunet-helper-nat-client.c | ||
242 | src/nat/gnunet-helper-nat-client-windows.c | 251 | src/nat/gnunet-helper-nat-client-windows.c |
243 | src/nat/gnunet-helper-nat-server.c | 252 | src/nat/gnunet-helper-nat-client.c |
244 | src/nat/gnunet-helper-nat-server-windows.c | 253 | src/nat/gnunet-helper-nat-server-windows.c |
254 | src/nat/gnunet-helper-nat-server.c | ||
245 | src/nat/gnunet-nat.c | 255 | src/nat/gnunet-nat.c |
246 | src/nat/gnunet-service-nat.c | 256 | src/nat/gnunet-service-nat.c |
247 | src/nat/gnunet-service-nat_externalip.c | 257 | src/nat/gnunet-service-nat_externalip.c |
@@ -250,15 +260,15 @@ src/nat/gnunet-service-nat_mini.c | |||
250 | src/nat/gnunet-service-nat_stun.c | 260 | src/nat/gnunet-service-nat_stun.c |
251 | src/nat/nat_api.c | 261 | src/nat/nat_api.c |
252 | src/nat/nat_api_stun.c | 262 | src/nat/nat_api_stun.c |
253 | src/nse/gnunet-nse.c | ||
254 | src/nse/gnunet-nse-profiler.c | 263 | src/nse/gnunet-nse-profiler.c |
264 | src/nse/gnunet-nse.c | ||
255 | src/nse/gnunet-service-nse.c | 265 | src/nse/gnunet-service-nse.c |
256 | src/nse/nse_api.c | 266 | src/nse/nse_api.c |
267 | src/peerinfo-tool/gnunet-peerinfo.c | ||
268 | src/peerinfo-tool/gnunet-peerinfo_plugins.c | ||
257 | src/peerinfo/gnunet-service-peerinfo.c | 269 | src/peerinfo/gnunet-service-peerinfo.c |
258 | src/peerinfo/peerinfo_api.c | 270 | src/peerinfo/peerinfo_api.c |
259 | src/peerinfo/peerinfo_api_notify.c | 271 | src/peerinfo/peerinfo_api_notify.c |
260 | src/peerinfo-tool/gnunet-peerinfo.c | ||
261 | src/peerinfo-tool/gnunet-peerinfo_plugins.c | ||
262 | src/peerstore/gnunet-peerstore.c | 272 | src/peerstore/gnunet-peerstore.c |
263 | src/peerstore/gnunet-service-peerstore.c | 273 | src/peerstore/gnunet-service-peerstore.c |
264 | src/peerstore/peerstore_api.c | 274 | src/peerstore/peerstore_api.c |
@@ -310,13 +320,13 @@ src/rps/gnunet-service-rps_peers.c | |||
310 | src/rps/gnunet-service-rps_sampler.c | 320 | src/rps/gnunet-service-rps_sampler.c |
311 | src/rps/gnunet-service-rps_sampler_elem.c | 321 | src/rps/gnunet-service-rps_sampler_elem.c |
312 | src/rps/gnunet-service-rps_view.c | 322 | src/rps/gnunet-service-rps_view.c |
313 | src/rps/rps_api.c | ||
314 | src/rps/rps-test_util.c | 323 | src/rps/rps-test_util.c |
324 | src/rps/rps_api.c | ||
315 | src/scalarproduct/gnunet-scalarproduct.c | 325 | src/scalarproduct/gnunet-scalarproduct.c |
316 | src/scalarproduct/gnunet-service-scalarproduct_alice.c | ||
317 | src/scalarproduct/gnunet-service-scalarproduct_bob.c | ||
318 | src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c | 326 | src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c |
319 | src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c | 327 | src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c |
328 | src/scalarproduct/gnunet-service-scalarproduct_alice.c | ||
329 | src/scalarproduct/gnunet-service-scalarproduct_bob.c | ||
320 | src/scalarproduct/scalarproduct_api.c | 330 | src/scalarproduct/scalarproduct_api.c |
321 | src/secretsharing/gnunet-secretsharing-profiler.c | 331 | src/secretsharing/gnunet-secretsharing-profiler.c |
322 | src/secretsharing/gnunet-service-secretsharing.c | 332 | src/secretsharing/gnunet-service-secretsharing.c |
@@ -343,15 +353,16 @@ src/statistics/gnunet-statistics.c | |||
343 | src/statistics/statistics_api.c | 353 | src/statistics/statistics_api.c |
344 | src/template/gnunet-service-template.c | 354 | src/template/gnunet-service-template.c |
345 | src/template/gnunet-template.c | 355 | src/template/gnunet-template.c |
356 | src/testbed-logger/gnunet-service-testbed-logger.c | ||
357 | src/testbed-logger/testbed_logger_api.c | ||
346 | src/testbed/generate-underlay-topology.c | 358 | src/testbed/generate-underlay-topology.c |
347 | src/testbed/gnunet-daemon-latency-logger.c | 359 | src/testbed/gnunet-daemon-latency-logger.c |
348 | src/testbed/gnunet-daemon-testbed-blacklist.c | 360 | src/testbed/gnunet-daemon-testbed-blacklist.c |
349 | src/testbed/gnunet-daemon-testbed-underlay.c | 361 | src/testbed/gnunet-daemon-testbed-underlay.c |
350 | src/testbed/gnunet-helper-testbed.c | 362 | src/testbed/gnunet-helper-testbed.c |
351 | src/testbed/gnunet_mpi_test.c | ||
352 | src/testbed/gnunet-service-test-barriers.c | 363 | src/testbed/gnunet-service-test-barriers.c |
353 | src/testbed/gnunet-service-testbed_barriers.c | ||
354 | src/testbed/gnunet-service-testbed.c | 364 | src/testbed/gnunet-service-testbed.c |
365 | src/testbed/gnunet-service-testbed_barriers.c | ||
355 | src/testbed/gnunet-service-testbed_cache.c | 366 | src/testbed/gnunet-service-testbed_cache.c |
356 | src/testbed/gnunet-service-testbed_connectionpool.c | 367 | src/testbed/gnunet-service-testbed_connectionpool.c |
357 | src/testbed/gnunet-service-testbed_cpustatus.c | 368 | src/testbed/gnunet-service-testbed_cpustatus.c |
@@ -359,20 +370,19 @@ src/testbed/gnunet-service-testbed_links.c | |||
359 | src/testbed/gnunet-service-testbed_meminfo.c | 370 | src/testbed/gnunet-service-testbed_meminfo.c |
360 | src/testbed/gnunet-service-testbed_oc.c | 371 | src/testbed/gnunet-service-testbed_oc.c |
361 | src/testbed/gnunet-service-testbed_peers.c | 372 | src/testbed/gnunet-service-testbed_peers.c |
362 | src/testbed/gnunet_testbed_mpi_spawn.c | ||
363 | src/testbed/gnunet-testbed-profiler.c | 373 | src/testbed/gnunet-testbed-profiler.c |
364 | src/testbed-logger/gnunet-service-testbed-logger.c | 374 | src/testbed/gnunet_mpi_test.c |
365 | src/testbed-logger/testbed_logger_api.c | 375 | src/testbed/gnunet_testbed_mpi_spawn.c |
366 | src/testbed/testbed_api_barriers.c | ||
367 | src/testbed/testbed_api.c | 376 | src/testbed/testbed_api.c |
377 | src/testbed/testbed_api_barriers.c | ||
368 | src/testbed/testbed_api_hosts.c | 378 | src/testbed/testbed_api_hosts.c |
369 | src/testbed/testbed_api_operations.c | 379 | src/testbed/testbed_api_operations.c |
370 | src/testbed/testbed_api_peers.c | 380 | src/testbed/testbed_api_peers.c |
371 | src/testbed/testbed_api_sd.c | 381 | src/testbed/testbed_api_sd.c |
372 | src/testbed/testbed_api_services.c | 382 | src/testbed/testbed_api_services.c |
373 | src/testbed/testbed_api_statistics.c | 383 | src/testbed/testbed_api_statistics.c |
374 | src/testbed/testbed_api_testbed.c | ||
375 | src/testbed/testbed_api_test.c | 384 | src/testbed/testbed_api_test.c |
385 | src/testbed/testbed_api_testbed.c | ||
376 | src/testbed/testbed_api_topology.c | 386 | src/testbed/testbed_api_topology.c |
377 | src/testbed/testbed_api_underlay.c | 387 | src/testbed/testbed_api_underlay.c |
378 | src/testing/gnunet-testing.c | 388 | src/testing/gnunet-testing.c |
@@ -381,34 +391,39 @@ src/testing/testing.c | |||
381 | src/topology/friends.c | 391 | src/topology/friends.c |
382 | src/topology/gnunet-daemon-topology.c | 392 | src/topology/gnunet-daemon-topology.c |
383 | src/transport/gnunet-helper-transport-bluetooth.c | 393 | src/transport/gnunet-helper-transport-bluetooth.c |
384 | src/transport/gnunet-helper-transport-wlan.c | ||
385 | src/transport/gnunet-helper-transport-wlan-dummy.c | 394 | src/transport/gnunet-helper-transport-wlan-dummy.c |
386 | src/transport/gnunet-service-transport_ats.c | 395 | src/transport/gnunet-helper-transport-wlan.c |
387 | src/transport/gnunet-service-transport.c | 396 | src/transport/gnunet-service-transport.c |
397 | src/transport/gnunet-service-transport_ats.c | ||
388 | src/transport/gnunet-service-transport_hello.c | 398 | src/transport/gnunet-service-transport_hello.c |
389 | src/transport/gnunet-service-transport_manipulation.c | 399 | src/transport/gnunet-service-transport_manipulation.c |
390 | src/transport/gnunet-service-transport_neighbours.c | 400 | src/transport/gnunet-service-transport_neighbours.c |
391 | src/transport/gnunet-service-transport_plugins.c | 401 | src/transport/gnunet-service-transport_plugins.c |
392 | src/transport/gnunet-service-transport_validation.c | 402 | src/transport/gnunet-service-transport_validation.c |
393 | src/transport/gnunet-transport.c | ||
394 | src/transport/gnunet-transport-certificate-creation.c | 403 | src/transport/gnunet-transport-certificate-creation.c |
395 | src/transport/gnunet-transport-profiler.c | 404 | src/transport/gnunet-transport-profiler.c |
396 | src/transport/gnunet-transport-wlan-receiver.c | 405 | src/transport/gnunet-transport-wlan-receiver.c |
397 | src/transport/gnunet-transport-wlan-sender.c | 406 | src/transport/gnunet-transport-wlan-sender.c |
407 | src/transport/gnunet-transport.c | ||
398 | src/transport/plugin_transport_http_client.c | 408 | src/transport/plugin_transport_http_client.c |
399 | src/transport/plugin_transport_http_common.c | 409 | src/transport/plugin_transport_http_common.c |
400 | src/transport/plugin_transport_http_server.c | 410 | src/transport/plugin_transport_http_server.c |
401 | src/transport/plugin_transport_smtp.c | 411 | src/transport/plugin_transport_smtp.c |
402 | src/transport/plugin_transport_tcp.c | 412 | src/transport/plugin_transport_tcp.c |
403 | src/transport/plugin_transport_template.c | 413 | src/transport/plugin_transport_template.c |
404 | src/transport/plugin_transport_udp_broadcasting.c | ||
405 | src/transport/plugin_transport_udp.c | 414 | src/transport/plugin_transport_udp.c |
415 | src/transport/plugin_transport_udp_broadcasting.c | ||
406 | src/transport/plugin_transport_unix.c | 416 | src/transport/plugin_transport_unix.c |
407 | src/transport/plugin_transport_wlan.c | 417 | src/transport/plugin_transport_wlan.c |
408 | src/transport/tcp_connection_legacy.c | 418 | src/transport/tcp_connection_legacy.c |
409 | src/transport/tcp_server_legacy.c | 419 | src/transport/tcp_server_legacy.c |
410 | src/transport/tcp_server_mst_legacy.c | 420 | src/transport/tcp_server_mst_legacy.c |
411 | src/transport/tcp_service_legacy.c | 421 | src/transport/tcp_service_legacy.c |
422 | src/transport/transport-testing-filenames.c | ||
423 | src/transport/transport-testing-loggers.c | ||
424 | src/transport/transport-testing-main.c | ||
425 | src/transport/transport-testing-send.c | ||
426 | src/transport/transport-testing.c | ||
412 | src/transport/transport_api_address_to_string.c | 427 | src/transport/transport_api_address_to_string.c |
413 | src/transport/transport_api_blacklist.c | 428 | src/transport/transport_api_blacklist.c |
414 | src/transport/transport_api_core.c | 429 | src/transport/transport_api_core.c |
@@ -417,11 +432,6 @@ src/transport/transport_api_manipulation.c | |||
417 | src/transport/transport_api_monitor_peers.c | 432 | src/transport/transport_api_monitor_peers.c |
418 | src/transport/transport_api_monitor_plugins.c | 433 | src/transport/transport_api_monitor_plugins.c |
419 | src/transport/transport_api_offer_hello.c | 434 | src/transport/transport_api_offer_hello.c |
420 | src/transport/transport-testing.c | ||
421 | src/transport/transport-testing-filenames.c | ||
422 | src/transport/transport-testing-loggers.c | ||
423 | src/transport/transport-testing-main.c | ||
424 | src/transport/transport-testing-send.c | ||
425 | src/tun/regex.c | 435 | src/tun/regex.c |
426 | src/tun/tun.c | 436 | src/tun/tun.c |
427 | src/util/bandwidth.c | 437 | src/util/bandwidth.c |
@@ -435,10 +445,11 @@ src/util/configuration_loader.c | |||
435 | src/util/container_bloomfilter.c | 445 | src/util/container_bloomfilter.c |
436 | src/util/container_heap.c | 446 | src/util/container_heap.c |
437 | src/util/container_meta_data.c | 447 | src/util/container_meta_data.c |
438 | src/util/container_multihashmap32.c | ||
439 | src/util/container_multihashmap.c | 448 | src/util/container_multihashmap.c |
449 | src/util/container_multihashmap32.c | ||
440 | src/util/container_multipeermap.c | 450 | src/util/container_multipeermap.c |
441 | src/util/container_multishortmap.c | 451 | src/util/container_multishortmap.c |
452 | src/util/crypto_abe.c | ||
442 | src/util/crypto_crc.c | 453 | src/util/crypto_crc.c |
443 | src/util/crypto_ecc.c | 454 | src/util/crypto_ecc.c |
444 | src/util/crypto_ecc_dlog.c | 455 | src/util/crypto_ecc_dlog.c |
@@ -455,8 +466,8 @@ src/util/crypto_symmetric.c | |||
455 | src/util/disk.c | 466 | src/util/disk.c |
456 | src/util/getopt.c | 467 | src/util/getopt.c |
457 | src/util/getopt_helpers.c | 468 | src/util/getopt_helpers.c |
458 | src/util/gnunet-config.c | ||
459 | src/util/gnunet-config-diff.c | 469 | src/util/gnunet-config-diff.c |
470 | src/util/gnunet-config.c | ||
460 | src/util/gnunet-ecc.c | 471 | src/util/gnunet-ecc.c |
461 | src/util/gnunet-helper-w32-console.c | 472 | src/util/gnunet-helper-w32-console.c |
462 | src/util/gnunet-resolver.c | 473 | src/util/gnunet-resolver.c |
@@ -487,8 +498,8 @@ src/util/time.c | |||
487 | src/util/w32cat.c | 498 | src/util/w32cat.c |
488 | src/util/win.c | 499 | src/util/win.c |
489 | src/util/winproc.c | 500 | src/util/winproc.c |
490 | src/vpn/gnunet-helper-vpn.c | ||
491 | src/vpn/gnunet-helper-vpn-windows.c | 501 | src/vpn/gnunet-helper-vpn-windows.c |
502 | src/vpn/gnunet-helper-vpn.c | ||
492 | src/vpn/gnunet-service-vpn.c | 503 | src/vpn/gnunet-service-vpn.c |
493 | src/vpn/gnunet-vpn.c | 504 | src/vpn/gnunet-vpn.c |
494 | src/vpn/vpn_api.c | 505 | src/vpn/vpn_api.c |
@@ -10,7 +10,7 @@ msgid "" | |||
10 | msgstr "" | 10 | msgstr "" |
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" | |||
272 | msgstr "" | 272 | msgstr "" |
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" | |||
280 | msgstr "»%s« konnte nicht aufgelöst werden: %s\n" | 280 | msgstr "»%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 "" | |||
353 | msgid "Initiating shutdown as requested by client.\n" | 353 | msgid "Initiating shutdown as requested by client.\n" |
354 | msgstr "" | 354 | msgstr "" |
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 | 357 | msgid "Stop logging\n" |
358 | msgid "" | 358 | msgstr "Protokollierung stoppen\n" |
359 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
360 | "%llu\n" | ||
361 | msgstr "" | ||
362 | |||
363 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
364 | #, c-format | ||
365 | msgid "" | ||
366 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
367 | "%llu\n" | ||
368 | msgstr "" | ||
369 | |||
370 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
371 | #, c-format | ||
372 | msgid "" | ||
373 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
374 | "%llu\n" | ||
375 | msgstr "" | ||
376 | |||
377 | #: src/ats/gnunet-ats-solver-eval.c:3294 | ||
378 | #: src/ats-tests/gnunet-solver-eval.c:939 | ||
379 | msgid "solver to use" | ||
380 | msgstr "" | ||
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 | ||
385 | msgid "experiment to use" | ||
386 | msgstr "" | ||
387 | |||
388 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
389 | msgid "print logging" | ||
390 | msgstr "" | ||
391 | |||
392 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
393 | msgid "save logging to disk" | ||
394 | msgstr "" | ||
395 | |||
396 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
397 | msgid "disable normalization" | ||
398 | msgstr "" | ||
399 | |||
400 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
401 | #, c-format | ||
402 | msgid "" | ||
403 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
404 | "%llu\n" | ||
405 | msgstr "" | ||
406 | |||
407 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
408 | #, c-format | ||
409 | msgid "%s quota configured for network `%s' is %llu\n" | ||
410 | msgstr "" | ||
411 | |||
412 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
413 | #, c-format | ||
414 | msgid "" | ||
415 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
416 | msgstr "" | ||
417 | |||
418 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
419 | #, fuzzy, c-format | ||
420 | msgid "Failed to initialize solver `%s'!\n" | ||
421 | msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n" | ||
422 | |||
423 | #: src/ats/plugin_ats_mlp.c:1274 | ||
424 | msgid "Problem size too large, cannot allocate memory!\n" | ||
425 | msgstr "" | ||
426 | |||
427 | #: src/ats/plugin_ats_mlp.c:1869 | ||
428 | #, fuzzy, c-format | ||
429 | msgid "Adding address for peer `%s' multiple times\n" | ||
430 | msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n" | ||
431 | |||
432 | #: src/ats/plugin_ats_mlp.c:1913 | ||
433 | #, fuzzy, c-format | ||
434 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
435 | msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n" | ||
436 | |||
437 | #: src/ats/plugin_ats_mlp.c:2475 | ||
438 | msgid "" | ||
439 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
440 | msgstr "" | ||
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 | ||
450 | msgid "Invalid %s configuration %f \n" | ||
451 | msgstr "Konfiguration konnte nicht aus %s geladen werden\n" | ||
452 | |||
453 | #: src/ats/plugin_ats_mlp.c:2670 | ||
454 | #, c-format | ||
455 | msgid "" | ||
456 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
457 | "%llu must be at least %llu\n" | ||
458 | msgstr "" | ||
459 | |||
460 | #: src/ats/plugin_ats_mlp.c:2679 | ||
461 | #, c-format | ||
462 | msgid "" | ||
463 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
464 | "must be at least %llu\n" | ||
465 | msgstr "" | ||
466 | |||
467 | #: src/ats/plugin_ats_mlp.c:2689 | ||
468 | #, c-format | ||
469 | msgid "" | ||
470 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
471 | msgstr "" | ||
472 | |||
473 | #: src/ats/plugin_ats_mlp.c:2698 | ||
474 | #, c-format | ||
475 | msgid "" | ||
476 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
477 | msgstr "" | ||
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 |
481 | msgid "Invalid %s configuration %f\n" | 362 | msgid "Start logging `%s'\n" |
482 | msgstr " gconfig\tGTK Konfiguration\n" | 363 | msgstr "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 "" | |||
491 | msgid "Failed to connect master peer [%u] with slave [%u]\n" | 372 | msgid "Failed to connect master peer [%u] with slave [%u]\n" |
492 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | 373 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" |
493 | 374 | ||
494 | #: src/ats-tests/ats-testing-log.c:837 | ||
495 | msgid "Stop logging\n" | ||
496 | msgstr "Protokollierung stoppen\n" | ||
497 | |||
498 | #: src/ats-tests/ats-testing-log.c:892 | ||
499 | #, fuzzy, c-format | ||
500 | msgid "Start logging `%s'\n" | ||
501 | msgstr "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 |
505 | msgid "" | 377 | msgid "" |
@@ -507,6 +379,15 @@ msgid "" | |||
507 | "= %u KiB/s\n" | 379 | "= %u KiB/s\n" |
508 | msgstr "" | 380 | msgstr "" |
509 | 381 | ||
382 | #: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294 | ||
383 | msgid "solver to use" | ||
384 | msgstr "" | ||
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 | ||
388 | msgid "experiment to use" | ||
389 | msgstr "" | ||
390 | |||
510 | #: src/ats-tool/gnunet-ats.c:307 | 391 | #: src/ats-tool/gnunet-ats.c:307 |
511 | #, c-format | 392 | #, c-format |
512 | msgid "%u address resolutions had a timeout\n" | 393 | msgid "%u address resolutions had a timeout\n" |
@@ -624,6 +505,123 @@ msgstr "" | |||
624 | msgid "Print information about ATS state" | 505 | msgid "Print information about ATS state" |
625 | msgstr "Informationen über andere GNUnet Knoten ausgeben." | 506 | msgstr "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 | ||
510 | msgid "" | ||
511 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
512 | "%llu\n" | ||
513 | msgstr "" | ||
514 | |||
515 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
516 | #, c-format | ||
517 | msgid "" | ||
518 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
519 | "%llu\n" | ||
520 | msgstr "" | ||
521 | |||
522 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
523 | #, c-format | ||
524 | msgid "" | ||
525 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
526 | "%llu\n" | ||
527 | msgstr "" | ||
528 | |||
529 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
530 | msgid "print logging" | ||
531 | msgstr "" | ||
532 | |||
533 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
534 | msgid "save logging to disk" | ||
535 | msgstr "" | ||
536 | |||
537 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
538 | msgid "disable normalization" | ||
539 | msgstr "" | ||
540 | |||
541 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
542 | #, c-format | ||
543 | msgid "" | ||
544 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
545 | "%llu\n" | ||
546 | msgstr "" | ||
547 | |||
548 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
549 | #, c-format | ||
550 | msgid "%s quota configured for network `%s' is %llu\n" | ||
551 | msgstr "" | ||
552 | |||
553 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
554 | #, c-format | ||
555 | msgid "" | ||
556 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
557 | msgstr "" | ||
558 | |||
559 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
560 | #, fuzzy, c-format | ||
561 | msgid "Failed to initialize solver `%s'!\n" | ||
562 | msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n" | ||
563 | |||
564 | #: src/ats/plugin_ats_mlp.c:1274 | ||
565 | msgid "Problem size too large, cannot allocate memory!\n" | ||
566 | msgstr "" | ||
567 | |||
568 | #: src/ats/plugin_ats_mlp.c:1869 | ||
569 | #, fuzzy, c-format | ||
570 | msgid "Adding address for peer `%s' multiple times\n" | ||
571 | msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n" | ||
572 | |||
573 | #: src/ats/plugin_ats_mlp.c:1913 | ||
574 | #, fuzzy, c-format | ||
575 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
576 | msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n" | ||
577 | |||
578 | #: src/ats/plugin_ats_mlp.c:2475 | ||
579 | msgid "" | ||
580 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
581 | msgstr "" | ||
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 | ||
591 | msgid "Invalid %s configuration %f \n" | ||
592 | msgstr "Konfiguration konnte nicht aus %s geladen werden\n" | ||
593 | |||
594 | #: src/ats/plugin_ats_mlp.c:2670 | ||
595 | #, c-format | ||
596 | msgid "" | ||
597 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
598 | "%llu must be at least %llu\n" | ||
599 | msgstr "" | ||
600 | |||
601 | #: src/ats/plugin_ats_mlp.c:2679 | ||
602 | #, c-format | ||
603 | msgid "" | ||
604 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
605 | "must be at least %llu\n" | ||
606 | msgstr "" | ||
607 | |||
608 | #: src/ats/plugin_ats_mlp.c:2689 | ||
609 | #, c-format | ||
610 | msgid "" | ||
611 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
612 | msgstr "" | ||
613 | |||
614 | #: src/ats/plugin_ats_mlp.c:2698 | ||
615 | #, c-format | ||
616 | msgid "" | ||
617 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
618 | msgstr "" | ||
619 | |||
620 | #: src/ats/plugin_ats_proportional.c:1164 | ||
621 | #, fuzzy, c-format | ||
622 | msgid "Invalid %s configuration %f\n" | ||
623 | msgstr " gconfig\tGTK Konfiguration\n" | ||
624 | |||
627 | #: src/auction/gnunet-auction-create.c:163 | 625 | #: src/auction/gnunet-auction-create.c:163 |
628 | msgid "description of the item to be sold" | 626 | msgid "description of the item to be sold" |
629 | msgstr "" | 627 | msgstr "" |
@@ -769,6 +767,28 @@ msgstr "Ausführlicherer Modus (empfangene Werte ausgeben)" | |||
769 | msgid "Connection to conversation service lost, trying to reconnect\n" | 767 | msgid "Connection to conversation service lost, trying to reconnect\n" |
770 | msgstr "" | 768 | msgstr "" |
771 | 769 | ||
770 | #: src/conversation/gnunet-conversation-test.c:119 | ||
771 | #, c-format | ||
772 | msgid "" | ||
773 | "\n" | ||
774 | "End of transmission. Have a GNU day.\n" | ||
775 | msgstr "" | ||
776 | |||
777 | #: src/conversation/gnunet-conversation-test.c:145 | ||
778 | #, c-format | ||
779 | msgid "" | ||
780 | "\n" | ||
781 | "We are now playing your recording back. If you can hear it, your audio " | ||
782 | "settings are working..." | ||
783 | msgstr "" | ||
784 | |||
785 | #: src/conversation/gnunet-conversation-test.c:210 | ||
786 | #, c-format | ||
787 | msgid "" | ||
788 | "We will now be recording you for %s. After that time, the recording will be " | ||
789 | "played back to you..." | ||
790 | msgstr "" | ||
791 | |||
772 | #: src/conversation/gnunet-conversation.c:269 | 792 | #: src/conversation/gnunet-conversation.c:269 |
773 | #, c-format | 793 | #, c-format |
774 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" | 794 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" |
@@ -1026,30 +1046,8 @@ msgstr "" | |||
1026 | msgid "Enables having a conversation with other GNUnet users." | 1046 | msgid "Enables having a conversation with other GNUnet users." |
1027 | msgstr "" | 1047 | msgstr "" |
1028 | 1048 | ||
1029 | #: src/conversation/gnunet-conversation-test.c:119 | ||
1030 | #, c-format | ||
1031 | msgid "" | ||
1032 | "\n" | ||
1033 | "End of transmission. Have a GNU day.\n" | ||
1034 | msgstr "" | ||
1035 | |||
1036 | #: src/conversation/gnunet-conversation-test.c:145 | ||
1037 | #, c-format | ||
1038 | msgid "" | ||
1039 | "\n" | ||
1040 | "We are now playing your recording back. If you can hear it, your audio " | ||
1041 | "settings are working..." | ||
1042 | msgstr "" | ||
1043 | |||
1044 | #: src/conversation/gnunet-conversation-test.c:210 | ||
1045 | #, c-format | ||
1046 | msgid "" | ||
1047 | "We will now be recording you for %s. After that time, the recording will be " | ||
1048 | "played back to you..." | ||
1049 | msgstr "" | ||
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 |
1054 | msgid "Read error from STDIN: %d %s\n" | 1052 | msgid "Read error from STDIN: %d %s\n" |
1055 | msgstr "Fehler beim Lesen aus STDIN: %d %s\n" | 1053 | msgstr "Fehler beim Lesen aus STDIN: %d %s\n" |
@@ -1174,6 +1172,11 @@ msgstr "ogg_stream_init() fehlgeschlagen.\n" | |||
1174 | msgid "Failed to allocate %u bytes for second packet\n" | 1172 | msgid "Failed to allocate %u bytes for second packet\n" |
1175 | msgstr "UDP-Sockets können nicht geöffnet werden\n" | 1173 | msgstr "UDP-Sockets können nicht geöffnet werden\n" |
1176 | 1174 | ||
1175 | #: src/conversation/gnunet-service-conversation.c:1276 | ||
1176 | #, fuzzy, c-format | ||
1177 | msgid "Could not open line, port %s already in use!\n" | ||
1178 | msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n" | ||
1179 | |||
1177 | #: src/conversation/microphone.c:119 | 1180 | #: src/conversation/microphone.c:119 |
1178 | msgid "Could not start record audio helper\n" | 1181 | msgid "Could not start record audio helper\n" |
1179 | msgstr "" | 1182 | msgstr "" |
@@ -1463,8 +1466,138 @@ msgstr "# Bytes empfangen über TCP" | |||
1463 | msgid "# updates to my type map" | 1466 | msgid "# updates to my type map" |
1464 | msgstr "" | 1467 | msgstr "" |
1465 | 1468 | ||
1469 | #: src/credential/credential_misc.c:88 | ||
1470 | #, fuzzy, c-format | ||
1471 | msgid "Unable to parse CRED record string `%s'\n" | ||
1472 | msgstr "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 | ||
1477 | msgid "Ego `%s' not known to identity service\n" | ||
1478 | msgstr "`%s': unbekannter Dienst: %s\n" | ||
1479 | |||
1480 | #: src/credential/gnunet-credential.c:294 | ||
1481 | #: src/credential/gnunet-credential.c:446 | ||
1482 | #, c-format | ||
1483 | msgid "Issuer public key `%s' is not well-formed\n" | ||
1484 | msgstr "" | ||
1485 | |||
1486 | #: src/credential/gnunet-credential.c:375 | ||
1487 | #: src/credential/gnunet-credential.c:435 | ||
1488 | #, fuzzy, c-format | ||
1489 | msgid "Issuer public key not well-formed\n" | ||
1490 | msgstr "Ungültiger Parameter: `%s'\n" | ||
1491 | |||
1492 | #: src/credential/gnunet-credential.c:386 | ||
1493 | #: src/credential/gnunet-credential.c:455 | ||
1494 | #, fuzzy, c-format | ||
1495 | msgid "Failed to connect to CREDENTIAL\n" | ||
1496 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | ||
1497 | |||
1498 | #: src/credential/gnunet-credential.c:392 | ||
1499 | #, c-format | ||
1500 | msgid "You must provide issuer the attribute\n" | ||
1501 | msgstr "" | ||
1502 | |||
1503 | #: src/credential/gnunet-credential.c:399 | ||
1504 | #, fuzzy, c-format | ||
1505 | msgid "ego required\n" | ||
1506 | msgstr "Gültiger Typ ist erforderlich\n" | ||
1507 | |||
1508 | #: src/credential/gnunet-credential.c:415 | ||
1509 | #, c-format | ||
1510 | msgid "Subject public key needed\n" | ||
1511 | msgstr "" | ||
1512 | |||
1513 | #: src/credential/gnunet-credential.c:426 | ||
1514 | #, c-format | ||
1515 | msgid "Subject public key `%s' is not well-formed\n" | ||
1516 | msgstr "" | ||
1517 | |||
1518 | #: src/credential/gnunet-credential.c:461 | ||
1519 | #, c-format | ||
1520 | msgid "You must provide issuer and subject attributes\n" | ||
1521 | msgstr "" | ||
1522 | |||
1523 | #: src/credential/gnunet-credential.c:511 | ||
1524 | #, fuzzy, c-format | ||
1525 | msgid "Issuer ego required\n" | ||
1526 | msgstr "Gültiger Typ ist erforderlich\n" | ||
1527 | |||
1528 | #: src/credential/gnunet-credential.c:523 | ||
1529 | #, c-format | ||
1530 | msgid "Please specify name to lookup, subject key and issuer key!\n" | ||
1531 | msgstr "" | ||
1532 | |||
1533 | #: src/credential/gnunet-credential.c:543 | ||
1534 | msgid "create credential" | ||
1535 | msgstr "" | ||
1536 | |||
1537 | #: src/credential/gnunet-credential.c:547 | ||
1538 | msgid "verify credential against attribute" | ||
1539 | msgstr "" | ||
1540 | |||
1541 | #: src/credential/gnunet-credential.c:552 | ||
1542 | #, fuzzy | ||
1543 | msgid "The public key of the subject to lookup the credential for" | ||
1544 | msgstr "Die Priorität des Inhalts angeben" | ||
1545 | |||
1546 | #: src/credential/gnunet-credential.c:557 | ||
1547 | msgid "The name of the credential presented by the subject" | ||
1548 | msgstr "" | ||
1549 | |||
1550 | #: src/credential/gnunet-credential.c:562 | ||
1551 | msgid "The public key of the authority to verify the credential against" | ||
1552 | msgstr "" | ||
1553 | |||
1554 | #: src/credential/gnunet-credential.c:567 | ||
1555 | msgid "The ego to use" | ||
1556 | msgstr "" | ||
1557 | |||
1558 | #: src/credential/gnunet-credential.c:572 | ||
1559 | msgid "The issuer attribute to verify against or to issue" | ||
1560 | msgstr "" | ||
1561 | |||
1562 | #: src/credential/gnunet-credential.c:577 | ||
1563 | msgid "The time to live for the credential" | ||
1564 | msgstr "" | ||
1565 | |||
1566 | #: src/credential/gnunet-credential.c:581 | ||
1567 | msgid "collect credentials" | ||
1568 | msgstr "" | ||
1569 | |||
1570 | #: src/credential/gnunet-credential.c:595 | ||
1571 | #, fuzzy | ||
1572 | msgid "GNUnet credential resolver tool" | ||
1573 | msgstr "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 | ||
1578 | msgid "Failed to connect to GNS\n" | ||
1579 | msgstr "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 | ||
1586 | msgid "Failed to connect to namestore\n" | ||
1587 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | ||
1588 | |||
1589 | #: src/credential/plugin_gnsrecord_credential.c:186 | ||
1590 | #, fuzzy, c-format | ||
1591 | msgid "Unable to parse ATTR record string `%s'\n" | ||
1592 | msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" | ||
1593 | |||
1594 | #: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668 | ||
1595 | #, fuzzy | ||
1596 | msgid "GNS REST API initialized\n" | ||
1597 | msgstr " 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 |
1468 | msgid "# bytes stored" | 1601 | msgid "# bytes stored" |
1469 | msgstr "# gespeicherte Bytes" | 1602 | msgstr "# 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 |
1527 | msgid "`%s' failed at %s:%d with error: %s\n" | 1659 | msgid "`%s' failed at %s:%d with error: %s\n" |
1528 | msgstr "»%s« schlug bei %s:%d mit dem Fehler %s fehl\n" | 1660 | msgstr "»%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 |
1534 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" | 1667 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" |
@@ -1596,23 +1729,74 @@ msgstr "" | |||
1596 | msgid "# GET requests executed" | 1729 | msgid "# GET requests executed" |
1597 | msgstr "# ausgeführte GET-Anfragen" | 1730 | msgstr "# ausgeführte GET-Anfragen" |
1598 | 1731 | ||
1599 | #: src/datastore/gnunet-datastore.c:113 | 1732 | #: src/datastore/gnunet-datastore.c:189 |
1733 | #, c-format | ||
1734 | msgid "Dumped %<PRIu64> records\n" | ||
1735 | msgstr "" | ||
1736 | |||
1737 | #: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 | ||
1738 | #, c-format | ||
1739 | msgid "Short write to file: %zd bytes expecting %zd\n" | ||
1740 | msgstr "" | ||
1741 | |||
1742 | #: src/datastore/gnunet-datastore.c:261 | ||
1743 | #, fuzzy | ||
1744 | msgid "Error queueing datastore GET operation\n" | ||
1745 | msgstr "Fehler beim Anlegen des Benutzers" | ||
1746 | |||
1747 | #: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 | ||
1748 | #, fuzzy, c-format | ||
1749 | msgid "Unable to open dump file: %s\n" | ||
1750 | msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" | ||
1751 | |||
1752 | #: src/datastore/gnunet-datastore.c:326 | ||
1600 | #, c-format | 1753 | #, c-format |
1601 | msgid "Failed to store item: %s, aborting\n" | 1754 | msgid "Failed to store item: %s, aborting\n" |
1602 | msgstr "Objekt konnte nicht gespeichert werden: %s, Abbruch\n" | 1755 | msgstr "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 |
1606 | msgid "Cannot use the same configuration for source and destination\n" | 1759 | msgid "Inserted %<PRIu64> records\n" |
1607 | msgstr "" | 1760 | msgstr "" |
1608 | 1761 | ||
1609 | #: src/datastore/gnunet-datastore.c:256 | 1762 | #: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 |
1610 | msgid "" | 1763 | #, c-format |
1611 | "specifies the configuration to use to access an alternative datastore; will " | 1764 | msgid "Short read from file: %zd bytes expecting %zd\n" |
1612 | "merge that datastore into our current datastore" | ||
1613 | msgstr "" | 1765 | msgstr "" |
1614 | 1766 | ||
1615 | #: src/datastore/gnunet-datastore.c:265 | 1767 | #: src/datastore/gnunet-datastore.c:389 |
1768 | #, fuzzy | ||
1769 | msgid "Error queueing datastore PUT operation\n" | ||
1770 | msgstr "Fehler beim Anlegen des Benutzers" | ||
1771 | |||
1772 | #: src/datastore/gnunet-datastore.c:432 | ||
1773 | msgid "Input file is not of a supported format\n" | ||
1774 | msgstr "" | ||
1775 | |||
1776 | #: src/datastore/gnunet-datastore.c:458 | ||
1777 | #, fuzzy | ||
1778 | msgid "Failed connecting to the datastore.\n" | ||
1779 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden." | ||
1780 | |||
1781 | #: src/datastore/gnunet-datastore.c:470 | ||
1782 | #, c-format | ||
1783 | msgid "Please choose at least one operation: %s, %s\n" | ||
1784 | msgstr "" | ||
1785 | |||
1786 | #: src/datastore/gnunet-datastore.c:493 | ||
1787 | msgid "Dump all records from the datastore" | ||
1788 | msgstr "" | ||
1789 | |||
1790 | #: src/datastore/gnunet-datastore.c:497 | ||
1791 | #, fuzzy | ||
1792 | msgid "Insert records into the datastore" | ||
1793 | msgstr "# bytes in der Datenbank" | ||
1794 | |||
1795 | #: src/datastore/gnunet-datastore.c:502 | ||
1796 | msgid "File to dump or insert" | ||
1797 | msgstr "" | ||
1798 | |||
1799 | #: src/datastore/gnunet-datastore.c:511 | ||
1616 | #, fuzzy | 1800 | #, fuzzy |
1617 | msgid "Manipulate GNUnet datastore" | 1801 | msgid "Manipulate GNUnet datastore" |
1618 | msgstr "sqlite Datenspeicher" | 1802 | msgstr "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 |
1660 | msgid "# reserved" | 1844 | msgid "# reserved" |
1661 | msgstr "" | 1845 | msgstr "" |
1662 | 1846 | ||
@@ -1664,147 +1848,148 @@ msgstr "" | |||
1664 | msgid "Could not find matching reservation" | 1848 | msgid "Could not find matching reservation" |
1665 | msgstr "" | 1849 | msgstr "" |
1666 | 1850 | ||
1667 | #: src/datastore/gnunet-service-datastore.c:792 | 1851 | #: src/datastore/gnunet-service-datastore.c:773 |
1668 | #, c-format | 1852 | #, c-format |
1669 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" | 1853 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" |
1670 | msgstr "" | 1854 | msgstr "" |
1671 | 1855 | ||
1672 | #: src/datastore/gnunet-service-datastore.c:1026 | 1856 | #: src/datastore/gnunet-service-datastore.c:876 |
1673 | #, fuzzy | 1857 | #, fuzzy |
1674 | msgid "# GET requests received" | 1858 | msgid "# GET requests received" |
1675 | msgstr "# Client Trace-Anfragen empfangen" | 1859 | msgstr "# 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 |
1679 | msgid "# GET KEY requests received" | 1863 | msgid "# GET KEY requests received" |
1680 | msgstr "# Client Trace-Anfragen empfangen" | 1864 | msgstr "# Client Trace-Anfragen empfangen" |
1681 | 1865 | ||
1682 | #: src/datastore/gnunet-service-datastore.c:1071 | 1866 | #: src/datastore/gnunet-service-datastore.c:920 |
1683 | msgid "# requests filtered by bloomfilter" | 1867 | msgid "# requests filtered by bloomfilter" |
1684 | msgstr "" | 1868 | msgstr "" |
1685 | 1869 | ||
1686 | #: src/datastore/gnunet-service-datastore.c:1108 | 1870 | #: src/datastore/gnunet-service-datastore.c:956 |
1687 | #, fuzzy | 1871 | #, fuzzy |
1688 | msgid "# GET REPLICATION requests received" | 1872 | msgid "# GET REPLICATION requests received" |
1689 | msgstr "# Client Trace-Anfragen empfangen" | 1873 | msgstr "# 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 |
1693 | msgid "# GET ZERO ANONYMITY requests received" | 1877 | msgid "# GET ZERO ANONYMITY requests received" |
1694 | msgstr "# Client Trace-Anfragen empfangen" | 1878 | msgstr "# Client Trace-Anfragen empfangen" |
1695 | 1879 | ||
1696 | #: src/datastore/gnunet-service-datastore.c:1190 | 1880 | #: src/datastore/gnunet-service-datastore.c:1036 |
1697 | msgid "Content not found" | 1881 | msgid "Content not found" |
1698 | msgstr "Kein Inhalt gefunden" | 1882 | msgstr "Kein Inhalt gefunden" |
1699 | 1883 | ||
1700 | #: src/datastore/gnunet-service-datastore.c:1199 | 1884 | #: src/datastore/gnunet-service-datastore.c:1043 |
1701 | msgid "# bytes removed (explicit request)" | 1885 | msgid "# bytes removed (explicit request)" |
1702 | msgstr "" | 1886 | msgstr "" |
1703 | 1887 | ||
1704 | #: src/datastore/gnunet-service-datastore.c:1246 | 1888 | #: src/datastore/gnunet-service-datastore.c:1088 |
1705 | #, fuzzy | 1889 | #, fuzzy |
1706 | msgid "# REMOVE requests received" | 1890 | msgid "# REMOVE requests received" |
1707 | msgstr "# Client Trace-Anfragen empfangen" | 1891 | msgstr "# 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 |
1711 | msgid "" | 1895 | msgid "" |
1712 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" | 1896 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" |
1713 | msgstr "" | 1897 | msgstr "" |
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 |
1718 | msgid "New payload: %lld\n" | 1902 | msgid "New payload: %lld\n" |
1719 | msgstr "" | 1903 | msgstr "" |
1720 | 1904 | ||
1721 | #: src/datastore/gnunet-service-datastore.c:1361 | 1905 | #: src/datastore/gnunet-service-datastore.c:1197 |
1722 | #, c-format | 1906 | #, c-format |
1723 | msgid "Loading `%s' datastore plugin\n" | 1907 | msgid "Loading `%s' datastore plugin\n" |
1724 | msgstr "" | 1908 | msgstr "" |
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 |
1728 | msgid "Failed to load datastore plugin for `%s'\n" | 1912 | msgid "Failed to load datastore plugin for `%s'\n" |
1729 | msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" | 1913 | msgstr "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 |
1732 | msgid "Bloomfilter construction complete.\n" | 1916 | msgid "Bloomfilter construction complete.\n" |
1733 | msgstr "" | 1917 | msgstr "" |
1734 | 1918 | ||
1735 | #: src/datastore/gnunet-service-datastore.c:1489 | 1919 | #: src/datastore/gnunet-service-datastore.c:1325 |
1736 | msgid "Rebuilding bloomfilter. Please be patient.\n" | 1920 | msgid "Rebuilding bloomfilter. Please be patient.\n" |
1737 | msgstr "" | 1921 | msgstr "" |
1738 | 1922 | ||
1739 | #: src/datastore/gnunet-service-datastore.c:1500 | 1923 | #: src/datastore/gnunet-service-datastore.c:1336 |
1740 | msgid "Plugin does not support get_keys function. Please fix!\n" | 1924 | msgid "Plugin does not support get_keys function. Please fix!\n" |
1741 | msgstr "" | 1925 | msgstr "" |
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 |
1745 | msgid "# bytes used in file-sharing datastore `%s'" | 1929 | msgid "# bytes used in file-sharing datastore `%s'" |
1746 | msgstr "# bytes erlaubt in der Datenbank" | 1930 | msgstr "# bytes erlaubt in der Datenbank" |
1747 | 1931 | ||
1748 | #: src/datastore/gnunet-service-datastore.c:1686 | 1932 | #: src/datastore/gnunet-service-datastore.c:1522 |
1749 | msgid "# quota" | 1933 | msgid "# quota" |
1750 | msgstr "# Kontingent" | 1934 | msgstr "# Kontingent" |
1751 | 1935 | ||
1752 | #: src/datastore/gnunet-service-datastore.c:1691 | 1936 | #: src/datastore/gnunet-service-datastore.c:1527 |
1753 | msgid "# cache size" | 1937 | msgid "# cache size" |
1754 | msgstr "# Zwischenspeichergröße" | 1938 | msgstr "# 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 |
1758 | msgid "Could not use specified filename `%s' for bloomfilter.\n" | 1942 | msgid "Could not use specified filename `%s' for bloomfilter.\n" |
1759 | msgstr "" | 1943 | msgstr "" |
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 |
1764 | msgid "Failed to remove bogus bloomfilter file `%s'\n" | 1948 | msgid "Failed to remove bogus bloomfilter file `%s'\n" |
1765 | msgstr "Datei wurde als `%s' gespeichert.\n" | 1949 | msgstr "Datei wurde als `%s' gespeichert.\n" |
1766 | 1950 | ||
1767 | #: src/datastore/gnunet-service-datastore.c:1773 | 1951 | #: src/datastore/gnunet-service-datastore.c:1609 |
1768 | msgid "Failed to initialize bloomfilter.\n" | 1952 | msgid "Failed to initialize bloomfilter.\n" |
1769 | msgstr "Bloomfilter konnte nicht initialisiert werden.\n" | 1953 | msgstr "Bloomfilter konnte nicht initialisiert werden.\n" |
1770 | 1954 | ||
1771 | #: src/datastore/plugin_datastore_heap.c:769 | 1955 | #: src/datastore/plugin_datastore_heap.c:893 |
1772 | msgid "Heap database running\n" | 1956 | msgid "Heap database running\n" |
1773 | msgstr "Heap-Datenbank läuft\n" | 1957 | msgstr "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 | ||
1962 | msgid "MySQL statement run failure" | ||
1963 | msgstr "" | ||
1964 | |||
1965 | #: src/datastore/plugin_datastore_mysql.c:410 | ||
1966 | #: src/datastore/plugin_datastore_sqlite.c:626 | ||
1777 | #, fuzzy | 1967 | #, fuzzy |
1778 | msgid "Data too large" | 1968 | msgid "Data too large" |
1779 | msgstr "Anzahl der Werte" | 1969 | msgstr "Anzahl der Werte" |
1780 | 1970 | ||
1781 | #: src/datastore/plugin_datastore_mysql.c:393 | 1971 | #: src/datastore/plugin_datastore_mysql.c:848 |
1782 | msgid "MySQL statement run failure" | ||
1783 | msgstr "" | ||
1784 | |||
1785 | #: src/datastore/plugin_datastore_mysql.c:936 | ||
1786 | #, fuzzy, c-format | 1972 | #, fuzzy, c-format |
1787 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" | 1973 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" |
1788 | msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n" | 1974 | msgstr "`%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 |
1792 | msgid "Mysql database running\n" | 1978 | msgid "Mysql database running\n" |
1793 | msgstr "MySQL-Datenbank läuft\n" | 1979 | msgstr "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 | ||
1796 | msgid "Postgress exec failure" | 1983 | msgid "Postgress exec failure" |
1797 | msgstr "" | 1984 | msgstr "" |
1798 | 1985 | ||
1799 | #: src/datastore/plugin_datastore_postgres.c:866 | 1986 | #: src/datastore/plugin_datastore_postgres.c:852 |
1800 | #, fuzzy | 1987 | #, fuzzy |
1801 | msgid "Failed to drop table from database.\n" | 1988 | msgid "Failed to drop table from database.\n" |
1802 | msgstr "Fehler beim Binden an UDP Port %d.\n" | 1989 | msgstr "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 | ||
1808 | msgid "Postgres database running\n" | 1993 | msgid "Postgres database running\n" |
1809 | msgstr "PostgreSQL-Datenbank läuft\n" | 1994 | msgstr "PostgreSQL-Datenbank läuft\n" |
1810 | 1995 | ||
@@ -1816,7 +2001,8 @@ msgstr "PostgreSQL-Datenbank läuft\n" | |||
1816 | msgid "`%s' failed at %s:%u with error: %s" | 2001 | msgid "`%s' failed at %s:%u with error: %s" |
1817 | msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" | 2002 | msgstr "`%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" | |||
1825 | msgid "Unable to initialize SQLite: %s.\n" | 2011 | msgid "Unable to initialize SQLite: %s.\n" |
1826 | msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n" | 2012 | msgstr "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 |
2015 | msgid "sqlite bind failure" | ||
2016 | msgstr "" | ||
2017 | |||
2018 | #: src/datastore/plugin_datastore_sqlite.c:1259 | ||
1829 | msgid "sqlite version to old to determine size, assuming zero\n" | 2019 | msgid "sqlite version to old to determine size, assuming zero\n" |
1830 | msgstr "" | 2020 | msgstr "" |
1831 | 2021 | ||
1832 | #: src/datastore/plugin_datastore_sqlite.c:1268 | 2022 | #: src/datastore/plugin_datastore_sqlite.c:1293 |
1833 | #, c-format | 2023 | #, c-format |
1834 | msgid "" | 2024 | msgid "" |
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" |
1837 | msgstr "" | 2027 | msgstr "" |
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 |
1842 | msgid "Sqlite database running\n" | 2033 | msgid "Sqlite database running\n" |
1843 | msgstr "Sqlite-Datenbank läuft\n" | 2034 | msgstr "Sqlite-Datenbank läuft\n" |
1844 | 2035 | ||
1845 | #: src/datastore/plugin_datastore_template.c:259 | 2036 | #: src/datastore/plugin_datastore_template.c:253 |
1846 | msgid "Template database running\n" | 2037 | msgid "Template database running\n" |
1847 | msgstr "" | 2038 | msgstr "" |
1848 | 2039 | ||
@@ -1903,52 +2094,6 @@ msgstr "" | |||
1903 | msgid "Prints all packets that go through the DHT." | 2094 | msgid "Prints all packets that go through the DHT." |
1904 | msgstr "" | 2095 | msgstr "" |
1905 | 2096 | ||
1906 | #: src/dht/gnunet_dht_profiler.c:1161 | ||
1907 | #: src/testbed/gnunet-testbed-profiler.c:255 | ||
1908 | #, c-format | ||
1909 | msgid "Exiting as the number of peers is %u\n" | ||
1910 | msgstr "" | ||
1911 | |||
1912 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
1913 | #, fuzzy | ||
1914 | msgid "number of peers to start" | ||
1915 | msgstr "Anzahl an Durchläufen" | ||
1916 | |||
1917 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
1918 | msgid "" | ||
1919 | "maximum number of times we try to search for successor circle formation (0 " | ||
1920 | "for R5N)" | ||
1921 | msgstr "" | ||
1922 | |||
1923 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
1924 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
1925 | msgid "name of the file with the login information for the testbed" | ||
1926 | msgstr "" | ||
1927 | |||
1928 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
1929 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
1930 | msgstr "" | ||
1931 | |||
1932 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
1933 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
1934 | msgstr "" | ||
1935 | |||
1936 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
1937 | msgid "delay to start doing GETs (default: 5 min)" | ||
1938 | msgstr "" | ||
1939 | |||
1940 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
1941 | msgid "replication degree for DHT PUTs" | ||
1942 | msgstr "" | ||
1943 | |||
1944 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
1945 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
1946 | msgstr "" | ||
1947 | |||
1948 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
1949 | msgid "Measure quality and performance of the DHT service." | ||
1950 | msgstr "" | ||
1951 | |||
1952 | #: src/dht/gnunet-dht-put.c:120 | 2097 | #: src/dht/gnunet-dht-put.c:120 |
1953 | msgid "PUT request sent with key" | 2098 | msgid "PUT request sent with key" |
1954 | msgstr "" | 2099 | msgstr "" |
@@ -2215,6 +2360,51 @@ msgstr "" | |||
2215 | msgid "# DHT requests combined" | 2360 | msgid "# DHT requests combined" |
2216 | msgstr "# dht Anfragen weitergeleitet" | 2361 | msgstr "# dht Anfragen weitergeleitet" |
2217 | 2362 | ||
2363 | #: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255 | ||
2364 | #, c-format | ||
2365 | msgid "Exiting as the number of peers is %u\n" | ||
2366 | msgstr "" | ||
2367 | |||
2368 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
2369 | #, fuzzy | ||
2370 | msgid "number of peers to start" | ||
2371 | msgstr "Anzahl an Durchläufen" | ||
2372 | |||
2373 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2374 | msgid "" | ||
2375 | "maximum number of times we try to search for successor circle formation (0 " | ||
2376 | "for R5N)" | ||
2377 | msgstr "" | ||
2378 | |||
2379 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2380 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2381 | msgid "name of the file with the login information for the testbed" | ||
2382 | msgstr "" | ||
2383 | |||
2384 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
2385 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2386 | msgstr "" | ||
2387 | |||
2388 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2389 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2390 | msgstr "" | ||
2391 | |||
2392 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2393 | msgid "delay to start doing GETs (default: 5 min)" | ||
2394 | msgstr "" | ||
2395 | |||
2396 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2397 | msgid "replication degree for DHT PUTs" | ||
2398 | msgstr "" | ||
2399 | |||
2400 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2401 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2402 | msgstr "" | ||
2403 | |||
2404 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2405 | msgid "Measure quality and performance of the DHT service." | ||
2406 | msgstr "" | ||
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 |
2220 | msgid "Block not of type %u\n" | 2410 | msgid "Block not of type %u\n" |
@@ -2546,7 +2736,7 @@ msgstr "" | |||
2546 | msgid "No useful service enabled. Exiting.\n" | 2736 | msgid "No useful service enabled. Exiting.\n" |
2547 | msgstr "" | 2737 | msgstr "" |
2548 | 2738 | ||
2549 | #: src/exit/gnunet-daemon-exit.c:3969 | 2739 | #: src/exit/gnunet-daemon-exit.c:3970 |
2550 | msgid "Daemon to run to provide an IP exit node for the VPN" | 2740 | msgid "Daemon to run to provide an IP exit node for the VPN" |
2551 | msgstr "" | 2741 | msgstr "" |
2552 | 2742 | ||
@@ -3199,15 +3389,6 @@ msgid "" | |||
3199 | "chk/...)" | 3389 | "chk/...)" |
3200 | msgstr "" | 3390 | msgstr "" |
3201 | 3391 | ||
3202 | #: src/fs/gnunet-fs.c:119 | ||
3203 | msgid "print a list of all indexed files" | ||
3204 | msgstr "" | ||
3205 | |||
3206 | #: src/fs/gnunet-fs.c:130 | ||
3207 | #, fuzzy | ||
3208 | msgid "Special file-sharing operations" | ||
3209 | msgstr "Alle Optionen anzeigen" | ||
3210 | |||
3211 | #: src/fs/gnunet-fs-profiler.c:211 | 3392 | #: src/fs/gnunet-fs-profiler.c:211 |
3212 | msgid "run the experiment with COUNT peers" | 3393 | msgid "run the experiment with COUNT peers" |
3213 | msgstr "" | 3394 | msgstr "" |
@@ -3224,6 +3405,15 @@ msgstr "" | |||
3224 | msgid "run a testbed to measure file-sharing performance" | 3405 | msgid "run a testbed to measure file-sharing performance" |
3225 | msgstr "" | 3406 | msgstr "" |
3226 | 3407 | ||
3408 | #: src/fs/gnunet-fs.c:119 | ||
3409 | msgid "print a list of all indexed files" | ||
3410 | msgstr "" | ||
3411 | |||
3412 | #: src/fs/gnunet-fs.c:130 | ||
3413 | #, fuzzy | ||
3414 | msgid "Special file-sharing operations" | ||
3415 | msgstr "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 |
3229 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" | 3419 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" |
@@ -3923,22 +4113,11 @@ msgstr "" | |||
3923 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" | 4113 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" |
3924 | msgstr "" | 4114 | msgstr "" |
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 | 4117 | msgid "Not ready to process requests, lacking ego data\n" |
3928 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
3929 | msgstr "" | ||
3930 | |||
3931 | #: src/gns/gnunet-gns.c:252 | ||
3932 | #, c-format | ||
3933 | msgid "Please specify name to lookup!\n" | ||
3934 | msgstr "" | ||
3935 | |||
3936 | #: src/gns/gnunet-gns.c:276 | ||
3937 | #, c-format | ||
3938 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
3939 | msgstr "" | 4118 | msgstr "" |
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 |
3944 | msgid "" | 4123 | msgid "" |
@@ -3946,56 +4125,12 @@ msgid "" | |||
3946 | "gns-import.sh?\n" | 4125 | "gns-import.sh?\n" |
3947 | msgstr "" | 4126 | msgstr "" |
3948 | 4127 | ||
3949 | #: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727 | ||
3950 | #, fuzzy, c-format | ||
3951 | msgid "Failed to connect to GNS\n" | ||
3952 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | ||
3953 | |||
3954 | #: src/gns/gnunet-gns.c:374 | ||
3955 | #, c-format | ||
3956 | msgid "Public key `%s' is not well-formed\n" | ||
3957 | msgstr "" | ||
3958 | |||
3959 | #: src/gns/gnunet-gns.c:428 | ||
3960 | msgid "Lookup a record for the given name" | ||
3961 | msgstr "" | ||
3962 | |||
3963 | #: src/gns/gnunet-gns.c:434 | ||
3964 | #, fuzzy | ||
3965 | msgid "Specify the type of the record to lookup" | ||
3966 | msgstr "Die Priorität des Inhalts angeben" | ||
3967 | |||
3968 | #: src/gns/gnunet-gns.c:440 | ||
3969 | msgid "Specify timeout for the lookup" | ||
3970 | msgstr "" | ||
3971 | |||
3972 | #: src/gns/gnunet-gns.c:445 | ||
3973 | msgid "No unneeded output" | ||
3974 | msgstr "" | ||
3975 | |||
3976 | #: src/gns/gnunet-gns.c:451 | ||
3977 | msgid "Specify the public key of the zone to lookup the record in" | ||
3978 | msgstr "" | ||
3979 | |||
3980 | #: src/gns/gnunet-gns.c:457 | ||
3981 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
3982 | msgstr "" | ||
3983 | |||
3984 | #: src/gns/gnunet-gns.c:476 | ||
3985 | #, fuzzy | ||
3986 | msgid "GNUnet GNS resolver tool" | ||
3987 | msgstr "GNUnet Netzwerk Topologie tracen." | ||
3988 | |||
3989 | #: src/gns/gnunet-gns-helper-service-w32.c:602 | ||
3990 | msgid "Not ready to process requests, lacking ego data\n" | ||
3991 | msgstr "" | ||
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 |
3995 | msgid "Failed to connect to identity service\n" | 4130 | msgid "Failed to connect to identity service\n" |
3996 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | 4131 | msgstr "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 |
3999 | msgid "This program will import some GNS authorities into your GNS namestore." | 4134 | msgid "This program will import some GNS authorities into your GNS namestore." |
4000 | msgstr "" | 4135 | msgstr "" |
4001 | 4136 | ||
@@ -4120,13 +4255,63 @@ msgstr "" | |||
4120 | msgid "GNUnet GNS proxy" | 4255 | msgid "GNUnet GNS proxy" |
4121 | msgstr "" | 4256 | msgstr "" |
4122 | 4257 | ||
4258 | #: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 | ||
4259 | #, c-format | ||
4260 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4261 | msgstr "" | ||
4262 | |||
4263 | #: src/gns/gnunet-gns.c:252 | ||
4264 | #, c-format | ||
4265 | msgid "Please specify name to lookup!\n" | ||
4266 | msgstr "" | ||
4267 | |||
4268 | #: src/gns/gnunet-gns.c:276 | ||
4269 | #, c-format | ||
4270 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4271 | msgstr "" | ||
4272 | |||
4273 | #: src/gns/gnunet-gns.c:374 | ||
4274 | #, c-format | ||
4275 | msgid "Public key `%s' is not well-formed\n" | ||
4276 | msgstr "" | ||
4277 | |||
4278 | #: src/gns/gnunet-gns.c:428 | ||
4279 | msgid "Lookup a record for the given name" | ||
4280 | msgstr "" | ||
4281 | |||
4282 | #: src/gns/gnunet-gns.c:434 | ||
4283 | #, fuzzy | ||
4284 | msgid "Specify the type of the record to lookup" | ||
4285 | msgstr "Die Priorität des Inhalts angeben" | ||
4286 | |||
4287 | #: src/gns/gnunet-gns.c:440 | ||
4288 | msgid "Specify timeout for the lookup" | ||
4289 | msgstr "" | ||
4290 | |||
4291 | #: src/gns/gnunet-gns.c:445 | ||
4292 | msgid "No unneeded output" | ||
4293 | msgstr "" | ||
4294 | |||
4295 | #: src/gns/gnunet-gns.c:451 | ||
4296 | msgid "Specify the public key of the zone to lookup the record in" | ||
4297 | msgstr "" | ||
4298 | |||
4299 | #: src/gns/gnunet-gns.c:457 | ||
4300 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4301 | msgstr "" | ||
4302 | |||
4303 | #: src/gns/gnunet-gns.c:476 | ||
4304 | #, fuzzy | ||
4305 | msgid "GNUnet GNS resolver tool" | ||
4306 | msgstr "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 |
4125 | msgid "Failed to connect to the namecache!\n" | 4310 | msgid "Failed to connect to the namecache!\n" |
4126 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | 4311 | msgstr "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 |
4131 | msgid "Could not connect to DHT!\n" | 4316 | msgid "Could not connect to DHT!\n" |
4132 | msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n" | 4317 | msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n" |
@@ -4185,45 +4370,35 @@ msgstr "" | |||
4185 | msgid "Hostname `%s' is not well-formed, resolution fails\n" | 4370 | msgid "Hostname `%s' is not well-formed, resolution fails\n" |
4186 | msgstr "" | 4371 | msgstr "" |
4187 | 4372 | ||
4188 | #: src/gns/plugin_gnsrecord_gns.c:203 | 4373 | #: src/gns/plugin_gnsrecord_gns.c:179 |
4189 | #, c-format | 4374 | #, c-format |
4190 | msgid "Unable to parse PKEY record `%s'\n" | 4375 | msgid "Unable to parse PKEY record `%s'\n" |
4191 | msgstr "" | 4376 | msgstr "" |
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 |
4195 | msgid "Unable to parse GNS2DNS record `%s'\n" | 4380 | msgid "Unable to parse GNS2DNS record `%s'\n" |
4196 | msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" | 4381 | msgstr "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 |
4200 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" | 4385 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" |
4201 | msgstr "" | 4386 | msgstr "" |
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 |
4205 | msgid "Unable to parse VPN record string `%s'\n" | 4390 | msgid "Unable to parse VPN record string `%s'\n" |
4206 | msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" | 4391 | msgstr "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 |
4210 | msgid "Unable to parse BOX record string `%s'\n" | 4395 | msgid "Unable to parse BOX record string `%s'\n" |
4211 | msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" | 4396 | msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" |
4212 | 4397 | ||
4213 | #: src/gns/plugin_gnsrecord_gns.c:360 | ||
4214 | #, fuzzy, c-format | ||
4215 | msgid "Unable to parse REVERSE record string `%s'\n" | ||
4216 | msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" | ||
4217 | |||
4218 | #: src/gns/plugin_rest_gns.c:384 | 4398 | #: src/gns/plugin_rest_gns.c:384 |
4219 | msgid "Ego for not found, cannot perform lookup.\n" | 4399 | msgid "Ego for not found, cannot perform lookup.\n" |
4220 | msgstr "" | 4400 | msgstr "" |
4221 | 4401 | ||
4222 | #: src/gns/plugin_rest_gns.c:668 | ||
4223 | #, fuzzy | ||
4224 | msgid "GNS REST API initialized\n" | ||
4225 | msgstr " 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 |
4229 | msgid "Unable to parse IPv4 address `%s'\n" | 4404 | msgid "Unable to parse IPv4 address `%s'\n" |
@@ -4655,6 +4830,53 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n" | |||
4655 | msgid "Could not start hostlist HTTP server on port %u\n" | 4830 | msgid "Could not start hostlist HTTP server on port %u\n" |
4656 | msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n" | 4831 | msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n" |
4657 | 4832 | ||
4833 | #: src/identity-provider/gnunet-idp.c:348 | ||
4834 | #, fuzzy | ||
4835 | msgid "Ego is required\n" | ||
4836 | msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n" | ||
4837 | |||
4838 | #: src/identity-provider/gnunet-idp.c:370 | ||
4839 | msgid "Add attribute" | ||
4840 | msgstr "" | ||
4841 | |||
4842 | #: src/identity-provider/gnunet-idp.c:376 | ||
4843 | msgid "Attribute value" | ||
4844 | msgstr "" | ||
4845 | |||
4846 | #: src/identity-provider/gnunet-idp.c:381 | ||
4847 | msgid "Ego" | ||
4848 | msgstr "" | ||
4849 | |||
4850 | #: src/identity-provider/gnunet-idp.c:386 | ||
4851 | msgid "Audience (relying party)" | ||
4852 | msgstr "" | ||
4853 | |||
4854 | #: src/identity-provider/gnunet-idp.c:390 | ||
4855 | msgid "List attributes for Ego" | ||
4856 | msgstr "" | ||
4857 | |||
4858 | #: src/identity-provider/gnunet-idp.c:395 | ||
4859 | msgid "Issue a ticket" | ||
4860 | msgstr "" | ||
4861 | |||
4862 | #: src/identity-provider/gnunet-idp.c:400 | ||
4863 | msgid "Consume a ticket" | ||
4864 | msgstr "" | ||
4865 | |||
4866 | #: src/identity-provider/gnunet-idp.c:405 | ||
4867 | msgid "Revoke a ticket" | ||
4868 | msgstr "" | ||
4869 | |||
4870 | #: src/identity-provider/identity_provider_api.c:429 | ||
4871 | #, fuzzy | ||
4872 | msgid "failed to store record\n" | ||
4873 | msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" | ||
4874 | |||
4875 | #: src/identity-provider/plugin_rest_identity_provider.c:1175 | ||
4876 | #, fuzzy | ||
4877 | msgid "Identity Provider REST API initialized\n" | ||
4878 | msgstr " 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 |
4660 | msgid "Failed to create ego: %s\n" | 4882 | msgid "Failed to create ego: %s\n" |
@@ -4742,33 +4964,10 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" | |||
4742 | msgid "Failed to create directory `%s' for storing egos\n" | 4964 | msgid "Failed to create directory `%s' for storing egos\n" |
4743 | msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" | 4965 | msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" |
4744 | 4966 | ||
4745 | #: src/identity/plugin_rest_identity.c:967 | 4967 | #: src/identity/plugin_rest_identity.c:964 |
4746 | msgid "Identity REST API initialized\n" | 4968 | msgid "Identity REST API initialized\n" |
4747 | msgstr "" | 4969 | msgstr "" |
4748 | 4970 | ||
4749 | #: src/identity-provider/gnunet-identity-token.c:66 | ||
4750 | #, fuzzy | ||
4751 | msgid "Option `-t' is required\n" | ||
4752 | msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n" | ||
4753 | |||
4754 | #: src/identity-provider/gnunet-identity-token.c:77 | ||
4755 | #, fuzzy, c-format | ||
4756 | msgid "Token `%s' is malformed\n" | ||
4757 | msgstr "Schlüssel »%s« ist gültig\n" | ||
4758 | |||
4759 | #: src/identity-provider/gnunet-identity-token.c:166 | ||
4760 | msgid "GNUid token" | ||
4761 | msgstr "" | ||
4762 | |||
4763 | #: src/identity-provider/gnunet-identity-token.c:171 | ||
4764 | msgid "Print token contents" | ||
4765 | msgstr "" | ||
4766 | |||
4767 | #: src/identity-provider/plugin_rest_identity_provider.c:1166 | ||
4768 | #, fuzzy | ||
4769 | msgid "Identity Token REST API initialized\n" | ||
4770 | msgstr " Verbindung fehlgeschlagen\n" | ||
4771 | |||
4772 | #: src/json/json.c:119 | 4971 | #: src/json/json.c:119 |
4773 | #, fuzzy, c-format | 4972 | #, fuzzy, c-format |
4774 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" | 4973 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" |
@@ -4870,11 +5069,65 @@ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" | |||
4870 | msgid "flat plugin running\n" | 5069 | msgid "flat plugin running\n" |
4871 | msgstr "Sqlite-Datenbank läuft\n" | 5070 | msgstr "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 |
5074 | msgid "Unsupported form value `%s'\n" | ||
5075 | msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" | ||
5076 | |||
5077 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
5078 | #, fuzzy, c-format | ||
5079 | msgid "Failed to create record for domain `%s': %s\n" | ||
5080 | msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" | ||
5081 | |||
5082 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5083 | msgid "Error when mapping zone to name\n" | ||
5084 | msgstr "" | ||
5085 | |||
5086 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5087 | #, c-format | ||
5088 | msgid "Found existing name `%s' for the given key\n" | ||
5089 | msgstr "" | ||
5090 | |||
5091 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5092 | #, c-format | ||
5093 | msgid "Found %u existing records for domain `%s'\n" | ||
5094 | msgstr "" | ||
5095 | |||
5096 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5097 | #, fuzzy, c-format | ||
5098 | msgid "Failed to create page for `%s'\n" | ||
5099 | msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n" | ||
5100 | |||
5101 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5102 | #, fuzzy, c-format | ||
5103 | msgid "Failed to setup post processor for `%s'\n" | ||
5104 | msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n" | ||
5105 | |||
5106 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5107 | msgid "Domain name must not contain `.'\n" | ||
5108 | msgstr "" | ||
5109 | |||
5110 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5111 | msgid "Domain name must not contain `+'\n" | ||
5112 | msgstr "" | ||
5113 | |||
5114 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5115 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5116 | msgstr "" | ||
5117 | |||
5118 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
4875 | #, fuzzy | 5119 | #, fuzzy |
4876 | msgid "Failed to create indices\n" | 5120 | msgid "Failed to start HTTP server\n" |
4877 | msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" | 5121 | msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n" |
5122 | |||
5123 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5124 | #, fuzzy | ||
5125 | msgid "Failed to connect to identity\n" | ||
5126 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | ||
5127 | |||
5128 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5129 | msgid "GNU Name System First Come First Serve name registration service" | ||
5130 | msgstr "" | ||
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" | |||
4882 | msgstr "" | 5135 | msgstr "" |
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 |
4887 | msgid "Deleting record failed, record does not exist%s%s\n" | 5140 | msgid "Deleting record failed, record does not exist%s%s\n" |
4888 | msgstr "" | 5141 | msgstr "" |
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 |
4893 | msgid "Deleting record failed%s%s\n" | 5146 | msgid "Deleting record failed%s%s\n" |
4894 | msgstr "" | 5147 | msgstr "" |
@@ -4906,7 +5159,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n" | |||
4906 | msgstr "" | 5159 | msgstr "" |
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 |
4911 | msgid "There are no records under label `%s' that could be deleted.\n" | 5164 | msgid "There are no records under label `%s' that could be deleted.\n" |
4912 | msgstr "" | 5165 | msgstr "" |
@@ -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" |
4918 | msgstr "" | 5171 | msgstr "" |
4919 | 5172 | ||
4920 | #: src/namestore/gnunet-namestore.c:776 | ||
4921 | #: src/namestore/plugin_rest_namestore.c:1004 | ||
4922 | #, fuzzy, c-format | ||
4923 | msgid "Ego `%s' not known to identity service\n" | ||
4924 | msgstr "`%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 |
4928 | msgid "No options given\n" | 5175 | msgid "No options given\n" |
4929 | msgstr "" | 5176 | msgstr "" |
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 | ||
4935 | msgid "Failed to connect to namestore\n" | ||
4936 | msgstr "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" | |||
4948 | msgstr "" | 5188 | msgstr "" |
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 |
4953 | msgid "Unsupported type `%s'\n" | 5193 | msgid "Unsupported type `%s'\n" |
4954 | msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" | 5194 | msgstr "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 |
4960 | msgid "Value `%s' invalid for record type `%s'\n" | 5200 | msgid "Value `%s' invalid for record type `%s'\n" |
4961 | msgstr "%s: Symbolwert `%s' ist ungültig für %s\n" | 5201 | msgstr "%s: Symbolwert `%s' ist ungültig für %s\n" |
@@ -4974,8 +5214,7 @@ msgstr "" | |||
4974 | msgid "Invalid public key for reverse lookup `%s'\n" | 5214 | msgid "Invalid public key for reverse lookup `%s'\n" |
4975 | msgstr "" | 5215 | msgstr "" |
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 |
4980 | msgid "Invalid URI `%s'\n" | 5219 | msgid "Invalid URI `%s'\n" |
4981 | msgstr "Ungültiger Parameter: `%s'\n" | 5220 | msgstr "Ungültiger Parameter: `%s'\n" |
@@ -4986,13 +5225,13 @@ msgid "Invalid nick `%s'\n" | |||
4986 | msgstr "Ungültiger Parameter: `%s'\n" | 5225 | msgstr "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 |
4991 | msgid "No default ego configured in identity service\n" | 5230 | msgid "No default ego configured in identity service\n" |
4992 | msgstr "" | 5231 | msgstr "" |
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 |
4997 | msgid "Cannot connect to identity service\n" | 5236 | msgid "Cannot connect to identity service\n" |
4998 | msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n" | 5237 | msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n" |
@@ -5052,67 +5291,7 @@ msgstr "" | |||
5052 | msgid "name of the ego controlling the zone" | 5291 | msgid "name of the ego controlling the zone" |
5053 | msgstr "" | 5292 | msgstr "" |
5054 | 5293 | ||
5055 | #: src/namestore/gnunet-namestore-fcfsd.c:508 | 5294 | #: src/namestore/gnunet-service-namestore.c:615 |
5056 | #, fuzzy, c-format | ||
5057 | msgid "Unsupported form value `%s'\n" | ||
5058 | msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" | ||
5059 | |||
5060 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
5061 | #, fuzzy, c-format | ||
5062 | msgid "Failed to create record for domain `%s': %s\n" | ||
5063 | msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" | ||
5064 | |||
5065 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5066 | msgid "Error when mapping zone to name\n" | ||
5067 | msgstr "" | ||
5068 | |||
5069 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5070 | #, c-format | ||
5071 | msgid "Found existing name `%s' for the given key\n" | ||
5072 | msgstr "" | ||
5073 | |||
5074 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5075 | #, c-format | ||
5076 | msgid "Found %u existing records for domain `%s'\n" | ||
5077 | msgstr "" | ||
5078 | |||
5079 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5080 | #, fuzzy, c-format | ||
5081 | msgid "Failed to create page for `%s'\n" | ||
5082 | msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n" | ||
5083 | |||
5084 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5085 | #, fuzzy, c-format | ||
5086 | msgid "Failed to setup post processor for `%s'\n" | ||
5087 | msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n" | ||
5088 | |||
5089 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5090 | msgid "Domain name must not contain `.'\n" | ||
5091 | msgstr "" | ||
5092 | |||
5093 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5094 | msgid "Domain name must not contain `+'\n" | ||
5095 | msgstr "" | ||
5096 | |||
5097 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5098 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5099 | msgstr "" | ||
5100 | |||
5101 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5102 | #, fuzzy | ||
5103 | msgid "Failed to start HTTP server\n" | ||
5104 | msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n" | ||
5105 | |||
5106 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5107 | #, fuzzy | ||
5108 | msgid "Failed to connect to identity\n" | ||
5109 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | ||
5110 | |||
5111 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5112 | msgid "GNU Name System First Come First Serve name registration service" | ||
5113 | msgstr "" | ||
5114 | |||
5115 | #: src/namestore/gnunet-service-namestore.c:612 | ||
5116 | #, c-format | 5295 | #, c-format |
5117 | msgid "Failed to replicate block in namecache: %s\n" | 5296 | msgid "Failed to replicate block in namecache: %s\n" |
5118 | msgstr "" | 5297 | msgstr "" |
@@ -5126,7 +5305,7 @@ msgstr "" | |||
5126 | msgid "flat file database running\n" | 5305 | msgid "flat file database running\n" |
5127 | msgstr "Sqlite-Datenbank läuft\n" | 5306 | msgstr "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 |
5131 | msgid "Namestore REST API initialized\n" | 5310 | msgid "Namestore REST API initialized\n" |
5132 | msgstr " Verbindung fehlgeschlagen\n" | 5311 | msgstr " Verbindung fehlgeschlagen\n" |
@@ -5416,10 +5595,6 @@ msgstr "Kommando `%s' wurde nicht gefunden!\n" | |||
5416 | msgid "`upnpc' command not found\n" | 5595 | msgid "`upnpc' command not found\n" |
5417 | msgstr "Kommando `%s' wurde nicht gefunden!\n" | 5596 | msgstr "Kommando `%s' wurde nicht gefunden!\n" |
5418 | 5597 | ||
5419 | #: src/nse/gnunet-nse.c:122 | ||
5420 | msgid "Show network size estimates from NSE service." | ||
5421 | msgstr "" | ||
5422 | |||
5423 | #: src/nse/gnunet-nse-profiler.c:842 | 5598 | #: src/nse/gnunet-nse-profiler.c:842 |
5424 | msgid "limit to the number of connections to NSE services, 0 for none" | 5599 | msgid "limit to the number of connections to NSE services, 0 for none" |
5425 | msgstr "" | 5600 | msgstr "" |
@@ -5444,68 +5619,15 @@ msgstr "" | |||
5444 | msgid "Measure quality and performance of the NSE service." | 5619 | msgid "Measure quality and performance of the NSE service." |
5445 | msgstr "" | 5620 | msgstr "" |
5446 | 5621 | ||
5622 | #: src/nse/gnunet-nse.c:122 | ||
5623 | msgid "Show network size estimates from NSE service." | ||
5624 | msgstr "" | ||
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 |
5449 | msgid "Value is too large.\n" | 5628 | msgid "Value is too large.\n" |
5450 | msgstr "" | 5629 | msgstr "" |
5451 | 5630 | ||
5452 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5453 | #, fuzzy, c-format | ||
5454 | msgid "Removing expired address of transport `%s'\n" | ||
5455 | msgstr "Verfügbare(r) Transport(e): %s\n" | ||
5456 | |||
5457 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5458 | #, fuzzy, c-format | ||
5459 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5460 | msgstr "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 | ||
5465 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5466 | msgstr "Datei wurde als `%s' gespeichert.\n" | ||
5467 | |||
5468 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5469 | msgid "# peers known" | ||
5470 | msgstr "" | ||
5471 | |||
5472 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5473 | #, c-format | ||
5474 | msgid "" | ||
5475 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5476 | msgstr "" | ||
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 | ||
5482 | msgid "Scanning directory `%s'\n" | ||
5483 | msgstr "==> Verzeichnis `%s':\n" | ||
5484 | |||
5485 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5486 | #, fuzzy, c-format | ||
5487 | msgid "Still no peers found in `%s'!\n" | ||
5488 | msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n" | ||
5489 | |||
5490 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5491 | #, fuzzy, c-format | ||
5492 | msgid "Cleaning up directory `%s'\n" | ||
5493 | msgstr "==> Verzeichnis `%s':\n" | ||
5494 | |||
5495 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5496 | #, c-format | ||
5497 | msgid "Importing HELLOs from `%s'\n" | ||
5498 | msgstr "" | ||
5499 | |||
5500 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5501 | msgid "Skipping import of included HELLOs\n" | ||
5502 | msgstr "" | ||
5503 | |||
5504 | #: src/peerinfo/peerinfo_api.c:220 | ||
5505 | #, fuzzy | ||
5506 | msgid "Failed to receive response from `PEERINFO' service." | ||
5507 | msgstr "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 |
5511 | msgid "%sPeer `%s'\n" | 5633 | msgid "%sPeer `%s'\n" |
@@ -5596,6 +5718,63 @@ msgstr "Teste Transport(e) %s\n" | |||
5596 | msgid "Failed to load transport plugin for `%s'\n" | 5718 | msgid "Failed to load transport plugin for `%s'\n" |
5597 | msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" | 5719 | msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" |
5598 | 5720 | ||
5721 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5722 | #, fuzzy, c-format | ||
5723 | msgid "Removing expired address of transport `%s'\n" | ||
5724 | msgstr "Verfügbare(r) Transport(e): %s\n" | ||
5725 | |||
5726 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5727 | #, fuzzy, c-format | ||
5728 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5729 | msgstr "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 | ||
5734 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5735 | msgstr "Datei wurde als `%s' gespeichert.\n" | ||
5736 | |||
5737 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5738 | msgid "# peers known" | ||
5739 | msgstr "" | ||
5740 | |||
5741 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5742 | #, c-format | ||
5743 | msgid "" | ||
5744 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5745 | msgstr "" | ||
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 | ||
5751 | msgid "Scanning directory `%s'\n" | ||
5752 | msgstr "==> Verzeichnis `%s':\n" | ||
5753 | |||
5754 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5755 | #, fuzzy, c-format | ||
5756 | msgid "Still no peers found in `%s'!\n" | ||
5757 | msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n" | ||
5758 | |||
5759 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5760 | #, fuzzy, c-format | ||
5761 | msgid "Cleaning up directory `%s'\n" | ||
5762 | msgstr "==> Verzeichnis `%s':\n" | ||
5763 | |||
5764 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5765 | #, c-format | ||
5766 | msgid "Importing HELLOs from `%s'\n" | ||
5767 | msgstr "" | ||
5768 | |||
5769 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5770 | msgid "Skipping import of included HELLOs\n" | ||
5771 | msgstr "" | ||
5772 | |||
5773 | #: src/peerinfo/peerinfo_api.c:220 | ||
5774 | #, fuzzy | ||
5775 | msgid "Failed to receive response from `PEERINFO' service." | ||
5776 | msgstr "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 |
5600 | msgid "peerstore" | 5779 | msgid "peerstore" |
5601 | msgstr "" | 5780 | msgstr "" |
@@ -5644,15 +5823,10 @@ msgstr "" | |||
5644 | msgid "Unable to create indices: %s.\n" | 5823 | msgid "Unable to create indices: %s.\n" |
5645 | msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n" | 5824 | msgstr "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 |
5649 | msgid "`%s:%s' failed at %s:%d with error: %s\n" | 5828 | msgid "PQprepare (`%s' as `%s') failed with error: %s\n" |
5650 | msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n" | 5829 | msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n" |
5651 | |||
5652 | #: src/postgres/postgres.c:192 | ||
5653 | #, fuzzy, c-format | ||
5654 | msgid "Unable to connect to Postgres database '%s': %s\n" | ||
5655 | msgstr "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 "" | |||
5832 | msgid "Daemon to announce regular expressions for the peer using cadet." | 6006 | msgid "Daemon to announce regular expressions for the peer using cadet." |
5833 | msgstr "" | 6007 | msgstr "" |
5834 | 6008 | ||
5835 | #: src/regex/gnunet-regex-profiler.c:1314 | 6009 | #: src/regex/gnunet-regex-profiler.c:1386 |
5836 | msgid "No configuration file given. Exiting\n" | 6010 | msgid "No configuration file given. Exiting\n" |
5837 | msgstr "Keine Konfigurationsdatei angegeben. Abbruch\n" | 6011 | msgstr "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 |
5842 | msgid "No policy directory specified on command line. Exiting.\n" | 6016 | msgid "No policy directory specified on command line. Exiting.\n" |
5843 | msgstr "" | 6017 | msgstr "" |
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 |
5848 | msgid "Specified policies directory does not exist. Exiting.\n" | 6022 | msgid "Specified policies directory does not exist. Exiting.\n" |
5849 | msgstr "" | 6023 | msgstr "" |
5850 | 6024 | ||
5851 | #: src/regex/gnunet-regex-profiler.c:1368 | 6025 | #: src/regex/gnunet-regex-profiler.c:1440 |
5852 | #, c-format | 6026 | #, c-format |
5853 | msgid "No files found in `%s'\n" | 6027 | msgid "No files found in `%s'\n" |
5854 | msgstr "Keine Dateien in »%s« gefunden\n" | 6028 | msgstr "Keine Dateien in »%s« gefunden\n" |
5855 | 6029 | ||
5856 | #: src/regex/gnunet-regex-profiler.c:1377 | 6030 | #: src/regex/gnunet-regex-profiler.c:1449 |
5857 | msgid "No search strings file given. Exiting.\n" | 6031 | msgid "No search strings file given. Exiting.\n" |
5858 | msgstr "" | 6032 | msgstr "" |
5859 | 6033 | ||
5860 | #: src/regex/gnunet-regex-profiler.c:1397 | 6034 | #: src/regex/gnunet-regex-profiler.c:1469 |
5861 | msgid "Error loading search strings. Exiting.\n" | 6035 | msgid "Error loading search strings. Exiting.\n" |
5862 | msgstr "" | 6036 | msgstr "" |
5863 | 6037 | ||
5864 | #: src/regex/gnunet-regex-profiler.c:1485 | 6038 | #: src/regex/gnunet-regex-profiler.c:1557 |
5865 | msgid "name of the file for writing statistics" | 6039 | msgid "name of the file for writing statistics" |
5866 | msgstr "" | 6040 | msgstr "" |
5867 | 6041 | ||
5868 | #: src/regex/gnunet-regex-profiler.c:1491 | 6042 | #: src/regex/gnunet-regex-profiler.c:1563 |
5869 | msgid "wait TIMEOUT before ending the experiment" | 6043 | msgid "wait TIMEOUT before ending the experiment" |
5870 | msgstr "" | 6044 | msgstr "" |
5871 | 6045 | ||
5872 | #: src/regex/gnunet-regex-profiler.c:1497 | 6046 | #: src/regex/gnunet-regex-profiler.c:1569 |
5873 | msgid "directory with policy files" | 6047 | msgid "directory with policy files" |
5874 | msgstr "" | 6048 | msgstr "" |
5875 | 6049 | ||
5876 | #: src/regex/gnunet-regex-profiler.c:1504 | 6050 | #: src/regex/gnunet-regex-profiler.c:1576 |
5877 | msgid "name of file with input strings" | 6051 | msgid "name of file with input strings" |
5878 | msgstr "" | 6052 | msgstr "" |
5879 | 6053 | ||
5880 | #: src/regex/gnunet-regex-profiler.c:1510 | 6054 | #: src/regex/gnunet-regex-profiler.c:1582 |
5881 | msgid "name of file with hosts' names" | 6055 | msgid "name of file with hosts' names" |
5882 | msgstr "" | 6056 | msgstr "" |
5883 | 6057 | ||
5884 | #: src/regex/gnunet-regex-profiler.c:1523 | 6058 | #: src/regex/gnunet-regex-profiler.c:1595 |
5885 | msgid "Profiler for regex" | 6059 | msgid "Profiler for regex" |
5886 | msgstr "" | 6060 | msgstr "" |
5887 | 6061 | ||
@@ -6110,10 +6284,10 @@ msgstr "" | |||
6110 | msgid "Calculate the Vectorproduct with a GNUnet peer." | 6284 | msgid "Calculate the Vectorproduct with a GNUnet peer." |
6111 | msgstr "" | 6285 | msgstr "" |
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 |
6118 | msgid "Connect to CADET failed\n" | 6292 | msgid "Connect to CADET failed\n" |
6119 | msgstr " Verbindung fehlgeschlagen\n" | 6293 | msgstr " Verbindung fehlgeschlagen\n" |
@@ -6138,7 +6312,7 @@ msgstr "" | |||
6138 | msgid "also profile decryption" | 6312 | msgid "also profile decryption" |
6139 | msgstr "" | 6313 | msgstr "" |
6140 | 6314 | ||
6141 | #: src/set/gnunet-service-set.c:1948 | 6315 | #: src/set/gnunet-service-set.c:1989 |
6142 | #, fuzzy | 6316 | #, fuzzy |
6143 | msgid "Could not connect to CADET service\n" | 6317 | msgid "Could not connect to CADET service\n" |
6144 | msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n" | 6318 | msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n" |
@@ -6198,113 +6372,113 @@ msgstr "" | |||
6198 | msgid "say good-bye and leave somebody else's place" | 6372 | msgid "say good-bye and leave somebody else's place" |
6199 | msgstr "" | 6373 | msgstr "" |
6200 | 6374 | ||
6201 | #: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 | 6375 | #: src/social/gnunet-social.c:1227 |
6202 | msgid "create a place" | 6376 | msgid "create a place" |
6203 | msgstr "" | 6377 | msgstr "" |
6204 | 6378 | ||
6205 | #: src/social/gnunet-social.c:1237 | 6379 | #: src/social/gnunet-social.c:1232 |
6206 | msgid "destroy a place we were hosting" | 6380 | msgid "destroy a place we were hosting" |
6207 | msgstr "" | 6381 | msgstr "" |
6208 | 6382 | ||
6209 | #: src/social/gnunet-social.c:1242 | 6383 | #: src/social/gnunet-social.c:1237 |
6210 | msgid "enter somebody else's place" | 6384 | msgid "enter somebody else's place" |
6211 | msgstr "" | 6385 | msgstr "" |
6212 | 6386 | ||
6213 | #: src/social/gnunet-social.c:1248 | 6387 | #: src/social/gnunet-social.c:1243 |
6214 | msgid "find state matching name prefix" | 6388 | msgid "find state matching name prefix" |
6215 | msgstr "" | 6389 | msgstr "" |
6216 | 6390 | ||
6217 | #: src/social/gnunet-social.c:1253 | 6391 | #: src/social/gnunet-social.c:1248 |
6218 | msgid "replay history of messages up to the given --limit" | 6392 | msgid "replay history of messages up to the given --limit" |
6219 | msgstr "" | 6393 | msgstr "" |
6220 | 6394 | ||
6221 | #: src/social/gnunet-social.c:1258 | 6395 | #: src/social/gnunet-social.c:1253 |
6222 | msgid "reconnect to a previously created place" | 6396 | msgid "reconnect to a previously created place" |
6223 | msgstr "" | 6397 | msgstr "" |
6224 | 6398 | ||
6225 | #: src/social/gnunet-social.c:1263 | 6399 | #: src/social/gnunet-social.c:1258 |
6226 | msgid "publish something to a place we are hosting" | 6400 | msgid "publish something to a place we are hosting" |
6227 | msgstr "" | 6401 | msgstr "" |
6228 | 6402 | ||
6229 | #: src/social/gnunet-social.c:1268 | 6403 | #: src/social/gnunet-social.c:1263 |
6230 | msgid "reconnect to a previously entered place" | 6404 | msgid "reconnect to a previously entered place" |
6231 | msgstr "" | 6405 | msgstr "" |
6232 | 6406 | ||
6233 | #: src/social/gnunet-social.c:1273 | 6407 | #: src/social/gnunet-social.c:1268 |
6234 | msgid "search for state matching exact name" | 6408 | msgid "search for state matching exact name" |
6235 | msgstr "" | 6409 | msgstr "" |
6236 | 6410 | ||
6237 | #: src/social/gnunet-social.c:1278 | 6411 | #: src/social/gnunet-social.c:1273 |
6238 | msgid "submit something to somebody's place" | 6412 | msgid "submit something to somebody's place" |
6239 | msgstr "" | 6413 | msgstr "" |
6240 | 6414 | ||
6241 | #: src/social/gnunet-social.c:1283 | 6415 | #: src/social/gnunet-social.c:1278 |
6242 | msgid "list of egos and subscribed places" | 6416 | msgid "list of egos and subscribed places" |
6243 | msgstr "" | 6417 | msgstr "" |
6244 | 6418 | ||
6245 | #: src/social/gnunet-social.c:1288 | 6419 | #: src/social/gnunet-social.c:1283 |
6246 | msgid "extract and replay history between message IDs --start and --until" | 6420 | msgid "extract and replay history between message IDs --start and --until" |
6247 | msgstr "" | 6421 | msgstr "" |
6248 | 6422 | ||
6249 | #: src/social/gnunet-social.c:1297 | 6423 | #: src/social/gnunet-social.c:1292 |
6250 | msgid "application ID to use when connecting" | 6424 | msgid "application ID to use when connecting" |
6251 | msgstr "" | 6425 | msgstr "" |
6252 | 6426 | ||
6253 | #: src/social/gnunet-social.c:1303 | 6427 | #: src/social/gnunet-social.c:1298 |
6254 | msgid "message body or state value" | 6428 | msgid "message body or state value" |
6255 | msgstr "" | 6429 | msgstr "" |
6256 | 6430 | ||
6257 | #: src/social/gnunet-social.c:1309 | 6431 | #: src/social/gnunet-social.c:1304 |
6258 | #, fuzzy | 6432 | #, fuzzy |
6259 | msgid "name or public key of ego" | 6433 | msgid "name or public key of ego" |
6260 | msgstr "Ungültiger Parameter: `%s'\n" | 6434 | msgstr "Ungültiger Parameter: `%s'\n" |
6261 | 6435 | ||
6262 | #: src/social/gnunet-social.c:1314 | 6436 | #: src/social/gnunet-social.c:1309 |
6263 | msgid "wait for incoming messages" | 6437 | msgid "wait for incoming messages" |
6264 | msgstr "" | 6438 | msgstr "" |
6265 | 6439 | ||
6266 | #: src/social/gnunet-social.c:1320 | 6440 | #: src/social/gnunet-social.c:1315 |
6267 | msgid "GNS name" | 6441 | msgid "GNS name" |
6268 | msgstr "" | 6442 | msgstr "" |
6269 | 6443 | ||
6270 | #: src/social/gnunet-social.c:1326 | 6444 | #: src/social/gnunet-social.c:1321 |
6271 | msgid "peer ID for --guest-enter" | 6445 | msgid "peer ID for --guest-enter" |
6272 | msgstr "" | 6446 | msgstr "" |
6273 | 6447 | ||
6274 | #: src/social/gnunet-social.c:1332 | 6448 | #: src/social/gnunet-social.c:1327 |
6275 | msgid "name (key) to query from state" | 6449 | msgid "name (key) to query from state" |
6276 | msgstr "" | 6450 | msgstr "" |
6277 | 6451 | ||
6278 | #: src/social/gnunet-social.c:1338 | 6452 | #: src/social/gnunet-social.c:1333 |
6279 | msgid "method name" | 6453 | msgid "method name" |
6280 | msgstr "" | 6454 | msgstr "" |
6281 | 6455 | ||
6282 | #: src/social/gnunet-social.c:1344 | 6456 | #: src/social/gnunet-social.c:1339 |
6283 | #, fuzzy | 6457 | #, fuzzy |
6284 | msgid "number of messages to replay from history" | 6458 | msgid "number of messages to replay from history" |
6285 | msgstr "Anzahl an Durchläufen" | 6459 | msgstr "Anzahl an Durchläufen" |
6286 | 6460 | ||
6287 | #: src/social/gnunet-social.c:1350 | 6461 | #: src/social/gnunet-social.c:1345 |
6288 | msgid "key address of place" | 6462 | msgid "key address of place" |
6289 | msgstr "" | 6463 | msgstr "" |
6290 | 6464 | ||
6291 | #: src/social/gnunet-social.c:1356 | 6465 | #: src/social/gnunet-social.c:1351 |
6292 | msgid "start message ID for history replay" | 6466 | msgid "start message ID for history replay" |
6293 | msgstr "" | 6467 | msgstr "" |
6294 | 6468 | ||
6295 | #: src/social/gnunet-social.c:1361 | 6469 | #: src/social/gnunet-social.c:1356 |
6296 | msgid "respond to entry requests by admitting all guests" | 6470 | msgid "respond to entry requests by admitting all guests" |
6297 | msgstr "" | 6471 | msgstr "" |
6298 | 6472 | ||
6299 | #: src/social/gnunet-social.c:1367 | 6473 | #: src/social/gnunet-social.c:1362 |
6300 | msgid "end message ID for history replay" | 6474 | msgid "end message ID for history replay" |
6301 | msgstr "" | 6475 | msgstr "" |
6302 | 6476 | ||
6303 | #: src/social/gnunet-social.c:1372 | 6477 | #: src/social/gnunet-social.c:1367 |
6304 | msgid "respond to entry requests by refusing all guests" | 6478 | msgid "respond to entry requests by refusing all guests" |
6305 | msgstr "" | 6479 | msgstr "" |
6306 | 6480 | ||
6307 | #: src/social/gnunet-social.c:1382 | 6481 | #: src/social/gnunet-social.c:1377 |
6308 | msgid "" | 6482 | msgid "" |
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 "" | |||
6497 | msgstr "" | 6671 | msgstr "" |
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 |
6502 | msgid "Incorrect hostkey file format: %s\n" | 6676 | msgid "Incorrect hostkey file format: %s\n" |
6503 | msgstr "" | 6677 | msgstr "" |
@@ -6567,6 +6741,17 @@ msgstr "" | |||
6567 | msgid "%.s Unknown result code." | 6741 | msgid "%.s Unknown result code." |
6568 | msgstr "" | 6742 | msgstr "" |
6569 | 6743 | ||
6744 | #: src/testbed/gnunet-testbed-profiler.c:290 | ||
6745 | msgid "tolerate COUNT number of continious timeout failures" | ||
6746 | msgstr "" | ||
6747 | |||
6748 | #: src/testbed/gnunet-testbed-profiler.c:295 | ||
6749 | msgid "" | ||
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" | ||
6753 | msgstr "" | ||
6754 | |||
6570 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | 6755 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 |
6571 | #, fuzzy | 6756 | #, fuzzy |
6572 | msgid "Waiting for child to exit.\n" | 6757 | msgid "Waiting for child to exit.\n" |
@@ -6579,17 +6764,6 @@ msgstr "" | |||
6579 | msgid "Spawning process `%s'\n" | 6764 | msgid "Spawning process `%s'\n" |
6580 | msgstr "Ungültige Antwort auf `%s'.\n" | 6765 | msgstr "Ungültige Antwort auf `%s'.\n" |
6581 | 6766 | ||
6582 | #: src/testbed/gnunet-testbed-profiler.c:290 | ||
6583 | msgid "tolerate COUNT number of continious timeout failures" | ||
6584 | msgstr "" | ||
6585 | |||
6586 | #: src/testbed/gnunet-testbed-profiler.c:295 | ||
6587 | msgid "" | ||
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" | ||
6591 | msgstr "" | ||
6592 | |||
6593 | #: src/testbed/testbed_api.c:410 | 6767 | #: src/testbed/testbed_api.c:410 |
6594 | #, fuzzy, c-format | 6768 | #, fuzzy, c-format |
6595 | msgid "Adding host %u failed with error: %s\n" | 6769 | msgid "Adding host %u failed with error: %s\n" |
@@ -6882,10 +7056,6 @@ msgstr "# HELLO-Meldungen empfangen" | |||
6882 | msgid "GNUnet topology control" | 7056 | msgid "GNUnet topology control" |
6883 | msgstr "" | 7057 | msgstr "" |
6884 | 7058 | ||
6885 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
6886 | msgid "# Addresses given to ATS" | ||
6887 | msgstr "" | ||
6888 | |||
6889 | #: src/transport/gnunet-service-transport.c:448 | 7059 | #: src/transport/gnunet-service-transport.c:448 |
6890 | msgid "# messages dropped due to slow client" | 7060 | msgid "# messages dropped due to slow client" |
6891 | msgstr "" | 7061 | msgstr "" |
@@ -6930,6 +7100,10 @@ msgstr "" | |||
6930 | msgid "Transport service is lacking key configuration settings. Exiting.\n" | 7100 | msgid "Transport service is lacking key configuration settings. Exiting.\n" |
6931 | msgstr "" | 7101 | msgstr "" |
6932 | 7102 | ||
7103 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
7104 | msgid "# Addresses given to ATS" | ||
7105 | msgstr "" | ||
7106 | |||
6933 | #: src/transport/gnunet-service-transport_hello.c:195 | 7107 | #: src/transport/gnunet-service-transport_hello.c:195 |
6934 | msgid "# refreshed my HELLO" | 7108 | msgid "# refreshed my HELLO" |
6935 | msgstr "" | 7109 | msgstr "" |
@@ -7251,6 +7425,43 @@ msgstr "" | |||
7251 | msgid "# validations succeeded" | 7425 | msgid "# validations succeeded" |
7252 | msgstr "" | 7426 | msgstr "" |
7253 | 7427 | ||
7428 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7429 | #, c-format | ||
7430 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7431 | msgstr "" | ||
7432 | |||
7433 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7434 | msgid "send data to peer" | ||
7435 | msgstr "" | ||
7436 | |||
7437 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7438 | #, fuzzy | ||
7439 | msgid "receive data from peer" | ||
7440 | msgstr "# Bytes des Typs %d empfangen" | ||
7441 | |||
7442 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7443 | msgid "iterations" | ||
7444 | msgstr "" | ||
7445 | |||
7446 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7447 | #, fuzzy | ||
7448 | msgid "number of messages to send" | ||
7449 | msgstr "Anzahl an Durchläufen" | ||
7450 | |||
7451 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7452 | msgid "message size to use" | ||
7453 | msgstr "" | ||
7454 | |||
7455 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7456 | #: src/transport/gnunet-transport.c:1462 | ||
7457 | msgid "peer identity" | ||
7458 | msgstr "" | ||
7459 | |||
7460 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7461 | #: src/transport/gnunet-transport.c:1482 | ||
7462 | msgid "Direct access to transport service." | ||
7463 | msgstr "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 |
7256 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" | 7467 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" |
@@ -7383,11 +7594,6 @@ msgstr "" | |||
7383 | msgid "do not resolve hostnames" | 7594 | msgid "do not resolve hostnames" |
7384 | msgstr "Keine Rechnernamen auflösen" | 7595 | msgstr "Keine Rechnernamen auflösen" |
7385 | 7596 | ||
7386 | #: src/transport/gnunet-transport.c:1462 | ||
7387 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7388 | msgid "peer identity" | ||
7389 | msgstr "" | ||
7390 | |||
7391 | #: src/transport/gnunet-transport.c:1466 | 7597 | #: src/transport/gnunet-transport.c:1466 |
7392 | msgid "monitor plugin sessions" | 7598 | msgid "monitor plugin sessions" |
7393 | msgstr "" | 7599 | msgstr "" |
@@ -7396,41 +7602,9 @@ msgstr "" | |||
7396 | msgid "send data for benchmarking to the other peer (until CTRL-C)" | 7602 | msgid "send data for benchmarking to the other peer (until CTRL-C)" |
7397 | msgstr "" | 7603 | msgstr "" |
7398 | 7604 | ||
7399 | #: src/transport/gnunet-transport.c:1482 | ||
7400 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7401 | msgid "Direct access to transport service." | ||
7402 | msgstr "Direkter Zugriff auf den Transportdienst" | ||
7403 | |||
7404 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7405 | #, c-format | ||
7406 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7407 | msgstr "" | ||
7408 | |||
7409 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7410 | msgid "send data to peer" | ||
7411 | msgstr "" | ||
7412 | |||
7413 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7414 | #, fuzzy | ||
7415 | msgid "receive data from peer" | ||
7416 | msgstr "# Bytes des Typs %d empfangen" | ||
7417 | |||
7418 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7419 | msgid "iterations" | ||
7420 | msgstr "" | ||
7421 | |||
7422 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7423 | #, fuzzy | ||
7424 | msgid "number of messages to send" | ||
7425 | msgstr "Anzahl an Durchläufen" | ||
7426 | |||
7427 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7428 | msgid "message size to use" | ||
7429 | msgstr "" | ||
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 |
7436 | msgid "TCP_STEALTH not supported on this platform.\n" | 7610 | msgid "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" | |||
7442 | msgstr "" | 7616 | msgstr "" |
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 |
7447 | msgid "Shutting down plugin `%s'\n" | 7621 | msgid "Shutting down plugin `%s'\n" |
7448 | msgstr "Collection `%s' begonnen.\n" | 7622 | msgstr "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 |
7453 | msgid "Shutdown for plugin `%s' complete\n" | 7627 | msgid "Shutdown for plugin `%s' complete\n" |
7454 | msgstr "GNUnet wurde erfolgreich heruntergefahren.\n" | 7628 | msgstr "GNUnet wurde erfolgreich heruntergefahren.\n" |
@@ -7458,103 +7632,103 @@ msgstr "GNUnet wurde erfolgreich heruntergefahren.\n" | |||
7458 | msgid "Maximum number of requests is %u\n" | 7632 | msgid "Maximum number of requests is %u\n" |
7459 | msgstr "Maximale Anzahl der Verbindungen ist %u\n" | 7633 | msgstr "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 |
7463 | msgid "" | 7637 | msgid "" |
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" |
7466 | msgstr "" | 7640 | msgstr "" |
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 |
7470 | msgid "Accepting connection (%u of %u) from `%s'\n" | 7644 | msgid "Accepting connection (%u of %u) from `%s'\n" |
7471 | msgstr "" | 7645 | msgstr "" |
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 |
7475 | msgid "" | 7649 | msgid "" |
7476 | "Server reached maximum number connections (%u), rejecting new connection\n" | 7650 | "Server reached maximum number connections (%u), rejecting new connection\n" |
7477 | msgstr "" | 7651 | msgstr "" |
7478 | 7652 | ||
7479 | #: src/transport/plugin_transport_http_server.c:2125 | 7653 | #: src/transport/plugin_transport_http_server.c:2186 |
7480 | msgid "" | 7654 | msgid "" |
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" |
7483 | msgstr "" | 7657 | msgstr "" |
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 |
7487 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" | 7661 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" |
7488 | msgstr "" | 7662 | msgstr "" |
7489 | 7663 | ||
7490 | #: src/transport/plugin_transport_http_server.c:2275 | 7664 | #: src/transport/plugin_transport_http_server.c:2338 |
7491 | msgid "Could not load or create server certificate! Loading plugin failed!\n" | 7665 | msgid "Could not load or create server certificate! Loading plugin failed!\n" |
7492 | msgstr "" | 7666 | msgstr "" |
7493 | 7667 | ||
7494 | #: src/transport/plugin_transport_http_server.c:2587 | 7668 | #: src/transport/plugin_transport_http_server.c:2650 |
7495 | msgid "Require valid port number for service in configuration!\n" | 7669 | msgid "Require valid port number for service in configuration!\n" |
7496 | msgstr "" | 7670 | msgstr "" |
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 |
7500 | msgid "Found %u addresses to report to NAT service\n" | 7674 | msgid "Found %u addresses to report to NAT service\n" |
7501 | msgstr "" | 7675 | msgstr "" |
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 |
7505 | msgid "Disabling IPv6 since it is not supported on this system!\n" | 7679 | msgid "Disabling IPv6 since it is not supported on this system!\n" |
7506 | msgstr "" | 7680 | msgstr "" |
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 |
7510 | msgid "IPv4 support is %s\n" | 7684 | msgid "IPv4 support is %s\n" |
7511 | msgstr "" | 7685 | msgstr "" |
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 |
7515 | msgid "IPv6 support is %s\n" | 7689 | msgid "IPv6 support is %s\n" |
7516 | msgstr "" | 7690 | msgstr "" |
7517 | 7691 | ||
7518 | #: src/transport/plugin_transport_http_server.c:2965 | 7692 | #: src/transport/plugin_transport_http_server.c:3028 |
7519 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" | 7693 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" |
7520 | msgstr "" | 7694 | msgstr "" |
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 |
7524 | msgid "Port is required! Fix in configuration\n" | 7698 | msgid "Port is required! Fix in configuration\n" |
7525 | msgstr "Port ist erforderlich! Bearbeiten Sie die Konfiguration\n" | 7699 | msgstr "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 |
7529 | msgid "Using port %u\n" | 7703 | msgid "Using port %u\n" |
7530 | msgstr "Port %u wird verwendet\n" | 7704 | msgstr "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 |
7534 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" | 7708 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" |
7535 | msgstr "" | 7709 | msgstr "" |
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 |
7539 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" | 7713 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" |
7540 | msgstr "" | 7714 | msgstr "" |
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 |
7544 | msgid "Using external hostname `%s'\n" | 7718 | msgid "Using external hostname `%s'\n" |
7545 | msgstr "" | 7719 | msgstr "" |
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 |
7549 | msgid "Notifying transport only about hostname `%s'\n" | 7723 | msgid "Notifying transport only about hostname `%s'\n" |
7550 | msgstr "Teste Transport(e) %s\n" | 7724 | msgstr "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 |
7554 | msgid "Maximum number of connections is %u\n" | 7728 | msgid "Maximum number of connections is %u\n" |
7555 | msgstr "Maximale Anzahl der Verbindungen ist %u\n" | 7729 | msgstr "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 |
7558 | msgid "Unable to compile URL regex\n" | 7732 | msgid "Unable to compile URL regex\n" |
7559 | msgstr "" | 7733 | msgstr "" |
7560 | 7734 | ||
@@ -7700,21 +7874,6 @@ msgstr "" | |||
7700 | msgid "TCP transport advertises itself as being on port %llu\n" | 7874 | msgid "TCP transport advertises itself as being on port %llu\n" |
7701 | msgstr "" | 7875 | msgstr "" |
7702 | 7876 | ||
7703 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7704 | #, fuzzy | ||
7705 | msgid "# Multicast HELLO beacons received via UDP" | ||
7706 | msgstr "# Bytes empfangen über TCP" | ||
7707 | |||
7708 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7709 | msgid "" | ||
7710 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7711 | msgstr "" | ||
7712 | |||
7713 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7714 | #, fuzzy, c-format | ||
7715 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7716 | msgstr "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 |
7720 | msgid "" | 7879 | msgid "" |
@@ -7762,6 +7921,21 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n" | |||
7762 | msgid "Failed to create UDP network sockets\n" | 7921 | msgid "Failed to create UDP network sockets\n" |
7763 | msgstr "UDP-Sockets können nicht geöffnet werden\n" | 7922 | msgstr "UDP-Sockets können nicht geöffnet werden\n" |
7764 | 7923 | ||
7924 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7925 | #, fuzzy | ||
7926 | msgid "# Multicast HELLO beacons received via UDP" | ||
7927 | msgstr "# Bytes empfangen über TCP" | ||
7928 | |||
7929 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7930 | msgid "" | ||
7931 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7932 | msgstr "" | ||
7933 | |||
7934 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7935 | #, fuzzy, c-format | ||
7936 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7937 | msgstr "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 |
7767 | msgid "Cannot create path to `%s'\n" | 7941 | msgid "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" |
7876 | msgstr "" | 8050 | msgstr "" |
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 |
7880 | msgid "Unknown address family %d\n" | 8054 | msgid "Unknown address family %d\n" |
7881 | msgstr "" | 8055 | msgstr "" |
@@ -7920,51 +8094,51 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | |||
7920 | msgid "Service `%s' runs at %s\n" | 8094 | msgid "Service `%s' runs at %s\n" |
7921 | msgstr "Dienst »%s« läuft auf %s\n" | 8095 | msgstr "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 |
7924 | msgid "Service process failed to initialize\n" | 8098 | msgid "Service process failed to initialize\n" |
7925 | msgstr "" | 8099 | msgstr "" |
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 |
7928 | msgid "Service process could not initialize server function\n" | 8102 | msgid "Service process could not initialize server function\n" |
7929 | msgstr "" | 8103 | msgstr "" |
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 |
7932 | msgid "Service process failed to report status\n" | 8106 | msgid "Service process failed to report status\n" |
7933 | msgstr "" | 8107 | msgstr "" |
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 |
7938 | msgid "Cannot obtain information about user `%s': %s\n" | 8112 | msgid "Cannot obtain information about user `%s': %s\n" |
7939 | msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n" | 8113 | msgstr "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 |
7942 | msgid "No such user" | 8116 | msgid "No such user" |
7943 | msgstr "" | 8117 | msgstr "" |
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 |
7947 | msgid "Cannot change user/group to `%s': %s\n" | 8121 | msgid "Cannot change user/group to `%s': %s\n" |
7948 | msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n" | 8122 | msgstr "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 |
7951 | msgid "do daemonize (detach from terminal)" | 8125 | msgid "do daemonize (detach from terminal)" |
7952 | msgstr "" | 8126 | msgstr "" |
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 |
7957 | msgid "Malformed configuration file `%s', exit ...\n" | 8131 | msgid "Malformed configuration file `%s', exit ...\n" |
7958 | msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n" | 8132 | msgstr "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 |
7963 | msgid "Malformed configuration, exit ...\n" | 8137 | msgid "Malformed configuration, exit ...\n" |
7964 | msgstr "GNUnet Konfiguration" | 8138 | msgstr "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 |
7969 | msgid "Could not access configuration file `%s'\n" | 8143 | msgid "Could not access configuration file `%s'\n" |
7970 | msgstr "Konfigurationsdatei `%s' konnte nicht geparst werden.\n" | 8144 | msgstr "Konfigurationsdatei `%s' konnte nicht geparst werden.\n" |
@@ -8008,55 +8182,55 @@ msgstr "" | |||
8008 | msgid "Need a non-empty hostname for service `%s'.\n" | 8182 | msgid "Need a non-empty hostname for service `%s'.\n" |
8009 | msgstr "" | 8183 | msgstr "" |
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 |
8012 | msgid "DEBUG" | 8186 | msgid "DEBUG" |
8013 | msgstr "DEBUG" | 8187 | msgstr "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 |
8016 | msgid "INFO" | 8190 | msgid "INFO" |
8017 | msgstr "INFO" | 8191 | msgstr "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 |
8020 | msgid "MESSAGE" | 8194 | msgid "MESSAGE" |
8021 | msgstr "" | 8195 | msgstr "" |
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 |
8024 | msgid "WARNING" | 8198 | msgid "WARNING" |
8025 | msgstr "WARNUNG" | 8199 | msgstr "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 |
8028 | msgid "ERROR" | 8202 | msgid "ERROR" |
8029 | msgstr "FEHLER" | 8203 | msgstr "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 |
8032 | msgid "NONE" | 8206 | msgid "NONE" |
8033 | msgstr "" | 8207 | msgstr "" |
8034 | 8208 | ||
8035 | #: src/util/common_logging.c:879 | 8209 | #: src/util/common_logging.c:882 |
8036 | #, c-format | 8210 | #, c-format |
8037 | msgid "Message `%.*s' repeated %u times in the last %s\n" | 8211 | msgid "Message `%.*s' repeated %u times in the last %s\n" |
8038 | msgstr "" | 8212 | msgstr "" |
8039 | 8213 | ||
8040 | #: src/util/common_logging.c:1132 | 8214 | #: src/util/common_logging.c:1135 |
8041 | msgid "INVALID" | 8215 | msgid "INVALID" |
8042 | msgstr "" | 8216 | msgstr "" |
8043 | 8217 | ||
8044 | #: src/util/common_logging.c:1302 | 8218 | #: src/util/common_logging.c:1326 |
8045 | msgid "unknown address" | 8219 | msgid "unknown address" |
8046 | msgstr "Unbekannte Adresse" | 8220 | msgstr "Unbekannte Adresse" |
8047 | 8221 | ||
8048 | #: src/util/common_logging.c:1344 | 8222 | #: src/util/common_logging.c:1368 |
8049 | msgid "invalid address" | 8223 | msgid "invalid address" |
8050 | msgstr "Ungültige Adresse" | 8224 | msgstr "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 |
8054 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" | 8228 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" |
8055 | msgstr "" | 8229 | msgstr "" |
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 |
8061 | msgid "" | 8235 | msgid "" |
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 |
8069 | msgid "Syntax error while deserializing in line %u\n" | 8243 | msgid "Syntax error while deserializing in line %u\n" |
8070 | msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n" | 8244 | msgstr "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 |
8074 | msgid "Error while reading file `%s'\n" | 8248 | msgid "Error while reading file `%s'\n" |
8075 | msgstr "Konfigurationsdatei `%s' konnte nicht geöffnet werden.\n" | 8249 | msgstr "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 |
8079 | msgid "" | 8253 | msgid "" |
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" |
8082 | msgstr "" | 8256 | msgstr "" |
8083 | 8257 | ||
8084 | #: src/util/configuration.c:1136 | 8258 | #: src/util/configuration.c:1153 |
8085 | #, c-format | 8259 | #, c-format |
8086 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" | 8260 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" |
8087 | msgstr "" | 8261 | msgstr "" |
8088 | 8262 | ||
8089 | #: src/util/configuration.c:1169 | 8263 | #: src/util/configuration.c:1186 |
8090 | #, c-format | 8264 | #, c-format |
8091 | msgid "Missing closing `%s' in option `%s'\n" | 8265 | msgid "Missing closing `%s' in option `%s'\n" |
8092 | msgstr "" | 8266 | msgstr "" |
8093 | 8267 | ||
8094 | #: src/util/configuration.c:1237 | 8268 | #: src/util/configuration.c:1254 |
8095 | #, c-format | 8269 | #, c-format |
8096 | msgid "" | 8270 | msgid "" |
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" | |||
8125 | msgid "EdDSA signature verification failed at %s:%d: %s\n" | 8299 | msgid "EdDSA signature verification failed at %s:%d: %s\n" |
8126 | msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n" | 8300 | msgstr "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 |
8131 | msgid "Could not acquire lock on file `%s': %s...\n" | 8305 | msgid "Could not acquire lock on file `%s': %s...\n" |
8132 | msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" | 8306 | msgstr "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 |
8136 | msgid "Creating a new private key. This may take a while.\n" | 8310 | msgid "Creating a new private key. This may take a while.\n" |
8137 | msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n" | 8311 | msgstr "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 |
8140 | msgid "This may be ok if someone is currently generating a private key.\n" | 8314 | msgid "This may be ok if someone is currently generating a private key.\n" |
8141 | msgstr "" | 8315 | msgstr "" |
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 |
8145 | msgid "" | 8319 | msgid "" |
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" |
8147 | msgstr "" | 8321 | msgstr "" |
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 |
8150 | msgid "This may be ok if someone is currently generating a key.\n" | 8324 | msgid "This may be ok if someone is currently generating a key.\n" |
8151 | msgstr "" | 8325 | msgstr "" |
8152 | 8326 | ||
8153 | #: src/util/crypto_ecc_setup.c:413 | 8327 | #: src/util/crypto_ecc_setup.c:415 |
8154 | #, fuzzy | 8328 | #, fuzzy |
8155 | msgid "Could not load peer's private key\n" | 8329 | msgid "Could not load peer's private key\n" |
8156 | msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" | 8330 | msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" |
@@ -8344,22 +8518,22 @@ msgstr "" | |||
8344 | msgid "Manipulate GNUnet configuration files" | 8518 | msgid "Manipulate GNUnet configuration files" |
8345 | msgstr "GNUnet-Konfigurationsdateien bearbeiten" | 8519 | msgstr "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 |
8349 | msgid "Failed to open `%s': %s\n" | 8523 | msgid "Failed to open `%s': %s\n" |
8350 | msgstr "»%s« kann nicht geöffnet werden: %s\n" | 8524 | msgstr "»%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 |
8354 | msgid "Generating %u keys like %s, please wait" | 8528 | msgid "Generating %u keys like %s, please wait" |
8355 | msgstr "" | 8529 | msgstr "" |
8356 | 8530 | ||
8357 | #: src/util/gnunet-ecc.c:133 | 8531 | #: src/util/gnunet-ecc.c:138 |
8358 | #, c-format | 8532 | #, c-format |
8359 | msgid "Generating %u keys, please wait" | 8533 | msgid "Generating %u keys, please wait" |
8360 | msgstr "" | 8534 | msgstr "" |
8361 | 8535 | ||
8362 | #: src/util/gnunet-ecc.c:174 | 8536 | #: src/util/gnunet-ecc.c:179 |
8363 | #, c-format | 8537 | #, c-format |
8364 | msgid "" | 8538 | msgid "" |
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 |
8373 | msgid "" | 8547 | msgid "" |
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 |
8382 | msgid "" | 8556 | msgid "" |
8383 | "\n" | 8557 | "\n" |
8384 | "Error, %u keys not generated\n" | 8558 | "Error, %u keys not generated\n" |
8385 | msgstr "" | 8559 | msgstr "" |
8386 | 8560 | ||
8387 | #: src/util/gnunet-ecc.c:280 | 8561 | #: src/util/gnunet-ecc.c:283 |
8388 | #, fuzzy, c-format | 8562 | #, fuzzy, c-format |
8389 | msgid "Hostkeys file `%s' not found\n" | 8563 | msgid "Hostkeys file `%s' not found\n" |
8390 | msgstr "Kommando `%s' wurde nicht gefunden!\n" | 8564 | msgstr "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 |
8394 | msgid "Hostkeys file `%s' is empty\n" | 8568 | msgid "Hostkeys file `%s' is empty\n" |
8395 | msgstr "" | 8569 | msgstr "" |
8396 | 8570 | ||
8397 | #: src/util/gnunet-ecc.c:313 | 8571 | #: src/util/gnunet-ecc.c:316 |
8398 | #, fuzzy, c-format | 8572 | #, fuzzy, c-format |
8399 | msgid "Could not read hostkey file: %s\n" | 8573 | msgid "Could not read hostkey file: %s\n" |
8400 | msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n" | 8574 | msgstr "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 |
8403 | msgid "No hostkey file specified on command line\n" | 8577 | msgid "No hostkey file specified on command line\n" |
8404 | msgstr "" | 8578 | msgstr "" |
8405 | 8579 | ||
8406 | #: src/util/gnunet-ecc.c:416 | 8580 | #: src/util/gnunet-ecc.c:425 |
8407 | msgid "list keys included in a file (for testing)" | 8581 | msgid "list keys included in a file (for testing)" |
8408 | msgstr "" | 8582 | msgstr "" |
8409 | 8583 | ||
8410 | #: src/util/gnunet-ecc.c:421 | 8584 | #: src/util/gnunet-ecc.c:430 |
8411 | msgid "number of keys to list included in a file (for testing)" | 8585 | msgid "number of keys to list included in a file (for testing)" |
8412 | msgstr "" | 8586 | msgstr "" |
8413 | 8587 | ||
8414 | #: src/util/gnunet-ecc.c:426 | 8588 | #: src/util/gnunet-ecc.c:435 |
8415 | msgid "create COUNT public-private key pairs (for testing)" | 8589 | msgid "create COUNT public-private key pairs (for testing)" |
8416 | msgstr "" | 8590 | msgstr "" |
8417 | 8591 | ||
8418 | #: src/util/gnunet-ecc.c:430 | 8592 | #: src/util/gnunet-ecc.c:439 |
8419 | msgid "print the public key in ASCII format" | 8593 | msgid "print the public key in ASCII format" |
8420 | msgstr "" | 8594 | msgstr "" |
8421 | 8595 | ||
8422 | #: src/util/gnunet-ecc.c:434 | 8596 | #: src/util/gnunet-ecc.c:443 |
8597 | msgid "print the public key in HEX format" | ||
8598 | msgstr "" | ||
8599 | |||
8600 | #: src/util/gnunet-ecc.c:447 | ||
8423 | msgid "print examples of ECC operations (used for compatibility testing)" | 8601 | msgid "print examples of ECC operations (used for compatibility testing)" |
8424 | msgstr "" | 8602 | msgstr "" |
8425 | 8603 | ||
8426 | #: src/util/gnunet-ecc.c:449 | 8604 | #: src/util/gnunet-ecc.c:463 |
8427 | msgid "Manipulate GNUnet private ECC key files" | 8605 | msgid "Manipulate GNUnet private ECC key files" |
8428 | msgstr "" | 8606 | msgstr "" |
8429 | 8607 | ||
@@ -8515,7 +8693,7 @@ msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n" | |||
8515 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" | 8693 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" |
8516 | msgstr "" | 8694 | msgstr "" |
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 |
8520 | msgid "" | 8698 | msgid "" |
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" | |||
8569 | msgid "Could not determine plugin installation path.\n" | 8747 | msgid "Could not determine plugin installation path.\n" |
8570 | msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n" | 8748 | msgstr "Ö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 |
8574 | msgid "" | 8752 | msgid "" |
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 |
8589 | msgid "Timeout trying to resolve hostname `%s'.\n" | 8767 | msgid "Timeout trying to resolve hostname `%s'.\n" |
8590 | msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" | 8768 | msgstr "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 |
8594 | msgid "Timeout trying to resolve IP address `%s'.\n" | 8772 | msgid "Timeout trying to resolve IP address `%s'.\n" |
8595 | msgstr "" | 8773 | msgstr "" |
8596 | 8774 | ||
8597 | #: src/util/resolver_api.c:1004 | 8775 | #: src/util/resolver_api.c:1023 |
8598 | #, fuzzy | 8776 | #, fuzzy |
8599 | msgid "Resolver not configured correctly.\n" | 8777 | msgid "Resolver not configured correctly.\n" |
8600 | msgstr "Standarddienst »%s« ist nicht korrekt eingerichtet!\n" | 8778 | msgstr "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 |
8605 | msgid "Could not resolve our FQDN: %s\n" | 8783 | msgid "Could not resolve our FQDN: %s\n" |
8606 | msgstr "`%s' konnte nicht aufgelöst werden: %s\n" | 8784 | msgstr "`%s' konnte nicht aufgelöst werden: %s\n" |
8607 | 8785 | ||
8608 | #: src/util/service.c:1306 | 8786 | #: src/util/service.c:1305 |
8609 | msgid "" | 8787 | msgid "" |
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" |
8611 | msgstr "" | 8789 | msgstr "" |
8612 | 8790 | ||
8613 | #: src/util/service.c:2082 | 8791 | #: src/util/service.c:2081 |
8614 | #, c-format | 8792 | #, c-format |
8615 | msgid "" | 8793 | msgid "" |
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" | |||
8685 | msgid "end of time" | 8863 | msgid "end of time" |
8686 | msgstr "" | 8864 | msgstr "" |
8687 | 8865 | ||
8688 | #: src/util/strings.c:1269 | 8866 | #: src/util/strings.c:1270 |
8689 | msgid "IPv6 address did not start with `['\n" | 8867 | msgid "IPv6 address did not start with `['\n" |
8690 | msgstr "IPv6-Adresse beginnt nicht mit »[«\n" | 8868 | msgstr "IPv6-Adresse beginnt nicht mit »[«\n" |
8691 | 8869 | ||
8692 | #: src/util/strings.c:1277 | 8870 | #: src/util/strings.c:1278 |
8693 | msgid "IPv6 address did contain ':' to separate port number\n" | 8871 | msgid "IPv6 address did contain ':' to separate port number\n" |
8694 | msgstr "IPv6-Adresse enthält kein »:« zur Abtrennung der Portnummer\n" | 8872 | msgstr "IPv6-Adresse enthält kein »:« zur Abtrennung der Portnummer\n" |
8695 | 8873 | ||
8696 | #: src/util/strings.c:1283 | 8874 | #: src/util/strings.c:1284 |
8697 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" | 8875 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" |
8698 | msgstr "IPv6-Adresse enthält kein »]« vor »:« zur Abtrennung der Portnummer\n" | 8876 | msgstr "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 |
8701 | msgid "IPv6 address did contain a valid port number after the last ':'\n" | 8879 | msgid "IPv6 address did contain a valid port number after the last ':'\n" |
8702 | msgstr "IPv6-Adresse enthält keine gültige Portnummer nach dem letzten »:«\n" | 8880 | msgstr "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 |
8706 | msgid "Invalid IPv6 address `%s': %s\n" | 8884 | msgid "Invalid IPv6 address `%s': %s\n" |
8707 | msgstr "Ungültige Antwort auf `%s' von `%s'\n" | 8885 | msgstr "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 |
8710 | msgid "Port not in range\n" | 8888 | msgid "Port not in range\n" |
8711 | msgstr "Port außerhalb des Bereichs\n" | 8889 | msgstr "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 |
8715 | msgid "Malformed port policy `%s'\n" | 8893 | msgid "Malformed port policy `%s'\n" |
8716 | msgstr "" | 8894 | msgstr "" |
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 |
8721 | msgid "Invalid format for IP: `%s'\n" | 8899 | msgid "Invalid format for IP: `%s'\n" |
8722 | msgstr "Ungültiges Format für IP: »%s«\n" | 8900 | msgstr "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 |
8726 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." | 8904 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." |
8727 | msgstr "Ungültige Netzwerk-Notation ('/%d ist nicht gültig in IPv4 CIDR)." | 8905 | msgstr "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 |
8731 | msgid "Invalid format: `%s'\n" | 8909 | msgid "Invalid format: `%s'\n" |
8732 | msgstr "Ungültiges Format für IP: `%s'\n" | 8910 | msgstr "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 |
8736 | msgid "Invalid network notation (does not end with ';': `%s')\n" | 8914 | msgid "Invalid network notation (does not end with ';': `%s')\n" |
8737 | msgstr "Ungültige Netzwerk-Notation (endet nicht mit »;«: »%s«)\n" | 8915 | msgstr "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 |
8741 | msgid "Wrong format `%s' for netmask\n" | 8919 | msgid "Wrong format `%s' for netmask\n" |
8742 | msgstr "Falsches Format `%s' für Netzmaske: %s\n" | 8920 | msgstr "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 |
8746 | msgid "Wrong format `%s' for network\n" | 8924 | msgid "Wrong format `%s' for network\n" |
8747 | msgstr "Falsches Format `%s' für Netzwerk: %s\n" | 8925 | msgstr "Falsches Format `%s' für Netzwerk: %s\n" |
@@ -8920,28 +9098,44 @@ msgstr "Dienst wird über UDP angeboten" | |||
8920 | msgid "Setup tunnels via VPN." | 9098 | msgid "Setup tunnels via VPN." |
8921 | msgstr "Tunnel über VPN einrichten." | 9099 | msgstr "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 |
8925 | msgid "Failed to connect to the namestore!\n" | 9103 | msgid "Failed to connect to the namestore!\n" |
8926 | msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" | 9104 | msgstr "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 |
8931 | msgid "Assertion failed at %s:%d.\n" | 9109 | msgid "Assertion failed at %s:%d.\n" |
8932 | msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n" | 9110 | msgstr "`%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 |
8936 | msgid "External protocol violation detected at %s:%d.\n" | 9114 | msgid "External protocol violation detected at %s:%d.\n" |
8937 | msgstr "Protokollverletzung auf Socket. Kommando erwartet.\n" | 9115 | msgstr "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 |
8941 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" | 9119 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" |
8942 | msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" | 9120 | msgstr "`%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 | ||
@@ -7,7 +7,7 @@ msgid "" | |||
7 | msgstr "" | 7 | msgstr "" |
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" | |||
296 | msgstr "Se produjo un fallo al resolver «%s»: %s\n" | 296 | msgstr "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 | |||
376 | msgid "Initiating shutdown as requested by client.\n" | 376 | msgid "Initiating shutdown as requested by client.\n" |
377 | msgstr "Iniciando apagado bajo petición del cliente.\n" | 377 | msgstr "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 | 380 | msgid "Stop logging\n" |
381 | msgid "" | ||
382 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
383 | "%llu\n" | ||
384 | msgstr "" | ||
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 | ||
390 | msgid "" | ||
391 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
392 | "%llu\n" | ||
393 | msgstr "" | ||
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 | ||
399 | msgid "" | ||
400 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
401 | "%llu\n" | ||
402 | msgstr "" | ||
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 | ||
409 | msgid "solver to use" | ||
410 | msgstr "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 | ||
415 | msgid "experiment to use" | ||
416 | msgstr "" | ||
417 | |||
418 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
419 | #, fuzzy | ||
420 | msgid "print logging" | ||
421 | msgstr "Iniciando descarga «%s».\n" | ||
422 | |||
423 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
424 | msgid "save logging to disk" | ||
425 | msgstr "" | ||
426 | |||
427 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
428 | msgid "disable normalization" | ||
429 | msgstr "" | ||
430 | |||
431 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
432 | #, fuzzy, c-format | ||
433 | msgid "" | ||
434 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
435 | "%llu\n" | ||
436 | msgstr "" | ||
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 | ||
443 | msgid "%s quota configured for network `%s' is %llu\n" | ||
444 | msgstr "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 | ||
448 | msgid "" | ||
449 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
450 | msgstr "" | ||
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 | ||
456 | msgid "Failed to initialize solver `%s'!\n" | ||
457 | msgstr "¡No se puede inicializar el resolvedor!\n" | ||
458 | |||
459 | #: src/ats/plugin_ats_mlp.c:1274 | ||
460 | msgid "Problem size too large, cannot allocate memory!\n" | ||
461 | msgstr "" | ||
462 | |||
463 | #: src/ats/plugin_ats_mlp.c:1869 | ||
464 | #, fuzzy, c-format | ||
465 | msgid "Adding address for peer `%s' multiple times\n" | ||
466 | msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n" | ||
467 | |||
468 | #: src/ats/plugin_ats_mlp.c:1913 | ||
469 | #, fuzzy, c-format | ||
470 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
471 | msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n" | ||
472 | |||
473 | #: src/ats/plugin_ats_mlp.c:2475 | ||
474 | msgid "" | ||
475 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
476 | msgstr "" | ||
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 | ||
486 | msgid "Invalid %s configuration %f \n" | ||
487 | msgstr "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 | ||
491 | msgid "" | ||
492 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
493 | "%llu must be at least %llu\n" | ||
494 | msgstr "" | ||
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 | ||
500 | msgid "" | ||
501 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
502 | "must be at least %llu\n" | ||
503 | msgstr "" | 381 | msgstr "" |
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 | ||
510 | msgid "" | ||
511 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
512 | msgstr "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 | ||
517 | msgid "" | ||
518 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
519 | msgstr "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 |
523 | msgid "Invalid %s configuration %f\n" | 385 | msgid "Start logging `%s'\n" |
524 | msgstr "Se produjo un fallo al cargar la configuración de %s\n" | 386 | msgstr "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 "" | |||
533 | msgid "Failed to connect master peer [%u] with slave [%u]\n" | 395 | msgid "Failed to connect master peer [%u] with slave [%u]\n" |
534 | msgstr "Fallo al conectar a gnunetd.\n" | 396 | msgstr "Fallo al conectar a gnunetd.\n" |
535 | 397 | ||
536 | #: src/ats-tests/ats-testing-log.c:837 | ||
537 | msgid "Stop logging\n" | ||
538 | msgstr "" | ||
539 | |||
540 | #: src/ats-tests/ats-testing-log.c:892 | ||
541 | #, fuzzy, c-format | ||
542 | msgid "Start logging `%s'\n" | ||
543 | msgstr "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 |
547 | msgid "" | 400 | msgid "" |
@@ -549,6 +402,16 @@ msgid "" | |||
549 | "= %u KiB/s\n" | 402 | "= %u KiB/s\n" |
550 | msgstr "" | 403 | msgstr "" |
551 | 404 | ||
405 | #: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294 | ||
406 | #, fuzzy | ||
407 | msgid "solver to use" | ||
408 | msgstr "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 | ||
412 | msgid "experiment to use" | ||
413 | msgstr "" | ||
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)" | |||
683 | msgid "Print information about ATS state" | 546 | msgid "Print information about ATS state" |
684 | msgstr "Imprime información acerca del estado del ATS" | 547 | msgstr "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 | ||
551 | msgid "" | ||
552 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
553 | "%llu\n" | ||
554 | msgstr "" | ||
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 | ||
560 | msgid "" | ||
561 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
562 | "%llu\n" | ||
563 | msgstr "" | ||
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 | ||
569 | msgid "" | ||
570 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
571 | "%llu\n" | ||
572 | msgstr "" | ||
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 | ||
578 | msgid "print logging" | ||
579 | msgstr "Iniciando descarga «%s».\n" | ||
580 | |||
581 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
582 | msgid "save logging to disk" | ||
583 | msgstr "" | ||
584 | |||
585 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
586 | msgid "disable normalization" | ||
587 | msgstr "" | ||
588 | |||
589 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
590 | #, fuzzy, c-format | ||
591 | msgid "" | ||
592 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
593 | "%llu\n" | ||
594 | msgstr "" | ||
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 | ||
601 | msgid "%s quota configured for network `%s' is %llu\n" | ||
602 | msgstr "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 | ||
606 | msgid "" | ||
607 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
608 | msgstr "" | ||
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 | ||
614 | msgid "Failed to initialize solver `%s'!\n" | ||
615 | msgstr "¡No se puede inicializar el resolvedor!\n" | ||
616 | |||
617 | #: src/ats/plugin_ats_mlp.c:1274 | ||
618 | msgid "Problem size too large, cannot allocate memory!\n" | ||
619 | msgstr "" | ||
620 | |||
621 | #: src/ats/plugin_ats_mlp.c:1869 | ||
622 | #, fuzzy, c-format | ||
623 | msgid "Adding address for peer `%s' multiple times\n" | ||
624 | msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n" | ||
625 | |||
626 | #: src/ats/plugin_ats_mlp.c:1913 | ||
627 | #, fuzzy, c-format | ||
628 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
629 | msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n" | ||
630 | |||
631 | #: src/ats/plugin_ats_mlp.c:2475 | ||
632 | msgid "" | ||
633 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
634 | msgstr "" | ||
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 | ||
644 | msgid "Invalid %s configuration %f \n" | ||
645 | msgstr "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 | ||
649 | msgid "" | ||
650 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
651 | "%llu must be at least %llu\n" | ||
652 | msgstr "" | ||
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 | ||
658 | msgid "" | ||
659 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
660 | "must be at least %llu\n" | ||
661 | msgstr "" | ||
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 | ||
668 | msgid "" | ||
669 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
670 | msgstr "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 | ||
675 | msgid "" | ||
676 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
677 | msgstr "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 | ||
681 | msgid "Invalid %s configuration %f\n" | ||
682 | msgstr "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 |
687 | msgid "description of the item to be sold" | 685 | msgid "description of the item to be sold" |
688 | msgstr "" | 686 | msgstr "" |
@@ -834,6 +832,28 @@ msgid "Connection to conversation service lost, trying to reconnect\n" | |||
834 | msgstr "" | 832 | msgstr "" |
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 | ||
837 | msgid "" | ||
838 | "\n" | ||
839 | "End of transmission. Have a GNU day.\n" | ||
840 | msgstr "" | ||
841 | |||
842 | #: src/conversation/gnunet-conversation-test.c:145 | ||
843 | #, c-format | ||
844 | msgid "" | ||
845 | "\n" | ||
846 | "We are now playing your recording back. If you can hear it, your audio " | ||
847 | "settings are working..." | ||
848 | msgstr "" | ||
849 | |||
850 | #: src/conversation/gnunet-conversation-test.c:210 | ||
851 | #, c-format | ||
852 | msgid "" | ||
853 | "We will now be recording you for %s. After that time, the recording will be " | ||
854 | "played back to you..." | ||
855 | msgstr "" | ||
856 | |||
837 | #: src/conversation/gnunet-conversation.c:269 | 857 | #: src/conversation/gnunet-conversation.c:269 |
838 | #, c-format | 858 | #, c-format |
839 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" | 859 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" |
@@ -1092,30 +1112,8 @@ msgstr "" | |||
1092 | msgid "Enables having a conversation with other GNUnet users." | 1112 | msgid "Enables having a conversation with other GNUnet users." |
1093 | msgstr "" | 1113 | msgstr "" |
1094 | 1114 | ||
1095 | #: src/conversation/gnunet-conversation-test.c:119 | ||
1096 | #, c-format | ||
1097 | msgid "" | ||
1098 | "\n" | ||
1099 | "End of transmission. Have a GNU day.\n" | ||
1100 | msgstr "" | ||
1101 | |||
1102 | #: src/conversation/gnunet-conversation-test.c:145 | ||
1103 | #, c-format | ||
1104 | msgid "" | ||
1105 | "\n" | ||
1106 | "We are now playing your recording back. If you can hear it, your audio " | ||
1107 | "settings are working..." | ||
1108 | msgstr "" | ||
1109 | |||
1110 | #: src/conversation/gnunet-conversation-test.c:210 | ||
1111 | #, c-format | ||
1112 | msgid "" | ||
1113 | "We will now be recording you for %s. After that time, the recording will be " | ||
1114 | "played back to you..." | ||
1115 | msgstr "" | ||
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 |
1120 | msgid "Read error from STDIN: %d %s\n" | 1118 | msgid "Read error from STDIN: %d %s\n" |
1121 | msgstr "" | 1119 | msgstr "" |
@@ -1247,6 +1245,11 @@ msgid "Failed to allocate %u bytes for second packet\n" | |||
1247 | msgstr "" | 1245 | msgstr "" |
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 | ||
1250 | msgid "Could not open line, port %s already in use!\n" | ||
1251 | msgstr "¡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 |
1252 | msgid "Could not start record audio helper\n" | 1255 | msgid "Could not start record audio helper\n" |
@@ -1534,8 +1537,140 @@ msgstr "# mapas de tipos recibidos" | |||
1534 | msgid "# updates to my type map" | 1537 | msgid "# updates to my type map" |
1535 | msgstr "# actualizaciones de mi mapa de tipos" | 1538 | msgstr "# actualizaciones de mi mapa de tipos" |
1536 | 1539 | ||
1540 | #: src/credential/credential_misc.c:88 | ||
1541 | #, fuzzy, c-format | ||
1542 | msgid "Unable to parse CRED record string `%s'\n" | ||
1543 | msgstr "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 | ||
1548 | msgid "Ego `%s' not known to identity service\n" | ||
1549 | msgstr "'%s': servicio desconocido: %s\n" | ||
1550 | |||
1551 | #: src/credential/gnunet-credential.c:294 | ||
1552 | #: src/credential/gnunet-credential.c:446 | ||
1553 | #, fuzzy, c-format | ||
1554 | msgid "Issuer public key `%s' is not well-formed\n" | ||
1555 | msgstr "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 | ||
1560 | msgid "Issuer public key not well-formed\n" | ||
1561 | msgstr "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 | ||
1566 | msgid "Failed to connect to CREDENTIAL\n" | ||
1567 | msgstr "Se produjo un fallo al conectar con GNS\n" | ||
1568 | |||
1569 | #: src/credential/gnunet-credential.c:392 | ||
1570 | #, c-format | ||
1571 | msgid "You must provide issuer the attribute\n" | ||
1572 | msgstr "" | ||
1573 | |||
1574 | #: src/credential/gnunet-credential.c:399 | ||
1575 | #, fuzzy, c-format | ||
1576 | msgid "ego required\n" | ||
1577 | msgstr "Tipo requerido\n" | ||
1578 | |||
1579 | #: src/credential/gnunet-credential.c:415 | ||
1580 | #, c-format | ||
1581 | msgid "Subject public key needed\n" | ||
1582 | msgstr "" | ||
1583 | |||
1584 | #: src/credential/gnunet-credential.c:426 | ||
1585 | #, fuzzy, c-format | ||
1586 | msgid "Subject public key `%s' is not well-formed\n" | ||
1587 | msgstr "El bloque del tipo %u está mal formado\n" | ||
1588 | |||
1589 | #: src/credential/gnunet-credential.c:461 | ||
1590 | #, c-format | ||
1591 | msgid "You must provide issuer and subject attributes\n" | ||
1592 | msgstr "" | ||
1593 | |||
1594 | #: src/credential/gnunet-credential.c:511 | ||
1595 | #, fuzzy, c-format | ||
1596 | msgid "Issuer ego required\n" | ||
1597 | msgstr "Tipo requerido\n" | ||
1598 | |||
1599 | #: src/credential/gnunet-credential.c:523 | ||
1600 | #, c-format | ||
1601 | msgid "Please specify name to lookup, subject key and issuer key!\n" | ||
1602 | msgstr "" | ||
1603 | |||
1604 | #: src/credential/gnunet-credential.c:543 | ||
1605 | msgid "create credential" | ||
1606 | msgstr "" | ||
1607 | |||
1608 | #: src/credential/gnunet-credential.c:547 | ||
1609 | msgid "verify credential against attribute" | ||
1610 | msgstr "" | ||
1611 | |||
1612 | #: src/credential/gnunet-credential.c:552 | ||
1613 | #, fuzzy | ||
1614 | msgid "The public key of the subject to lookup the credential for" | ||
1615 | msgstr "Especificar el tipo del registro a buscar" | ||
1616 | |||
1617 | #: src/credential/gnunet-credential.c:557 | ||
1618 | msgid "The name of the credential presented by the subject" | ||
1619 | msgstr "" | ||
1620 | |||
1621 | #: src/credential/gnunet-credential.c:562 | ||
1622 | #, fuzzy | ||
1623 | msgid "The public key of the authority to verify the credential against" | ||
1624 | msgstr "Especificar el tipo del registro a buscar" | ||
1625 | |||
1626 | #: src/credential/gnunet-credential.c:567 | ||
1627 | #, fuzzy | ||
1628 | msgid "The ego to use" | ||
1629 | msgstr "tamaño del mensaje" | ||
1630 | |||
1631 | #: src/credential/gnunet-credential.c:572 | ||
1632 | msgid "The issuer attribute to verify against or to issue" | ||
1633 | msgstr "" | ||
1634 | |||
1635 | #: src/credential/gnunet-credential.c:577 | ||
1636 | msgid "The time to live for the credential" | ||
1637 | msgstr "" | ||
1638 | |||
1639 | #: src/credential/gnunet-credential.c:581 | ||
1640 | msgid "collect credentials" | ||
1641 | msgstr "" | ||
1642 | |||
1643 | #: src/credential/gnunet-credential.c:595 | ||
1644 | #, fuzzy | ||
1645 | msgid "GNUnet credential resolver tool" | ||
1646 | msgstr "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 | ||
1651 | msgid "Failed to connect to GNS\n" | ||
1652 | msgstr "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 | ||
1659 | msgid "Failed to connect to namestore\n" | ||
1660 | msgstr "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 | ||
1664 | msgid "Unable to parse ATTR record string `%s'\n" | ||
1665 | msgstr "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 | ||
1669 | msgid "GNS REST API initialized\n" | ||
1670 | msgstr "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 |
1539 | msgid "# bytes stored" | 1674 | msgid "# bytes stored" |
1540 | msgstr "# bytes almacenados" | 1675 | msgstr "# 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 |
1599 | msgid "`%s' failed at %s:%d with error: %s\n" | 1733 | msgid "`%s' failed at %s:%d with error: %s\n" |
1600 | msgstr "«%s» falló en %s: %d con el error: %s\n" | 1734 | msgstr "«%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 |
1606 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" | 1741 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" |
@@ -1665,23 +1800,75 @@ msgstr "# peticiones «GET ZERO ANONYMITY» ejecutadas" | |||
1665 | msgid "# GET requests executed" | 1800 | msgid "# GET requests executed" |
1666 | msgstr "# peticiones «GET» ejecutadas" | 1801 | msgstr "# peticiones «GET» ejecutadas" |
1667 | 1802 | ||
1668 | #: src/datastore/gnunet-datastore.c:113 | 1803 | #: src/datastore/gnunet-datastore.c:189 |
1804 | #, c-format | ||
1805 | msgid "Dumped %<PRIu64> records\n" | ||
1806 | msgstr "" | ||
1807 | |||
1808 | #: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 | ||
1809 | #, c-format | ||
1810 | msgid "Short write to file: %zd bytes expecting %zd\n" | ||
1811 | msgstr "" | ||
1812 | |||
1813 | #: src/datastore/gnunet-datastore.c:261 | ||
1814 | #, fuzzy | ||
1815 | msgid "Error queueing datastore GET operation\n" | ||
1816 | msgstr "Error leyendo «%s»: %s" | ||
1817 | |||
1818 | #: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 | ||
1819 | #, fuzzy, c-format | ||
1820 | msgid "Unable to open dump file: %s\n" | ||
1821 | msgstr "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 |
1670 | msgid "Failed to store item: %s, aborting\n" | 1825 | msgid "Failed to store item: %s, aborting\n" |
1671 | msgstr "Se produjo un fallo al abrir «%s» para escritura" | 1826 | msgstr "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 | ||
1830 | msgid "Inserted %<PRIu64> records\n" | ||
1831 | msgstr "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 |
1675 | msgid "Cannot use the same configuration for source and destination\n" | 1835 | msgid "Short read from file: %zd bytes expecting %zd\n" |
1676 | msgstr "" | 1836 | msgstr "" |
1677 | 1837 | ||
1678 | #: src/datastore/gnunet-datastore.c:256 | 1838 | #: src/datastore/gnunet-datastore.c:389 |
1679 | msgid "" | 1839 | #, fuzzy |
1680 | "specifies the configuration to use to access an alternative datastore; will " | 1840 | msgid "Error queueing datastore PUT operation\n" |
1681 | "merge that datastore into our current datastore" | 1841 | msgstr "Error leyendo «%s»: %s" |
1842 | |||
1843 | #: src/datastore/gnunet-datastore.c:432 | ||
1844 | msgid "Input file is not of a supported format\n" | ||
1682 | msgstr "" | 1845 | msgstr "" |
1683 | 1846 | ||
1684 | #: src/datastore/gnunet-datastore.c:265 | 1847 | #: src/datastore/gnunet-datastore.c:458 |
1848 | #, fuzzy | ||
1849 | msgid "Failed connecting to the datastore.\n" | ||
1850 | msgstr "Se produjo un fallo al conectar con el almacén de datos." | ||
1851 | |||
1852 | #: src/datastore/gnunet-datastore.c:470 | ||
1853 | #, fuzzy, c-format | ||
1854 | msgid "Please choose at least one operation: %s, %s\n" | ||
1855 | msgstr "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 | ||
1859 | msgid "Dump all records from the datastore" | ||
1860 | msgstr "Buscar el registro para el nombre dado" | ||
1861 | |||
1862 | #: src/datastore/gnunet-datastore.c:497 | ||
1863 | #, fuzzy | ||
1864 | msgid "Insert records into the datastore" | ||
1865 | msgstr "# bytes mandados al almacén de datos" | ||
1866 | |||
1867 | #: src/datastore/gnunet-datastore.c:502 | ||
1868 | msgid "File to dump or insert" | ||
1869 | msgstr "" | ||
1870 | |||
1871 | #: src/datastore/gnunet-datastore.c:511 | ||
1685 | #, fuzzy | 1872 | #, fuzzy |
1686 | msgid "Manipulate GNUnet datastore" | 1873 | msgid "Manipulate GNUnet datastore" |
1687 | msgstr "Manipular ficheros de configuración de GNUnet" | 1874 | msgstr "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 |
1735 | msgid "# reserved" | 1922 | msgid "# reserved" |
1736 | msgstr "# reservado" | 1923 | msgstr "# reservado" |
1737 | 1924 | ||
@@ -1739,47 +1926,47 @@ msgstr "# reservado" | |||
1739 | msgid "Could not find matching reservation" | 1926 | msgid "Could not find matching reservation" |
1740 | msgstr "No se pudo encontrar una reserva coincidente" | 1927 | msgstr "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 |
1744 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" | 1931 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" |
1745 | msgstr "" | 1932 | msgstr "" |
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 |
1749 | msgid "# GET requests received" | 1936 | msgid "# GET requests received" |
1750 | msgstr "# peticiones «GET» recibidas" | 1937 | msgstr "# 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 |
1754 | msgid "# GET KEY requests received" | 1941 | msgid "# GET KEY requests received" |
1755 | msgstr "# peticiones «GET» recibidas" | 1942 | msgstr "# peticiones «GET» recibidas" |
1756 | 1943 | ||
1757 | #: src/datastore/gnunet-service-datastore.c:1071 | 1944 | #: src/datastore/gnunet-service-datastore.c:920 |
1758 | msgid "# requests filtered by bloomfilter" | 1945 | msgid "# requests filtered by bloomfilter" |
1759 | msgstr "# peticiones filtradas por el «bloomfilter»" | 1946 | msgstr "# peticiones filtradas por el «bloomfilter»" |
1760 | 1947 | ||
1761 | #: src/datastore/gnunet-service-datastore.c:1108 | 1948 | #: src/datastore/gnunet-service-datastore.c:956 |
1762 | msgid "# GET REPLICATION requests received" | 1949 | msgid "# GET REPLICATION requests received" |
1763 | msgstr "# peticiones «GET REPLICATION» recibidas" | 1950 | msgstr "# peticiones «GET REPLICATION» recibidas" |
1764 | 1951 | ||
1765 | #: src/datastore/gnunet-service-datastore.c:1141 | 1952 | #: src/datastore/gnunet-service-datastore.c:989 |
1766 | msgid "# GET ZERO ANONYMITY requests received" | 1953 | msgid "# GET ZERO ANONYMITY requests received" |
1767 | msgstr "# peticiones «GET ZERO ANONYMITY» recibidas" | 1954 | msgstr "# peticiones «GET ZERO ANONYMITY» recibidas" |
1768 | 1955 | ||
1769 | #: src/datastore/gnunet-service-datastore.c:1190 | 1956 | #: src/datastore/gnunet-service-datastore.c:1036 |
1770 | msgid "Content not found" | 1957 | msgid "Content not found" |
1771 | msgstr "Contenido no encontrado" | 1958 | msgstr "Contenido no encontrado" |
1772 | 1959 | ||
1773 | #: src/datastore/gnunet-service-datastore.c:1199 | 1960 | #: src/datastore/gnunet-service-datastore.c:1043 |
1774 | msgid "# bytes removed (explicit request)" | 1961 | msgid "# bytes removed (explicit request)" |
1775 | msgstr "# bytes eliminados (petición explÃcita)" | 1962 | msgstr "# bytes eliminados (petición explÃcita)" |
1776 | 1963 | ||
1777 | #: src/datastore/gnunet-service-datastore.c:1246 | 1964 | #: src/datastore/gnunet-service-datastore.c:1088 |
1778 | msgid "# REMOVE requests received" | 1965 | msgid "# REMOVE requests received" |
1779 | msgstr "# peticiones «REMOVE» recibidas" | 1966 | msgstr "# 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 |
1784 | msgid "" | 1971 | msgid "" |
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 |
1793 | msgid "New payload: %lld\n" | 1980 | msgid "New payload: %lld\n" |
1794 | msgstr "" | 1981 | msgstr "" |
1795 | 1982 | ||
1796 | #: src/datastore/gnunet-service-datastore.c:1361 | 1983 | #: src/datastore/gnunet-service-datastore.c:1197 |
1797 | #, c-format | 1984 | #, c-format |
1798 | msgid "Loading `%s' datastore plugin\n" | 1985 | msgid "Loading `%s' datastore plugin\n" |
1799 | msgstr "Cargando el módulo del almacén de datos «%s»\n" | 1986 | msgstr "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 |
1803 | msgid "Failed to load datastore plugin for `%s'\n" | 1990 | msgid "Failed to load datastore plugin for `%s'\n" |
1804 | msgstr "" | 1991 | msgstr "" |
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 |
1808 | msgid "Bloomfilter construction complete.\n" | 1995 | msgid "Bloomfilter construction complete.\n" |
1809 | msgstr "Construcción de «bloomfilter» completa.\n" | 1996 | msgstr "Construcción de «bloomfilter» completa.\n" |
1810 | 1997 | ||
1811 | #: src/datastore/gnunet-service-datastore.c:1489 | 1998 | #: src/datastore/gnunet-service-datastore.c:1325 |
1812 | msgid "Rebuilding bloomfilter. Please be patient.\n" | 1999 | msgid "Rebuilding bloomfilter. Please be patient.\n" |
1813 | msgstr "Reconstruyendo «bloomfilter». Por favor, tenga paciencia.\n" | 2000 | msgstr "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 |
1816 | msgid "Plugin does not support get_keys function. Please fix!\n" | 2003 | msgid "Plugin does not support get_keys function. Please fix!\n" |
1817 | msgstr "El módulo no soporta la función «get_keys». Por favor, corrÃjalo.\n" | 2004 | msgstr "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 |
1821 | msgid "# bytes used in file-sharing datastore `%s'" | 2008 | msgid "# bytes used in file-sharing datastore `%s'" |
1822 | msgstr "# bytes usados en el almacén de ficheros compartidos «%s»" | 2009 | msgstr "# 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 |
1825 | msgid "# quota" | 2012 | msgid "# quota" |
1826 | msgstr "# cuota" | 2013 | msgstr "# cuota" |
1827 | 2014 | ||
1828 | #: src/datastore/gnunet-service-datastore.c:1691 | 2015 | #: src/datastore/gnunet-service-datastore.c:1527 |
1829 | msgid "# cache size" | 2016 | msgid "# cache size" |
1830 | msgstr "# tamaño de la caché" | 2017 | msgstr "# 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 |
1834 | msgid "Could not use specified filename `%s' for bloomfilter.\n" | 2021 | msgid "Could not use specified filename `%s' for bloomfilter.\n" |
1835 | msgstr "" | 2022 | msgstr "" |
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 |
1841 | msgid "Failed to remove bogus bloomfilter file `%s'\n" | 2028 | msgid "Failed to remove bogus bloomfilter file `%s'\n" |
1842 | msgstr "" | 2029 | msgstr "" |
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 |
1847 | msgid "Failed to initialize bloomfilter.\n" | 2034 | msgid "Failed to initialize bloomfilter.\n" |
1848 | msgstr "Se produjo un fallo al inicializar «bloomfilter».\n" | 2035 | msgstr "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 |
1851 | msgid "Heap database running\n" | 2038 | msgid "Heap database running\n" |
1852 | msgstr "Base de datos de montÃculo ejecutándose\n" | 2039 | msgstr "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 | ||
2044 | msgid "MySQL statement run failure" | ||
2045 | msgstr "" | ||
2046 | |||
2047 | #: src/datastore/plugin_datastore_mysql.c:410 | ||
2048 | #: src/datastore/plugin_datastore_sqlite.c:626 | ||
1856 | #, fuzzy | 2049 | #, fuzzy |
1857 | msgid "Data too large" | 2050 | msgid "Data too large" |
1858 | msgstr "número de valores" | 2051 | msgstr "número de valores" |
1859 | 2052 | ||
1860 | #: src/datastore/plugin_datastore_mysql.c:393 | 2053 | #: src/datastore/plugin_datastore_mysql.c:848 |
1861 | msgid "MySQL statement run failure" | ||
1862 | msgstr "" | ||
1863 | |||
1864 | #: src/datastore/plugin_datastore_mysql.c:936 | ||
1865 | #, c-format | 2054 | #, c-format |
1866 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" | 2055 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" |
1867 | msgstr "«%s» para «%s» falló en %s: %d con error: %s\n" | 2056 | msgstr "«%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 |
1871 | msgid "Mysql database running\n" | 2060 | msgid "Mysql database running\n" |
1872 | msgstr "Base de datos Mysql ejecutándose\n" | 2061 | msgstr "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 | ||
1875 | msgid "Postgress exec failure" | 2065 | msgid "Postgress exec failure" |
1876 | msgstr "" | 2066 | msgstr "" |
1877 | 2067 | ||
1878 | #: src/datastore/plugin_datastore_postgres.c:866 | 2068 | #: src/datastore/plugin_datastore_postgres.c:852 |
1879 | msgid "Failed to drop table from database.\n" | 2069 | msgid "Failed to drop table from database.\n" |
1880 | msgstr "Se produjo un fallo al borrar una tabla de la base de datos.\n" | 2070 | msgstr "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 | ||
1886 | msgid "Postgres database running\n" | 2074 | msgid "Postgres database running\n" |
1887 | msgstr "Base de datos Postgres ejecutándose\n" | 2075 | msgstr "Base de datos Postgres ejecutándose\n" |
1888 | 2076 | ||
@@ -1894,7 +2082,8 @@ msgstr "Base de datos Postgres ejecutándose\n" | |||
1894 | msgid "`%s' failed at %s:%u with error: %s" | 2082 | msgid "`%s' failed at %s:%u with error: %s" |
1895 | msgstr "«%s» falló en %s:%u con el error: %s" | 2083 | msgstr "«%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" | |||
1903 | msgid "Unable to initialize SQLite: %s.\n" | 2092 | msgid "Unable to initialize SQLite: %s.\n" |
1904 | msgstr "Imposible inicializar SQLite: %s.\n" | 2093 | msgstr "Imposible inicializar SQLite: %s.\n" |
1905 | 2094 | ||
2095 | #: src/datastore/plugin_datastore_sqlite.c:577 | ||
2096 | msgid "sqlite bind failure" | ||
2097 | msgstr "" | ||
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 |
1908 | msgid "sqlite version to old to determine size, assuming zero\n" | 2101 | msgid "sqlite version to old to determine size, assuming zero\n" |
1909 | msgstr "" | 2102 | msgstr "" |
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 |
1915 | msgid "" | 2108 | msgid "" |
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 |
1925 | msgid "Sqlite database running\n" | 2119 | msgid "Sqlite database running\n" |
1926 | msgstr "Base de datos sqlite ejecutándose\n" | 2120 | msgstr "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 |
1929 | msgid "Template database running\n" | 2123 | msgid "Template database running\n" |
1930 | msgstr "Base de datos de plantilla ejecutándose\n" | 2124 | msgstr "Base de datos de plantilla ejecutándose\n" |
1931 | 2125 | ||
@@ -1989,54 +2183,6 @@ msgstr "ser prolijo (imprime información de progreso)" | |||
1989 | msgid "Prints all packets that go through the DHT." | 2183 | msgid "Prints all packets that go through the DHT." |
1990 | msgstr "Imprime todos los paquetes que pasan por la DHT." | 2184 | msgstr "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 | ||
1995 | msgid "Exiting as the number of peers is %u\n" | ||
1996 | msgstr "El número máximo de conexiones es %u\n" | ||
1997 | |||
1998 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
1999 | msgid "number of peers to start" | ||
2000 | msgstr "número de pares para empezar" | ||
2001 | |||
2002 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2003 | msgid "" | ||
2004 | "maximum number of times we try to search for successor circle formation (0 " | ||
2005 | "for R5N)" | ||
2006 | msgstr "" | ||
2007 | |||
2008 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2009 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2010 | msgid "name of the file with the login information for the testbed" | ||
2011 | msgstr "" | ||
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 | ||
2016 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2017 | msgstr "" | ||
2018 | |||
2019 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2020 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2021 | msgstr "" | ||
2022 | |||
2023 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2024 | msgid "delay to start doing GETs (default: 5 min)" | ||
2025 | msgstr "" | ||
2026 | |||
2027 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2028 | msgid "replication degree for DHT PUTs" | ||
2029 | msgstr "" | ||
2030 | |||
2031 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2032 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2033 | msgstr "" | ||
2034 | |||
2035 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2036 | #, fuzzy | ||
2037 | msgid "Measure quality and performance of the DHT service." | ||
2038 | msgstr "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 |
2041 | msgid "PUT request sent with key" | 2187 | msgid "PUT request sent with key" |
2042 | msgstr "Petición «PUT» enviada con clave" | 2188 | msgstr "Petición «PUT» enviada con clave" |
@@ -2303,6 +2449,53 @@ msgstr "# Entradas añadidas a la tabla de encaminamiento" | |||
2303 | msgid "# DHT requests combined" | 2449 | msgid "# DHT requests combined" |
2304 | msgstr "# Peticiones a la DHT combinadas" | 2450 | msgstr "# 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 | ||
2454 | msgid "Exiting as the number of peers is %u\n" | ||
2455 | msgstr "El número máximo de conexiones es %u\n" | ||
2456 | |||
2457 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
2458 | msgid "number of peers to start" | ||
2459 | msgstr "número de pares para empezar" | ||
2460 | |||
2461 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2462 | msgid "" | ||
2463 | "maximum number of times we try to search for successor circle formation (0 " | ||
2464 | "for R5N)" | ||
2465 | msgstr "" | ||
2466 | |||
2467 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2468 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2469 | msgid "name of the file with the login information for the testbed" | ||
2470 | msgstr "" | ||
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 | ||
2475 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2476 | msgstr "" | ||
2477 | |||
2478 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2479 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2480 | msgstr "" | ||
2481 | |||
2482 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2483 | msgid "delay to start doing GETs (default: 5 min)" | ||
2484 | msgstr "" | ||
2485 | |||
2486 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2487 | msgid "replication degree for DHT PUTs" | ||
2488 | msgstr "" | ||
2489 | |||
2490 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2491 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2492 | msgstr "" | ||
2493 | |||
2494 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2495 | #, fuzzy | ||
2496 | msgid "Measure quality and performance of the DHT service." | ||
2497 | msgstr "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 |
2308 | msgid "Block not of type %u\n" | 2501 | msgid "Block not of type %u\n" |
@@ -2646,7 +2839,7 @@ msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n" | |||
2646 | msgid "No useful service enabled. Exiting.\n" | 2839 | msgid "No useful service enabled. Exiting.\n" |
2647 | msgstr "Ningún servicio útil habilitado. Saliendo.\n" | 2840 | msgstr "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 |
2650 | msgid "Daemon to run to provide an IP exit node for the VPN" | 2843 | msgid "Daemon to run to provide an IP exit node for the VPN" |
2651 | msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN" | 2844 | msgstr "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 | ||
3329 | msgid "print a list of all indexed files" | ||
3330 | msgstr "imprimir una lista de todos los ficheros indexados" | ||
3331 | |||
3332 | #: src/fs/gnunet-fs.c:130 | ||
3333 | msgid "Special file-sharing operations" | ||
3334 | msgstr "Operaciones especiales de compartición de ficheros" | ||
3335 | |||
3336 | #: src/fs/gnunet-fs-profiler.c:211 | 3521 | #: src/fs/gnunet-fs-profiler.c:211 |
3337 | msgid "run the experiment with COUNT peers" | 3522 | msgid "run the experiment with COUNT peers" |
3338 | msgstr "ejecuta el experimento con «COUNT» pares" | 3523 | msgstr "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 | ||
3542 | msgid "print a list of all indexed files" | ||
3543 | msgstr "imprimir una lista de todos los ficheros indexados" | ||
3544 | |||
3545 | #: src/fs/gnunet-fs.c:130 | ||
3546 | msgid "Special file-sharing operations" | ||
3547 | msgstr "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 |
3358 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" | 3551 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" |
@@ -4049,22 +4242,11 @@ msgstr "" | |||
4049 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" | 4242 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" |
4050 | msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)" | 4243 | msgstr "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 | 4246 | msgid "Not ready to process requests, lacking ego data\n" |
4054 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4055 | msgstr "" | ||
4056 | |||
4057 | #: src/gns/gnunet-gns.c:252 | ||
4058 | #, c-format | ||
4059 | msgid "Please specify name to lookup!\n" | ||
4060 | msgstr "" | ||
4061 | |||
4062 | #: src/gns/gnunet-gns.c:276 | ||
4063 | #, c-format | ||
4064 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4065 | msgstr "" | 4247 | msgstr "" |
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 |
4070 | msgid "" | 4252 | msgid "" |
@@ -4072,58 +4254,12 @@ msgid "" | |||
4072 | "gns-import.sh?\n" | 4254 | "gns-import.sh?\n" |
4073 | msgstr "" | 4255 | msgstr "" |
4074 | 4256 | ||
4075 | #: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727 | ||
4076 | #, c-format | ||
4077 | msgid "Failed to connect to GNS\n" | ||
4078 | msgstr "Se produjo un fallo al conectar con GNS\n" | ||
4079 | |||
4080 | #: src/gns/gnunet-gns.c:374 | ||
4081 | #, c-format | ||
4082 | msgid "Public key `%s' is not well-formed\n" | ||
4083 | msgstr "" | ||
4084 | |||
4085 | #: src/gns/gnunet-gns.c:428 | ||
4086 | msgid "Lookup a record for the given name" | ||
4087 | msgstr "Buscar el registro para el nombre dado" | ||
4088 | |||
4089 | #: src/gns/gnunet-gns.c:434 | ||
4090 | msgid "Specify the type of the record to lookup" | ||
4091 | msgstr "Especificar el tipo del registro a buscar" | ||
4092 | |||
4093 | #: src/gns/gnunet-gns.c:440 | ||
4094 | #, fuzzy | ||
4095 | msgid "Specify timeout for the lookup" | ||
4096 | msgstr "Especificar el tipo del registro a buscar" | ||
4097 | |||
4098 | #: src/gns/gnunet-gns.c:445 | ||
4099 | msgid "No unneeded output" | ||
4100 | msgstr "Sin salida innecesaria" | ||
4101 | |||
4102 | #: src/gns/gnunet-gns.c:451 | ||
4103 | #, fuzzy | ||
4104 | msgid "Specify the public key of the zone to lookup the record in" | ||
4105 | msgstr "Especificar el tipo del registro a buscar" | ||
4106 | |||
4107 | #: src/gns/gnunet-gns.c:457 | ||
4108 | #, fuzzy | ||
4109 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4110 | msgstr "Especificar el tipo del registro a buscar" | ||
4111 | |||
4112 | #: src/gns/gnunet-gns.c:476 | ||
4113 | #, fuzzy | ||
4114 | msgid "GNUnet GNS resolver tool" | ||
4115 | msgstr "Herramienta de acceso GNUnet GNS" | ||
4116 | |||
4117 | #: src/gns/gnunet-gns-helper-service-w32.c:602 | ||
4118 | msgid "Not ready to process requests, lacking ego data\n" | ||
4119 | msgstr "" | ||
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 |
4123 | msgid "Failed to connect to identity service\n" | 4259 | msgid "Failed to connect to identity service\n" |
4124 | msgstr "Fallo al conectar a gnunetd.\n" | 4260 | msgstr "Fallo al conectar a gnunetd.\n" |
4125 | 4261 | ||
4126 | #: src/gns/gnunet-gns-import.c:489 | 4262 | #: src/gns/gnunet-gns-import.c:452 |
4127 | msgid "This program will import some GNS authorities into your GNS namestore." | 4263 | msgid "This program will import some GNS authorities into your GNS namestore." |
4128 | msgstr "" | 4264 | msgstr "" |
4129 | 4265 | ||
@@ -4249,13 +4385,65 @@ msgstr "fichero pem para usar como autoridad de certificación (CA)" | |||
4249 | msgid "GNUnet GNS proxy" | 4385 | msgid "GNUnet GNS proxy" |
4250 | msgstr "Proxy GNUnet GNS" | 4386 | msgstr "Proxy GNUnet GNS" |
4251 | 4387 | ||
4388 | #: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 | ||
4389 | #, c-format | ||
4390 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4391 | msgstr "" | ||
4392 | |||
4393 | #: src/gns/gnunet-gns.c:252 | ||
4394 | #, c-format | ||
4395 | msgid "Please specify name to lookup!\n" | ||
4396 | msgstr "" | ||
4397 | |||
4398 | #: src/gns/gnunet-gns.c:276 | ||
4399 | #, c-format | ||
4400 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4401 | msgstr "" | ||
4402 | |||
4403 | #: src/gns/gnunet-gns.c:374 | ||
4404 | #, c-format | ||
4405 | msgid "Public key `%s' is not well-formed\n" | ||
4406 | msgstr "" | ||
4407 | |||
4408 | #: src/gns/gnunet-gns.c:428 | ||
4409 | msgid "Lookup a record for the given name" | ||
4410 | msgstr "Buscar el registro para el nombre dado" | ||
4411 | |||
4412 | #: src/gns/gnunet-gns.c:434 | ||
4413 | msgid "Specify the type of the record to lookup" | ||
4414 | msgstr "Especificar el tipo del registro a buscar" | ||
4415 | |||
4416 | #: src/gns/gnunet-gns.c:440 | ||
4417 | #, fuzzy | ||
4418 | msgid "Specify timeout for the lookup" | ||
4419 | msgstr "Especificar el tipo del registro a buscar" | ||
4420 | |||
4421 | #: src/gns/gnunet-gns.c:445 | ||
4422 | msgid "No unneeded output" | ||
4423 | msgstr "Sin salida innecesaria" | ||
4424 | |||
4425 | #: src/gns/gnunet-gns.c:451 | ||
4426 | #, fuzzy | ||
4427 | msgid "Specify the public key of the zone to lookup the record in" | ||
4428 | msgstr "Especificar el tipo del registro a buscar" | ||
4429 | |||
4430 | #: src/gns/gnunet-gns.c:457 | ||
4431 | #, fuzzy | ||
4432 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4433 | msgstr "Especificar el tipo del registro a buscar" | ||
4434 | |||
4435 | #: src/gns/gnunet-gns.c:476 | ||
4436 | #, fuzzy | ||
4437 | msgid "GNUnet GNS resolver tool" | ||
4438 | msgstr "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 |
4254 | msgid "Failed to connect to the namecache!\n" | 4442 | msgid "Failed to connect to the namecache!\n" |
4255 | msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n" | 4443 | msgstr "¡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 |
4259 | msgid "Could not connect to DHT!\n" | 4447 | msgid "Could not connect to DHT!\n" |
4260 | msgstr "¡No se pudo conectar a la DHT!\n" | 4448 | msgstr "¡No se pudo conectar a la DHT!\n" |
4261 | 4449 | ||
@@ -4313,47 +4501,37 @@ msgstr "" | |||
4313 | msgid "Hostname `%s' is not well-formed, resolution fails\n" | 4501 | msgid "Hostname `%s' is not well-formed, resolution fails\n" |
4314 | msgstr "" | 4502 | msgstr "" |
4315 | 4503 | ||
4316 | #: src/gns/plugin_gnsrecord_gns.c:203 | 4504 | #: src/gns/plugin_gnsrecord_gns.c:179 |
4317 | #, c-format | 4505 | #, c-format |
4318 | msgid "Unable to parse PKEY record `%s'\n" | 4506 | msgid "Unable to parse PKEY record `%s'\n" |
4319 | msgstr "No se pudo procesar el registro PKEY «%s»\n" | 4507 | msgstr "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 |
4323 | msgid "Unable to parse GNS2DNS record `%s'\n" | 4511 | msgid "Unable to parse GNS2DNS record `%s'\n" |
4324 | msgstr "No se pudo procesar el registro SOA «%s»\n" | 4512 | msgstr "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 |
4328 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" | 4516 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" |
4329 | msgstr "" | 4517 | msgstr "" |
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 |
4335 | msgid "Unable to parse VPN record string `%s'\n" | 4523 | msgid "Unable to parse VPN record string `%s'\n" |
4336 | msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" | 4524 | msgstr "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 |
4340 | msgid "Unable to parse BOX record string `%s'\n" | 4528 | msgid "Unable to parse BOX record string `%s'\n" |
4341 | msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" | 4529 | msgstr "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 | ||
4345 | msgid "Unable to parse REVERSE record string `%s'\n" | ||
4346 | msgstr "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 |
4349 | msgid "Ego for not found, cannot perform lookup.\n" | 4532 | msgid "Ego for not found, cannot perform lookup.\n" |
4350 | msgstr "" | 4533 | msgstr "" |
4351 | 4534 | ||
4352 | #: src/gns/plugin_rest_gns.c:668 | ||
4353 | #, fuzzy | ||
4354 | msgid "GNS REST API initialized\n" | ||
4355 | msgstr "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 |
4359 | msgid "Unable to parse IPv4 address `%s'\n" | 4537 | msgid "Unable to parse IPv4 address `%s'\n" |
@@ -4816,6 +4994,53 @@ msgid "Could not start hostlist HTTP server on port %u\n" | |||
4816 | msgstr "" | 4994 | msgstr "" |
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 | ||
4999 | msgid "Ego is required\n" | ||
5000 | msgstr "Las opción «%s» o «%s» es necesaria.\n" | ||
5001 | |||
5002 | #: src/identity-provider/gnunet-idp.c:370 | ||
5003 | msgid "Add attribute" | ||
5004 | msgstr "" | ||
5005 | |||
5006 | #: src/identity-provider/gnunet-idp.c:376 | ||
5007 | msgid "Attribute value" | ||
5008 | msgstr "" | ||
5009 | |||
5010 | #: src/identity-provider/gnunet-idp.c:381 | ||
5011 | msgid "Ego" | ||
5012 | msgstr "" | ||
5013 | |||
5014 | #: src/identity-provider/gnunet-idp.c:386 | ||
5015 | msgid "Audience (relying party)" | ||
5016 | msgstr "" | ||
5017 | |||
5018 | #: src/identity-provider/gnunet-idp.c:390 | ||
5019 | msgid "List attributes for Ego" | ||
5020 | msgstr "" | ||
5021 | |||
5022 | #: src/identity-provider/gnunet-idp.c:395 | ||
5023 | msgid "Issue a ticket" | ||
5024 | msgstr "" | ||
5025 | |||
5026 | #: src/identity-provider/gnunet-idp.c:400 | ||
5027 | msgid "Consume a ticket" | ||
5028 | msgstr "" | ||
5029 | |||
5030 | #: src/identity-provider/gnunet-idp.c:405 | ||
5031 | msgid "Revoke a ticket" | ||
5032 | msgstr "" | ||
5033 | |||
5034 | #: src/identity-provider/identity_provider_api.c:429 | ||
5035 | #, fuzzy | ||
5036 | msgid "failed to store record\n" | ||
5037 | msgstr "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 | ||
5041 | msgid "Identity Provider REST API initialized\n" | ||
5042 | msgstr "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 |
4821 | msgid "Failed to create ego: %s\n" | 5046 | msgid "Failed to create ego: %s\n" |
@@ -4910,34 +5135,11 @@ msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" | |||
4910 | msgid "Failed to create directory `%s' for storing egos\n" | 5135 | msgid "Failed to create directory `%s' for storing egos\n" |
4911 | msgstr "Se produjo un fallo al leer el directorio «%s»\n" | 5136 | msgstr "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 |
4915 | msgid "Identity REST API initialized\n" | 5140 | msgid "Identity REST API initialized\n" |
4916 | msgstr "Conexión fallida\n" | 5141 | msgstr "Conexión fallida\n" |
4917 | 5142 | ||
4918 | #: src/identity-provider/gnunet-identity-token.c:66 | ||
4919 | #, fuzzy | ||
4920 | msgid "Option `-t' is required\n" | ||
4921 | msgstr "Las opción «%s» o «%s» es necesaria.\n" | ||
4922 | |||
4923 | #: src/identity-provider/gnunet-identity-token.c:77 | ||
4924 | #, fuzzy, c-format | ||
4925 | msgid "Token `%s' is malformed\n" | ||
4926 | msgstr "El bloque del tipo %u está mal formado\n" | ||
4927 | |||
4928 | #: src/identity-provider/gnunet-identity-token.c:166 | ||
4929 | msgid "GNUid token" | ||
4930 | msgstr "" | ||
4931 | |||
4932 | #: src/identity-provider/gnunet-identity-token.c:171 | ||
4933 | msgid "Print token contents" | ||
4934 | msgstr "" | ||
4935 | |||
4936 | #: src/identity-provider/plugin_rest_identity_provider.c:1166 | ||
4937 | #, fuzzy | ||
4938 | msgid "Identity Token REST API initialized\n" | ||
4939 | msgstr "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 |
4943 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" | 5145 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" |
@@ -5040,10 +5242,66 @@ msgstr "Se produjo un fallo al crear los Ãndices\n" | |||
5040 | msgid "flat plugin running\n" | 5242 | msgid "flat plugin running\n" |
5041 | msgstr "Base de datos sqlite ejecutándose\n" | 5243 | msgstr "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 |
5045 | msgid "Failed to create indices\n" | 5247 | #, c-format |
5046 | msgstr "Se produjo un fallo al crear los Ãndices\n" | 5248 | msgid "Unsupported form value `%s'\n" |
5249 | msgstr "Forma de valor no soportada «%s»\n" | ||
5250 | |||
5251 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
5252 | #, c-format | ||
5253 | msgid "Failed to create record for domain `%s': %s\n" | ||
5254 | msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n" | ||
5255 | |||
5256 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5257 | msgid "Error when mapping zone to name\n" | ||
5258 | msgstr "" | ||
5259 | |||
5260 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5261 | #, c-format | ||
5262 | msgid "Found existing name `%s' for the given key\n" | ||
5263 | msgstr "Encontrado nombre «%s» para la clave dada\n" | ||
5264 | |||
5265 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5266 | #, c-format | ||
5267 | msgid "Found %u existing records for domain `%s'\n" | ||
5268 | msgstr "Encontrados %u registros para el dominio «%s»\n" | ||
5269 | |||
5270 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5271 | #, c-format | ||
5272 | msgid "Failed to create page for `%s'\n" | ||
5273 | msgstr "Se produjo un fallo al crear la página para «%s»\n" | ||
5274 | |||
5275 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5276 | #, c-format | ||
5277 | msgid "Failed to setup post processor for `%s'\n" | ||
5278 | msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n" | ||
5279 | |||
5280 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5281 | msgid "Domain name must not contain `.'\n" | ||
5282 | msgstr "El nombre de dominio no puede contener «.»\n" | ||
5283 | |||
5284 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5285 | msgid "Domain name must not contain `+'\n" | ||
5286 | msgstr "El nombre de dominio no puede contener «+»\n" | ||
5287 | |||
5288 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5289 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5290 | msgstr "" | ||
5291 | |||
5292 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5293 | msgid "Failed to start HTTP server\n" | ||
5294 | msgstr "Se produjo un fallo al iniciar el servidor HTTP\n" | ||
5295 | |||
5296 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5297 | #, fuzzy | ||
5298 | msgid "Failed to connect to identity\n" | ||
5299 | msgstr "Se produjo un fallo al conectar con GNS\n" | ||
5300 | |||
5301 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5302 | #, fuzzy | ||
5303 | msgid "GNU Name System First Come First Serve name registration service" | ||
5304 | msgstr "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" | |||
5051 | msgstr "No se pudo añadir el registro: %s\n" | 5309 | msgstr "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 |
5056 | msgid "Deleting record failed, record does not exist%s%s\n" | 5314 | msgid "Deleting record failed, record does not exist%s%s\n" |
5057 | msgstr "No se pudo borrar el registro: %s\n" | 5315 | msgstr "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 |
5062 | msgid "Deleting record failed%s%s\n" | 5320 | msgid "Deleting record failed%s%s\n" |
5063 | msgstr "No se pudo borrar el registro: %s\n" | 5321 | msgstr "No se pudo borrar el registro: %s\n" |
@@ -5075,7 +5333,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n" | |||
5075 | msgstr "" | 5333 | msgstr "" |
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 |
5080 | msgid "There are no records under label `%s' that could be deleted.\n" | 5338 | msgid "There are no records under label `%s' that could be deleted.\n" |
5081 | msgstr "" | 5339 | msgstr "" |
@@ -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" |
5087 | msgstr "" | 5345 | msgstr "" |
5088 | 5346 | ||
5089 | #: src/namestore/gnunet-namestore.c:776 | ||
5090 | #: src/namestore/plugin_rest_namestore.c:1004 | ||
5091 | #, fuzzy, c-format | ||
5092 | msgid "Ego `%s' not known to identity service\n" | ||
5093 | msgstr "'%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 |
5097 | msgid "No options given\n" | 5349 | msgid "No options given\n" |
5098 | msgstr "No se han proporcionado opciones\n" | 5350 | msgstr "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 | ||
5103 | msgid "Failed to connect to namestore\n" | ||
5104 | msgstr "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" | |||
5116 | msgstr "añadir" | 5362 | msgstr "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 |
5121 | msgid "Unsupported type `%s'\n" | 5367 | msgid "Unsupported type `%s'\n" |
5122 | msgstr "Tipo no soportado «%s»\n" | 5368 | msgstr "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 |
5128 | msgid "Value `%s' invalid for record type `%s'\n" | 5374 | msgid "Value `%s' invalid for record type `%s'\n" |
5129 | msgstr "Valor «%s» no válido para el tipo de registro «%s»\n" | 5375 | msgstr "Valor «%s» no válido para el tipo de registro «%s»\n" |
@@ -5142,8 +5388,7 @@ msgstr "borrar" | |||
5142 | msgid "Invalid public key for reverse lookup `%s'\n" | 5388 | msgid "Invalid public key for reverse lookup `%s'\n" |
5143 | msgstr "Parámetro no válido «%s»\n" | 5389 | msgstr "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 |
5148 | msgid "Invalid URI `%s'\n" | 5393 | msgid "Invalid URI `%s'\n" |
5149 | msgstr "URI no válida: «%s»\n" | 5394 | msgstr "URI no válida: «%s»\n" |
@@ -5154,13 +5399,13 @@ msgid "Invalid nick `%s'\n" | |||
5154 | msgstr "URI no válida: «%s»\n" | 5399 | msgstr "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 |
5159 | msgid "No default ego configured in identity service\n" | 5404 | msgid "No default ego configured in identity service\n" |
5160 | msgstr "'%s': servicio desconocido: %s\n" | 5405 | msgstr "'%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 |
5165 | msgid "Cannot connect to identity service\n" | 5410 | msgid "Cannot connect to identity service\n" |
5166 | msgstr "¡No se pudo conectar al servicio %s!\n" | 5411 | msgstr "¡No se pudo conectar al servicio %s!\n" |
@@ -5226,68 +5471,7 @@ msgstr "" | |||
5226 | msgid "name of the ego controlling the zone" | 5471 | msgid "name of the ego controlling the zone" |
5227 | msgstr "nombre de la sección a la que acceder" | 5472 | msgstr "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 | ||
5232 | msgid "Unsupported form value `%s'\n" | ||
5233 | msgstr "Forma de valor no soportada «%s»\n" | ||
5234 | |||
5235 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
5236 | #, c-format | ||
5237 | msgid "Failed to create record for domain `%s': %s\n" | ||
5238 | msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n" | ||
5239 | |||
5240 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5241 | msgid "Error when mapping zone to name\n" | ||
5242 | msgstr "" | ||
5243 | |||
5244 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5245 | #, c-format | ||
5246 | msgid "Found existing name `%s' for the given key\n" | ||
5247 | msgstr "Encontrado nombre «%s» para la clave dada\n" | ||
5248 | |||
5249 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5250 | #, c-format | ||
5251 | msgid "Found %u existing records for domain `%s'\n" | ||
5252 | msgstr "Encontrados %u registros para el dominio «%s»\n" | ||
5253 | |||
5254 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5255 | #, c-format | ||
5256 | msgid "Failed to create page for `%s'\n" | ||
5257 | msgstr "Se produjo un fallo al crear la página para «%s»\n" | ||
5258 | |||
5259 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5260 | #, c-format | ||
5261 | msgid "Failed to setup post processor for `%s'\n" | ||
5262 | msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n" | ||
5263 | |||
5264 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5265 | msgid "Domain name must not contain `.'\n" | ||
5266 | msgstr "El nombre de dominio no puede contener «.»\n" | ||
5267 | |||
5268 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5269 | msgid "Domain name must not contain `+'\n" | ||
5270 | msgstr "El nombre de dominio no puede contener «+»\n" | ||
5271 | |||
5272 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5273 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5274 | msgstr "" | ||
5275 | |||
5276 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5277 | msgid "Failed to start HTTP server\n" | ||
5278 | msgstr "Se produjo un fallo al iniciar el servidor HTTP\n" | ||
5279 | |||
5280 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5281 | #, fuzzy | ||
5282 | msgid "Failed to connect to identity\n" | ||
5283 | msgstr "Se produjo un fallo al conectar con GNS\n" | ||
5284 | |||
5285 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5286 | #, fuzzy | ||
5287 | msgid "GNU Name System First Come First Serve name registration service" | ||
5288 | msgstr "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 |
5292 | msgid "Failed to replicate block in namecache: %s\n" | 5476 | msgid "Failed to replicate block in namecache: %s\n" |
5293 | msgstr "Se produjo un fallo al crear el espacio de nombres «%s»\n" | 5477 | msgstr "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" | |||
5302 | msgid "flat file database running\n" | 5486 | msgid "flat file database running\n" |
5303 | msgstr "Base de datos de plantilla ejecutándose\n" | 5487 | msgstr "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 |
5307 | msgid "Namestore REST API initialized\n" | 5491 | msgid "Namestore REST API initialized\n" |
5308 | msgstr "Conexión fallida\n" | 5492 | msgstr "Conexión fallida\n" |
@@ -5602,11 +5786,6 @@ msgstr "comando «external-ip» no encontrado\n" | |||
5602 | msgid "`upnpc' command not found\n" | 5786 | msgid "`upnpc' command not found\n" |
5603 | msgstr "comando «upnpc» no encontrado\n" | 5787 | msgstr "comando «upnpc» no encontrado\n" |
5604 | 5788 | ||
5605 | #: src/nse/gnunet-nse.c:122 | ||
5606 | #, fuzzy | ||
5607 | msgid "Show network size estimates from NSE service." | ||
5608 | msgstr "# Estimaciones del tamaño de red recibidas" | ||
5609 | |||
5610 | #: src/nse/gnunet-nse-profiler.c:842 | 5789 | #: src/nse/gnunet-nse-profiler.c:842 |
5611 | msgid "limit to the number of connections to NSE services, 0 for none" | 5790 | msgid "limit to the number of connections to NSE services, 0 for none" |
5612 | msgstr "lÃmite al número de conexiones a servicios NSE, 0 para ilimitadas" | 5791 | msgstr "lÃmite al número de conexiones a servicios NSE, 0 para ilimitadas" |
@@ -5632,70 +5811,16 @@ msgstr "retraso entre rondas" | |||
5632 | msgid "Measure quality and performance of the NSE service." | 5811 | msgid "Measure quality and performance of the NSE service." |
5633 | msgstr "Medir la calidad y rendimiento del servicio NSE." | 5812 | msgstr "Medir la calidad y rendimiento del servicio NSE." |
5634 | 5813 | ||
5814 | #: src/nse/gnunet-nse.c:122 | ||
5815 | #, fuzzy | ||
5816 | msgid "Show network size estimates from NSE service." | ||
5817 | msgstr "# 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 |
5637 | msgid "Value is too large.\n" | 5821 | msgid "Value is too large.\n" |
5638 | msgstr "" | 5822 | msgstr "" |
5639 | 5823 | ||
5640 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5641 | #, c-format | ||
5642 | msgid "Removing expired address of transport `%s'\n" | ||
5643 | msgstr "Eliminando dirección de transporte «%s»\n" | ||
5644 | |||
5645 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5646 | #, fuzzy, c-format | ||
5647 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5648 | msgstr "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 | ||
5653 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5654 | msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n" | ||
5655 | |||
5656 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5657 | msgid "# peers known" | ||
5658 | msgstr "# pares conocidos" | ||
5659 | |||
5660 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5661 | #, c-format | ||
5662 | msgid "" | ||
5663 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5664 | msgstr "" | ||
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 | ||
5670 | msgid "Scanning directory `%s'\n" | ||
5671 | msgstr "Escaneando directorio «%s».\n" | ||
5672 | |||
5673 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5674 | #, c-format | ||
5675 | msgid "Still no peers found in `%s'!\n" | ||
5676 | msgstr "¡Aún no se han encontrado pares en «%s»!\n" | ||
5677 | |||
5678 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5679 | #, fuzzy, c-format | ||
5680 | msgid "Cleaning up directory `%s'\n" | ||
5681 | msgstr "Escaneando directorio «%s».\n" | ||
5682 | |||
5683 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5684 | #, c-format | ||
5685 | msgid "Importing HELLOs from `%s'\n" | ||
5686 | msgstr "Importando HELLO de «%s»\n" | ||
5687 | |||
5688 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5689 | msgid "Skipping import of included HELLOs\n" | ||
5690 | msgstr "" | ||
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 | ||
5695 | msgid "Failed to receive response from `PEERINFO' service." | ||
5696 | msgstr "" | ||
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 |
5701 | msgid "%sPeer `%s'\n" | 5826 | msgid "%sPeer `%s'\n" |
@@ -5785,6 +5910,65 @@ msgstr "Cargando el módulo de transporte «%s»\n" | |||
5785 | msgid "Failed to load transport plugin for `%s'\n" | 5910 | msgid "Failed to load transport plugin for `%s'\n" |
5786 | msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n" | 5911 | msgstr "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 | ||
5915 | msgid "Removing expired address of transport `%s'\n" | ||
5916 | msgstr "Eliminando dirección de transporte «%s»\n" | ||
5917 | |||
5918 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5919 | #, fuzzy, c-format | ||
5920 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5921 | msgstr "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 | ||
5926 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5927 | msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n" | ||
5928 | |||
5929 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5930 | msgid "# peers known" | ||
5931 | msgstr "# pares conocidos" | ||
5932 | |||
5933 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5934 | #, c-format | ||
5935 | msgid "" | ||
5936 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5937 | msgstr "" | ||
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 | ||
5943 | msgid "Scanning directory `%s'\n" | ||
5944 | msgstr "Escaneando directorio «%s».\n" | ||
5945 | |||
5946 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5947 | #, c-format | ||
5948 | msgid "Still no peers found in `%s'!\n" | ||
5949 | msgstr "¡Aún no se han encontrado pares en «%s»!\n" | ||
5950 | |||
5951 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5952 | #, fuzzy, c-format | ||
5953 | msgid "Cleaning up directory `%s'\n" | ||
5954 | msgstr "Escaneando directorio «%s».\n" | ||
5955 | |||
5956 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5957 | #, c-format | ||
5958 | msgid "Importing HELLOs from `%s'\n" | ||
5959 | msgstr "Importando HELLO de «%s»\n" | ||
5960 | |||
5961 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5962 | msgid "Skipping import of included HELLOs\n" | ||
5963 | msgstr "" | ||
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 | ||
5968 | msgid "Failed to receive response from `PEERINFO' service." | ||
5969 | msgstr "" | ||
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 |
5789 | msgid "peerstore" | 5973 | msgid "peerstore" |
5790 | msgstr "" | 5974 | msgstr "" |
@@ -5834,15 +6018,10 @@ msgstr "Error leyendo de «%s»: %s\n" | |||
5834 | msgid "Unable to create indices: %s.\n" | 6018 | msgid "Unable to create indices: %s.\n" |
5835 | msgstr "Se produjo un fallo al crear los Ãndices\n" | 6019 | msgstr "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 |
5839 | msgid "`%s:%s' failed at %s:%d with error: %s\n" | 6023 | msgid "PQprepare (`%s' as `%s') failed with error: %s\n" |
5840 | msgstr "«%s:%s» falló en %s:%d con error: %s" | 6024 | msgstr "«%s» para «%s» falló en %s: %d con error: %s\n" |
5841 | |||
5842 | #: src/postgres/postgres.c:192 | ||
5843 | #, fuzzy, c-format | ||
5844 | msgid "Unable to connect to Postgres database '%s': %s\n" | ||
5845 | msgstr "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 "" | |||
6019 | msgid "Daemon to announce regular expressions for the peer using cadet." | 6198 | msgid "Daemon to announce regular expressions for the peer using cadet." |
6020 | msgstr "Demonio para anunciar expresiones regulares para el par usando mesh." | 6199 | msgstr "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 |
6023 | msgid "No configuration file given. Exiting\n" | 6202 | msgid "No configuration file given. Exiting\n" |
6024 | msgstr "No se ha introducido ningún fichero de configuración. Saliendo\n" | 6203 | msgstr "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 |
6029 | msgid "No policy directory specified on command line. Exiting.\n" | 6208 | msgid "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 |
6037 | msgid "Specified policies directory does not exist. Exiting.\n" | 6216 | msgid "Specified policies directory does not exist. Exiting.\n" |
6038 | msgstr "Las polÃticas de directorio especificadas no existen. Saliendo.\n" | 6217 | msgstr "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 |
6042 | msgid "No files found in `%s'\n" | 6221 | msgid "No files found in `%s'\n" |
6043 | msgstr "No se han encontrado ficheros en «%s»\n" | 6222 | msgstr "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 |
6046 | msgid "No search strings file given. Exiting.\n" | 6225 | msgid "No search strings file given. Exiting.\n" |
6047 | msgstr "No se ha proporcionado un fichero de cadenas de búsqueda. Saliendo.\n" | 6226 | msgstr "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 |
6050 | msgid "Error loading search strings. Exiting.\n" | 6229 | msgid "Error loading search strings. Exiting.\n" |
6051 | msgstr "Error cargando cadenas de búsqueda. Saliendo.\n" | 6230 | msgstr "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 |
6054 | msgid "name of the file for writing statistics" | 6233 | msgid "name of the file for writing statistics" |
6055 | msgstr "nombre del fichero para escribir las estadÃsticas" | 6234 | msgstr "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 |
6059 | msgid "wait TIMEOUT before ending the experiment" | 6238 | msgid "wait TIMEOUT before ending the experiment" |
6060 | msgstr "" | 6239 | msgstr "" |
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 |
6065 | msgid "directory with policy files" | 6244 | msgid "directory with policy files" |
6066 | msgstr "" | 6245 | msgstr "" |
6067 | 6246 | ||
6068 | #: src/regex/gnunet-regex-profiler.c:1504 | 6247 | #: src/regex/gnunet-regex-profiler.c:1576 |
6069 | #, fuzzy | 6248 | #, fuzzy |
6070 | msgid "name of file with input strings" | 6249 | msgid "name of file with input strings" |
6071 | msgstr "nombre del fichero para escribir las estadÃsticas" | 6250 | msgstr "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 |
6075 | msgid "name of file with hosts' names" | 6254 | msgid "name of file with hosts' names" |
6076 | msgstr "nombre del fichero para escribir las estadÃsticas" | 6255 | msgstr "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 |
6079 | msgid "Profiler for regex" | 6258 | msgid "Profiler for regex" |
6080 | msgstr "Perfilador para expresiones regulares." | 6259 | msgstr "Perfilador para expresiones regulares." |
6081 | 6260 | ||
@@ -6312,10 +6491,10 @@ msgstr "" | |||
6312 | msgid "Calculate the Vectorproduct with a GNUnet peer." | 6491 | msgid "Calculate the Vectorproduct with a GNUnet peer." |
6313 | msgstr "" | 6492 | msgstr "" |
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 |
6320 | msgid "Connect to CADET failed\n" | 6499 | msgid "Connect to CADET failed\n" |
6321 | msgstr "Conexión fallida (¿bug?)\n" | 6500 | msgstr "Conexión fallida (¿bug?)\n" |
@@ -6340,7 +6519,7 @@ msgstr "" | |||
6340 | msgid "also profile decryption" | 6519 | msgid "also profile decryption" |
6341 | msgstr "" | 6520 | msgstr "" |
6342 | 6521 | ||
6343 | #: src/set/gnunet-service-set.c:1948 | 6522 | #: src/set/gnunet-service-set.c:1989 |
6344 | #, fuzzy | 6523 | #, fuzzy |
6345 | msgid "Could not connect to CADET service\n" | 6524 | msgid "Could not connect to CADET service\n" |
6346 | msgstr "¡No se pudo conectar al servicio %s!\n" | 6525 | msgstr "¡No se pudo conectar al servicio %s!\n" |
@@ -6401,116 +6580,116 @@ msgstr "" | |||
6401 | msgid "say good-bye and leave somebody else's place" | 6580 | msgid "say good-bye and leave somebody else's place" |
6402 | msgstr "" | 6581 | msgstr "" |
6403 | 6582 | ||
6404 | #: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 | 6583 | #: src/social/gnunet-social.c:1227 |
6405 | msgid "create a place" | 6584 | msgid "create a place" |
6406 | msgstr "" | 6585 | msgstr "" |
6407 | 6586 | ||
6408 | #: src/social/gnunet-social.c:1237 | 6587 | #: src/social/gnunet-social.c:1232 |
6409 | msgid "destroy a place we were hosting" | 6588 | msgid "destroy a place we were hosting" |
6410 | msgstr "" | 6589 | msgstr "" |
6411 | 6590 | ||
6412 | #: src/social/gnunet-social.c:1242 | 6591 | #: src/social/gnunet-social.c:1237 |
6413 | msgid "enter somebody else's place" | 6592 | msgid "enter somebody else's place" |
6414 | msgstr "" | 6593 | msgstr "" |
6415 | 6594 | ||
6416 | #: src/social/gnunet-social.c:1248 | 6595 | #: src/social/gnunet-social.c:1243 |
6417 | msgid "find state matching name prefix" | 6596 | msgid "find state matching name prefix" |
6418 | msgstr "" | 6597 | msgstr "" |
6419 | 6598 | ||
6420 | #: src/social/gnunet-social.c:1253 | 6599 | #: src/social/gnunet-social.c:1248 |
6421 | msgid "replay history of messages up to the given --limit" | 6600 | msgid "replay history of messages up to the given --limit" |
6422 | msgstr "" | 6601 | msgstr "" |
6423 | 6602 | ||
6424 | #: src/social/gnunet-social.c:1258 | 6603 | #: src/social/gnunet-social.c:1253 |
6425 | msgid "reconnect to a previously created place" | 6604 | msgid "reconnect to a previously created place" |
6426 | msgstr "" | 6605 | msgstr "" |
6427 | 6606 | ||
6428 | #: src/social/gnunet-social.c:1263 | 6607 | #: src/social/gnunet-social.c:1258 |
6429 | msgid "publish something to a place we are hosting" | 6608 | msgid "publish something to a place we are hosting" |
6430 | msgstr "" | 6609 | msgstr "" |
6431 | 6610 | ||
6432 | #: src/social/gnunet-social.c:1268 | 6611 | #: src/social/gnunet-social.c:1263 |
6433 | msgid "reconnect to a previously entered place" | 6612 | msgid "reconnect to a previously entered place" |
6434 | msgstr "" | 6613 | msgstr "" |
6435 | 6614 | ||
6436 | #: src/social/gnunet-social.c:1273 | 6615 | #: src/social/gnunet-social.c:1268 |
6437 | msgid "search for state matching exact name" | 6616 | msgid "search for state matching exact name" |
6438 | msgstr "" | 6617 | msgstr "" |
6439 | 6618 | ||
6440 | #: src/social/gnunet-social.c:1278 | 6619 | #: src/social/gnunet-social.c:1273 |
6441 | msgid "submit something to somebody's place" | 6620 | msgid "submit something to somebody's place" |
6442 | msgstr "" | 6621 | msgstr "" |
6443 | 6622 | ||
6444 | #: src/social/gnunet-social.c:1283 | 6623 | #: src/social/gnunet-social.c:1278 |
6445 | msgid "list of egos and subscribed places" | 6624 | msgid "list of egos and subscribed places" |
6446 | msgstr "" | 6625 | msgstr "" |
6447 | 6626 | ||
6448 | #: src/social/gnunet-social.c:1288 | 6627 | #: src/social/gnunet-social.c:1283 |
6449 | msgid "extract and replay history between message IDs --start and --until" | 6628 | msgid "extract and replay history between message IDs --start and --until" |
6450 | msgstr "" | 6629 | msgstr "" |
6451 | 6630 | ||
6452 | #: src/social/gnunet-social.c:1297 | 6631 | #: src/social/gnunet-social.c:1292 |
6453 | msgid "application ID to use when connecting" | 6632 | msgid "application ID to use when connecting" |
6454 | msgstr "" | 6633 | msgstr "" |
6455 | 6634 | ||
6456 | #: src/social/gnunet-social.c:1303 | 6635 | #: src/social/gnunet-social.c:1298 |
6457 | msgid "message body or state value" | 6636 | msgid "message body or state value" |
6458 | msgstr "" | 6637 | msgstr "" |
6459 | 6638 | ||
6460 | #: src/social/gnunet-social.c:1309 | 6639 | #: src/social/gnunet-social.c:1304 |
6461 | #, fuzzy | 6640 | #, fuzzy |
6462 | msgid "name or public key of ego" | 6641 | msgid "name or public key of ego" |
6463 | msgstr "Parámetro no válido «%s»\n" | 6642 | msgstr "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 |
6467 | msgid "wait for incoming messages" | 6646 | msgid "wait for incoming messages" |
6468 | msgstr "Falló al entregar el mensaje '%s'.\n" | 6647 | msgstr "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 |
6472 | msgid "GNS name" | 6651 | msgid "GNS name" |
6473 | msgstr "Mostrar el _nombre" | 6652 | msgstr "Mostrar el _nombre" |
6474 | 6653 | ||
6475 | #: src/social/gnunet-social.c:1326 | 6654 | #: src/social/gnunet-social.c:1321 |
6476 | msgid "peer ID for --guest-enter" | 6655 | msgid "peer ID for --guest-enter" |
6477 | msgstr "" | 6656 | msgstr "" |
6478 | 6657 | ||
6479 | #: src/social/gnunet-social.c:1332 | 6658 | #: src/social/gnunet-social.c:1327 |
6480 | msgid "name (key) to query from state" | 6659 | msgid "name (key) to query from state" |
6481 | msgstr "" | 6660 | msgstr "" |
6482 | 6661 | ||
6483 | #: src/social/gnunet-social.c:1338 | 6662 | #: src/social/gnunet-social.c:1333 |
6484 | #, fuzzy | 6663 | #, fuzzy |
6485 | msgid "method name" | 6664 | msgid "method name" |
6486 | msgstr "Mostrar el _nombre" | 6665 | msgstr "Mostrar el _nombre" |
6487 | 6666 | ||
6488 | #: src/social/gnunet-social.c:1344 | 6667 | #: src/social/gnunet-social.c:1339 |
6489 | #, fuzzy | 6668 | #, fuzzy |
6490 | msgid "number of messages to replay from history" | 6669 | msgid "number of messages to replay from history" |
6491 | msgstr "número de mensajes a usar por iteración" | 6670 | msgstr "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 |
6494 | msgid "key address of place" | 6673 | msgid "key address of place" |
6495 | msgstr "" | 6674 | msgstr "" |
6496 | 6675 | ||
6497 | #: src/social/gnunet-social.c:1356 | 6676 | #: src/social/gnunet-social.c:1351 |
6498 | msgid "start message ID for history replay" | 6677 | msgid "start message ID for history replay" |
6499 | msgstr "" | 6678 | msgstr "" |
6500 | 6679 | ||
6501 | #: src/social/gnunet-social.c:1361 | 6680 | #: src/social/gnunet-social.c:1356 |
6502 | msgid "respond to entry requests by admitting all guests" | 6681 | msgid "respond to entry requests by admitting all guests" |
6503 | msgstr "" | 6682 | msgstr "" |
6504 | 6683 | ||
6505 | #: src/social/gnunet-social.c:1367 | 6684 | #: src/social/gnunet-social.c:1362 |
6506 | msgid "end message ID for history replay" | 6685 | msgid "end message ID for history replay" |
6507 | msgstr "" | 6686 | msgstr "" |
6508 | 6687 | ||
6509 | #: src/social/gnunet-social.c:1372 | 6688 | #: src/social/gnunet-social.c:1367 |
6510 | msgid "respond to entry requests by refusing all guests" | 6689 | msgid "respond to entry requests by refusing all guests" |
6511 | msgstr "" | 6690 | msgstr "" |
6512 | 6691 | ||
6513 | #: src/social/gnunet-social.c:1382 | 6692 | #: src/social/gnunet-social.c:1377 |
6514 | msgid "" | 6693 | msgid "" |
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 "" | |||
6703 | msgstr "" | 6882 | msgstr "" |
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 |
6708 | msgid "Incorrect hostkey file format: %s\n" | 6887 | msgid "Incorrect hostkey file format: %s\n" |
6709 | msgstr "El fichero de máquinas no tiene el formato correcto: %s\n" | 6888 | msgstr "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" | |||
6777 | msgid "%.s Unknown result code." | 6956 | msgid "%.s Unknown result code." |
6778 | msgstr "Código de respuesta del ARM desconocido.\n" | 6957 | msgstr "Código de respuesta del ARM desconocido.\n" |
6779 | 6958 | ||
6780 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6781 | #, fuzzy | ||
6782 | msgid "Waiting for child to exit.\n" | ||
6783 | msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n" | ||
6784 | |||
6785 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6786 | #, fuzzy, c-format | ||
6787 | msgid "Spawning process `%s'\n" | ||
6788 | msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n" | ||
6789 | |||
6790 | #: src/testbed/gnunet-testbed-profiler.c:290 | 6959 | #: src/testbed/gnunet-testbed-profiler.c:290 |
6791 | msgid "tolerate COUNT number of continious timeout failures" | 6960 | msgid "tolerate COUNT number of continious timeout failures" |
6792 | msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo" | 6961 | msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo" |
@@ -6798,6 +6967,16 @@ msgid "" | |||
6798 | "signal is received" | 6967 | "signal is received" |
6799 | msgstr "" | 6968 | msgstr "" |
6800 | 6969 | ||
6970 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6971 | #, fuzzy | ||
6972 | msgid "Waiting for child to exit.\n" | ||
6973 | msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n" | ||
6974 | |||
6975 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6976 | #, fuzzy, c-format | ||
6977 | msgid "Spawning process `%s'\n" | ||
6978 | msgstr "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 |
6803 | msgid "Adding host %u failed with error: %s\n" | 6982 | msgid "Adding host %u failed with error: %s\n" |
@@ -7118,10 +7297,6 @@ msgstr "# mensajes «HELLO» recibidos" | |||
7118 | msgid "GNUnet topology control" | 7297 | msgid "GNUnet topology control" |
7119 | msgstr "" | 7298 | msgstr "" |
7120 | 7299 | ||
7121 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
7122 | msgid "# Addresses given to ATS" | ||
7123 | msgstr "" | ||
7124 | |||
7125 | #: src/transport/gnunet-service-transport.c:448 | 7300 | #: src/transport/gnunet-service-transport.c:448 |
7126 | msgid "# messages dropped due to slow client" | 7301 | msgid "# messages dropped due to slow client" |
7127 | msgstr "# mensajes omitidos debido a un cliente lento" | 7302 | msgstr "# 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 | ||
7349 | msgid "# Addresses given to ATS" | ||
7350 | msgstr "" | ||
7351 | |||
7173 | #: src/transport/gnunet-service-transport_hello.c:195 | 7352 | #: src/transport/gnunet-service-transport_hello.c:195 |
7174 | msgid "# refreshed my HELLO" | 7353 | msgid "# refreshed my HELLO" |
7175 | msgstr "# refrescos de mi «HELLO»" | 7354 | msgstr "# refrescos de mi «HELLO»" |
@@ -7506,6 +7685,45 @@ msgstr "# Mensajes PONG omitidos, firma expirada" | |||
7506 | msgid "# validations succeeded" | 7685 | msgid "# validations succeeded" |
7507 | msgstr "# revalidaciones de direcciones iniciadas" | 7686 | msgstr "# revalidaciones de direcciones iniciadas" |
7508 | 7687 | ||
7688 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7689 | #, c-format | ||
7690 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7691 | msgstr "" | ||
7692 | |||
7693 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7694 | msgid "send data to peer" | ||
7695 | msgstr "" | ||
7696 | |||
7697 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7698 | #, fuzzy | ||
7699 | msgid "receive data from peer" | ||
7700 | msgstr "# respuestas recibidas de otros pares" | ||
7701 | |||
7702 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7703 | #, fuzzy | ||
7704 | msgid "iterations" | ||
7705 | msgstr "Otras configuraciones" | ||
7706 | |||
7707 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7708 | #, fuzzy | ||
7709 | msgid "number of messages to send" | ||
7710 | msgstr "número de mensajes a usar por iteración" | ||
7711 | |||
7712 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7713 | #, fuzzy | ||
7714 | msgid "message size to use" | ||
7715 | msgstr "tamaño del mensaje" | ||
7716 | |||
7717 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7718 | #: src/transport/gnunet-transport.c:1462 | ||
7719 | msgid "peer identity" | ||
7720 | msgstr "identidad del par" | ||
7721 | |||
7722 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7723 | #: src/transport/gnunet-transport.c:1482 | ||
7724 | msgid "Direct access to transport service." | ||
7725 | msgstr "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 |
7511 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" | 7729 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" |
@@ -7649,11 +7867,6 @@ msgstr "" | |||
7649 | msgid "do not resolve hostnames" | 7867 | msgid "do not resolve hostnames" |
7650 | msgstr "no resolver nombres de máquinas" | 7868 | msgstr "no resolver nombres de máquinas" |
7651 | 7869 | ||
7652 | #: src/transport/gnunet-transport.c:1462 | ||
7653 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7654 | msgid "peer identity" | ||
7655 | msgstr "identidad del par" | ||
7656 | |||
7657 | #: src/transport/gnunet-transport.c:1466 | 7870 | #: src/transport/gnunet-transport.c:1466 |
7658 | #, fuzzy | 7871 | #, fuzzy |
7659 | msgid "monitor plugin sessions" | 7872 | msgid "monitor plugin sessions" |
@@ -7663,43 +7876,9 @@ msgstr "# sesiones wlan pendientes" | |||
7663 | msgid "send data for benchmarking to the other peer (until CTRL-C)" | 7876 | msgid "send data for benchmarking to the other peer (until CTRL-C)" |
7664 | msgstr "enviar data para prueba a otro par (hasta CTRL-C)" | 7877 | msgstr "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 | ||
7668 | msgid "Direct access to transport service." | ||
7669 | msgstr "Acceso directo al servicio de transporte." | ||
7670 | |||
7671 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7672 | #, c-format | ||
7673 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7674 | msgstr "" | ||
7675 | |||
7676 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7677 | msgid "send data to peer" | ||
7678 | msgstr "" | ||
7679 | |||
7680 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7681 | #, fuzzy | ||
7682 | msgid "receive data from peer" | ||
7683 | msgstr "# respuestas recibidas de otros pares" | ||
7684 | |||
7685 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7686 | #, fuzzy | ||
7687 | msgid "iterations" | ||
7688 | msgstr "Otras configuraciones" | ||
7689 | |||
7690 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7691 | #, fuzzy | ||
7692 | msgid "number of messages to send" | ||
7693 | msgstr "número de mensajes a usar por iteración" | ||
7694 | |||
7695 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7696 | #, fuzzy | ||
7697 | msgid "message size to use" | ||
7698 | msgstr "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 |
7705 | msgid "TCP_STEALTH not supported on this platform.\n" | 7884 | msgid "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 |
7718 | msgid "Shutting down plugin `%s'\n" | 7897 | msgid "Shutting down plugin `%s'\n" |
7719 | msgstr "Finalizando el módulo «%s»\n" | 7898 | msgstr "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 |
7724 | msgid "Shutdown for plugin `%s' complete\n" | 7903 | msgid "Shutdown for plugin `%s' complete\n" |
7725 | msgstr "Finalización del módulo «%s» completa\n" | 7904 | msgstr "Finalización del módulo «%s» completa\n" |
@@ -7729,7 +7908,7 @@ msgstr "Finalización del módulo «%s» completa\n" | |||
7729 | msgid "Maximum number of requests is %u\n" | 7908 | msgid "Maximum number of requests is %u\n" |
7730 | msgstr "El número máximo de conexiones es %u\n" | 7909 | msgstr "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 |
7734 | msgid "" | 7913 | msgid "" |
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 |
7743 | msgid "Accepting connection (%u of %u) from `%s'\n" | 7922 | msgid "Accepting connection (%u of %u) from `%s'\n" |
7744 | msgstr "Aceptando conexión (%u de %u) desde «%s»\n" | 7923 | msgstr "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 |
7748 | msgid "" | 7927 | msgid "" |
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 |
7755 | msgid "" | 7934 | msgid "" |
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 |
7764 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" | 7943 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" |
7765 | msgstr "" | 7944 | msgstr "" |
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 |
7770 | msgid "Could not load or create server certificate! Loading plugin failed!\n" | 7949 | msgid "Could not load or create server certificate! Loading plugin failed!\n" |
7771 | msgstr "" | 7950 | msgstr "" |
7772 | 7951 | ||
7773 | #: src/transport/plugin_transport_http_server.c:2587 | 7952 | #: src/transport/plugin_transport_http_server.c:2650 |
7774 | msgid "Require valid port number for service in configuration!\n" | 7953 | msgid "Require valid port number for service in configuration!\n" |
7775 | msgstr "¡Se necesita un puerto válido para el servicio en la configuración!\n" | 7954 | msgstr "¡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 |
7779 | msgid "Found %u addresses to report to NAT service\n" | 7958 | msgid "Found %u addresses to report to NAT service\n" |
7780 | msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n" | 7959 | msgstr "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 |
7784 | msgid "Disabling IPv6 since it is not supported on this system!\n" | 7963 | msgid "Disabling IPv6 since it is not supported on this system!\n" |
7785 | msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n" | 7964 | msgstr "¡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 |
7789 | msgid "IPv4 support is %s\n" | 7968 | msgid "IPv4 support is %s\n" |
7790 | msgstr "El soporte IPv4 es %s\n" | 7969 | msgstr "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 |
7794 | msgid "IPv6 support is %s\n" | 7973 | msgid "IPv6 support is %s\n" |
7795 | msgstr "El soporte IPv6 es %s\n" | 7974 | msgstr "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 |
7798 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" | 7977 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" |
7799 | msgstr "¡Ni IPv4 ni IPv6 están habilitadas! Corrija la configuración\n" | 7978 | msgstr "¡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 |
7802 | msgid "Port is required! Fix in configuration\n" | 7981 | msgid "Port is required! Fix in configuration\n" |
7803 | msgstr "¡El puerto es necesario! Corrija la configuración\n" | 7982 | msgstr "¡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 |
7807 | msgid "Using port %u\n" | 7986 | msgid "Using port %u\n" |
7808 | msgstr "Usando puerto %u\n" | 7987 | msgstr "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 |
7812 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" | 7991 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" |
7813 | msgstr "" | 7992 | msgstr "" |
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 |
7819 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" | 7998 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" |
7820 | msgstr "" | 7999 | msgstr "" |
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 |
7826 | msgid "Using external hostname `%s'\n" | 8005 | msgid "Using external hostname `%s'\n" |
7827 | msgstr "Usando nombre de máquina externo «%s»\n" | 8006 | msgstr "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 |
7831 | msgid "Notifying transport only about hostname `%s'\n" | 8010 | msgid "Notifying transport only about hostname `%s'\n" |
7832 | msgstr "Notificando al transporte sólo el nombre de máquina «%s»\n" | 8011 | msgstr "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 |
7836 | msgid "Maximum number of connections is %u\n" | 8015 | msgid "Maximum number of connections is %u\n" |
7837 | msgstr "El número máximo de conexiones es %u\n" | 8016 | msgstr "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 |
7841 | msgid "Unable to compile URL regex\n" | 8020 | msgid "Unable to compile URL regex\n" |
7842 | msgstr "¡Imposible obtener «HELLO» del par!\n" | 8021 | msgstr "¡Imposible obtener «HELLO» del par!\n" |
@@ -7981,23 +8160,6 @@ msgstr "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n" | |||
7981 | msgid "TCP transport advertises itself as being on port %llu\n" | 8160 | msgid "TCP transport advertises itself as being on port %llu\n" |
7982 | msgstr "El transporte TCP anuncia que está en el puerto %llu\n" | 8161 | msgstr "El transporte TCP anuncia que está en el puerto %llu\n" |
7983 | 8162 | ||
7984 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7985 | #, fuzzy | ||
7986 | msgid "# Multicast HELLO beacons received via UDP" | ||
7987 | msgstr "# beacons HELLO multicast IPv6 recibidos vÃa UDP" | ||
7988 | |||
7989 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7990 | msgid "" | ||
7991 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7992 | msgstr "" | ||
7993 | |||
7994 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7995 | #, c-format | ||
7996 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7997 | msgstr "" | ||
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 |
8003 | msgid "" | 8165 | msgid "" |
@@ -8052,6 +8214,23 @@ msgstr "«%s» no es una dirección IP válida.\n" | |||
8052 | msgid "Failed to create UDP network sockets\n" | 8214 | msgid "Failed to create UDP network sockets\n" |
8053 | msgstr "Se produjo un fallo al crear una nueva firma" | 8215 | msgstr "Se produjo un fallo al crear una nueva firma" |
8054 | 8216 | ||
8217 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
8218 | #, fuzzy | ||
8219 | msgid "# Multicast HELLO beacons received via UDP" | ||
8220 | msgstr "# beacons HELLO multicast IPv6 recibidos vÃa UDP" | ||
8221 | |||
8222 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
8223 | msgid "" | ||
8224 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
8225 | msgstr "" | ||
8226 | |||
8227 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
8228 | #, c-format | ||
8229 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
8230 | msgstr "" | ||
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 |
8057 | msgid "Cannot create path to `%s'\n" | 8236 | msgid "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 |
8176 | msgid "Unknown address family %d\n" | 8355 | msgid "Unknown address family %d\n" |
8177 | msgstr "Familia de direcciones %d desconocida\n" | 8356 | msgstr "Familia de direcciones %d desconocida\n" |
@@ -8220,52 +8399,52 @@ msgstr "Se produjo un fallo al inciar «%s» en «%s»\n" | |||
8220 | msgid "Service `%s' runs at %s\n" | 8399 | msgid "Service `%s' runs at %s\n" |
8221 | msgstr "El servicio «%s» se ejecuta en %s\n" | 8400 | msgstr "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 |
8224 | msgid "Service process failed to initialize\n" | 8403 | msgid "Service process failed to initialize\n" |
8225 | msgstr "No se pudo inicializar el proceso del servicio\n" | 8404 | msgstr "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 |
8228 | msgid "Service process could not initialize server function\n" | 8407 | msgid "Service process could not initialize server function\n" |
8229 | msgstr "" | 8408 | msgstr "" |
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 |
8233 | msgid "Service process failed to report status\n" | 8412 | msgid "Service process failed to report status\n" |
8234 | msgstr "El proceso del servicio no devolvió un estado\n" | 8413 | msgstr "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 |
8239 | msgid "Cannot obtain information about user `%s': %s\n" | 8418 | msgid "Cannot obtain information about user `%s': %s\n" |
8240 | msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n" | 8419 | msgstr "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 |
8243 | msgid "No such user" | 8422 | msgid "No such user" |
8244 | msgstr "No existe tal usuario" | 8423 | msgstr "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 |
8248 | msgid "Cannot change user/group to `%s': %s\n" | 8427 | msgid "Cannot change user/group to `%s': %s\n" |
8249 | msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n" | 8428 | msgstr "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 |
8252 | msgid "do daemonize (detach from terminal)" | 8431 | msgid "do daemonize (detach from terminal)" |
8253 | msgstr "demonizar (desasociar del terminal)" | 8432 | msgstr "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 |
8258 | msgid "Malformed configuration file `%s', exit ...\n" | 8437 | msgid "Malformed configuration file `%s', exit ...\n" |
8259 | msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" | 8438 | msgstr "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 |
8264 | msgid "Malformed configuration, exit ...\n" | 8443 | msgid "Malformed configuration, exit ...\n" |
8265 | msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" | 8444 | msgstr "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 |
8270 | msgid "Could not access configuration file `%s'\n" | 8449 | msgid "Could not access configuration file `%s'\n" |
8271 | msgstr "No se pudo acceder al fichero de configuración «%s»\n" | 8450 | msgstr "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»" | |||
8309 | msgid "Need a non-empty hostname for service `%s'.\n" | 8488 | msgid "Need a non-empty hostname for service `%s'.\n" |
8310 | msgstr "Se necesita un nombre de máquina no vacÃo para el servicio «%s».\n" | 8489 | msgstr "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 |
8313 | msgid "DEBUG" | 8492 | msgid "DEBUG" |
8314 | msgstr "DEPURACIÓN" | 8493 | msgstr "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 |
8317 | msgid "INFO" | 8496 | msgid "INFO" |
8318 | msgstr "INFORMACIÓN" | 8497 | msgstr "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 |
8321 | msgid "MESSAGE" | 8500 | msgid "MESSAGE" |
8322 | msgstr "MENSAJE" | 8501 | msgstr "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 |
8325 | msgid "WARNING" | 8504 | msgid "WARNING" |
8326 | msgstr "PELIGRO" | 8505 | msgstr "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 |
8329 | msgid "ERROR" | 8508 | msgid "ERROR" |
8330 | msgstr "ERROR" | 8509 | msgstr "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 |
8333 | msgid "NONE" | 8512 | msgid "NONE" |
8334 | msgstr "NINGUNO" | 8513 | msgstr "NINGUNO" |
8335 | 8514 | ||
8336 | #: src/util/common_logging.c:879 | 8515 | #: src/util/common_logging.c:882 |
8337 | #, c-format | 8516 | #, c-format |
8338 | msgid "Message `%.*s' repeated %u times in the last %s\n" | 8517 | msgid "Message `%.*s' repeated %u times in the last %s\n" |
8339 | msgstr "Mensaje `%.*s» repetido %u veces en el último %s\n" | 8518 | msgstr "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 |
8342 | msgid "INVALID" | 8521 | msgid "INVALID" |
8343 | msgstr "NO VÃLIDO" | 8522 | msgstr "NO VÃLIDO" |
8344 | 8523 | ||
8345 | #: src/util/common_logging.c:1302 | 8524 | #: src/util/common_logging.c:1326 |
8346 | msgid "unknown address" | 8525 | msgid "unknown address" |
8347 | msgstr "dirección desconocida" | 8526 | msgstr "dirección desconocida" |
8348 | 8527 | ||
8349 | #: src/util/common_logging.c:1344 | 8528 | #: src/util/common_logging.c:1368 |
8350 | msgid "invalid address" | 8529 | msgid "invalid address" |
8351 | msgstr "dirección no válida" | 8530 | msgstr "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 |
8355 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" | 8534 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" |
8356 | msgstr "¡La configuración no especifica la opción «%s» en la sección «%s»!\n" | 8535 | msgstr "¡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 |
8360 | msgid "" | 8539 | msgid "" |
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 |
8368 | msgid "Syntax error while deserializing in line %u\n" | 8547 | msgid "Syntax error while deserializing in line %u\n" |
8369 | msgstr "Error de sintaxis en la lÃnea %u mientras se deserializaba\n" | 8548 | msgstr "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 |
8373 | msgid "Error while reading file `%s'\n" | 8552 | msgid "Error while reading file `%s'\n" |
8374 | msgstr "Error decodificando clave %u\n" | 8553 | msgstr "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 |
8378 | msgid "" | 8557 | msgid "" |
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 |
8387 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" | 8566 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" |
8388 | msgstr "" | 8567 | msgstr "" |
8389 | 8568 | ||
8390 | #: src/util/configuration.c:1169 | 8569 | #: src/util/configuration.c:1186 |
8391 | #, fuzzy, c-format | 8570 | #, fuzzy, c-format |
8392 | msgid "Missing closing `%s' in option `%s'\n" | 8571 | msgid "Missing closing `%s' in option `%s'\n" |
8393 | msgstr "Falta la opción «%s» para la operación «%s»\n" | 8572 | msgstr "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 |
8397 | msgid "" | 8576 | msgid "" |
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" | |||
8428 | msgid "EdDSA signature verification failed at %s:%d: %s\n" | 8607 | msgid "EdDSA signature verification failed at %s:%d: %s\n" |
8429 | msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n" | 8608 | msgstr "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 |
8434 | msgid "Could not acquire lock on file `%s': %s...\n" | 8613 | msgid "Could not acquire lock on file `%s': %s...\n" |
8435 | msgstr "No se pudo bloquear el fichero «%s»: %s...\n" | 8614 | msgstr "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 |
8438 | msgid "Creating a new private key. This may take a while.\n" | 8617 | msgid "Creating a new private key. This may take a while.\n" |
8439 | msgstr "Generando una clave privada nueva. Esto puede tomar un tiempo.\n" | 8618 | msgstr "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 |
8442 | msgid "This may be ok if someone is currently generating a private key.\n" | 8621 | msgid "This may be ok if someone is currently generating a private key.\n" |
8443 | msgstr "" | 8622 | msgstr "" |
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 |
8449 | msgid "" | 8628 | msgid "" |
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 |
8456 | msgid "This may be ok if someone is currently generating a key.\n" | 8635 | msgid "This may be ok if someone is currently generating a key.\n" |
8457 | msgstr "" | 8636 | msgstr "" |
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 |
8463 | msgid "Could not load peer's private key\n" | 8642 | msgid "Could not load peer's private key\n" |
8464 | msgstr "No se pudo acceder a la clave de máquina.\n" | 8643 | msgstr "No se pudo acceder a la clave de máquina.\n" |
@@ -8651,22 +8830,22 @@ msgstr "" | |||
8651 | msgid "Manipulate GNUnet configuration files" | 8830 | msgid "Manipulate GNUnet configuration files" |
8652 | msgstr "Manipular ficheros de configuración de GNUnet" | 8831 | msgstr "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 |
8656 | msgid "Failed to open `%s': %s\n" | 8835 | msgid "Failed to open `%s': %s\n" |
8657 | msgstr "Se produjo un fallo al abrir «%s»: %s\n" | 8836 | msgstr "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 |
8661 | msgid "Generating %u keys like %s, please wait" | 8840 | msgid "Generating %u keys like %s, please wait" |
8662 | msgstr "Generando %u claves, por favor, espere" | 8841 | msgstr "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 |
8666 | msgid "Generating %u keys, please wait" | 8845 | msgid "Generating %u keys, please wait" |
8667 | msgstr "Generando %u claves, por favor, espere" | 8846 | msgstr "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 |
8671 | msgid "" | 8850 | msgid "" |
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 |
8680 | msgid "" | 8859 | msgid "" |
8681 | "\n" | 8860 | "\n" |
8682 | "Finished!\n" | 8861 | "Finished!\n" |
8683 | msgstr "¡Finalizado!\n" | 8862 | msgstr "¡Finalizado!\n" |
8684 | 8863 | ||
8685 | #: src/util/gnunet-ecc.c:187 | 8864 | #: src/util/gnunet-ecc.c:192 |
8686 | #, c-format | 8865 | #, c-format |
8687 | msgid "" | 8866 | msgid "" |
8688 | "\n" | 8867 | "\n" |
8689 | "Error, %u keys not generated\n" | 8868 | "Error, %u keys not generated\n" |
8690 | msgstr "" | 8869 | msgstr "" |
8691 | 8870 | ||
8692 | #: src/util/gnunet-ecc.c:280 | 8871 | #: src/util/gnunet-ecc.c:283 |
8693 | #, fuzzy, c-format | 8872 | #, fuzzy, c-format |
8694 | msgid "Hostkeys file `%s' not found\n" | 8873 | msgid "Hostkeys file `%s' not found\n" |
8695 | msgstr "El fichero de máquinas %s no fue encontrado\n" | 8874 | msgstr "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 |
8699 | msgid "Hostkeys file `%s' is empty\n" | 8878 | msgid "Hostkeys file `%s' is empty\n" |
8700 | msgstr "El archivo de amigos «%s» está vacÃo.\n" | 8879 | msgstr "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 |
8704 | msgid "Could not read hostkey file: %s\n" | 8883 | msgid "Could not read hostkey file: %s\n" |
8705 | msgstr "¡No se puede leer el fichero de claves de máquina!\n" | 8884 | msgstr "¡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 |
8708 | msgid "No hostkey file specified on command line\n" | 8887 | msgid "No hostkey file specified on command line\n" |
8709 | msgstr "No se ha especificado la clave de máquina en la lÃnea de comandos\n" | 8888 | msgstr "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 |
8712 | msgid "list keys included in a file (for testing)" | 8891 | msgid "list keys included in a file (for testing)" |
8713 | msgstr "" | 8892 | msgstr "" |
8714 | 8893 | ||
8715 | #: src/util/gnunet-ecc.c:421 | 8894 | #: src/util/gnunet-ecc.c:430 |
8716 | msgid "number of keys to list included in a file (for testing)" | 8895 | msgid "number of keys to list included in a file (for testing)" |
8717 | msgstr "" | 8896 | msgstr "" |
8718 | 8897 | ||
8719 | #: src/util/gnunet-ecc.c:426 | 8898 | #: src/util/gnunet-ecc.c:435 |
8720 | msgid "create COUNT public-private key pairs (for testing)" | 8899 | msgid "create COUNT public-private key pairs (for testing)" |
8721 | msgstr "crea «COUNT» pares de claves pública-privada (para pruebas)" | 8900 | msgstr "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 |
8724 | msgid "print the public key in ASCII format" | 8903 | msgid "print the public key in ASCII format" |
8725 | msgstr "imprime la clave pública en formato ASCII" | 8904 | msgstr "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 | ||
8908 | msgid "print the public key in HEX format" | ||
8909 | msgstr "imprime la clave pública en formato ASCII" | ||
8910 | |||
8911 | #: src/util/gnunet-ecc.c:447 | ||
8728 | msgid "print examples of ECC operations (used for compatibility testing)" | 8912 | msgid "print examples of ECC operations (used for compatibility testing)" |
8729 | msgstr "" | 8913 | msgstr "" |
8730 | 8914 | ||
8731 | #: src/util/gnunet-ecc.c:449 | 8915 | #: src/util/gnunet-ecc.c:463 |
8732 | msgid "Manipulate GNUnet private ECC key files" | 8916 | msgid "Manipulate GNUnet private ECC key files" |
8733 | msgstr "Manipular los ficheros de clave privada ECC de GNUnet" | 8917 | msgstr "Manipular los ficheros de clave privada ECC de GNUnet" |
8734 | 8918 | ||
@@ -8823,7 +9007,7 @@ msgstr "Error escribiendo a «%s»: %s\n" | |||
8823 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" | 9007 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" |
8824 | msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n" | 9008 | msgstr "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 |
8828 | msgid "" | 9012 | msgid "" |
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" | |||
8879 | msgid "Could not determine plugin installation path.\n" | 9063 | msgid "Could not determine plugin installation path.\n" |
8880 | msgstr "No se pudo determinar la ruta de instalación de los módulos.\n" | 9064 | msgstr "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 |
8884 | msgid "" | 9068 | msgid "" |
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 |
8899 | msgid "Timeout trying to resolve hostname `%s'.\n" | 9083 | msgid "Timeout trying to resolve hostname `%s'.\n" |
8900 | msgstr "Expiración de plazo intentando resolver el nombre de máquina «%s».\n" | 9084 | msgstr "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 |
8904 | msgid "Timeout trying to resolve IP address `%s'.\n" | 9088 | msgid "Timeout trying to resolve IP address `%s'.\n" |
8905 | msgstr "Expiración de plazo intentando resolver la dirección IP «%s».\n" | 9089 | msgstr "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 |
8912 | msgid "Resolver not configured correctly.\n" | 9096 | msgid "Resolver not configured correctly.\n" |
8913 | msgstr "¡El servicio predeterminado «%s» no está configurado correctamente!\n" | 9097 | msgstr "¡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 |
8918 | msgid "Could not resolve our FQDN: %s\n" | 9102 | msgid "Could not resolve our FQDN: %s\n" |
8919 | msgstr "" | 9103 | msgstr "" |
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 |
8923 | msgid "" | 9107 | msgid "" |
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" |
8925 | msgstr "" | 9109 | msgstr "" |
8926 | 9110 | ||
8927 | #: src/util/service.c:2082 | 9111 | #: src/util/service.c:2081 |
8928 | #, fuzzy, c-format | 9112 | #, fuzzy, c-format |
8929 | msgid "" | 9113 | msgid "" |
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" | |||
9003 | msgid "end of time" | 9187 | msgid "end of time" |
9004 | msgstr "fin del plazo" | 9188 | msgstr "fin del plazo" |
9005 | 9189 | ||
9006 | #: src/util/strings.c:1269 | 9190 | #: src/util/strings.c:1270 |
9007 | msgid "IPv6 address did not start with `['\n" | 9191 | msgid "IPv6 address did not start with `['\n" |
9008 | msgstr "La dirección IPv6 no empezaba con «[»\n" | 9192 | msgstr "La dirección IPv6 no empezaba con «[»\n" |
9009 | 9193 | ||
9010 | #: src/util/strings.c:1277 | 9194 | #: src/util/strings.c:1278 |
9011 | msgid "IPv6 address did contain ':' to separate port number\n" | 9195 | msgid "IPv6 address did contain ':' to separate port number\n" |
9012 | msgstr "La dirección IPv6 contenÃa «:» para separar el número de puerto\n" | 9196 | msgstr "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 |
9015 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" | 9199 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" |
9016 | msgstr "" | 9200 | msgstr "" |
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 |
9021 | msgid "IPv6 address did contain a valid port number after the last ':'\n" | 9205 | msgid "IPv6 address did contain a valid port number after the last ':'\n" |
9022 | msgstr "" | 9206 | msgstr "" |
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 |
9028 | msgid "Invalid IPv6 address `%s': %s\n" | 9212 | msgid "Invalid IPv6 address `%s': %s\n" |
9029 | msgstr "Dirección IPv6 «%s» no válida: %s\n" | 9213 | msgstr "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 |
9032 | msgid "Port not in range\n" | 9216 | msgid "Port not in range\n" |
9033 | msgstr "" | 9217 | msgstr "" |
9034 | 9218 | ||
9035 | #: src/util/strings.c:1596 | 9219 | #: src/util/strings.c:1597 |
9036 | #, fuzzy, c-format | 9220 | #, fuzzy, c-format |
9037 | msgid "Malformed port policy `%s'\n" | 9221 | msgid "Malformed port policy `%s'\n" |
9038 | msgstr "Se produjo un fallo al iniciar el servicio «%s»\n" | 9222 | msgstr "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 |
9043 | msgid "Invalid format for IP: `%s'\n" | 9227 | msgid "Invalid format for IP: `%s'\n" |
9044 | msgstr "Formato no válido para la IP: «%s»\n" | 9228 | msgstr "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 |
9048 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." | 9232 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." |
9049 | msgstr "Notación de red no válida («/%d» no es válido en IPv4 CIDR)." | 9233 | msgstr "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 |
9053 | msgid "Invalid format: `%s'\n" | 9237 | msgid "Invalid format: `%s'\n" |
9054 | msgstr "Formato de tiempo no válido «%s»\n" | 9238 | msgstr "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 |
9058 | msgid "Invalid network notation (does not end with ';': `%s')\n" | 9242 | msgid "Invalid network notation (does not end with ';': `%s')\n" |
9059 | msgstr "Notación de red no válida (no termina con «;»: «%s»)\n" | 9243 | msgstr "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 |
9063 | msgid "Wrong format `%s' for netmask\n" | 9247 | msgid "Wrong format `%s' for netmask\n" |
9064 | msgstr "Formato «%s» erroneo para máscara de red\n" | 9248 | msgstr "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 |
9068 | msgid "Wrong format `%s' for network\n" | 9252 | msgid "Wrong format `%s' for network\n" |
9069 | msgstr "Formato «%s» erroneo para red\n" | 9253 | msgstr "Formato «%s» erroneo para red\n" |
@@ -9244,27 +9428,42 @@ msgstr "el servicio es ofrecido vÃa UDP" | |||
9244 | msgid "Setup tunnels via VPN." | 9428 | msgid "Setup tunnels via VPN." |
9245 | msgstr "Configurar túneles vÃa VPN." | 9429 | msgstr "Configurar túneles vÃa VPN." |
9246 | 9430 | ||
9247 | #: src/zonemaster/gnunet-service-zonemaster.c:705 | 9431 | #: src/zonemaster/gnunet-service-zonemaster.c:706 |
9248 | msgid "Failed to connect to the namestore!\n" | 9432 | msgid "Failed to connect to the namestore!\n" |
9249 | msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n" | 9433 | msgstr "¡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 |
9254 | msgid "Assertion failed at %s:%d.\n" | 9438 | msgid "Assertion failed at %s:%d.\n" |
9255 | msgstr "Aserción fallida en %s:%d.\n" | 9439 | msgstr "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 |
9259 | msgid "External protocol violation detected at %s:%d.\n" | 9443 | msgid "External protocol violation detected at %s:%d.\n" |
9260 | msgstr "Violación externa del protocolo detectada en %s:%d.\n" | 9444 | msgstr "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 |
9264 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" | 9448 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" |
9265 | msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" | 9449 | msgstr "«%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 | ||
@@ -7,7 +7,7 @@ msgid "" | |||
7 | msgstr "" | 7 | msgstr "" |
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" | |||
267 | msgstr "" | 267 | msgstr "" |
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" | |||
275 | msgstr "Résolution de « %s » échouée : %s\n" | 275 | msgstr "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 "" | |||
348 | msgid "Initiating shutdown as requested by client.\n" | 348 | msgid "Initiating shutdown as requested by client.\n" |
349 | msgstr "" | 349 | msgstr "" |
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 | 352 | msgid "Stop logging\n" |
353 | msgid "" | 353 | msgstr "Arrêter la journalisation\n" |
354 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
355 | "%llu\n" | ||
356 | msgstr "" | ||
357 | |||
358 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
359 | #, c-format | ||
360 | msgid "" | ||
361 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
362 | "%llu\n" | ||
363 | msgstr "" | ||
364 | |||
365 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
366 | #, c-format | ||
367 | msgid "" | ||
368 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
369 | "%llu\n" | ||
370 | msgstr "" | ||
371 | |||
372 | #: src/ats/gnunet-ats-solver-eval.c:3294 | ||
373 | #: src/ats-tests/gnunet-solver-eval.c:939 | ||
374 | msgid "solver to use" | ||
375 | msgstr "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 | ||
380 | msgid "experiment to use" | ||
381 | msgstr "" | ||
382 | |||
383 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
384 | msgid "print logging" | ||
385 | msgstr "afficher le journal" | ||
386 | |||
387 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
388 | msgid "save logging to disk" | ||
389 | msgstr "" | ||
390 | |||
391 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
392 | msgid "disable normalization" | ||
393 | msgstr "" | ||
394 | |||
395 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
396 | #, c-format | ||
397 | msgid "" | ||
398 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
399 | "%llu\n" | ||
400 | msgstr "" | ||
401 | |||
402 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
403 | #, c-format | ||
404 | msgid "%s quota configured for network `%s' is %llu\n" | ||
405 | msgstr "" | ||
406 | |||
407 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
408 | #, c-format | ||
409 | msgid "" | ||
410 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
411 | msgstr "" | ||
412 | |||
413 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
414 | #, c-format | ||
415 | msgid "Failed to initialize solver `%s'!\n" | ||
416 | msgstr "" | ||
417 | |||
418 | #: src/ats/plugin_ats_mlp.c:1274 | ||
419 | msgid "Problem size too large, cannot allocate memory!\n" | ||
420 | msgstr "" | ||
421 | |||
422 | #: src/ats/plugin_ats_mlp.c:1869 | ||
423 | #, c-format | ||
424 | msgid "Adding address for peer `%s' multiple times\n" | ||
425 | msgstr "" | ||
426 | |||
427 | #: src/ats/plugin_ats_mlp.c:1913 | ||
428 | #, c-format | ||
429 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
430 | msgstr "" | ||
431 | |||
432 | #: src/ats/plugin_ats_mlp.c:2475 | ||
433 | msgid "" | ||
434 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
435 | msgstr "" | ||
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 | ||
445 | msgid "Invalid %s configuration %f \n" | ||
446 | msgstr "fornat invalide : « %s »\n" | ||
447 | |||
448 | #: src/ats/plugin_ats_mlp.c:2670 | ||
449 | #, c-format | ||
450 | msgid "" | ||
451 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
452 | "%llu must be at least %llu\n" | ||
453 | msgstr "" | ||
454 | |||
455 | #: src/ats/plugin_ats_mlp.c:2679 | ||
456 | #, c-format | ||
457 | msgid "" | ||
458 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
459 | "must be at least %llu\n" | ||
460 | msgstr "" | ||
461 | |||
462 | #: src/ats/plugin_ats_mlp.c:2689 | ||
463 | #, c-format | ||
464 | msgid "" | ||
465 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
466 | msgstr "" | ||
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 |
470 | msgid "" | 357 | msgid "Start logging `%s'\n" |
471 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | 358 | msgstr "Démarrer la journalisation « %s »\n" |
472 | msgstr "" | ||
473 | |||
474 | #: src/ats/plugin_ats_proportional.c:1164 | ||
475 | #, fuzzy, c-format | ||
476 | msgid "Invalid %s configuration %f\n" | ||
477 | msgstr "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 "" | |||
486 | msgid "Failed to connect master peer [%u] with slave [%u]\n" | 367 | msgid "Failed to connect master peer [%u] with slave [%u]\n" |
487 | msgstr "" | 368 | msgstr "" |
488 | 369 | ||
489 | #: src/ats-tests/ats-testing-log.c:837 | ||
490 | msgid "Stop logging\n" | ||
491 | msgstr "Arrêter la journalisation\n" | ||
492 | |||
493 | #: src/ats-tests/ats-testing-log.c:892 | ||
494 | #, c-format | ||
495 | msgid "Start logging `%s'\n" | ||
496 | msgstr "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 |
500 | msgid "" | 372 | msgid "" |
@@ -502,6 +374,15 @@ msgid "" | |||
502 | "= %u KiB/s\n" | 374 | "= %u KiB/s\n" |
503 | msgstr "" | 375 | msgstr "" |
504 | 376 | ||
377 | #: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294 | ||
378 | msgid "solver to use" | ||
379 | msgstr "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 | ||
383 | msgid "experiment to use" | ||
384 | msgstr "" | ||
385 | |||
505 | #: src/ats-tool/gnunet-ats.c:307 | 386 | #: src/ats-tool/gnunet-ats.c:307 |
506 | #, c-format | 387 | #, c-format |
507 | msgid "%u address resolutions had a timeout\n" | 388 | msgid "%u address resolutions had a timeout\n" |
@@ -617,6 +498,123 @@ msgstr "" | |||
617 | msgid "Print information about ATS state" | 498 | msgid "Print information about ATS state" |
618 | msgstr "" | 499 | msgstr "" |
619 | 500 | ||
501 | #: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822 | ||
502 | #, c-format | ||
503 | msgid "" | ||
504 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
505 | "%llu\n" | ||
506 | msgstr "" | ||
507 | |||
508 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
509 | #, c-format | ||
510 | msgid "" | ||
511 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
512 | "%llu\n" | ||
513 | msgstr "" | ||
514 | |||
515 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
516 | #, c-format | ||
517 | msgid "" | ||
518 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
519 | "%llu\n" | ||
520 | msgstr "" | ||
521 | |||
522 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
523 | msgid "print logging" | ||
524 | msgstr "afficher le journal" | ||
525 | |||
526 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
527 | msgid "save logging to disk" | ||
528 | msgstr "" | ||
529 | |||
530 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
531 | msgid "disable normalization" | ||
532 | msgstr "" | ||
533 | |||
534 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
535 | #, c-format | ||
536 | msgid "" | ||
537 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
538 | "%llu\n" | ||
539 | msgstr "" | ||
540 | |||
541 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
542 | #, c-format | ||
543 | msgid "%s quota configured for network `%s' is %llu\n" | ||
544 | msgstr "" | ||
545 | |||
546 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
547 | #, c-format | ||
548 | msgid "" | ||
549 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
550 | msgstr "" | ||
551 | |||
552 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
553 | #, c-format | ||
554 | msgid "Failed to initialize solver `%s'!\n" | ||
555 | msgstr "" | ||
556 | |||
557 | #: src/ats/plugin_ats_mlp.c:1274 | ||
558 | msgid "Problem size too large, cannot allocate memory!\n" | ||
559 | msgstr "" | ||
560 | |||
561 | #: src/ats/plugin_ats_mlp.c:1869 | ||
562 | #, c-format | ||
563 | msgid "Adding address for peer `%s' multiple times\n" | ||
564 | msgstr "" | ||
565 | |||
566 | #: src/ats/plugin_ats_mlp.c:1913 | ||
567 | #, c-format | ||
568 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
569 | msgstr "" | ||
570 | |||
571 | #: src/ats/plugin_ats_mlp.c:2475 | ||
572 | msgid "" | ||
573 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
574 | msgstr "" | ||
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 | ||
584 | msgid "Invalid %s configuration %f \n" | ||
585 | msgstr "fornat invalide : « %s »\n" | ||
586 | |||
587 | #: src/ats/plugin_ats_mlp.c:2670 | ||
588 | #, c-format | ||
589 | msgid "" | ||
590 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
591 | "%llu must be at least %llu\n" | ||
592 | msgstr "" | ||
593 | |||
594 | #: src/ats/plugin_ats_mlp.c:2679 | ||
595 | #, c-format | ||
596 | msgid "" | ||
597 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
598 | "must be at least %llu\n" | ||
599 | msgstr "" | ||
600 | |||
601 | #: src/ats/plugin_ats_mlp.c:2689 | ||
602 | #, c-format | ||
603 | msgid "" | ||
604 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
605 | msgstr "" | ||
606 | |||
607 | #: src/ats/plugin_ats_mlp.c:2698 | ||
608 | #, c-format | ||
609 | msgid "" | ||
610 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
611 | msgstr "" | ||
612 | |||
613 | #: src/ats/plugin_ats_proportional.c:1164 | ||
614 | #, fuzzy, c-format | ||
615 | msgid "Invalid %s configuration %f\n" | ||
616 | msgstr "fornat invalide : « %s »\n" | ||
617 | |||
620 | #: src/auction/gnunet-auction-create.c:163 | 618 | #: src/auction/gnunet-auction-create.c:163 |
621 | msgid "description of the item to be sold" | 619 | msgid "description of the item to be sold" |
622 | msgstr "" | 620 | msgstr "" |
@@ -755,6 +753,28 @@ msgstr "" | |||
755 | msgid "Connection to conversation service lost, trying to reconnect\n" | 753 | msgid "Connection to conversation service lost, trying to reconnect\n" |
756 | msgstr "" | 754 | msgstr "" |
757 | 755 | ||
756 | #: src/conversation/gnunet-conversation-test.c:119 | ||
757 | #, c-format | ||
758 | msgid "" | ||
759 | "\n" | ||
760 | "End of transmission. Have a GNU day.\n" | ||
761 | msgstr "" | ||
762 | |||
763 | #: src/conversation/gnunet-conversation-test.c:145 | ||
764 | #, c-format | ||
765 | msgid "" | ||
766 | "\n" | ||
767 | "We are now playing your recording back. If you can hear it, your audio " | ||
768 | "settings are working..." | ||
769 | msgstr "" | ||
770 | |||
771 | #: src/conversation/gnunet-conversation-test.c:210 | ||
772 | #, c-format | ||
773 | msgid "" | ||
774 | "We will now be recording you for %s. After that time, the recording will be " | ||
775 | "played back to you..." | ||
776 | msgstr "" | ||
777 | |||
758 | #: src/conversation/gnunet-conversation.c:269 | 778 | #: src/conversation/gnunet-conversation.c:269 |
759 | #, c-format | 779 | #, c-format |
760 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" | 780 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" |
@@ -1008,30 +1028,8 @@ msgstr "" | |||
1008 | msgid "Enables having a conversation with other GNUnet users." | 1028 | msgid "Enables having a conversation with other GNUnet users." |
1009 | msgstr "" | 1029 | msgstr "" |
1010 | 1030 | ||
1011 | #: src/conversation/gnunet-conversation-test.c:119 | ||
1012 | #, c-format | ||
1013 | msgid "" | ||
1014 | "\n" | ||
1015 | "End of transmission. Have a GNU day.\n" | ||
1016 | msgstr "" | ||
1017 | |||
1018 | #: src/conversation/gnunet-conversation-test.c:145 | ||
1019 | #, c-format | ||
1020 | msgid "" | ||
1021 | "\n" | ||
1022 | "We are now playing your recording back. If you can hear it, your audio " | ||
1023 | "settings are working..." | ||
1024 | msgstr "" | ||
1025 | |||
1026 | #: src/conversation/gnunet-conversation-test.c:210 | ||
1027 | #, c-format | ||
1028 | msgid "" | ||
1029 | "We will now be recording you for %s. After that time, the recording will be " | ||
1030 | "played back to you..." | ||
1031 | msgstr "" | ||
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 |
1036 | msgid "Read error from STDIN: %d %s\n" | 1034 | msgid "Read error from STDIN: %d %s\n" |
1037 | msgstr "" | 1035 | msgstr "" |
@@ -1155,6 +1153,11 @@ msgstr "ogg_stream_init() échoué.\n" | |||
1155 | msgid "Failed to allocate %u bytes for second packet\n" | 1153 | msgid "Failed to allocate %u bytes for second packet\n" |
1156 | msgstr "" | 1154 | msgstr "" |
1157 | 1155 | ||
1156 | #: src/conversation/gnunet-service-conversation.c:1276 | ||
1157 | #, c-format | ||
1158 | msgid "Could not open line, port %s already in use!\n" | ||
1159 | msgstr "" | ||
1160 | |||
1158 | #: src/conversation/microphone.c:119 | 1161 | #: src/conversation/microphone.c:119 |
1159 | msgid "Could not start record audio helper\n" | 1162 | msgid "Could not start record audio helper\n" |
1160 | msgstr "" | 1163 | msgstr "" |
@@ -1418,8 +1421,135 @@ msgstr "" | |||
1418 | msgid "# updates to my type map" | 1421 | msgid "# updates to my type map" |
1419 | msgstr "" | 1422 | msgstr "" |
1420 | 1423 | ||
1424 | #: src/credential/credential_misc.c:88 | ||
1425 | #, c-format | ||
1426 | msgid "Unable to parse CRED record string `%s'\n" | ||
1427 | msgstr "" | ||
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 | ||
1432 | msgid "Ego `%s' not known to identity service\n" | ||
1433 | msgstr "" | ||
1434 | |||
1435 | #: src/credential/gnunet-credential.c:294 | ||
1436 | #: src/credential/gnunet-credential.c:446 | ||
1437 | #, c-format | ||
1438 | msgid "Issuer public key `%s' is not well-formed\n" | ||
1439 | msgstr "" | ||
1440 | |||
1441 | #: src/credential/gnunet-credential.c:375 | ||
1442 | #: src/credential/gnunet-credential.c:435 | ||
1443 | #, c-format | ||
1444 | msgid "Issuer public key not well-formed\n" | ||
1445 | msgstr "" | ||
1446 | |||
1447 | #: src/credential/gnunet-credential.c:386 | ||
1448 | #: src/credential/gnunet-credential.c:455 | ||
1449 | #, fuzzy, c-format | ||
1450 | msgid "Failed to connect to CREDENTIAL\n" | ||
1451 | msgstr "Impossible d’ouvrir « %s ».\n" | ||
1452 | |||
1453 | #: src/credential/gnunet-credential.c:392 | ||
1454 | #, c-format | ||
1455 | msgid "You must provide issuer the attribute\n" | ||
1456 | msgstr "" | ||
1457 | |||
1458 | #: src/credential/gnunet-credential.c:399 | ||
1459 | #, c-format | ||
1460 | msgid "ego required\n" | ||
1461 | msgstr "" | ||
1462 | |||
1463 | #: src/credential/gnunet-credential.c:415 | ||
1464 | #, c-format | ||
1465 | msgid "Subject public key needed\n" | ||
1466 | msgstr "" | ||
1467 | |||
1468 | #: src/credential/gnunet-credential.c:426 | ||
1469 | #, c-format | ||
1470 | msgid "Subject public key `%s' is not well-formed\n" | ||
1471 | msgstr "" | ||
1472 | |||
1473 | #: src/credential/gnunet-credential.c:461 | ||
1474 | #, c-format | ||
1475 | msgid "You must provide issuer and subject attributes\n" | ||
1476 | msgstr "" | ||
1477 | |||
1478 | #: src/credential/gnunet-credential.c:511 | ||
1479 | #, c-format | ||
1480 | msgid "Issuer ego required\n" | ||
1481 | msgstr "" | ||
1482 | |||
1483 | #: src/credential/gnunet-credential.c:523 | ||
1484 | #, c-format | ||
1485 | msgid "Please specify name to lookup, subject key and issuer key!\n" | ||
1486 | msgstr "" | ||
1487 | |||
1488 | #: src/credential/gnunet-credential.c:543 | ||
1489 | msgid "create credential" | ||
1490 | msgstr "" | ||
1491 | |||
1492 | #: src/credential/gnunet-credential.c:547 | ||
1493 | msgid "verify credential against attribute" | ||
1494 | msgstr "" | ||
1495 | |||
1496 | #: src/credential/gnunet-credential.c:552 | ||
1497 | msgid "The public key of the subject to lookup the credential for" | ||
1498 | msgstr "" | ||
1499 | |||
1500 | #: src/credential/gnunet-credential.c:557 | ||
1501 | msgid "The name of the credential presented by the subject" | ||
1502 | msgstr "" | ||
1503 | |||
1504 | #: src/credential/gnunet-credential.c:562 | ||
1505 | msgid "The public key of the authority to verify the credential against" | ||
1506 | msgstr "" | ||
1507 | |||
1508 | #: src/credential/gnunet-credential.c:567 | ||
1509 | msgid "The ego to use" | ||
1510 | msgstr "" | ||
1511 | |||
1512 | #: src/credential/gnunet-credential.c:572 | ||
1513 | msgid "The issuer attribute to verify against or to issue" | ||
1514 | msgstr "" | ||
1515 | |||
1516 | #: src/credential/gnunet-credential.c:577 | ||
1517 | msgid "The time to live for the credential" | ||
1518 | msgstr "" | ||
1519 | |||
1520 | #: src/credential/gnunet-credential.c:581 | ||
1521 | msgid "collect credentials" | ||
1522 | msgstr "" | ||
1523 | |||
1524 | #: src/credential/gnunet-credential.c:595 | ||
1525 | msgid "GNUnet credential resolver tool" | ||
1526 | msgstr "" | ||
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 | ||
1531 | msgid "Failed to connect to GNS\n" | ||
1532 | msgstr "" | ||
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 | ||
1539 | msgid "Failed to connect to namestore\n" | ||
1540 | msgstr "" | ||
1541 | |||
1542 | #: src/credential/plugin_gnsrecord_credential.c:186 | ||
1543 | #, fuzzy, c-format | ||
1544 | msgid "Unable to parse ATTR record string `%s'\n" | ||
1545 | msgstr "Résolution de « %s » échouée\n" | ||
1546 | |||
1547 | #: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668 | ||
1548 | msgid "GNS REST API initialized\n" | ||
1549 | msgstr "" | ||
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 |
1423 | msgid "# bytes stored" | 1553 | msgid "# bytes stored" |
1424 | msgstr "" | 1554 | msgstr "" |
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 |
1480 | msgid "`%s' failed at %s:%d with error: %s\n" | 1609 | msgid "`%s' failed at %s:%d with error: %s\n" |
1481 | msgstr "" | 1610 | msgstr "" |
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 |
1487 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" | 1617 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" |
@@ -1545,23 +1675,70 @@ msgstr "" | |||
1545 | msgid "# GET requests executed" | 1675 | msgid "# GET requests executed" |
1546 | msgstr "" | 1676 | msgstr "" |
1547 | 1677 | ||
1548 | #: src/datastore/gnunet-datastore.c:113 | 1678 | #: src/datastore/gnunet-datastore.c:189 |
1679 | #, c-format | ||
1680 | msgid "Dumped %<PRIu64> records\n" | ||
1681 | msgstr "" | ||
1682 | |||
1683 | #: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 | ||
1684 | #, c-format | ||
1685 | msgid "Short write to file: %zd bytes expecting %zd\n" | ||
1686 | msgstr "" | ||
1687 | |||
1688 | #: src/datastore/gnunet-datastore.c:261 | ||
1689 | msgid "Error queueing datastore GET operation\n" | ||
1690 | msgstr "" | ||
1691 | |||
1692 | #: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 | ||
1693 | #, fuzzy, c-format | ||
1694 | msgid "Unable to open dump file: %s\n" | ||
1695 | msgstr "Résolution de « %s » échouée\n" | ||
1696 | |||
1697 | #: src/datastore/gnunet-datastore.c:326 | ||
1549 | #, c-format | 1698 | #, c-format |
1550 | msgid "Failed to store item: %s, aborting\n" | 1699 | msgid "Failed to store item: %s, aborting\n" |
1551 | msgstr "" | 1700 | msgstr "" |
1552 | 1701 | ||
1553 | #: src/datastore/gnunet-datastore.c:209 | 1702 | #: src/datastore/gnunet-datastore.c:340 |
1554 | #, c-format | 1703 | #, c-format |
1555 | msgid "Cannot use the same configuration for source and destination\n" | 1704 | msgid "Inserted %<PRIu64> records\n" |
1556 | msgstr "" | 1705 | msgstr "" |
1557 | 1706 | ||
1558 | #: src/datastore/gnunet-datastore.c:256 | 1707 | #: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 |
1559 | msgid "" | 1708 | #, c-format |
1560 | "specifies the configuration to use to access an alternative datastore; will " | 1709 | msgid "Short read from file: %zd bytes expecting %zd\n" |
1561 | "merge that datastore into our current datastore" | 1710 | msgstr "" |
1711 | |||
1712 | #: src/datastore/gnunet-datastore.c:389 | ||
1713 | msgid "Error queueing datastore PUT operation\n" | ||
1714 | msgstr "" | ||
1715 | |||
1716 | #: src/datastore/gnunet-datastore.c:432 | ||
1717 | msgid "Input file is not of a supported format\n" | ||
1718 | msgstr "" | ||
1719 | |||
1720 | #: src/datastore/gnunet-datastore.c:458 | ||
1721 | msgid "Failed connecting to the datastore.\n" | ||
1562 | msgstr "" | 1722 | msgstr "" |
1563 | 1723 | ||
1564 | #: src/datastore/gnunet-datastore.c:265 | 1724 | #: src/datastore/gnunet-datastore.c:470 |
1725 | #, c-format | ||
1726 | msgid "Please choose at least one operation: %s, %s\n" | ||
1727 | msgstr "" | ||
1728 | |||
1729 | #: src/datastore/gnunet-datastore.c:493 | ||
1730 | msgid "Dump all records from the datastore" | ||
1731 | msgstr "" | ||
1732 | |||
1733 | #: src/datastore/gnunet-datastore.c:497 | ||
1734 | msgid "Insert records into the datastore" | ||
1735 | msgstr "" | ||
1736 | |||
1737 | #: src/datastore/gnunet-datastore.c:502 | ||
1738 | msgid "File to dump or insert" | ||
1739 | msgstr "" | ||
1740 | |||
1741 | #: src/datastore/gnunet-datastore.c:511 | ||
1565 | msgid "Manipulate GNUnet datastore" | 1742 | msgid "Manipulate GNUnet datastore" |
1566 | msgstr "" | 1743 | msgstr "" |
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 |
1608 | msgid "# reserved" | 1785 | msgid "# reserved" |
1609 | msgstr "# réservé" | 1786 | msgstr "# réservé" |
1610 | 1787 | ||
@@ -1612,140 +1789,141 @@ msgstr "# réservé" | |||
1612 | msgid "Could not find matching reservation" | 1789 | msgid "Could not find matching reservation" |
1613 | msgstr "" | 1790 | msgstr "" |
1614 | 1791 | ||
1615 | #: src/datastore/gnunet-service-datastore.c:792 | 1792 | #: src/datastore/gnunet-service-datastore.c:773 |
1616 | #, c-format | 1793 | #, c-format |
1617 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" | 1794 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" |
1618 | msgstr "" | 1795 | msgstr "" |
1619 | 1796 | ||
1620 | #: src/datastore/gnunet-service-datastore.c:1026 | 1797 | #: src/datastore/gnunet-service-datastore.c:876 |
1621 | msgid "# GET requests received" | 1798 | msgid "# GET requests received" |
1622 | msgstr "" | 1799 | msgstr "" |
1623 | 1800 | ||
1624 | #: src/datastore/gnunet-service-datastore.c:1058 | 1801 | #: src/datastore/gnunet-service-datastore.c:907 |
1625 | msgid "# GET KEY requests received" | 1802 | msgid "# GET KEY requests received" |
1626 | msgstr "" | 1803 | msgstr "" |
1627 | 1804 | ||
1628 | #: src/datastore/gnunet-service-datastore.c:1071 | 1805 | #: src/datastore/gnunet-service-datastore.c:920 |
1629 | msgid "# requests filtered by bloomfilter" | 1806 | msgid "# requests filtered by bloomfilter" |
1630 | msgstr "" | 1807 | msgstr "" |
1631 | 1808 | ||
1632 | #: src/datastore/gnunet-service-datastore.c:1108 | 1809 | #: src/datastore/gnunet-service-datastore.c:956 |
1633 | msgid "# GET REPLICATION requests received" | 1810 | msgid "# GET REPLICATION requests received" |
1634 | msgstr "" | 1811 | msgstr "" |
1635 | 1812 | ||
1636 | #: src/datastore/gnunet-service-datastore.c:1141 | 1813 | #: src/datastore/gnunet-service-datastore.c:989 |
1637 | msgid "# GET ZERO ANONYMITY requests received" | 1814 | msgid "# GET ZERO ANONYMITY requests received" |
1638 | msgstr "" | 1815 | msgstr "" |
1639 | 1816 | ||
1640 | #: src/datastore/gnunet-service-datastore.c:1190 | 1817 | #: src/datastore/gnunet-service-datastore.c:1036 |
1641 | msgid "Content not found" | 1818 | msgid "Content not found" |
1642 | msgstr "" | 1819 | msgstr "" |
1643 | 1820 | ||
1644 | #: src/datastore/gnunet-service-datastore.c:1199 | 1821 | #: src/datastore/gnunet-service-datastore.c:1043 |
1645 | msgid "# bytes removed (explicit request)" | 1822 | msgid "# bytes removed (explicit request)" |
1646 | msgstr "" | 1823 | msgstr "" |
1647 | 1824 | ||
1648 | #: src/datastore/gnunet-service-datastore.c:1246 | 1825 | #: src/datastore/gnunet-service-datastore.c:1088 |
1649 | msgid "# REMOVE requests received" | 1826 | msgid "# REMOVE requests received" |
1650 | msgstr "" | 1827 | msgstr "" |
1651 | 1828 | ||
1652 | #: src/datastore/gnunet-service-datastore.c:1301 | 1829 | #: src/datastore/gnunet-service-datastore.c:1137 |
1653 | #, c-format | 1830 | #, c-format |
1654 | msgid "" | 1831 | msgid "" |
1655 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" | 1832 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" |
1656 | msgstr "" | 1833 | msgstr "" |
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 |
1661 | msgid "New payload: %lld\n" | 1838 | msgid "New payload: %lld\n" |
1662 | msgstr "" | 1839 | msgstr "" |
1663 | 1840 | ||
1664 | #: src/datastore/gnunet-service-datastore.c:1361 | 1841 | #: src/datastore/gnunet-service-datastore.c:1197 |
1665 | #, c-format | 1842 | #, c-format |
1666 | msgid "Loading `%s' datastore plugin\n" | 1843 | msgid "Loading `%s' datastore plugin\n" |
1667 | msgstr "" | 1844 | msgstr "" |
1668 | 1845 | ||
1669 | #: src/datastore/gnunet-service-datastore.c:1373 | 1846 | #: src/datastore/gnunet-service-datastore.c:1209 |
1670 | #, c-format | 1847 | #, c-format |
1671 | msgid "Failed to load datastore plugin for `%s'\n" | 1848 | msgid "Failed to load datastore plugin for `%s'\n" |
1672 | msgstr "" | 1849 | msgstr "" |
1673 | 1850 | ||
1674 | #: src/datastore/gnunet-service-datastore.c:1433 | 1851 | #: src/datastore/gnunet-service-datastore.c:1269 |
1675 | msgid "Bloomfilter construction complete.\n" | 1852 | msgid "Bloomfilter construction complete.\n" |
1676 | msgstr "" | 1853 | msgstr "" |
1677 | 1854 | ||
1678 | #: src/datastore/gnunet-service-datastore.c:1489 | 1855 | #: src/datastore/gnunet-service-datastore.c:1325 |
1679 | msgid "Rebuilding bloomfilter. Please be patient.\n" | 1856 | msgid "Rebuilding bloomfilter. Please be patient.\n" |
1680 | msgstr "" | 1857 | msgstr "" |
1681 | 1858 | ||
1682 | #: src/datastore/gnunet-service-datastore.c:1500 | 1859 | #: src/datastore/gnunet-service-datastore.c:1336 |
1683 | msgid "Plugin does not support get_keys function. Please fix!\n" | 1860 | msgid "Plugin does not support get_keys function. Please fix!\n" |
1684 | msgstr "" | 1861 | msgstr "" |
1685 | 1862 | ||
1686 | #: src/datastore/gnunet-service-datastore.c:1670 | 1863 | #: src/datastore/gnunet-service-datastore.c:1506 |
1687 | #, c-format | 1864 | #, c-format |
1688 | msgid "# bytes used in file-sharing datastore `%s'" | 1865 | msgid "# bytes used in file-sharing datastore `%s'" |
1689 | msgstr "" | 1866 | msgstr "" |
1690 | 1867 | ||
1691 | #: src/datastore/gnunet-service-datastore.c:1686 | 1868 | #: src/datastore/gnunet-service-datastore.c:1522 |
1692 | msgid "# quota" | 1869 | msgid "# quota" |
1693 | msgstr "# quota" | 1870 | msgstr "# quota" |
1694 | 1871 | ||
1695 | #: src/datastore/gnunet-service-datastore.c:1691 | 1872 | #: src/datastore/gnunet-service-datastore.c:1527 |
1696 | msgid "# cache size" | 1873 | msgid "# cache size" |
1697 | msgstr "# taille du cache" | 1874 | msgstr "# 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 |
1701 | msgid "Could not use specified filename `%s' for bloomfilter.\n" | 1878 | msgid "Could not use specified filename `%s' for bloomfilter.\n" |
1702 | msgstr "" | 1879 | msgstr "" |
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 |
1707 | msgid "Failed to remove bogus bloomfilter file `%s'\n" | 1884 | msgid "Failed to remove bogus bloomfilter file `%s'\n" |
1708 | msgstr "" | 1885 | msgstr "" |
1709 | 1886 | ||
1710 | #: src/datastore/gnunet-service-datastore.c:1773 | 1887 | #: src/datastore/gnunet-service-datastore.c:1609 |
1711 | msgid "Failed to initialize bloomfilter.\n" | 1888 | msgid "Failed to initialize bloomfilter.\n" |
1712 | msgstr "" | 1889 | msgstr "" |
1713 | 1890 | ||
1714 | #: src/datastore/plugin_datastore_heap.c:769 | 1891 | #: src/datastore/plugin_datastore_heap.c:893 |
1715 | msgid "Heap database running\n" | 1892 | msgid "Heap database running\n" |
1716 | msgstr "" | 1893 | msgstr "" |
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 |
1720 | msgid "Data too large" | 1897 | #: src/datastore/plugin_datastore_mysql.c:1075 |
1898 | msgid "MySQL statement run failure" | ||
1721 | msgstr "" | 1899 | msgstr "" |
1722 | 1900 | ||
1723 | #: src/datastore/plugin_datastore_mysql.c:393 | 1901 | #: src/datastore/plugin_datastore_mysql.c:410 |
1724 | msgid "MySQL statement run failure" | 1902 | #: src/datastore/plugin_datastore_sqlite.c:626 |
1903 | msgid "Data too large" | ||
1725 | msgstr "" | 1904 | msgstr "" |
1726 | 1905 | ||
1727 | #: src/datastore/plugin_datastore_mysql.c:936 | 1906 | #: src/datastore/plugin_datastore_mysql.c:848 |
1728 | #, c-format | 1907 | #, c-format |
1729 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" | 1908 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" |
1730 | msgstr "" | 1909 | msgstr "" |
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 |
1734 | msgid "Mysql database running\n" | 1913 | msgid "Mysql database running\n" |
1735 | msgstr "" | 1914 | msgstr "" |
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 | ||
1738 | msgid "Postgress exec failure" | 1918 | msgid "Postgress exec failure" |
1739 | msgstr "" | 1919 | msgstr "" |
1740 | 1920 | ||
1741 | #: src/datastore/plugin_datastore_postgres.c:866 | 1921 | #: src/datastore/plugin_datastore_postgres.c:852 |
1742 | msgid "Failed to drop table from database.\n" | 1922 | msgid "Failed to drop table from database.\n" |
1743 | msgstr "" | 1923 | msgstr "" |
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 | ||
1749 | msgid "Postgres database running\n" | 1927 | msgid "Postgres database running\n" |
1750 | msgstr "" | 1928 | msgstr "" |
1751 | 1929 | ||
@@ -1757,7 +1935,8 @@ msgstr "" | |||
1757 | msgid "`%s' failed at %s:%u with error: %s" | 1935 | msgid "`%s' failed at %s:%u with error: %s" |
1758 | msgstr "" | 1936 | msgstr "" |
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 "" | |||
1766 | msgid "Unable to initialize SQLite: %s.\n" | 1945 | msgid "Unable to initialize SQLite: %s.\n" |
1767 | msgstr "" | 1946 | msgstr "" |
1768 | 1947 | ||
1769 | #: src/datastore/plugin_datastore_sqlite.c:1234 | 1948 | #: src/datastore/plugin_datastore_sqlite.c:577 |
1949 | msgid "sqlite bind failure" | ||
1950 | msgstr "" | ||
1951 | |||
1952 | #: src/datastore/plugin_datastore_sqlite.c:1259 | ||
1770 | msgid "sqlite version to old to determine size, assuming zero\n" | 1953 | msgid "sqlite version to old to determine size, assuming zero\n" |
1771 | msgstr "" | 1954 | msgstr "" |
1772 | 1955 | ||
1773 | #: src/datastore/plugin_datastore_sqlite.c:1268 | 1956 | #: src/datastore/plugin_datastore_sqlite.c:1293 |
1774 | #, c-format | 1957 | #, c-format |
1775 | msgid "" | 1958 | msgid "" |
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" |
1778 | msgstr "" | 1961 | msgstr "" |
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 |
1783 | msgid "Sqlite database running\n" | 1967 | msgid "Sqlite database running\n" |
1784 | msgstr "" | 1968 | msgstr "" |
1785 | 1969 | ||
1786 | #: src/datastore/plugin_datastore_template.c:259 | 1970 | #: src/datastore/plugin_datastore_template.c:253 |
1787 | msgid "Template database running\n" | 1971 | msgid "Template database running\n" |
1788 | msgstr "" | 1972 | msgstr "" |
1789 | 1973 | ||
@@ -1846,52 +2030,6 @@ msgstr "" | |||
1846 | msgid "Prints all packets that go through the DHT." | 2030 | msgid "Prints all packets that go through the DHT." |
1847 | msgstr "" | 2031 | msgstr "" |
1848 | 2032 | ||
1849 | #: src/dht/gnunet_dht_profiler.c:1161 | ||
1850 | #: src/testbed/gnunet-testbed-profiler.c:255 | ||
1851 | #, c-format | ||
1852 | msgid "Exiting as the number of peers is %u\n" | ||
1853 | msgstr "" | ||
1854 | |||
1855 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
1856 | #, fuzzy | ||
1857 | msgid "number of peers to start" | ||
1858 | msgstr "nombre de valeurs" | ||
1859 | |||
1860 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
1861 | msgid "" | ||
1862 | "maximum number of times we try to search for successor circle formation (0 " | ||
1863 | "for R5N)" | ||
1864 | msgstr "" | ||
1865 | |||
1866 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
1867 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
1868 | msgid "name of the file with the login information for the testbed" | ||
1869 | msgstr "" | ||
1870 | |||
1871 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
1872 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
1873 | msgstr "" | ||
1874 | |||
1875 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
1876 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
1877 | msgstr "" | ||
1878 | |||
1879 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
1880 | msgid "delay to start doing GETs (default: 5 min)" | ||
1881 | msgstr "" | ||
1882 | |||
1883 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
1884 | msgid "replication degree for DHT PUTs" | ||
1885 | msgstr "" | ||
1886 | |||
1887 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
1888 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
1889 | msgstr "" | ||
1890 | |||
1891 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
1892 | msgid "Measure quality and performance of the DHT service." | ||
1893 | msgstr "" | ||
1894 | |||
1895 | #: src/dht/gnunet-dht-put.c:120 | 2033 | #: src/dht/gnunet-dht-put.c:120 |
1896 | msgid "PUT request sent with key" | 2034 | msgid "PUT request sent with key" |
1897 | msgstr "" | 2035 | msgstr "" |
@@ -2141,6 +2279,51 @@ msgstr "" | |||
2141 | msgid "# DHT requests combined" | 2279 | msgid "# DHT requests combined" |
2142 | msgstr "" | 2280 | msgstr "" |
2143 | 2281 | ||
2282 | #: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255 | ||
2283 | #, c-format | ||
2284 | msgid "Exiting as the number of peers is %u\n" | ||
2285 | msgstr "" | ||
2286 | |||
2287 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
2288 | #, fuzzy | ||
2289 | msgid "number of peers to start" | ||
2290 | msgstr "nombre de valeurs" | ||
2291 | |||
2292 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2293 | msgid "" | ||
2294 | "maximum number of times we try to search for successor circle formation (0 " | ||
2295 | "for R5N)" | ||
2296 | msgstr "" | ||
2297 | |||
2298 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2299 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2300 | msgid "name of the file with the login information for the testbed" | ||
2301 | msgstr "" | ||
2302 | |||
2303 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
2304 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2305 | msgstr "" | ||
2306 | |||
2307 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2308 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2309 | msgstr "" | ||
2310 | |||
2311 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2312 | msgid "delay to start doing GETs (default: 5 min)" | ||
2313 | msgstr "" | ||
2314 | |||
2315 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2316 | msgid "replication degree for DHT PUTs" | ||
2317 | msgstr "" | ||
2318 | |||
2319 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2320 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2321 | msgstr "" | ||
2322 | |||
2323 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2324 | msgid "Measure quality and performance of the DHT service." | ||
2325 | msgstr "" | ||
2326 | |||
2144 | #: src/dht/plugin_block_dht.c:187 | 2327 | #: src/dht/plugin_block_dht.c:187 |
2145 | #, c-format | 2328 | #, c-format |
2146 | msgid "Block not of type %u\n" | 2329 | msgid "Block not of type %u\n" |
@@ -2455,7 +2638,7 @@ msgstr "" | |||
2455 | msgid "No useful service enabled. Exiting.\n" | 2638 | msgid "No useful service enabled. Exiting.\n" |
2456 | msgstr "" | 2639 | msgstr "" |
2457 | 2640 | ||
2458 | #: src/exit/gnunet-daemon-exit.c:3969 | 2641 | #: src/exit/gnunet-daemon-exit.c:3970 |
2459 | msgid "Daemon to run to provide an IP exit node for the VPN" | 2642 | msgid "Daemon to run to provide an IP exit node for the VPN" |
2460 | msgstr "" | 2643 | msgstr "" |
2461 | 2644 | ||
@@ -3074,14 +3257,6 @@ msgid "" | |||
3074 | "chk/...)" | 3257 | "chk/...)" |
3075 | msgstr "" | 3258 | msgstr "" |
3076 | 3259 | ||
3077 | #: src/fs/gnunet-fs.c:119 | ||
3078 | msgid "print a list of all indexed files" | ||
3079 | msgstr "" | ||
3080 | |||
3081 | #: src/fs/gnunet-fs.c:130 | ||
3082 | msgid "Special file-sharing operations" | ||
3083 | msgstr "" | ||
3084 | |||
3085 | #: src/fs/gnunet-fs-profiler.c:211 | 3260 | #: src/fs/gnunet-fs-profiler.c:211 |
3086 | msgid "run the experiment with COUNT peers" | 3261 | msgid "run the experiment with COUNT peers" |
3087 | msgstr "" | 3262 | msgstr "" |
@@ -3098,6 +3273,14 @@ msgstr "" | |||
3098 | msgid "run a testbed to measure file-sharing performance" | 3273 | msgid "run a testbed to measure file-sharing performance" |
3099 | msgstr "" | 3274 | msgstr "" |
3100 | 3275 | ||
3276 | #: src/fs/gnunet-fs.c:119 | ||
3277 | msgid "print a list of all indexed files" | ||
3278 | msgstr "" | ||
3279 | |||
3280 | #: src/fs/gnunet-fs.c:130 | ||
3281 | msgid "Special file-sharing operations" | ||
3282 | msgstr "" | ||
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 |
3103 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" | 3286 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" |
@@ -3743,22 +3926,11 @@ msgstr "" | |||
3743 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" | 3926 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" |
3744 | msgstr "" | 3927 | msgstr "" |
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 | 3930 | msgid "Not ready to process requests, lacking ego data\n" |
3748 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
3749 | msgstr "" | ||
3750 | |||
3751 | #: src/gns/gnunet-gns.c:252 | ||
3752 | #, c-format | ||
3753 | msgid "Please specify name to lookup!\n" | ||
3754 | msgstr "" | ||
3755 | |||
3756 | #: src/gns/gnunet-gns.c:276 | ||
3757 | #, c-format | ||
3758 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
3759 | msgstr "" | 3931 | msgstr "" |
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 |
3764 | msgid "" | 3936 | msgid "" |
@@ -3766,54 +3938,12 @@ msgid "" | |||
3766 | "gns-import.sh?\n" | 3938 | "gns-import.sh?\n" |
3767 | msgstr "" | 3939 | msgstr "" |
3768 | 3940 | ||
3769 | #: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727 | ||
3770 | #, c-format | ||
3771 | msgid "Failed to connect to GNS\n" | ||
3772 | msgstr "" | ||
3773 | |||
3774 | #: src/gns/gnunet-gns.c:374 | ||
3775 | #, c-format | ||
3776 | msgid "Public key `%s' is not well-formed\n" | ||
3777 | msgstr "" | ||
3778 | |||
3779 | #: src/gns/gnunet-gns.c:428 | ||
3780 | msgid "Lookup a record for the given name" | ||
3781 | msgstr "" | ||
3782 | |||
3783 | #: src/gns/gnunet-gns.c:434 | ||
3784 | msgid "Specify the type of the record to lookup" | ||
3785 | msgstr "" | ||
3786 | |||
3787 | #: src/gns/gnunet-gns.c:440 | ||
3788 | msgid "Specify timeout for the lookup" | ||
3789 | msgstr "" | ||
3790 | |||
3791 | #: src/gns/gnunet-gns.c:445 | ||
3792 | msgid "No unneeded output" | ||
3793 | msgstr "" | ||
3794 | |||
3795 | #: src/gns/gnunet-gns.c:451 | ||
3796 | msgid "Specify the public key of the zone to lookup the record in" | ||
3797 | msgstr "" | ||
3798 | |||
3799 | #: src/gns/gnunet-gns.c:457 | ||
3800 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
3801 | msgstr "" | ||
3802 | |||
3803 | #: src/gns/gnunet-gns.c:476 | ||
3804 | msgid "GNUnet GNS resolver tool" | ||
3805 | msgstr "" | ||
3806 | |||
3807 | #: src/gns/gnunet-gns-helper-service-w32.c:602 | ||
3808 | msgid "Not ready to process requests, lacking ego data\n" | ||
3809 | msgstr "" | ||
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 |
3813 | msgid "Failed to connect to identity service\n" | 3943 | msgid "Failed to connect to identity service\n" |
3814 | msgstr "" | 3944 | msgstr "" |
3815 | 3945 | ||
3816 | #: src/gns/gnunet-gns-import.c:489 | 3946 | #: src/gns/gnunet-gns-import.c:452 |
3817 | msgid "This program will import some GNS authorities into your GNS namestore." | 3947 | msgid "This program will import some GNS authorities into your GNS namestore." |
3818 | msgstr "" | 3948 | msgstr "" |
3819 | 3949 | ||
@@ -3937,12 +4067,60 @@ msgstr "" | |||
3937 | msgid "GNUnet GNS proxy" | 4067 | msgid "GNUnet GNS proxy" |
3938 | msgstr "" | 4068 | msgstr "" |
3939 | 4069 | ||
4070 | #: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 | ||
4071 | #, c-format | ||
4072 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4073 | msgstr "" | ||
4074 | |||
4075 | #: src/gns/gnunet-gns.c:252 | ||
4076 | #, c-format | ||
4077 | msgid "Please specify name to lookup!\n" | ||
4078 | msgstr "" | ||
4079 | |||
4080 | #: src/gns/gnunet-gns.c:276 | ||
4081 | #, c-format | ||
4082 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4083 | msgstr "" | ||
4084 | |||
4085 | #: src/gns/gnunet-gns.c:374 | ||
4086 | #, c-format | ||
4087 | msgid "Public key `%s' is not well-formed\n" | ||
4088 | msgstr "" | ||
4089 | |||
4090 | #: src/gns/gnunet-gns.c:428 | ||
4091 | msgid "Lookup a record for the given name" | ||
4092 | msgstr "" | ||
4093 | |||
4094 | #: src/gns/gnunet-gns.c:434 | ||
4095 | msgid "Specify the type of the record to lookup" | ||
4096 | msgstr "" | ||
4097 | |||
4098 | #: src/gns/gnunet-gns.c:440 | ||
4099 | msgid "Specify timeout for the lookup" | ||
4100 | msgstr "" | ||
4101 | |||
4102 | #: src/gns/gnunet-gns.c:445 | ||
4103 | msgid "No unneeded output" | ||
4104 | msgstr "" | ||
4105 | |||
4106 | #: src/gns/gnunet-gns.c:451 | ||
4107 | msgid "Specify the public key of the zone to lookup the record in" | ||
4108 | msgstr "" | ||
4109 | |||
4110 | #: src/gns/gnunet-gns.c:457 | ||
4111 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4112 | msgstr "" | ||
4113 | |||
4114 | #: src/gns/gnunet-gns.c:476 | ||
4115 | msgid "GNUnet GNS resolver tool" | ||
4116 | msgstr "" | ||
4117 | |||
3940 | #: src/gns/gnunet-service-gns.c:442 | 4118 | #: src/gns/gnunet-service-gns.c:442 |
3941 | msgid "Failed to connect to the namecache!\n" | 4119 | msgid "Failed to connect to the namecache!\n" |
3942 | msgstr "" | 4120 | msgstr "" |
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 |
3946 | msgid "Could not connect to DHT!\n" | 4124 | msgid "Could not connect to DHT!\n" |
3947 | msgstr "" | 4125 | msgstr "" |
3948 | 4126 | ||
@@ -3997,44 +4175,35 @@ msgstr "" | |||
3997 | msgid "Hostname `%s' is not well-formed, resolution fails\n" | 4175 | msgid "Hostname `%s' is not well-formed, resolution fails\n" |
3998 | msgstr "" | 4176 | msgstr "" |
3999 | 4177 | ||
4000 | #: src/gns/plugin_gnsrecord_gns.c:203 | 4178 | #: src/gns/plugin_gnsrecord_gns.c:179 |
4001 | #, c-format | 4179 | #, c-format |
4002 | msgid "Unable to parse PKEY record `%s'\n" | 4180 | msgid "Unable to parse PKEY record `%s'\n" |
4003 | msgstr "" | 4181 | msgstr "" |
4004 | 4182 | ||
4005 | #: src/gns/plugin_gnsrecord_gns.c:232 | 4183 | #: src/gns/plugin_gnsrecord_gns.c:208 |
4006 | #, c-format | 4184 | #, c-format |
4007 | msgid "Unable to parse GNS2DNS record `%s'\n" | 4185 | msgid "Unable to parse GNS2DNS record `%s'\n" |
4008 | msgstr "" | 4186 | msgstr "" |
4009 | 4187 | ||
4010 | #: src/gns/plugin_gnsrecord_gns.c:253 | 4188 | #: src/gns/plugin_gnsrecord_gns.c:229 |
4011 | #, c-format | 4189 | #, c-format |
4012 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" | 4190 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" |
4013 | msgstr "" | 4191 | msgstr "" |
4014 | 4192 | ||
4015 | #: src/gns/plugin_gnsrecord_gns.c:276 | 4193 | #: src/gns/plugin_gnsrecord_gns.c:252 |
4016 | #, c-format | 4194 | #, c-format |
4017 | msgid "Unable to parse VPN record string `%s'\n" | 4195 | msgid "Unable to parse VPN record string `%s'\n" |
4018 | msgstr "" | 4196 | msgstr "" |
4019 | 4197 | ||
4020 | #: src/gns/plugin_gnsrecord_gns.c:312 | 4198 | #: src/gns/plugin_gnsrecord_gns.c:288 |
4021 | #, c-format | 4199 | #, c-format |
4022 | msgid "Unable to parse BOX record string `%s'\n" | 4200 | msgid "Unable to parse BOX record string `%s'\n" |
4023 | msgstr "" | 4201 | msgstr "" |
4024 | 4202 | ||
4025 | #: src/gns/plugin_gnsrecord_gns.c:360 | ||
4026 | #, c-format | ||
4027 | msgid "Unable to parse REVERSE record string `%s'\n" | ||
4028 | msgstr "" | ||
4029 | |||
4030 | #: src/gns/plugin_rest_gns.c:384 | 4203 | #: src/gns/plugin_rest_gns.c:384 |
4031 | msgid "Ego for not found, cannot perform lookup.\n" | 4204 | msgid "Ego for not found, cannot perform lookup.\n" |
4032 | msgstr "" | 4205 | msgstr "" |
4033 | 4206 | ||
4034 | #: src/gns/plugin_rest_gns.c:668 | ||
4035 | msgid "GNS REST API initialized\n" | ||
4036 | msgstr "" | ||
4037 | |||
4038 | #: src/gnsrecord/plugin_gnsrecord_dns.c:359 | 4207 | #: src/gnsrecord/plugin_gnsrecord_dns.c:359 |
4039 | #, c-format | 4208 | #, c-format |
4040 | msgid "Unable to parse IPv4 address `%s'\n" | 4209 | msgid "Unable to parse IPv4 address `%s'\n" |
@@ -4454,6 +4623,51 @@ msgstr "" | |||
4454 | msgid "Could not start hostlist HTTP server on port %u\n" | 4623 | msgid "Could not start hostlist HTTP server on port %u\n" |
4455 | msgstr "" | 4624 | msgstr "" |
4456 | 4625 | ||
4626 | #: src/identity-provider/gnunet-idp.c:348 | ||
4627 | msgid "Ego is required\n" | ||
4628 | msgstr "" | ||
4629 | |||
4630 | #: src/identity-provider/gnunet-idp.c:370 | ||
4631 | msgid "Add attribute" | ||
4632 | msgstr "" | ||
4633 | |||
4634 | #: src/identity-provider/gnunet-idp.c:376 | ||
4635 | msgid "Attribute value" | ||
4636 | msgstr "" | ||
4637 | |||
4638 | #: src/identity-provider/gnunet-idp.c:381 | ||
4639 | msgid "Ego" | ||
4640 | msgstr "" | ||
4641 | |||
4642 | #: src/identity-provider/gnunet-idp.c:386 | ||
4643 | msgid "Audience (relying party)" | ||
4644 | msgstr "" | ||
4645 | |||
4646 | #: src/identity-provider/gnunet-idp.c:390 | ||
4647 | msgid "List attributes for Ego" | ||
4648 | msgstr "" | ||
4649 | |||
4650 | #: src/identity-provider/gnunet-idp.c:395 | ||
4651 | msgid "Issue a ticket" | ||
4652 | msgstr "" | ||
4653 | |||
4654 | #: src/identity-provider/gnunet-idp.c:400 | ||
4655 | msgid "Consume a ticket" | ||
4656 | msgstr "" | ||
4657 | |||
4658 | #: src/identity-provider/gnunet-idp.c:405 | ||
4659 | msgid "Revoke a ticket" | ||
4660 | msgstr "" | ||
4661 | |||
4662 | #: src/identity-provider/identity_provider_api.c:429 | ||
4663 | #, fuzzy | ||
4664 | msgid "failed to store record\n" | ||
4665 | msgstr "Échec du démarrage de %s\n" | ||
4666 | |||
4667 | #: src/identity-provider/plugin_rest_identity_provider.c:1175 | ||
4668 | msgid "Identity Provider REST API initialized\n" | ||
4669 | msgstr "" | ||
4670 | |||
4457 | #: src/identity/gnunet-identity.c:179 | 4671 | #: src/identity/gnunet-identity.c:179 |
4458 | #, c-format | 4672 | #, c-format |
4459 | msgid "Failed to create ego: %s\n" | 4673 | msgid "Failed to create ego: %s\n" |
@@ -4541,31 +4755,10 @@ msgstr "" | |||
4541 | msgid "Failed to create directory `%s' for storing egos\n" | 4755 | msgid "Failed to create directory `%s' for storing egos\n" |
4542 | msgstr "" | 4756 | msgstr "" |
4543 | 4757 | ||
4544 | #: src/identity/plugin_rest_identity.c:967 | 4758 | #: src/identity/plugin_rest_identity.c:964 |
4545 | msgid "Identity REST API initialized\n" | 4759 | msgid "Identity REST API initialized\n" |
4546 | msgstr "" | 4760 | msgstr "" |
4547 | 4761 | ||
4548 | #: src/identity-provider/gnunet-identity-token.c:66 | ||
4549 | msgid "Option `-t' is required\n" | ||
4550 | msgstr "" | ||
4551 | |||
4552 | #: src/identity-provider/gnunet-identity-token.c:77 | ||
4553 | #, c-format | ||
4554 | msgid "Token `%s' is malformed\n" | ||
4555 | msgstr "" | ||
4556 | |||
4557 | #: src/identity-provider/gnunet-identity-token.c:166 | ||
4558 | msgid "GNUid token" | ||
4559 | msgstr "" | ||
4560 | |||
4561 | #: src/identity-provider/gnunet-identity-token.c:171 | ||
4562 | msgid "Print token contents" | ||
4563 | msgstr "" | ||
4564 | |||
4565 | #: src/identity-provider/plugin_rest_identity_provider.c:1166 | ||
4566 | msgid "Identity Token REST API initialized\n" | ||
4567 | msgstr "" | ||
4568 | |||
4569 | #: src/json/json.c:119 | 4762 | #: src/json/json.c:119 |
4570 | #, fuzzy, c-format | 4763 | #, fuzzy, c-format |
4571 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" | 4764 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" |
@@ -4663,9 +4856,62 @@ msgstr "Résolution de « %s » échouée\n" | |||
4663 | msgid "flat plugin running\n" | 4856 | msgid "flat plugin running\n" |
4664 | msgstr "" | 4857 | msgstr "" |
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 |
4668 | msgid "Failed to create indices\n" | 4861 | msgid "Unsupported form value `%s'\n" |
4862 | msgstr "" | ||
4863 | |||
4864 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
4865 | #, c-format | ||
4866 | msgid "Failed to create record for domain `%s': %s\n" | ||
4867 | msgstr "" | ||
4868 | |||
4869 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
4870 | msgid "Error when mapping zone to name\n" | ||
4871 | msgstr "" | ||
4872 | |||
4873 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
4874 | #, c-format | ||
4875 | msgid "Found existing name `%s' for the given key\n" | ||
4876 | msgstr "" | ||
4877 | |||
4878 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
4879 | #, c-format | ||
4880 | msgid "Found %u existing records for domain `%s'\n" | ||
4881 | msgstr "" | ||
4882 | |||
4883 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
4884 | #, c-format | ||
4885 | msgid "Failed to create page for `%s'\n" | ||
4886 | msgstr "" | ||
4887 | |||
4888 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
4889 | #, c-format | ||
4890 | msgid "Failed to setup post processor for `%s'\n" | ||
4891 | msgstr "" | ||
4892 | |||
4893 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
4894 | msgid "Domain name must not contain `.'\n" | ||
4895 | msgstr "" | ||
4896 | |||
4897 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
4898 | msgid "Domain name must not contain `+'\n" | ||
4899 | msgstr "" | ||
4900 | |||
4901 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
4902 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
4903 | msgstr "" | ||
4904 | |||
4905 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
4906 | msgid "Failed to start HTTP server\n" | ||
4907 | msgstr "" | ||
4908 | |||
4909 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
4910 | msgid "Failed to connect to identity\n" | ||
4911 | msgstr "" | ||
4912 | |||
4913 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
4914 | msgid "GNU Name System First Come First Serve name registration service" | ||
4669 | msgstr "" | 4915 | msgstr "" |
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" | |||
4674 | msgstr "" | 4920 | msgstr "" |
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 |
4679 | msgid "Deleting record failed, record does not exist%s%s\n" | 4925 | msgid "Deleting record failed, record does not exist%s%s\n" |
4680 | msgstr "" | 4926 | msgstr "" |
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 |
4685 | msgid "Deleting record failed%s%s\n" | 4931 | msgid "Deleting record failed%s%s\n" |
4686 | msgstr "" | 4932 | msgstr "" |
@@ -4698,7 +4944,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n" | |||
4698 | msgstr "" | 4944 | msgstr "" |
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 |
4703 | msgid "There are no records under label `%s' that could be deleted.\n" | 4949 | msgid "There are no records under label `%s' that could be deleted.\n" |
4704 | msgstr "" | 4950 | msgstr "" |
@@ -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" |
4710 | msgstr "" | 4956 | msgstr "" |
4711 | 4957 | ||
4712 | #: src/namestore/gnunet-namestore.c:776 | ||
4713 | #: src/namestore/plugin_rest_namestore.c:1004 | ||
4714 | #, c-format | ||
4715 | msgid "Ego `%s' not known to identity service\n" | ||
4716 | msgstr "" | ||
4717 | |||
4718 | #: src/namestore/gnunet-namestore.c:791 | 4958 | #: src/namestore/gnunet-namestore.c:791 |
4719 | #, c-format | 4959 | #, c-format |
4720 | msgid "No options given\n" | 4960 | msgid "No options given\n" |
4721 | msgstr "" | 4961 | msgstr "" |
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 | ||
4726 | msgid "Failed to connect to namestore\n" | ||
4727 | msgstr "" | ||
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" | |||
4739 | msgstr "ajouter" | 4973 | msgstr "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 |
4744 | msgid "Unsupported type `%s'\n" | 4978 | msgid "Unsupported type `%s'\n" |
4745 | msgstr "" | 4979 | msgstr "" |
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 |
4751 | msgid "Value `%s' invalid for record type `%s'\n" | 4985 | msgid "Value `%s' invalid for record type `%s'\n" |
4752 | msgstr "" | 4986 | msgstr "" |
@@ -4765,8 +4999,7 @@ msgstr "supprimer" | |||
4765 | msgid "Invalid public key for reverse lookup `%s'\n" | 4999 | msgid "Invalid public key for reverse lookup `%s'\n" |
4766 | msgstr "" | 5000 | msgstr "" |
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 |
4771 | msgid "Invalid URI `%s'\n" | 5004 | msgid "Invalid URI `%s'\n" |
4772 | msgstr "URI invalide « %s »\n" | 5005 | msgstr "URI invalide « %s »\n" |
@@ -4777,13 +5010,13 @@ msgid "Invalid nick `%s'\n" | |||
4777 | msgstr "" | 5010 | msgstr "" |
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 |
4782 | msgid "No default ego configured in identity service\n" | 5015 | msgid "No default ego configured in identity service\n" |
4783 | msgstr "" | 5016 | msgstr "" |
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 |
4788 | msgid "Cannot connect to identity service\n" | 5021 | msgid "Cannot connect to identity service\n" |
4789 | msgstr "" | 5022 | msgstr "" |
@@ -4843,65 +5076,7 @@ msgstr "" | |||
4843 | msgid "name of the ego controlling the zone" | 5076 | msgid "name of the ego controlling the zone" |
4844 | msgstr "" | 5077 | msgstr "" |
4845 | 5078 | ||
4846 | #: src/namestore/gnunet-namestore-fcfsd.c:508 | 5079 | #: src/namestore/gnunet-service-namestore.c:615 |
4847 | #, c-format | ||
4848 | msgid "Unsupported form value `%s'\n" | ||
4849 | msgstr "" | ||
4850 | |||
4851 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
4852 | #, c-format | ||
4853 | msgid "Failed to create record for domain `%s': %s\n" | ||
4854 | msgstr "" | ||
4855 | |||
4856 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
4857 | msgid "Error when mapping zone to name\n" | ||
4858 | msgstr "" | ||
4859 | |||
4860 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
4861 | #, c-format | ||
4862 | msgid "Found existing name `%s' for the given key\n" | ||
4863 | msgstr "" | ||
4864 | |||
4865 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
4866 | #, c-format | ||
4867 | msgid "Found %u existing records for domain `%s'\n" | ||
4868 | msgstr "" | ||
4869 | |||
4870 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
4871 | #, c-format | ||
4872 | msgid "Failed to create page for `%s'\n" | ||
4873 | msgstr "" | ||
4874 | |||
4875 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
4876 | #, c-format | ||
4877 | msgid "Failed to setup post processor for `%s'\n" | ||
4878 | msgstr "" | ||
4879 | |||
4880 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
4881 | msgid "Domain name must not contain `.'\n" | ||
4882 | msgstr "" | ||
4883 | |||
4884 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
4885 | msgid "Domain name must not contain `+'\n" | ||
4886 | msgstr "" | ||
4887 | |||
4888 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
4889 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
4890 | msgstr "" | ||
4891 | |||
4892 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
4893 | msgid "Failed to start HTTP server\n" | ||
4894 | msgstr "" | ||
4895 | |||
4896 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
4897 | msgid "Failed to connect to identity\n" | ||
4898 | msgstr "" | ||
4899 | |||
4900 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
4901 | msgid "GNU Name System First Come First Serve name registration service" | ||
4902 | msgstr "" | ||
4903 | |||
4904 | #: src/namestore/gnunet-service-namestore.c:612 | ||
4905 | #, c-format | 5080 | #, c-format |
4906 | msgid "Failed to replicate block in namecache: %s\n" | 5081 | msgid "Failed to replicate block in namecache: %s\n" |
4907 | msgstr "" | 5082 | msgstr "" |
@@ -4914,7 +5089,7 @@ msgstr "" | |||
4914 | msgid "flat file database running\n" | 5089 | msgid "flat file database running\n" |
4915 | msgstr "" | 5090 | msgstr "" |
4916 | 5091 | ||
4917 | #: src/namestore/plugin_rest_namestore.c:1188 | 5092 | #: src/namestore/plugin_rest_namestore.c:1193 |
4918 | msgid "Namestore REST API initialized\n" | 5093 | msgid "Namestore REST API initialized\n" |
4919 | msgstr "" | 5094 | msgstr "" |
4920 | 5095 | ||
@@ -5189,10 +5364,6 @@ msgstr "" | |||
5189 | msgid "`upnpc' command not found\n" | 5364 | msgid "`upnpc' command not found\n" |
5190 | msgstr "" | 5365 | msgstr "" |
5191 | 5366 | ||
5192 | #: src/nse/gnunet-nse.c:122 | ||
5193 | msgid "Show network size estimates from NSE service." | ||
5194 | msgstr "" | ||
5195 | |||
5196 | #: src/nse/gnunet-nse-profiler.c:842 | 5367 | #: src/nse/gnunet-nse-profiler.c:842 |
5197 | msgid "limit to the number of connections to NSE services, 0 for none" | 5368 | msgid "limit to the number of connections to NSE services, 0 for none" |
5198 | msgstr "" | 5369 | msgstr "" |
@@ -5217,65 +5388,15 @@ msgstr "" | |||
5217 | msgid "Measure quality and performance of the NSE service." | 5388 | msgid "Measure quality and performance of the NSE service." |
5218 | msgstr "" | 5389 | msgstr "" |
5219 | 5390 | ||
5391 | #: src/nse/gnunet-nse.c:122 | ||
5392 | msgid "Show network size estimates from NSE service." | ||
5393 | msgstr "" | ||
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 |
5222 | msgid "Value is too large.\n" | 5397 | msgid "Value is too large.\n" |
5223 | msgstr "" | 5398 | msgstr "" |
5224 | 5399 | ||
5225 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5226 | #, c-format | ||
5227 | msgid "Removing expired address of transport `%s'\n" | ||
5228 | msgstr "" | ||
5229 | |||
5230 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5231 | #, c-format | ||
5232 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5233 | msgstr "" | ||
5234 | |||
5235 | #: src/peerinfo/gnunet-service-peerinfo.c:331 | ||
5236 | #: src/peerinfo/gnunet-service-peerinfo.c:362 | ||
5237 | #, c-format | ||
5238 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5239 | msgstr "" | ||
5240 | |||
5241 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5242 | msgid "# peers known" | ||
5243 | msgstr "" | ||
5244 | |||
5245 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5246 | #, c-format | ||
5247 | msgid "" | ||
5248 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5249 | msgstr "" | ||
5250 | |||
5251 | #: src/peerinfo/gnunet-service-peerinfo.c:655 | ||
5252 | #, c-format | ||
5253 | msgid "Scanning directory `%s'\n" | ||
5254 | msgstr "" | ||
5255 | |||
5256 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5257 | #, c-format | ||
5258 | msgid "Still no peers found in `%s'!\n" | ||
5259 | msgstr "" | ||
5260 | |||
5261 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5262 | #, c-format | ||
5263 | msgid "Cleaning up directory `%s'\n" | ||
5264 | msgstr "" | ||
5265 | |||
5266 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5267 | #, c-format | ||
5268 | msgid "Importing HELLOs from `%s'\n" | ||
5269 | msgstr "" | ||
5270 | |||
5271 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5272 | msgid "Skipping import of included HELLOs\n" | ||
5273 | msgstr "" | ||
5274 | |||
5275 | #: src/peerinfo/peerinfo_api.c:220 | ||
5276 | msgid "Failed to receive response from `PEERINFO' service." | ||
5277 | msgstr "" | ||
5278 | |||
5279 | #: src/peerinfo-tool/gnunet-peerinfo.c:239 | 5400 | #: src/peerinfo-tool/gnunet-peerinfo.c:239 |
5280 | #, c-format | 5401 | #, c-format |
5281 | msgid "%sPeer `%s'\n" | 5402 | msgid "%sPeer `%s'\n" |
@@ -5365,6 +5486,60 @@ msgstr "" | |||
5365 | msgid "Failed to load transport plugin for `%s'\n" | 5486 | msgid "Failed to load transport plugin for `%s'\n" |
5366 | msgstr "" | 5487 | msgstr "" |
5367 | 5488 | ||
5489 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5490 | #, c-format | ||
5491 | msgid "Removing expired address of transport `%s'\n" | ||
5492 | msgstr "" | ||
5493 | |||
5494 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5495 | #, c-format | ||
5496 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5497 | msgstr "" | ||
5498 | |||
5499 | #: src/peerinfo/gnunet-service-peerinfo.c:331 | ||
5500 | #: src/peerinfo/gnunet-service-peerinfo.c:362 | ||
5501 | #, c-format | ||
5502 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5503 | msgstr "" | ||
5504 | |||
5505 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5506 | msgid "# peers known" | ||
5507 | msgstr "" | ||
5508 | |||
5509 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5510 | #, c-format | ||
5511 | msgid "" | ||
5512 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5513 | msgstr "" | ||
5514 | |||
5515 | #: src/peerinfo/gnunet-service-peerinfo.c:655 | ||
5516 | #, c-format | ||
5517 | msgid "Scanning directory `%s'\n" | ||
5518 | msgstr "" | ||
5519 | |||
5520 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5521 | #, c-format | ||
5522 | msgid "Still no peers found in `%s'!\n" | ||
5523 | msgstr "" | ||
5524 | |||
5525 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5526 | #, c-format | ||
5527 | msgid "Cleaning up directory `%s'\n" | ||
5528 | msgstr "" | ||
5529 | |||
5530 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5531 | #, c-format | ||
5532 | msgid "Importing HELLOs from `%s'\n" | ||
5533 | msgstr "" | ||
5534 | |||
5535 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5536 | msgid "Skipping import of included HELLOs\n" | ||
5537 | msgstr "" | ||
5538 | |||
5539 | #: src/peerinfo/peerinfo_api.c:220 | ||
5540 | msgid "Failed to receive response from `PEERINFO' service." | ||
5541 | msgstr "" | ||
5542 | |||
5368 | #: src/peerstore/gnunet-peerstore.c:91 | 5543 | #: src/peerstore/gnunet-peerstore.c:91 |
5369 | msgid "peerstore" | 5544 | msgid "peerstore" |
5370 | msgstr "" | 5545 | msgstr "" |
@@ -5412,16 +5587,11 @@ msgstr "" | |||
5412 | msgid "Unable to create indices: %s.\n" | 5587 | msgid "Unable to create indices: %s.\n" |
5413 | msgstr "" | 5588 | msgstr "" |
5414 | 5589 | ||
5415 | #: src/postgres/postgres.c:67 | 5590 | #: src/pq/pq_prepare.c:80 |
5416 | #, c-format | 5591 | #, c-format |
5417 | msgid "`%s:%s' failed at %s:%d with error: %s\n" | 5592 | msgid "PQprepare (`%s' as `%s') failed with error: %s\n" |
5418 | msgstr "" | 5593 | msgstr "" |
5419 | 5594 | ||
5420 | #: src/postgres/postgres.c:192 | ||
5421 | #, fuzzy, c-format | ||
5422 | msgid "Unable to connect to Postgres database '%s': %s\n" | ||
5423 | msgstr "Résolution de « %s » échouée\n" | ||
5424 | |||
5425 | #: src/psycstore/gnunet-service-psycstore.c:249 | 5595 | #: src/psycstore/gnunet-service-psycstore.c:249 |
5426 | msgid "Failed to store membership information!\n" | 5596 | msgid "Failed to store membership information!\n" |
5427 | msgstr "" | 5597 | msgstr "" |
@@ -5580,56 +5750,56 @@ msgstr "" | |||
5580 | msgid "Daemon to announce regular expressions for the peer using cadet." | 5750 | msgid "Daemon to announce regular expressions for the peer using cadet." |
5581 | msgstr "" | 5751 | msgstr "" |
5582 | 5752 | ||
5583 | #: src/regex/gnunet-regex-profiler.c:1314 | 5753 | #: src/regex/gnunet-regex-profiler.c:1386 |
5584 | msgid "No configuration file given. Exiting\n" | 5754 | msgid "No configuration file given. Exiting\n" |
5585 | msgstr "" | 5755 | msgstr "" |
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 |
5590 | msgid "No policy directory specified on command line. Exiting.\n" | 5760 | msgid "No policy directory specified on command line. Exiting.\n" |
5591 | msgstr "" | 5761 | msgstr "" |
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 |
5596 | msgid "Specified policies directory does not exist. Exiting.\n" | 5766 | msgid "Specified policies directory does not exist. Exiting.\n" |
5597 | msgstr "" | 5767 | msgstr "" |
5598 | 5768 | ||
5599 | #: src/regex/gnunet-regex-profiler.c:1368 | 5769 | #: src/regex/gnunet-regex-profiler.c:1440 |
5600 | #, c-format | 5770 | #, c-format |
5601 | msgid "No files found in `%s'\n" | 5771 | msgid "No files found in `%s'\n" |
5602 | msgstr "" | 5772 | msgstr "" |
5603 | 5773 | ||
5604 | #: src/regex/gnunet-regex-profiler.c:1377 | 5774 | #: src/regex/gnunet-regex-profiler.c:1449 |
5605 | msgid "No search strings file given. Exiting.\n" | 5775 | msgid "No search strings file given. Exiting.\n" |
5606 | msgstr "" | 5776 | msgstr "" |
5607 | 5777 | ||
5608 | #: src/regex/gnunet-regex-profiler.c:1397 | 5778 | #: src/regex/gnunet-regex-profiler.c:1469 |
5609 | msgid "Error loading search strings. Exiting.\n" | 5779 | msgid "Error loading search strings. Exiting.\n" |
5610 | msgstr "" | 5780 | msgstr "" |
5611 | 5781 | ||
5612 | #: src/regex/gnunet-regex-profiler.c:1485 | 5782 | #: src/regex/gnunet-regex-profiler.c:1557 |
5613 | msgid "name of the file for writing statistics" | 5783 | msgid "name of the file for writing statistics" |
5614 | msgstr "" | 5784 | msgstr "" |
5615 | 5785 | ||
5616 | #: src/regex/gnunet-regex-profiler.c:1491 | 5786 | #: src/regex/gnunet-regex-profiler.c:1563 |
5617 | msgid "wait TIMEOUT before ending the experiment" | 5787 | msgid "wait TIMEOUT before ending the experiment" |
5618 | msgstr "" | 5788 | msgstr "" |
5619 | 5789 | ||
5620 | #: src/regex/gnunet-regex-profiler.c:1497 | 5790 | #: src/regex/gnunet-regex-profiler.c:1569 |
5621 | msgid "directory with policy files" | 5791 | msgid "directory with policy files" |
5622 | msgstr "" | 5792 | msgstr "" |
5623 | 5793 | ||
5624 | #: src/regex/gnunet-regex-profiler.c:1504 | 5794 | #: src/regex/gnunet-regex-profiler.c:1576 |
5625 | msgid "name of file with input strings" | 5795 | msgid "name of file with input strings" |
5626 | msgstr "" | 5796 | msgstr "" |
5627 | 5797 | ||
5628 | #: src/regex/gnunet-regex-profiler.c:1510 | 5798 | #: src/regex/gnunet-regex-profiler.c:1582 |
5629 | msgid "name of file with hosts' names" | 5799 | msgid "name of file with hosts' names" |
5630 | msgstr "" | 5800 | msgstr "" |
5631 | 5801 | ||
5632 | #: src/regex/gnunet-regex-profiler.c:1523 | 5802 | #: src/regex/gnunet-regex-profiler.c:1595 |
5633 | msgid "Profiler for regex" | 5803 | msgid "Profiler for regex" |
5634 | msgstr "" | 5804 | msgstr "" |
5635 | 5805 | ||
@@ -5851,10 +6021,10 @@ msgstr "" | |||
5851 | msgid "Calculate the Vectorproduct with a GNUnet peer." | 6021 | msgid "Calculate the Vectorproduct with a GNUnet peer." |
5852 | msgstr "" | 6022 | msgstr "" |
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 | ||
5858 | msgid "Connect to CADET failed\n" | 6028 | msgid "Connect to CADET failed\n" |
5859 | msgstr "" | 6029 | msgstr "" |
5860 | 6030 | ||
@@ -5878,7 +6048,7 @@ msgstr "threshold" | |||
5878 | msgid "also profile decryption" | 6048 | msgid "also profile decryption" |
5879 | msgstr "" | 6049 | msgstr "" |
5880 | 6050 | ||
5881 | #: src/set/gnunet-service-set.c:1948 | 6051 | #: src/set/gnunet-service-set.c:1989 |
5882 | #, fuzzy | 6052 | #, fuzzy |
5883 | msgid "Could not connect to CADET service\n" | 6053 | msgid "Could not connect to CADET service\n" |
5884 | msgstr "Impossible d’ouvrir « %s ».\n" | 6054 | msgstr "Impossible d’ouvrir « %s ».\n" |
@@ -5935,112 +6105,112 @@ msgstr "" | |||
5935 | msgid "say good-bye and leave somebody else's place" | 6105 | msgid "say good-bye and leave somebody else's place" |
5936 | msgstr "" | 6106 | msgstr "" |
5937 | 6107 | ||
5938 | #: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 | 6108 | #: src/social/gnunet-social.c:1227 |
5939 | msgid "create a place" | 6109 | msgid "create a place" |
5940 | msgstr "" | 6110 | msgstr "" |
5941 | 6111 | ||
5942 | #: src/social/gnunet-social.c:1237 | 6112 | #: src/social/gnunet-social.c:1232 |
5943 | msgid "destroy a place we were hosting" | 6113 | msgid "destroy a place we were hosting" |
5944 | msgstr "" | 6114 | msgstr "" |
5945 | 6115 | ||
5946 | #: src/social/gnunet-social.c:1242 | 6116 | #: src/social/gnunet-social.c:1237 |
5947 | msgid "enter somebody else's place" | 6117 | msgid "enter somebody else's place" |
5948 | msgstr "" | 6118 | msgstr "" |
5949 | 6119 | ||
5950 | #: src/social/gnunet-social.c:1248 | 6120 | #: src/social/gnunet-social.c:1243 |
5951 | msgid "find state matching name prefix" | 6121 | msgid "find state matching name prefix" |
5952 | msgstr "" | 6122 | msgstr "" |
5953 | 6123 | ||
5954 | #: src/social/gnunet-social.c:1253 | 6124 | #: src/social/gnunet-social.c:1248 |
5955 | msgid "replay history of messages up to the given --limit" | 6125 | msgid "replay history of messages up to the given --limit" |
5956 | msgstr "" | 6126 | msgstr "" |
5957 | 6127 | ||
5958 | #: src/social/gnunet-social.c:1258 | 6128 | #: src/social/gnunet-social.c:1253 |
5959 | msgid "reconnect to a previously created place" | 6129 | msgid "reconnect to a previously created place" |
5960 | msgstr "" | 6130 | msgstr "" |
5961 | 6131 | ||
5962 | #: src/social/gnunet-social.c:1263 | 6132 | #: src/social/gnunet-social.c:1258 |
5963 | msgid "publish something to a place we are hosting" | 6133 | msgid "publish something to a place we are hosting" |
5964 | msgstr "" | 6134 | msgstr "" |
5965 | 6135 | ||
5966 | #: src/social/gnunet-social.c:1268 | 6136 | #: src/social/gnunet-social.c:1263 |
5967 | msgid "reconnect to a previously entered place" | 6137 | msgid "reconnect to a previously entered place" |
5968 | msgstr "" | 6138 | msgstr "" |
5969 | 6139 | ||
5970 | #: src/social/gnunet-social.c:1273 | 6140 | #: src/social/gnunet-social.c:1268 |
5971 | msgid "search for state matching exact name" | 6141 | msgid "search for state matching exact name" |
5972 | msgstr "" | 6142 | msgstr "" |
5973 | 6143 | ||
5974 | #: src/social/gnunet-social.c:1278 | 6144 | #: src/social/gnunet-social.c:1273 |
5975 | msgid "submit something to somebody's place" | 6145 | msgid "submit something to somebody's place" |
5976 | msgstr "" | 6146 | msgstr "" |
5977 | 6147 | ||
5978 | #: src/social/gnunet-social.c:1283 | 6148 | #: src/social/gnunet-social.c:1278 |
5979 | msgid "list of egos and subscribed places" | 6149 | msgid "list of egos and subscribed places" |
5980 | msgstr "" | 6150 | msgstr "" |
5981 | 6151 | ||
5982 | #: src/social/gnunet-social.c:1288 | 6152 | #: src/social/gnunet-social.c:1283 |
5983 | msgid "extract and replay history between message IDs --start and --until" | 6153 | msgid "extract and replay history between message IDs --start and --until" |
5984 | msgstr "" | 6154 | msgstr "" |
5985 | 6155 | ||
5986 | #: src/social/gnunet-social.c:1297 | 6156 | #: src/social/gnunet-social.c:1292 |
5987 | msgid "application ID to use when connecting" | 6157 | msgid "application ID to use when connecting" |
5988 | msgstr "" | 6158 | msgstr "" |
5989 | 6159 | ||
5990 | #: src/social/gnunet-social.c:1303 | 6160 | #: src/social/gnunet-social.c:1298 |
5991 | msgid "message body or state value" | 6161 | msgid "message body or state value" |
5992 | msgstr "" | 6162 | msgstr "" |
5993 | 6163 | ||
5994 | #: src/social/gnunet-social.c:1309 | 6164 | #: src/social/gnunet-social.c:1304 |
5995 | msgid "name or public key of ego" | 6165 | msgid "name or public key of ego" |
5996 | msgstr "" | 6166 | msgstr "" |
5997 | 6167 | ||
5998 | #: src/social/gnunet-social.c:1314 | 6168 | #: src/social/gnunet-social.c:1309 |
5999 | msgid "wait for incoming messages" | 6169 | msgid "wait for incoming messages" |
6000 | msgstr "" | 6170 | msgstr "" |
6001 | 6171 | ||
6002 | #: src/social/gnunet-social.c:1320 | 6172 | #: src/social/gnunet-social.c:1315 |
6003 | msgid "GNS name" | 6173 | msgid "GNS name" |
6004 | msgstr "" | 6174 | msgstr "" |
6005 | 6175 | ||
6006 | #: src/social/gnunet-social.c:1326 | 6176 | #: src/social/gnunet-social.c:1321 |
6007 | msgid "peer ID for --guest-enter" | 6177 | msgid "peer ID for --guest-enter" |
6008 | msgstr "" | 6178 | msgstr "" |
6009 | 6179 | ||
6010 | #: src/social/gnunet-social.c:1332 | 6180 | #: src/social/gnunet-social.c:1327 |
6011 | msgid "name (key) to query from state" | 6181 | msgid "name (key) to query from state" |
6012 | msgstr "" | 6182 | msgstr "" |
6013 | 6183 | ||
6014 | #: src/social/gnunet-social.c:1338 | 6184 | #: src/social/gnunet-social.c:1333 |
6015 | msgid "method name" | 6185 | msgid "method name" |
6016 | msgstr "" | 6186 | msgstr "" |
6017 | 6187 | ||
6018 | #: src/social/gnunet-social.c:1344 | 6188 | #: src/social/gnunet-social.c:1339 |
6019 | #, fuzzy | 6189 | #, fuzzy |
6020 | msgid "number of messages to replay from history" | 6190 | msgid "number of messages to replay from history" |
6021 | msgstr "nombre de valeurs" | 6191 | msgstr "nombre de valeurs" |
6022 | 6192 | ||
6023 | #: src/social/gnunet-social.c:1350 | 6193 | #: src/social/gnunet-social.c:1345 |
6024 | msgid "key address of place" | 6194 | msgid "key address of place" |
6025 | msgstr "" | 6195 | msgstr "" |
6026 | 6196 | ||
6027 | #: src/social/gnunet-social.c:1356 | 6197 | #: src/social/gnunet-social.c:1351 |
6028 | msgid "start message ID for history replay" | 6198 | msgid "start message ID for history replay" |
6029 | msgstr "" | 6199 | msgstr "" |
6030 | 6200 | ||
6031 | #: src/social/gnunet-social.c:1361 | 6201 | #: src/social/gnunet-social.c:1356 |
6032 | msgid "respond to entry requests by admitting all guests" | 6202 | msgid "respond to entry requests by admitting all guests" |
6033 | msgstr "" | 6203 | msgstr "" |
6034 | 6204 | ||
6035 | #: src/social/gnunet-social.c:1367 | 6205 | #: src/social/gnunet-social.c:1362 |
6036 | msgid "end message ID for history replay" | 6206 | msgid "end message ID for history replay" |
6037 | msgstr "" | 6207 | msgstr "" |
6038 | 6208 | ||
6039 | #: src/social/gnunet-social.c:1372 | 6209 | #: src/social/gnunet-social.c:1367 |
6040 | msgid "respond to entry requests by refusing all guests" | 6210 | msgid "respond to entry requests by refusing all guests" |
6041 | msgstr "" | 6211 | msgstr "" |
6042 | 6212 | ||
6043 | #: src/social/gnunet-social.c:1382 | 6213 | #: src/social/gnunet-social.c:1377 |
6044 | msgid "" | 6214 | msgid "" |
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 "" | |||
6230 | msgstr "" | 6400 | msgstr "" |
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 |
6235 | msgid "Incorrect hostkey file format: %s\n" | 6405 | msgid "Incorrect hostkey file format: %s\n" |
6236 | msgstr "" | 6406 | msgstr "" |
@@ -6300,15 +6470,6 @@ msgstr "" | |||
6300 | msgid "%.s Unknown result code." | 6470 | msgid "%.s Unknown result code." |
6301 | msgstr "%.s Code d'erreur inconnu" | 6471 | msgstr "%.s Code d'erreur inconnu" |
6302 | 6472 | ||
6303 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6304 | msgid "Waiting for child to exit.\n" | ||
6305 | msgstr "" | ||
6306 | |||
6307 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6308 | #, c-format | ||
6309 | msgid "Spawning process `%s'\n" | ||
6310 | msgstr "" | ||
6311 | |||
6312 | #: src/testbed/gnunet-testbed-profiler.c:290 | 6473 | #: src/testbed/gnunet-testbed-profiler.c:290 |
6313 | msgid "tolerate COUNT number of continious timeout failures" | 6474 | msgid "tolerate COUNT number of continious timeout failures" |
6314 | msgstr "" | 6475 | msgstr "" |
@@ -6320,6 +6481,15 @@ msgid "" | |||
6320 | "signal is received" | 6481 | "signal is received" |
6321 | msgstr "" | 6482 | msgstr "" |
6322 | 6483 | ||
6484 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6485 | msgid "Waiting for child to exit.\n" | ||
6486 | msgstr "" | ||
6487 | |||
6488 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6489 | #, c-format | ||
6490 | msgid "Spawning process `%s'\n" | ||
6491 | msgstr "" | ||
6492 | |||
6323 | #: src/testbed/testbed_api.c:410 | 6493 | #: src/testbed/testbed_api.c:410 |
6324 | #, c-format | 6494 | #, c-format |
6325 | msgid "Adding host %u failed with error: %s\n" | 6495 | msgid "Adding host %u failed with error: %s\n" |
@@ -6607,10 +6777,6 @@ msgstr "" | |||
6607 | msgid "GNUnet topology control" | 6777 | msgid "GNUnet topology control" |
6608 | msgstr "" | 6778 | msgstr "" |
6609 | 6779 | ||
6610 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
6611 | msgid "# Addresses given to ATS" | ||
6612 | msgstr "" | ||
6613 | |||
6614 | #: src/transport/gnunet-service-transport.c:448 | 6780 | #: src/transport/gnunet-service-transport.c:448 |
6615 | msgid "# messages dropped due to slow client" | 6781 | msgid "# messages dropped due to slow client" |
6616 | msgstr "" | 6782 | msgstr "" |
@@ -6655,6 +6821,10 @@ msgstr "" | |||
6655 | msgid "Transport service is lacking key configuration settings. Exiting.\n" | 6821 | msgid "Transport service is lacking key configuration settings. Exiting.\n" |
6656 | msgstr "" | 6822 | msgstr "" |
6657 | 6823 | ||
6824 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
6825 | msgid "# Addresses given to ATS" | ||
6826 | msgstr "" | ||
6827 | |||
6658 | #: src/transport/gnunet-service-transport_hello.c:195 | 6828 | #: src/transport/gnunet-service-transport_hello.c:195 |
6659 | msgid "# refreshed my HELLO" | 6829 | msgid "# refreshed my HELLO" |
6660 | msgstr "" | 6830 | msgstr "" |
@@ -6956,6 +7126,42 @@ msgstr "" | |||
6956 | msgid "# validations succeeded" | 7126 | msgid "# validations succeeded" |
6957 | msgstr "" | 7127 | msgstr "" |
6958 | 7128 | ||
7129 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7130 | #, c-format | ||
7131 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7132 | msgstr "" | ||
7133 | |||
7134 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7135 | msgid "send data to peer" | ||
7136 | msgstr "" | ||
7137 | |||
7138 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7139 | msgid "receive data from peer" | ||
7140 | msgstr "" | ||
7141 | |||
7142 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7143 | msgid "iterations" | ||
7144 | msgstr "" | ||
7145 | |||
7146 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7147 | #, fuzzy | ||
7148 | msgid "number of messages to send" | ||
7149 | msgstr "nombre de valeurs" | ||
7150 | |||
7151 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7152 | msgid "message size to use" | ||
7153 | msgstr "" | ||
7154 | |||
7155 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7156 | #: src/transport/gnunet-transport.c:1462 | ||
7157 | msgid "peer identity" | ||
7158 | msgstr "" | ||
7159 | |||
7160 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7161 | #: src/transport/gnunet-transport.c:1482 | ||
7162 | msgid "Direct access to transport service." | ||
7163 | msgstr "" | ||
7164 | |||
6959 | #: src/transport/gnunet-transport.c:413 | 7165 | #: src/transport/gnunet-transport.c:413 |
6960 | #, c-format | 7166 | #, c-format |
6961 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" | 7167 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" |
@@ -7084,11 +7290,6 @@ msgstr "" | |||
7084 | msgid "do not resolve hostnames" | 7290 | msgid "do not resolve hostnames" |
7085 | msgstr "" | 7291 | msgstr "" |
7086 | 7292 | ||
7087 | #: src/transport/gnunet-transport.c:1462 | ||
7088 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7089 | msgid "peer identity" | ||
7090 | msgstr "" | ||
7091 | |||
7092 | #: src/transport/gnunet-transport.c:1466 | 7293 | #: src/transport/gnunet-transport.c:1466 |
7093 | msgid "monitor plugin sessions" | 7294 | msgid "monitor plugin sessions" |
7094 | msgstr "" | 7295 | msgstr "" |
@@ -7097,40 +7298,9 @@ msgstr "" | |||
7097 | msgid "send data for benchmarking to the other peer (until CTRL-C)" | 7298 | msgid "send data for benchmarking to the other peer (until CTRL-C)" |
7098 | msgstr "" | 7299 | msgstr "" |
7099 | 7300 | ||
7100 | #: src/transport/gnunet-transport.c:1482 | ||
7101 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7102 | msgid "Direct access to transport service." | ||
7103 | msgstr "" | ||
7104 | |||
7105 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7106 | #, c-format | ||
7107 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7108 | msgstr "" | ||
7109 | |||
7110 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7111 | msgid "send data to peer" | ||
7112 | msgstr "" | ||
7113 | |||
7114 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7115 | msgid "receive data from peer" | ||
7116 | msgstr "" | ||
7117 | |||
7118 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7119 | msgid "iterations" | ||
7120 | msgstr "" | ||
7121 | |||
7122 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7123 | #, fuzzy | ||
7124 | msgid "number of messages to send" | ||
7125 | msgstr "nombre de valeurs" | ||
7126 | |||
7127 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7128 | msgid "message size to use" | ||
7129 | msgstr "" | ||
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 |
7136 | msgid "TCP_STEALTH not supported on this platform.\n" | 7306 | msgid "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" | |||
7142 | msgstr "" | 7312 | msgstr "" |
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 |
7147 | msgid "Shutting down plugin `%s'\n" | 7317 | msgid "Shutting down plugin `%s'\n" |
7148 | msgstr "" | 7318 | msgstr "" |
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 |
7153 | msgid "Shutdown for plugin `%s' complete\n" | 7323 | msgid "Shutdown for plugin `%s' complete\n" |
7154 | msgstr "" | 7324 | msgstr "" |
@@ -7158,102 +7328,102 @@ msgstr "" | |||
7158 | msgid "Maximum number of requests is %u\n" | 7328 | msgid "Maximum number of requests is %u\n" |
7159 | msgstr "" | 7329 | msgstr "" |
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 |
7163 | msgid "" | 7333 | msgid "" |
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" |
7166 | msgstr "" | 7336 | msgstr "" |
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 |
7170 | msgid "Accepting connection (%u of %u) from `%s'\n" | 7340 | msgid "Accepting connection (%u of %u) from `%s'\n" |
7171 | msgstr "" | 7341 | msgstr "" |
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 |
7175 | msgid "" | 7345 | msgid "" |
7176 | "Server reached maximum number connections (%u), rejecting new connection\n" | 7346 | "Server reached maximum number connections (%u), rejecting new connection\n" |
7177 | msgstr "" | 7347 | msgstr "" |
7178 | 7348 | ||
7179 | #: src/transport/plugin_transport_http_server.c:2125 | 7349 | #: src/transport/plugin_transport_http_server.c:2186 |
7180 | msgid "" | 7350 | msgid "" |
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" |
7183 | msgstr "" | 7353 | msgstr "" |
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 |
7187 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" | 7357 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" |
7188 | msgstr "" | 7358 | msgstr "" |
7189 | 7359 | ||
7190 | #: src/transport/plugin_transport_http_server.c:2275 | 7360 | #: src/transport/plugin_transport_http_server.c:2338 |
7191 | msgid "Could not load or create server certificate! Loading plugin failed!\n" | 7361 | msgid "Could not load or create server certificate! Loading plugin failed!\n" |
7192 | msgstr "" | 7362 | msgstr "" |
7193 | 7363 | ||
7194 | #: src/transport/plugin_transport_http_server.c:2587 | 7364 | #: src/transport/plugin_transport_http_server.c:2650 |
7195 | msgid "Require valid port number for service in configuration!\n" | 7365 | msgid "Require valid port number for service in configuration!\n" |
7196 | msgstr "" | 7366 | msgstr "" |
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 |
7200 | msgid "Found %u addresses to report to NAT service\n" | 7370 | msgid "Found %u addresses to report to NAT service\n" |
7201 | msgstr "" | 7371 | msgstr "" |
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 |
7205 | msgid "Disabling IPv6 since it is not supported on this system!\n" | 7375 | msgid "Disabling IPv6 since it is not supported on this system!\n" |
7206 | msgstr "" | 7376 | msgstr "" |
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 |
7210 | msgid "IPv4 support is %s\n" | 7380 | msgid "IPv4 support is %s\n" |
7211 | msgstr "Prise en charge d’IPv4 %s\n" | 7381 | msgstr "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 |
7215 | msgid "IPv6 support is %s\n" | 7385 | msgid "IPv6 support is %s\n" |
7216 | msgstr "Prise en charge d’IPv6 %s\n" | 7386 | msgstr "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 |
7219 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" | 7389 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" |
7220 | msgstr "" | 7390 | msgstr "" |
7221 | 7391 | ||
7222 | #: src/transport/plugin_transport_http_server.c:2976 | 7392 | #: src/transport/plugin_transport_http_server.c:3039 |
7223 | msgid "Port is required! Fix in configuration\n" | 7393 | msgid "Port is required! Fix in configuration\n" |
7224 | msgstr "" | 7394 | msgstr "" |
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 |
7228 | msgid "Using port %u\n" | 7398 | msgid "Using port %u\n" |
7229 | msgstr "Utilisation du port %u\n" | 7399 | msgstr "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 |
7233 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" | 7403 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" |
7234 | msgstr "" | 7404 | msgstr "" |
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 |
7238 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" | 7408 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" |
7239 | msgstr "" | 7409 | msgstr "" |
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 |
7243 | msgid "Using external hostname `%s'\n" | 7413 | msgid "Using external hostname `%s'\n" |
7244 | msgstr "" | 7414 | msgstr "" |
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 |
7248 | msgid "Notifying transport only about hostname `%s'\n" | 7418 | msgid "Notifying transport only about hostname `%s'\n" |
7249 | msgstr "" | 7419 | msgstr "" |
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 |
7253 | msgid "Maximum number of connections is %u\n" | 7423 | msgid "Maximum number of connections is %u\n" |
7254 | msgstr "" | 7424 | msgstr "" |
7255 | 7425 | ||
7256 | #: src/transport/plugin_transport_http_server.c:3475 | 7426 | #: src/transport/plugin_transport_http_server.c:3538 |
7257 | msgid "Unable to compile URL regex\n" | 7427 | msgid "Unable to compile URL regex\n" |
7258 | msgstr "" | 7428 | msgstr "" |
7259 | 7429 | ||
@@ -7393,20 +7563,6 @@ msgstr "" | |||
7393 | msgid "TCP transport advertises itself as being on port %llu\n" | 7563 | msgid "TCP transport advertises itself as being on port %llu\n" |
7394 | msgstr "" | 7564 | msgstr "" |
7395 | 7565 | ||
7396 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7397 | msgid "# Multicast HELLO beacons received via UDP" | ||
7398 | msgstr "" | ||
7399 | |||
7400 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7401 | msgid "" | ||
7402 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7403 | msgstr "" | ||
7404 | |||
7405 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7406 | #, c-format | ||
7407 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7408 | msgstr "" | ||
7409 | |||
7410 | #: src/transport/plugin_transport_udp.c:3366 | 7566 | #: src/transport/plugin_transport_udp.c:3366 |
7411 | #, c-format | 7567 | #, c-format |
7412 | msgid "" | 7568 | msgid "" |
@@ -7453,6 +7609,20 @@ msgstr "adresse invalide" | |||
7453 | msgid "Failed to create UDP network sockets\n" | 7609 | msgid "Failed to create UDP network sockets\n" |
7454 | msgstr "" | 7610 | msgstr "" |
7455 | 7611 | ||
7612 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7613 | msgid "# Multicast HELLO beacons received via UDP" | ||
7614 | msgstr "" | ||
7615 | |||
7616 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7617 | msgid "" | ||
7618 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7619 | msgstr "" | ||
7620 | |||
7621 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7622 | #, c-format | ||
7623 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7624 | msgstr "" | ||
7625 | |||
7456 | #: src/transport/plugin_transport_unix.c:1403 | 7626 | #: src/transport/plugin_transport_unix.c:1403 |
7457 | #, c-format | 7627 | #, c-format |
7458 | msgid "Cannot create path to `%s'\n" | 7628 | msgid "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" |
7558 | msgstr "" | 7728 | msgstr "" |
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 |
7562 | msgid "Unknown address family %d\n" | 7732 | msgid "Unknown address family %d\n" |
7563 | msgstr "" | 7733 | msgstr "" |
@@ -7602,50 +7772,50 @@ msgstr "" | |||
7602 | msgid "Service `%s' runs at %s\n" | 7772 | msgid "Service `%s' runs at %s\n" |
7603 | msgstr "" | 7773 | msgstr "" |
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 |
7606 | msgid "Service process failed to initialize\n" | 7776 | msgid "Service process failed to initialize\n" |
7607 | msgstr "" | 7777 | msgstr "" |
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 |
7610 | msgid "Service process could not initialize server function\n" | 7780 | msgid "Service process could not initialize server function\n" |
7611 | msgstr "" | 7781 | msgstr "" |
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 |
7614 | msgid "Service process failed to report status\n" | 7784 | msgid "Service process failed to report status\n" |
7615 | msgstr "" | 7785 | msgstr "" |
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 |
7620 | msgid "Cannot obtain information about user `%s': %s\n" | 7790 | msgid "Cannot obtain information about user `%s': %s\n" |
7621 | msgstr "" | 7791 | msgstr "" |
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 |
7624 | msgid "No such user" | 7794 | msgid "No such user" |
7625 | msgstr "Aucun utilisateur trouvé" | 7795 | msgstr "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 |
7629 | msgid "Cannot change user/group to `%s': %s\n" | 7799 | msgid "Cannot change user/group to `%s': %s\n" |
7630 | msgstr "" | 7800 | msgstr "" |
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 |
7633 | msgid "do daemonize (detach from terminal)" | 7803 | msgid "do daemonize (detach from terminal)" |
7634 | msgstr "" | 7804 | msgstr "" |
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 |
7639 | msgid "Malformed configuration file `%s', exit ...\n" | 7809 | msgid "Malformed configuration file `%s', exit ...\n" |
7640 | msgstr "" | 7810 | msgstr "" |
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 |
7644 | msgid "Malformed configuration, exit ...\n" | 7814 | msgid "Malformed configuration, exit ...\n" |
7645 | msgstr "" | 7815 | msgstr "" |
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 |
7650 | msgid "Could not access configuration file `%s'\n" | 7820 | msgid "Could not access configuration file `%s'\n" |
7651 | msgstr "" | 7821 | msgstr "" |
@@ -7689,86 +7859,86 @@ msgstr "" | |||
7689 | msgid "Need a non-empty hostname for service `%s'.\n" | 7859 | msgid "Need a non-empty hostname for service `%s'.\n" |
7690 | msgstr "" | 7860 | msgstr "" |
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 |
7693 | msgid "DEBUG" | 7863 | msgid "DEBUG" |
7694 | msgstr "DEBUG" | 7864 | msgstr "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 |
7697 | msgid "INFO" | 7867 | msgid "INFO" |
7698 | msgstr "INFO" | 7868 | msgstr "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 |
7701 | msgid "MESSAGE" | 7871 | msgid "MESSAGE" |
7702 | msgstr "" | 7872 | msgstr "" |
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 |
7705 | msgid "WARNING" | 7875 | msgid "WARNING" |
7706 | msgstr "AVERTISSEMENT" | 7876 | msgstr "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 |
7709 | msgid "ERROR" | 7879 | msgid "ERROR" |
7710 | msgstr "ERREUR" | 7880 | msgstr "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 |
7713 | msgid "NONE" | 7883 | msgid "NONE" |
7714 | msgstr "AUCUN" | 7884 | msgstr "AUCUN" |
7715 | 7885 | ||
7716 | #: src/util/common_logging.c:879 | 7886 | #: src/util/common_logging.c:882 |
7717 | #, c-format | 7887 | #, c-format |
7718 | msgid "Message `%.*s' repeated %u times in the last %s\n" | 7888 | msgid "Message `%.*s' repeated %u times in the last %s\n" |
7719 | msgstr "" | 7889 | msgstr "" |
7720 | 7890 | ||
7721 | #: src/util/common_logging.c:1132 | 7891 | #: src/util/common_logging.c:1135 |
7722 | msgid "INVALID" | 7892 | msgid "INVALID" |
7723 | msgstr "INVALIDE" | 7893 | msgstr "INVALIDE" |
7724 | 7894 | ||
7725 | #: src/util/common_logging.c:1302 | 7895 | #: src/util/common_logging.c:1326 |
7726 | msgid "unknown address" | 7896 | msgid "unknown address" |
7727 | msgstr "adresse inconnue" | 7897 | msgstr "adresse inconnue" |
7728 | 7898 | ||
7729 | #: src/util/common_logging.c:1344 | 7899 | #: src/util/common_logging.c:1368 |
7730 | msgid "invalid address" | 7900 | msgid "invalid address" |
7731 | msgstr "adresse invalide" | 7901 | msgstr "adresse invalide" |
7732 | 7902 | ||
7733 | #: src/util/common_logging.c:1362 | 7903 | #: src/util/common_logging.c:1386 |
7734 | #, c-format | 7904 | #, c-format |
7735 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" | 7905 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" |
7736 | msgstr "" | 7906 | msgstr "" |
7737 | 7907 | ||
7738 | #: src/util/common_logging.c:1383 | 7908 | #: src/util/common_logging.c:1407 |
7739 | #, c-format | 7909 | #, c-format |
7740 | msgid "" | 7910 | msgid "" |
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" |
7742 | msgstr "" | 7912 | msgstr "" |
7743 | 7913 | ||
7744 | #: src/util/configuration.c:286 | 7914 | #: src/util/configuration.c:296 |
7745 | #, c-format | 7915 | #, c-format |
7746 | msgid "Syntax error while deserializing in line %u\n" | 7916 | msgid "Syntax error while deserializing in line %u\n" |
7747 | msgstr "" | 7917 | msgstr "" |
7748 | 7918 | ||
7749 | #: src/util/configuration.c:344 | 7919 | #: src/util/configuration.c:355 |
7750 | #, fuzzy, c-format | 7920 | #, fuzzy, c-format |
7751 | msgid "Error while reading file `%s'\n" | 7921 | msgid "Error while reading file `%s'\n" |
7752 | msgstr "Erreur de lecture : « %s » : %s" | 7922 | msgstr "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 |
7756 | msgid "" | 7926 | msgid "" |
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" |
7759 | msgstr "" | 7929 | msgstr "" |
7760 | 7930 | ||
7761 | #: src/util/configuration.c:1136 | 7931 | #: src/util/configuration.c:1153 |
7762 | #, c-format | 7932 | #, c-format |
7763 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" | 7933 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" |
7764 | msgstr "" | 7934 | msgstr "" |
7765 | 7935 | ||
7766 | #: src/util/configuration.c:1169 | 7936 | #: src/util/configuration.c:1186 |
7767 | #, c-format | 7937 | #, c-format |
7768 | msgid "Missing closing `%s' in option `%s'\n" | 7938 | msgid "Missing closing `%s' in option `%s'\n" |
7769 | msgstr "" | 7939 | msgstr "" |
7770 | 7940 | ||
7771 | #: src/util/configuration.c:1237 | 7941 | #: src/util/configuration.c:1254 |
7772 | #, c-format | 7942 | #, c-format |
7773 | msgid "" | 7943 | msgid "" |
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 "" | |||
7802 | msgid "EdDSA signature verification failed at %s:%d: %s\n" | 7972 | msgid "EdDSA signature verification failed at %s:%d: %s\n" |
7803 | msgstr "" | 7973 | msgstr "" |
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 |
7808 | msgid "Could not acquire lock on file `%s': %s...\n" | 7978 | msgid "Could not acquire lock on file `%s': %s...\n" |
7809 | msgstr "" | 7979 | msgstr "" |
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 |
7812 | msgid "Creating a new private key. This may take a while.\n" | 7982 | msgid "Creating a new private key. This may take a while.\n" |
7813 | msgstr "" | 7983 | msgstr "" |
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 |
7816 | msgid "This may be ok if someone is currently generating a private key.\n" | 7986 | msgid "This may be ok if someone is currently generating a private key.\n" |
7817 | msgstr "" | 7987 | msgstr "" |
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 |
7821 | msgid "" | 7991 | msgid "" |
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" |
7823 | msgstr "" | 7993 | msgstr "" |
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 |
7826 | msgid "This may be ok if someone is currently generating a key.\n" | 7996 | msgid "This may be ok if someone is currently generating a key.\n" |
7827 | msgstr "" | 7997 | msgstr "" |
7828 | 7998 | ||
7829 | #: src/util/crypto_ecc_setup.c:413 | 7999 | #: src/util/crypto_ecc_setup.c:415 |
7830 | msgid "Could not load peer's private key\n" | 8000 | msgid "Could not load peer's private key\n" |
7831 | msgstr "" | 8001 | msgstr "" |
7832 | 8002 | ||
@@ -8014,29 +8184,29 @@ msgstr "" | |||
8014 | msgid "Manipulate GNUnet configuration files" | 8184 | msgid "Manipulate GNUnet configuration files" |
8015 | msgstr "" | 8185 | msgstr "" |
8016 | 8186 | ||
8017 | #: src/util/gnunet-ecc.c:84 | 8187 | #: src/util/gnunet-ecc.c:89 |
8018 | #, c-format | 8188 | #, c-format |
8019 | msgid "Failed to open `%s': %s\n" | 8189 | msgid "Failed to open `%s': %s\n" |
8020 | msgstr "" | 8190 | msgstr "" |
8021 | 8191 | ||
8022 | #: src/util/gnunet-ecc.c:120 | 8192 | #: src/util/gnunet-ecc.c:125 |
8023 | #, c-format | 8193 | #, c-format |
8024 | msgid "Generating %u keys like %s, please wait" | 8194 | msgid "Generating %u keys like %s, please wait" |
8025 | msgstr "" | 8195 | msgstr "" |
8026 | 8196 | ||
8027 | #: src/util/gnunet-ecc.c:133 | 8197 | #: src/util/gnunet-ecc.c:138 |
8028 | #, c-format | 8198 | #, c-format |
8029 | msgid "Generating %u keys, please wait" | 8199 | msgid "Generating %u keys, please wait" |
8030 | msgstr "" | 8200 | msgstr "" |
8031 | 8201 | ||
8032 | #: src/util/gnunet-ecc.c:174 | 8202 | #: src/util/gnunet-ecc.c:179 |
8033 | #, c-format | 8203 | #, c-format |
8034 | msgid "" | 8204 | msgid "" |
8035 | "\n" | 8205 | "\n" |
8036 | "Failed to write to `%s': %s\n" | 8206 | "Failed to write to `%s': %s\n" |
8037 | msgstr "" | 8207 | msgstr "" |
8038 | 8208 | ||
8039 | #: src/util/gnunet-ecc.c:184 | 8209 | #: src/util/gnunet-ecc.c:189 |
8040 | #, c-format | 8210 | #, c-format |
8041 | msgid "" | 8211 | msgid "" |
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 |
8050 | msgid "" | 8220 | msgid "" |
8051 | "\n" | 8221 | "\n" |
8052 | "Error, %u keys not generated\n" | 8222 | "Error, %u keys not generated\n" |
8053 | msgstr "" | 8223 | msgstr "" |
8054 | 8224 | ||
8055 | #: src/util/gnunet-ecc.c:280 | 8225 | #: src/util/gnunet-ecc.c:283 |
8056 | #, c-format | 8226 | #, c-format |
8057 | msgid "Hostkeys file `%s' not found\n" | 8227 | msgid "Hostkeys file `%s' not found\n" |
8058 | msgstr "" | 8228 | msgstr "" |
8059 | 8229 | ||
8060 | #: src/util/gnunet-ecc.c:291 | 8230 | #: src/util/gnunet-ecc.c:294 |
8061 | #, c-format | 8231 | #, c-format |
8062 | msgid "Hostkeys file `%s' is empty\n" | 8232 | msgid "Hostkeys file `%s' is empty\n" |
8063 | msgstr "" | 8233 | msgstr "" |
8064 | 8234 | ||
8065 | #: src/util/gnunet-ecc.c:313 | 8235 | #: src/util/gnunet-ecc.c:316 |
8066 | #, c-format | 8236 | #, c-format |
8067 | msgid "Could not read hostkey file: %s\n" | 8237 | msgid "Could not read hostkey file: %s\n" |
8068 | msgstr "" | 8238 | msgstr "" |
8069 | 8239 | ||
8070 | #: src/util/gnunet-ecc.c:364 | 8240 | #: src/util/gnunet-ecc.c:367 |
8071 | msgid "No hostkey file specified on command line\n" | 8241 | msgid "No hostkey file specified on command line\n" |
8072 | msgstr "" | 8242 | msgstr "" |
8073 | 8243 | ||
8074 | #: src/util/gnunet-ecc.c:416 | 8244 | #: src/util/gnunet-ecc.c:425 |
8075 | msgid "list keys included in a file (for testing)" | 8245 | msgid "list keys included in a file (for testing)" |
8076 | msgstr "" | 8246 | msgstr "" |
8077 | 8247 | ||
8078 | #: src/util/gnunet-ecc.c:421 | 8248 | #: src/util/gnunet-ecc.c:430 |
8079 | msgid "number of keys to list included in a file (for testing)" | 8249 | msgid "number of keys to list included in a file (for testing)" |
8080 | msgstr "" | 8250 | msgstr "" |
8081 | 8251 | ||
8082 | #: src/util/gnunet-ecc.c:426 | 8252 | #: src/util/gnunet-ecc.c:435 |
8083 | msgid "create COUNT public-private key pairs (for testing)" | 8253 | msgid "create COUNT public-private key pairs (for testing)" |
8084 | msgstr "" | 8254 | msgstr "" |
8085 | 8255 | ||
8086 | #: src/util/gnunet-ecc.c:430 | 8256 | #: src/util/gnunet-ecc.c:439 |
8087 | msgid "print the public key in ASCII format" | 8257 | msgid "print the public key in ASCII format" |
8088 | msgstr "" | 8258 | msgstr "" |
8089 | 8259 | ||
8090 | #: src/util/gnunet-ecc.c:434 | 8260 | #: src/util/gnunet-ecc.c:443 |
8261 | msgid "print the public key in HEX format" | ||
8262 | msgstr "" | ||
8263 | |||
8264 | #: src/util/gnunet-ecc.c:447 | ||
8091 | msgid "print examples of ECC operations (used for compatibility testing)" | 8265 | msgid "print examples of ECC operations (used for compatibility testing)" |
8092 | msgstr "" | 8266 | msgstr "" |
8093 | 8267 | ||
8094 | #: src/util/gnunet-ecc.c:449 | 8268 | #: src/util/gnunet-ecc.c:463 |
8095 | msgid "Manipulate GNUnet private ECC key files" | 8269 | msgid "Manipulate GNUnet private ECC key files" |
8096 | msgstr "" | 8270 | msgstr "" |
8097 | 8271 | ||
@@ -8183,7 +8357,7 @@ msgstr "" | |||
8183 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" | 8357 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" |
8184 | msgstr "" | 8358 | msgstr "" |
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 |
8188 | msgid "" | 8362 | msgid "" |
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 "" | |||
8235 | msgid "Could not determine plugin installation path.\n" | 8409 | msgid "Could not determine plugin installation path.\n" |
8236 | msgstr "" | 8410 | msgstr "" |
8237 | 8411 | ||
8238 | #: src/util/resolver_api.c:204 | 8412 | #: src/util/resolver_api.c:203 |
8239 | #, c-format | 8413 | #, c-format |
8240 | msgid "" | 8414 | msgid "" |
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" |
8249 | msgstr "" | 8423 | msgstr "" |
8250 | 8424 | ||
8251 | #: src/util/resolver_api.c:815 | 8425 | #: src/util/resolver_api.c:826 |
8252 | #, c-format | 8426 | #, c-format |
8253 | msgid "Timeout trying to resolve hostname `%s'.\n" | 8427 | msgid "Timeout trying to resolve hostname `%s'.\n" |
8254 | msgstr "" | 8428 | msgstr "" |
8255 | 8429 | ||
8256 | #: src/util/resolver_api.c:827 | 8430 | #: src/util/resolver_api.c:839 |
8257 | #, c-format | 8431 | #, c-format |
8258 | msgid "Timeout trying to resolve IP address `%s'.\n" | 8432 | msgid "Timeout trying to resolve IP address `%s'.\n" |
8259 | msgstr "" | 8433 | msgstr "" |
8260 | 8434 | ||
8261 | #: src/util/resolver_api.c:1004 | 8435 | #: src/util/resolver_api.c:1023 |
8262 | msgid "Resolver not configured correctly.\n" | 8436 | msgid "Resolver not configured correctly.\n" |
8263 | msgstr "" | 8437 | msgstr "" |
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 |
8268 | msgid "Could not resolve our FQDN: %s\n" | 8442 | msgid "Could not resolve our FQDN: %s\n" |
8269 | msgstr "Résolution de « %s » échouée : %s\n" | 8443 | msgstr "Résolution de « %s » échouée : %s\n" |
8270 | 8444 | ||
8271 | #: src/util/service.c:1306 | 8445 | #: src/util/service.c:1305 |
8272 | msgid "" | 8446 | msgid "" |
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" |
8274 | msgstr "" | 8448 | msgstr "" |
8275 | 8449 | ||
8276 | #: src/util/service.c:2082 | 8450 | #: src/util/service.c:2081 |
8277 | #, c-format | 8451 | #, c-format |
8278 | msgid "" | 8452 | msgid "" |
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" | |||
8348 | msgid "end of time" | 8522 | msgid "end of time" |
8349 | msgstr "fin du temps" | 8523 | msgstr "fin du temps" |
8350 | 8524 | ||
8351 | #: src/util/strings.c:1269 | 8525 | #: src/util/strings.c:1270 |
8352 | msgid "IPv6 address did not start with `['\n" | 8526 | msgid "IPv6 address did not start with `['\n" |
8353 | msgstr "" | 8527 | msgstr "" |
8354 | 8528 | ||
8355 | #: src/util/strings.c:1277 | 8529 | #: src/util/strings.c:1278 |
8356 | msgid "IPv6 address did contain ':' to separate port number\n" | 8530 | msgid "IPv6 address did contain ':' to separate port number\n" |
8357 | msgstr "" | 8531 | msgstr "" |
8358 | 8532 | ||
8359 | #: src/util/strings.c:1283 | 8533 | #: src/util/strings.c:1284 |
8360 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" | 8534 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" |
8361 | msgstr "" | 8535 | msgstr "" |
8362 | 8536 | ||
8363 | #: src/util/strings.c:1290 | 8537 | #: src/util/strings.c:1291 |
8364 | msgid "IPv6 address did contain a valid port number after the last ':'\n" | 8538 | msgid "IPv6 address did contain a valid port number after the last ':'\n" |
8365 | msgstr "" | 8539 | msgstr "" |
8366 | 8540 | ||
8367 | #: src/util/strings.c:1299 | 8541 | #: src/util/strings.c:1300 |
8368 | #, c-format | 8542 | #, c-format |
8369 | msgid "Invalid IPv6 address `%s': %s\n" | 8543 | msgid "Invalid IPv6 address `%s': %s\n" |
8370 | msgstr "" | 8544 | msgstr "" |
8371 | 8545 | ||
8372 | #: src/util/strings.c:1571 src/util/strings.c:1587 | 8546 | #: src/util/strings.c:1572 src/util/strings.c:1588 |
8373 | msgid "Port not in range\n" | 8547 | msgid "Port not in range\n" |
8374 | msgstr "" | 8548 | msgstr "" |
8375 | 8549 | ||
8376 | #: src/util/strings.c:1596 | 8550 | #: src/util/strings.c:1597 |
8377 | #, c-format | 8551 | #, c-format |
8378 | msgid "Malformed port policy `%s'\n" | 8552 | msgid "Malformed port policy `%s'\n" |
8379 | msgstr "" | 8553 | msgstr "" |
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 |
8384 | msgid "Invalid format for IP: `%s'\n" | 8558 | msgid "Invalid format for IP: `%s'\n" |
8385 | msgstr "" | 8559 | msgstr "" |
8386 | 8560 | ||
8387 | #: src/util/strings.c:1736 | 8561 | #: src/util/strings.c:1737 |
8388 | #, c-format | 8562 | #, c-format |
8389 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." | 8563 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." |
8390 | msgstr "" | 8564 | msgstr "" |
8391 | 8565 | ||
8392 | #: src/util/strings.c:1788 | 8566 | #: src/util/strings.c:1789 |
8393 | #, c-format | 8567 | #, c-format |
8394 | msgid "Invalid format: `%s'\n" | 8568 | msgid "Invalid format: `%s'\n" |
8395 | msgstr "fornat invalide : « %s »\n" | 8569 | msgstr "fornat invalide : « %s »\n" |
8396 | 8570 | ||
8397 | #: src/util/strings.c:1840 | 8571 | #: src/util/strings.c:1841 |
8398 | #, c-format | 8572 | #, c-format |
8399 | msgid "Invalid network notation (does not end with ';': `%s')\n" | 8573 | msgid "Invalid network notation (does not end with ';': `%s')\n" |
8400 | msgstr "" | 8574 | msgstr "" |
8401 | 8575 | ||
8402 | #: src/util/strings.c:1890 | 8576 | #: src/util/strings.c:1891 |
8403 | #, c-format | 8577 | #, c-format |
8404 | msgid "Wrong format `%s' for netmask\n" | 8578 | msgid "Wrong format `%s' for netmask\n" |
8405 | msgstr "" | 8579 | msgstr "" |
8406 | 8580 | ||
8407 | #: src/util/strings.c:1921 | 8581 | #: src/util/strings.c:1922 |
8408 | #, c-format | 8582 | #, c-format |
8409 | msgid "Wrong format `%s' for network\n" | 8583 | msgid "Wrong format `%s' for network\n" |
8410 | msgstr "" | 8584 | msgstr "" |
@@ -8573,26 +8747,30 @@ msgstr "" | |||
8573 | msgid "Setup tunnels via VPN." | 8747 | msgid "Setup tunnels via VPN." |
8574 | msgstr "Configurer des tunnels via VPN." | 8748 | msgstr "Configurer des tunnels via VPN." |
8575 | 8749 | ||
8576 | #: src/zonemaster/gnunet-service-zonemaster.c:705 | 8750 | #: src/zonemaster/gnunet-service-zonemaster.c:706 |
8577 | msgid "Failed to connect to the namestore!\n" | 8751 | msgid "Failed to connect to the namestore!\n" |
8578 | msgstr "" | 8752 | msgstr "" |
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 |
8583 | msgid "Assertion failed at %s:%d.\n" | 8757 | msgid "Assertion failed at %s:%d.\n" |
8584 | msgstr "" | 8758 | msgstr "" |
8585 | 8759 | ||
8586 | #: src/include/gnunet_common.h:711 | 8760 | #: src/include/gnunet_common.h:726 |
8587 | #, c-format | 8761 | #, c-format |
8588 | msgid "External protocol violation detected at %s:%d.\n" | 8762 | msgid "External protocol violation detected at %s:%d.\n" |
8589 | msgstr "" | 8763 | msgstr "" |
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 |
8593 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" | 8767 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" |
8594 | msgstr "" | 8768 | msgstr "" |
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 | ||
@@ -7,7 +7,7 @@ msgid "" | |||
7 | msgstr "" | 7 | msgstr "" |
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" | |||
273 | msgstr "" | 273 | msgstr "" |
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" | |||
281 | msgstr "Misslyckades att leverera \"%s\" meddelande.\n" | 281 | msgstr "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 "" | |||
355 | msgid "Initiating shutdown as requested by client.\n" | 355 | msgid "Initiating shutdown as requested by client.\n" |
356 | msgstr "" | 356 | msgstr "" |
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 | 359 | msgid "Stop logging\n" |
360 | msgid "" | ||
361 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
362 | "%llu\n" | ||
363 | msgstr "" | ||
364 | |||
365 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
366 | #, c-format | ||
367 | msgid "" | ||
368 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
369 | "%llu\n" | ||
370 | msgstr "" | ||
371 | |||
372 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
373 | #, c-format | ||
374 | msgid "" | ||
375 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
376 | "%llu\n" | ||
377 | msgstr "" | ||
378 | |||
379 | #: src/ats/gnunet-ats-solver-eval.c:3294 | ||
380 | #: src/ats-tests/gnunet-solver-eval.c:939 | ||
381 | msgid "solver to use" | ||
382 | msgstr "" | ||
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 | ||
387 | msgid "experiment to use" | ||
388 | msgstr "" | ||
389 | |||
390 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
391 | #, fuzzy | ||
392 | msgid "print logging" | ||
393 | msgstr "Startade samling \"%s\".\n" | ||
394 | |||
395 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
396 | msgid "save logging to disk" | ||
397 | msgstr "" | ||
398 | |||
399 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
400 | msgid "disable normalization" | ||
401 | msgstr "" | ||
402 | |||
403 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
404 | #, c-format | ||
405 | msgid "" | ||
406 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
407 | "%llu\n" | ||
408 | msgstr "" | ||
409 | |||
410 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
411 | #, c-format | ||
412 | msgid "%s quota configured for network `%s' is %llu\n" | ||
413 | msgstr "" | ||
414 | |||
415 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
416 | #, c-format | ||
417 | msgid "" | ||
418 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
419 | msgstr "" | ||
420 | |||
421 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
422 | #, fuzzy, c-format | ||
423 | msgid "Failed to initialize solver `%s'!\n" | ||
424 | msgstr "Kunde inte initiera SQLite.\n" | ||
425 | |||
426 | #: src/ats/plugin_ats_mlp.c:1274 | ||
427 | msgid "Problem size too large, cannot allocate memory!\n" | ||
428 | msgstr "" | ||
429 | |||
430 | #: src/ats/plugin_ats_mlp.c:1869 | ||
431 | #, fuzzy, c-format | ||
432 | msgid "Adding address for peer `%s' multiple times\n" | ||
433 | msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" | ||
434 | |||
435 | #: src/ats/plugin_ats_mlp.c:1913 | ||
436 | #, fuzzy, c-format | ||
437 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
438 | msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" | ||
439 | |||
440 | #: src/ats/plugin_ats_mlp.c:2475 | ||
441 | msgid "" | ||
442 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
443 | msgstr "" | ||
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 | ||
453 | msgid "Invalid %s configuration %f \n" | ||
454 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | ||
455 | |||
456 | #: src/ats/plugin_ats_mlp.c:2670 | ||
457 | #, c-format | ||
458 | msgid "" | ||
459 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
460 | "%llu must be at least %llu\n" | ||
461 | msgstr "" | ||
462 | |||
463 | #: src/ats/plugin_ats_mlp.c:2679 | ||
464 | #, c-format | ||
465 | msgid "" | ||
466 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
467 | "must be at least %llu\n" | ||
468 | msgstr "" | ||
469 | |||
470 | #: src/ats/plugin_ats_mlp.c:2689 | ||
471 | #, c-format | ||
472 | msgid "" | ||
473 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
474 | msgstr "" | ||
475 | |||
476 | #: src/ats/plugin_ats_mlp.c:2698 | ||
477 | #, c-format | ||
478 | msgid "" | ||
479 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
480 | msgstr "" | 360 | msgstr "" |
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 |
484 | msgid "Invalid %s configuration %f\n" | 364 | msgid "Start logging `%s'\n" |
485 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | 365 | msgstr "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 "" | |||
494 | msgid "Failed to connect master peer [%u] with slave [%u]\n" | 374 | msgid "Failed to connect master peer [%u] with slave [%u]\n" |
495 | msgstr "Misslyckades att ansluta till gnunetd.\n" | 375 | msgstr "Misslyckades att ansluta till gnunetd.\n" |
496 | 376 | ||
497 | #: src/ats-tests/ats-testing-log.c:837 | ||
498 | msgid "Stop logging\n" | ||
499 | msgstr "" | ||
500 | |||
501 | #: src/ats-tests/ats-testing-log.c:892 | ||
502 | #, fuzzy, c-format | ||
503 | msgid "Start logging `%s'\n" | ||
504 | msgstr "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 |
508 | msgid "" | 379 | msgid "" |
@@ -510,6 +381,15 @@ msgid "" | |||
510 | "= %u KiB/s\n" | 381 | "= %u KiB/s\n" |
511 | msgstr "" | 382 | msgstr "" |
512 | 383 | ||
384 | #: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294 | ||
385 | msgid "solver to use" | ||
386 | msgstr "" | ||
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 | ||
390 | msgid "experiment to use" | ||
391 | msgstr "" | ||
392 | |||
513 | #: src/ats-tool/gnunet-ats.c:307 | 393 | #: src/ats-tool/gnunet-ats.c:307 |
514 | #, c-format | 394 | #, c-format |
515 | msgid "%u address resolutions had a timeout\n" | 395 | msgid "%u address resolutions had a timeout\n" |
@@ -631,6 +511,124 @@ msgstr "" | |||
631 | msgid "Print information about ATS state" | 511 | msgid "Print information about ATS state" |
632 | msgstr "Skriv ut information om GNUnets motparter." | 512 | msgstr "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 | ||
516 | msgid "" | ||
517 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
518 | "%llu\n" | ||
519 | msgstr "" | ||
520 | |||
521 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
522 | #, c-format | ||
523 | msgid "" | ||
524 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
525 | "%llu\n" | ||
526 | msgstr "" | ||
527 | |||
528 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
529 | #, c-format | ||
530 | msgid "" | ||
531 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
532 | "%llu\n" | ||
533 | msgstr "" | ||
534 | |||
535 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
536 | #, fuzzy | ||
537 | msgid "print logging" | ||
538 | msgstr "Startade samling \"%s\".\n" | ||
539 | |||
540 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
541 | msgid "save logging to disk" | ||
542 | msgstr "" | ||
543 | |||
544 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
545 | msgid "disable normalization" | ||
546 | msgstr "" | ||
547 | |||
548 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
549 | #, c-format | ||
550 | msgid "" | ||
551 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
552 | "%llu\n" | ||
553 | msgstr "" | ||
554 | |||
555 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
556 | #, c-format | ||
557 | msgid "%s quota configured for network `%s' is %llu\n" | ||
558 | msgstr "" | ||
559 | |||
560 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
561 | #, c-format | ||
562 | msgid "" | ||
563 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
564 | msgstr "" | ||
565 | |||
566 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
567 | #, fuzzy, c-format | ||
568 | msgid "Failed to initialize solver `%s'!\n" | ||
569 | msgstr "Kunde inte initiera SQLite.\n" | ||
570 | |||
571 | #: src/ats/plugin_ats_mlp.c:1274 | ||
572 | msgid "Problem size too large, cannot allocate memory!\n" | ||
573 | msgstr "" | ||
574 | |||
575 | #: src/ats/plugin_ats_mlp.c:1869 | ||
576 | #, fuzzy, c-format | ||
577 | msgid "Adding address for peer `%s' multiple times\n" | ||
578 | msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" | ||
579 | |||
580 | #: src/ats/plugin_ats_mlp.c:1913 | ||
581 | #, fuzzy, c-format | ||
582 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
583 | msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" | ||
584 | |||
585 | #: src/ats/plugin_ats_mlp.c:2475 | ||
586 | msgid "" | ||
587 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
588 | msgstr "" | ||
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 | ||
598 | msgid "Invalid %s configuration %f \n" | ||
599 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | ||
600 | |||
601 | #: src/ats/plugin_ats_mlp.c:2670 | ||
602 | #, c-format | ||
603 | msgid "" | ||
604 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
605 | "%llu must be at least %llu\n" | ||
606 | msgstr "" | ||
607 | |||
608 | #: src/ats/plugin_ats_mlp.c:2679 | ||
609 | #, c-format | ||
610 | msgid "" | ||
611 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
612 | "must be at least %llu\n" | ||
613 | msgstr "" | ||
614 | |||
615 | #: src/ats/plugin_ats_mlp.c:2689 | ||
616 | #, c-format | ||
617 | msgid "" | ||
618 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
619 | msgstr "" | ||
620 | |||
621 | #: src/ats/plugin_ats_mlp.c:2698 | ||
622 | #, c-format | ||
623 | msgid "" | ||
624 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
625 | msgstr "" | ||
626 | |||
627 | #: src/ats/plugin_ats_proportional.c:1164 | ||
628 | #, fuzzy, c-format | ||
629 | msgid "Invalid %s configuration %f\n" | ||
630 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | ||
631 | |||
634 | #: src/auction/gnunet-auction-create.c:163 | 632 | #: src/auction/gnunet-auction-create.c:163 |
635 | msgid "description of the item to be sold" | 633 | msgid "description of the item to be sold" |
636 | msgstr "" | 634 | msgstr "" |
@@ -779,6 +777,28 @@ msgstr "" | |||
779 | msgid "Connection to conversation service lost, trying to reconnect\n" | 777 | msgid "Connection to conversation service lost, trying to reconnect\n" |
780 | msgstr "" | 778 | msgstr "" |
781 | 779 | ||
780 | #: src/conversation/gnunet-conversation-test.c:119 | ||
781 | #, c-format | ||
782 | msgid "" | ||
783 | "\n" | ||
784 | "End of transmission. Have a GNU day.\n" | ||
785 | msgstr "" | ||
786 | |||
787 | #: src/conversation/gnunet-conversation-test.c:145 | ||
788 | #, c-format | ||
789 | msgid "" | ||
790 | "\n" | ||
791 | "We are now playing your recording back. If you can hear it, your audio " | ||
792 | "settings are working..." | ||
793 | msgstr "" | ||
794 | |||
795 | #: src/conversation/gnunet-conversation-test.c:210 | ||
796 | #, c-format | ||
797 | msgid "" | ||
798 | "We will now be recording you for %s. After that time, the recording will be " | ||
799 | "played back to you..." | ||
800 | msgstr "" | ||
801 | |||
782 | #: src/conversation/gnunet-conversation.c:269 | 802 | #: src/conversation/gnunet-conversation.c:269 |
783 | #, c-format | 803 | #, c-format |
784 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" | 804 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" |
@@ -1036,30 +1056,8 @@ msgstr "" | |||
1036 | msgid "Enables having a conversation with other GNUnet users." | 1056 | msgid "Enables having a conversation with other GNUnet users." |
1037 | msgstr "" | 1057 | msgstr "" |
1038 | 1058 | ||
1039 | #: src/conversation/gnunet-conversation-test.c:119 | ||
1040 | #, c-format | ||
1041 | msgid "" | ||
1042 | "\n" | ||
1043 | "End of transmission. Have a GNU day.\n" | ||
1044 | msgstr "" | ||
1045 | |||
1046 | #: src/conversation/gnunet-conversation-test.c:145 | ||
1047 | #, c-format | ||
1048 | msgid "" | ||
1049 | "\n" | ||
1050 | "We are now playing your recording back. If you can hear it, your audio " | ||
1051 | "settings are working..." | ||
1052 | msgstr "" | ||
1053 | |||
1054 | #: src/conversation/gnunet-conversation-test.c:210 | ||
1055 | #, c-format | ||
1056 | msgid "" | ||
1057 | "We will now be recording you for %s. After that time, the recording will be " | ||
1058 | "played back to you..." | ||
1059 | msgstr "" | ||
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 |
1064 | msgid "Read error from STDIN: %d %s\n" | 1062 | msgid "Read error from STDIN: %d %s\n" |
1065 | msgstr "" | 1063 | msgstr "" |
@@ -1191,6 +1189,11 @@ msgstr "\"%s\" %s misslyckades: %s\n" | |||
1191 | msgid "Failed to allocate %u bytes for second packet\n" | 1189 | msgid "Failed to allocate %u bytes for second packet\n" |
1192 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 1190 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" |
1193 | 1191 | ||
1192 | #: src/conversation/gnunet-service-conversation.c:1276 | ||
1193 | #, fuzzy, c-format | ||
1194 | msgid "Could not open line, port %s already in use!\n" | ||
1195 | msgstr "Kunde inte ansluta till gnunetd.\n" | ||
1196 | |||
1194 | #: src/conversation/microphone.c:119 | 1197 | #: src/conversation/microphone.c:119 |
1195 | #, fuzzy | 1198 | #, fuzzy |
1196 | msgid "Could not start record audio helper\n" | 1199 | msgid "Could not start record audio helper\n" |
@@ -1490,8 +1493,140 @@ msgstr "# krypterade PONG-meddelanden mottagna" | |||
1490 | msgid "# updates to my type map" | 1493 | msgid "# updates to my type map" |
1491 | msgstr "" | 1494 | msgstr "" |
1492 | 1495 | ||
1496 | #: src/credential/credential_misc.c:88 | ||
1497 | #, fuzzy, c-format | ||
1498 | msgid "Unable to parse CRED record string `%s'\n" | ||
1499 | msgstr "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 | ||
1504 | msgid "Ego `%s' not known to identity service\n" | ||
1505 | msgstr "\"%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 | ||
1510 | msgid "Issuer public key `%s' is not well-formed\n" | ||
1511 | msgstr "Ogiltigt argument: \"%s\"\n" | ||
1512 | |||
1513 | #: src/credential/gnunet-credential.c:375 | ||
1514 | #: src/credential/gnunet-credential.c:435 | ||
1515 | #, fuzzy, c-format | ||
1516 | msgid "Issuer public key not well-formed\n" | ||
1517 | msgstr "Ogiltigt argument: \"%s\"\n" | ||
1518 | |||
1519 | #: src/credential/gnunet-credential.c:386 | ||
1520 | #: src/credential/gnunet-credential.c:455 | ||
1521 | #, fuzzy, c-format | ||
1522 | msgid "Failed to connect to CREDENTIAL\n" | ||
1523 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
1524 | |||
1525 | #: src/credential/gnunet-credential.c:392 | ||
1526 | #, c-format | ||
1527 | msgid "You must provide issuer the attribute\n" | ||
1528 | msgstr "" | ||
1529 | |||
1530 | #: src/credential/gnunet-credential.c:399 | ||
1531 | #, c-format | ||
1532 | msgid "ego required\n" | ||
1533 | msgstr "" | ||
1534 | |||
1535 | #: src/credential/gnunet-credential.c:415 | ||
1536 | #, c-format | ||
1537 | msgid "Subject public key needed\n" | ||
1538 | msgstr "" | ||
1539 | |||
1540 | #: src/credential/gnunet-credential.c:426 | ||
1541 | #, fuzzy, c-format | ||
1542 | msgid "Subject public key `%s' is not well-formed\n" | ||
1543 | msgstr "Ogiltigt argument: \"%s\"\n" | ||
1544 | |||
1545 | #: src/credential/gnunet-credential.c:461 | ||
1546 | #, c-format | ||
1547 | msgid "You must provide issuer and subject attributes\n" | ||
1548 | msgstr "" | ||
1549 | |||
1550 | #: src/credential/gnunet-credential.c:511 | ||
1551 | #, c-format | ||
1552 | msgid "Issuer ego required\n" | ||
1553 | msgstr "" | ||
1554 | |||
1555 | #: src/credential/gnunet-credential.c:523 | ||
1556 | #, c-format | ||
1557 | msgid "Please specify name to lookup, subject key and issuer key!\n" | ||
1558 | msgstr "" | ||
1559 | |||
1560 | #: src/credential/gnunet-credential.c:543 | ||
1561 | msgid "create credential" | ||
1562 | msgstr "" | ||
1563 | |||
1564 | #: src/credential/gnunet-credential.c:547 | ||
1565 | msgid "verify credential against attribute" | ||
1566 | msgstr "" | ||
1567 | |||
1568 | #: src/credential/gnunet-credential.c:552 | ||
1569 | #, fuzzy | ||
1570 | msgid "The public key of the subject to lookup the credential for" | ||
1571 | msgstr "ange prioritet för innehållet" | ||
1572 | |||
1573 | #: src/credential/gnunet-credential.c:557 | ||
1574 | msgid "The name of the credential presented by the subject" | ||
1575 | msgstr "" | ||
1576 | |||
1577 | #: src/credential/gnunet-credential.c:562 | ||
1578 | #, fuzzy | ||
1579 | msgid "The public key of the authority to verify the credential against" | ||
1580 | msgstr "ange prioritet för innehållet" | ||
1581 | |||
1582 | #: src/credential/gnunet-credential.c:567 | ||
1583 | #, fuzzy | ||
1584 | msgid "The ego to use" | ||
1585 | msgstr "meddelandestorlek" | ||
1586 | |||
1587 | #: src/credential/gnunet-credential.c:572 | ||
1588 | msgid "The issuer attribute to verify against or to issue" | ||
1589 | msgstr "" | ||
1590 | |||
1591 | #: src/credential/gnunet-credential.c:577 | ||
1592 | msgid "The time to live for the credential" | ||
1593 | msgstr "" | ||
1594 | |||
1595 | #: src/credential/gnunet-credential.c:581 | ||
1596 | msgid "collect credentials" | ||
1597 | msgstr "" | ||
1598 | |||
1599 | #: src/credential/gnunet-credential.c:595 | ||
1600 | #, fuzzy | ||
1601 | msgid "GNUnet credential resolver tool" | ||
1602 | msgstr "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 | ||
1607 | msgid "Failed to connect to GNS\n" | ||
1608 | msgstr "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 | ||
1615 | msgid "Failed to connect to namestore\n" | ||
1616 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
1617 | |||
1618 | #: src/credential/plugin_gnsrecord_credential.c:186 | ||
1619 | #, fuzzy, c-format | ||
1620 | msgid "Unable to parse ATTR record string `%s'\n" | ||
1621 | msgstr "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 | ||
1625 | msgid "GNS REST API initialized\n" | ||
1626 | msgstr " 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 |
1496 | msgid "# bytes stored" | 1631 | msgid "# bytes stored" |
1497 | msgstr "# byte krypterade" | 1632 | msgstr "# 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 |
1557 | msgid "`%s' failed at %s:%d with error: %s\n" | 1691 | msgid "`%s' failed at %s:%d with error: %s\n" |
1558 | msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" | 1692 | msgstr "\"%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 |
1564 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" | 1699 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" |
@@ -1626,23 +1761,75 @@ msgstr "" | |||
1626 | msgid "# GET requests executed" | 1761 | msgid "# GET requests executed" |
1627 | msgstr "" | 1762 | msgstr "" |
1628 | 1763 | ||
1629 | #: src/datastore/gnunet-datastore.c:113 | 1764 | #: src/datastore/gnunet-datastore.c:189 |
1765 | #, c-format | ||
1766 | msgid "Dumped %<PRIu64> records\n" | ||
1767 | msgstr "" | ||
1768 | |||
1769 | #: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 | ||
1770 | #, c-format | ||
1771 | msgid "Short write to file: %zd bytes expecting %zd\n" | ||
1772 | msgstr "" | ||
1773 | |||
1774 | #: src/datastore/gnunet-datastore.c:261 | ||
1775 | #, fuzzy | ||
1776 | msgid "Error queueing datastore GET operation\n" | ||
1777 | msgstr "Fel vid skapandet av användare" | ||
1778 | |||
1779 | #: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 | ||
1780 | #, fuzzy, c-format | ||
1781 | msgid "Unable to open dump file: %s\n" | ||
1782 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" | ||
1783 | |||
1784 | #: src/datastore/gnunet-datastore.c:326 | ||
1630 | #, fuzzy, c-format | 1785 | #, fuzzy, c-format |
1631 | msgid "Failed to store item: %s, aborting\n" | 1786 | msgid "Failed to store item: %s, aborting\n" |
1632 | msgstr "Misslyckades att leverera \"%s\" meddelande.\n" | 1787 | msgstr "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 |
1636 | msgid "Cannot use the same configuration for source and destination\n" | 1791 | msgid "Inserted %<PRIu64> records\n" |
1637 | msgstr "" | 1792 | msgstr "" |
1638 | 1793 | ||
1639 | #: src/datastore/gnunet-datastore.c:256 | 1794 | #: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 |
1640 | msgid "" | 1795 | #, c-format |
1641 | "specifies the configuration to use to access an alternative datastore; will " | 1796 | msgid "Short read from file: %zd bytes expecting %zd\n" |
1642 | "merge that datastore into our current datastore" | ||
1643 | msgstr "" | 1797 | msgstr "" |
1644 | 1798 | ||
1645 | #: src/datastore/gnunet-datastore.c:265 | 1799 | #: src/datastore/gnunet-datastore.c:389 |
1800 | #, fuzzy | ||
1801 | msgid "Error queueing datastore PUT operation\n" | ||
1802 | msgstr "Fel vid skapandet av användare" | ||
1803 | |||
1804 | #: src/datastore/gnunet-datastore.c:432 | ||
1805 | msgid "Input file is not of a supported format\n" | ||
1806 | msgstr "" | ||
1807 | |||
1808 | #: src/datastore/gnunet-datastore.c:458 | ||
1809 | #, fuzzy | ||
1810 | msgid "Failed connecting to the datastore.\n" | ||
1811 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
1812 | |||
1813 | #: src/datastore/gnunet-datastore.c:470 | ||
1814 | #, c-format | ||
1815 | msgid "Please choose at least one operation: %s, %s\n" | ||
1816 | msgstr "" | ||
1817 | |||
1818 | #: src/datastore/gnunet-datastore.c:493 | ||
1819 | #, fuzzy | ||
1820 | msgid "Dump all records from the datastore" | ||
1821 | msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" | ||
1822 | |||
1823 | #: src/datastore/gnunet-datastore.c:497 | ||
1824 | #, fuzzy | ||
1825 | msgid "Insert records into the datastore" | ||
1826 | msgstr "# byte krypterade" | ||
1827 | |||
1828 | #: src/datastore/gnunet-datastore.c:502 | ||
1829 | msgid "File to dump or insert" | ||
1830 | msgstr "" | ||
1831 | |||
1832 | #: src/datastore/gnunet-datastore.c:511 | ||
1646 | #, fuzzy | 1833 | #, fuzzy |
1647 | msgid "Manipulate GNUnet datastore" | 1834 | msgid "Manipulate GNUnet datastore" |
1648 | msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" | 1835 | msgstr "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 |
1691 | msgid "# reserved" | 1878 | msgid "# reserved" |
1692 | msgstr "" | 1879 | msgstr "" |
1693 | 1880 | ||
@@ -1695,147 +1882,148 @@ msgstr "" | |||
1695 | msgid "Could not find matching reservation" | 1882 | msgid "Could not find matching reservation" |
1696 | msgstr "" | 1883 | msgstr "" |
1697 | 1884 | ||
1698 | #: src/datastore/gnunet-service-datastore.c:792 | 1885 | #: src/datastore/gnunet-service-datastore.c:773 |
1699 | #, c-format | 1886 | #, c-format |
1700 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" | 1887 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" |
1701 | msgstr "" | 1888 | msgstr "" |
1702 | 1889 | ||
1703 | #: src/datastore/gnunet-service-datastore.c:1026 | 1890 | #: src/datastore/gnunet-service-datastore.c:876 |
1704 | #, fuzzy | 1891 | #, fuzzy |
1705 | msgid "# GET requests received" | 1892 | msgid "# GET requests received" |
1706 | msgstr "# byte mottogs via TCP" | 1893 | msgstr "# 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 |
1710 | msgid "# GET KEY requests received" | 1897 | msgid "# GET KEY requests received" |
1711 | msgstr "# byte mottogs via TCP" | 1898 | msgstr "# byte mottogs via TCP" |
1712 | 1899 | ||
1713 | #: src/datastore/gnunet-service-datastore.c:1071 | 1900 | #: src/datastore/gnunet-service-datastore.c:920 |
1714 | msgid "# requests filtered by bloomfilter" | 1901 | msgid "# requests filtered by bloomfilter" |
1715 | msgstr "" | 1902 | msgstr "" |
1716 | 1903 | ||
1717 | #: src/datastore/gnunet-service-datastore.c:1108 | 1904 | #: src/datastore/gnunet-service-datastore.c:956 |
1718 | msgid "# GET REPLICATION requests received" | 1905 | msgid "# GET REPLICATION requests received" |
1719 | msgstr "" | 1906 | msgstr "" |
1720 | 1907 | ||
1721 | #: src/datastore/gnunet-service-datastore.c:1141 | 1908 | #: src/datastore/gnunet-service-datastore.c:989 |
1722 | msgid "# GET ZERO ANONYMITY requests received" | 1909 | msgid "# GET ZERO ANONYMITY requests received" |
1723 | msgstr "" | 1910 | msgstr "" |
1724 | 1911 | ||
1725 | #: src/datastore/gnunet-service-datastore.c:1190 | 1912 | #: src/datastore/gnunet-service-datastore.c:1036 |
1726 | #, fuzzy | 1913 | #, fuzzy |
1727 | msgid "Content not found" | 1914 | msgid "Content not found" |
1728 | msgstr "Kommando \"%s\" hittades inte!\n" | 1915 | msgstr "Kommando \"%s\" hittades inte!\n" |
1729 | 1916 | ||
1730 | #: src/datastore/gnunet-service-datastore.c:1199 | 1917 | #: src/datastore/gnunet-service-datastore.c:1043 |
1731 | msgid "# bytes removed (explicit request)" | 1918 | msgid "# bytes removed (explicit request)" |
1732 | msgstr "" | 1919 | msgstr "" |
1733 | 1920 | ||
1734 | #: src/datastore/gnunet-service-datastore.c:1246 | 1921 | #: src/datastore/gnunet-service-datastore.c:1088 |
1735 | #, fuzzy | 1922 | #, fuzzy |
1736 | msgid "# REMOVE requests received" | 1923 | msgid "# REMOVE requests received" |
1737 | msgstr "# byte mottogs via TCP" | 1924 | msgstr "# 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 |
1741 | msgid "" | 1928 | msgid "" |
1742 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" | 1929 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" |
1743 | msgstr "" | 1930 | msgstr "" |
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 |
1748 | msgid "New payload: %lld\n" | 1935 | msgid "New payload: %lld\n" |
1749 | msgstr "" | 1936 | msgstr "" |
1750 | 1937 | ||
1751 | #: src/datastore/gnunet-service-datastore.c:1361 | 1938 | #: src/datastore/gnunet-service-datastore.c:1197 |
1752 | #, c-format | 1939 | #, c-format |
1753 | msgid "Loading `%s' datastore plugin\n" | 1940 | msgid "Loading `%s' datastore plugin\n" |
1754 | msgstr "" | 1941 | msgstr "" |
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 |
1758 | msgid "Failed to load datastore plugin for `%s'\n" | 1945 | msgid "Failed to load datastore plugin for `%s'\n" |
1759 | msgstr "Kunde inte slå upp \"%s\": %s\n" | 1946 | msgstr "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 |
1762 | msgid "Bloomfilter construction complete.\n" | 1949 | msgid "Bloomfilter construction complete.\n" |
1763 | msgstr "" | 1950 | msgstr "" |
1764 | 1951 | ||
1765 | #: src/datastore/gnunet-service-datastore.c:1489 | 1952 | #: src/datastore/gnunet-service-datastore.c:1325 |
1766 | msgid "Rebuilding bloomfilter. Please be patient.\n" | 1953 | msgid "Rebuilding bloomfilter. Please be patient.\n" |
1767 | msgstr "" | 1954 | msgstr "" |
1768 | 1955 | ||
1769 | #: src/datastore/gnunet-service-datastore.c:1500 | 1956 | #: src/datastore/gnunet-service-datastore.c:1336 |
1770 | msgid "Plugin does not support get_keys function. Please fix!\n" | 1957 | msgid "Plugin does not support get_keys function. Please fix!\n" |
1771 | msgstr "" | 1958 | msgstr "" |
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 |
1775 | msgid "# bytes used in file-sharing datastore `%s'" | 1962 | msgid "# bytes used in file-sharing datastore `%s'" |
1776 | msgstr "# byte krypterade" | 1963 | msgstr "# byte krypterade" |
1777 | 1964 | ||
1778 | #: src/datastore/gnunet-service-datastore.c:1686 | 1965 | #: src/datastore/gnunet-service-datastore.c:1522 |
1779 | msgid "# quota" | 1966 | msgid "# quota" |
1780 | msgstr "" | 1967 | msgstr "" |
1781 | 1968 | ||
1782 | #: src/datastore/gnunet-service-datastore.c:1691 | 1969 | #: src/datastore/gnunet-service-datastore.c:1527 |
1783 | msgid "# cache size" | 1970 | msgid "# cache size" |
1784 | msgstr "" | 1971 | msgstr "" |
1785 | 1972 | ||
1786 | #: src/datastore/gnunet-service-datastore.c:1707 | 1973 | #: src/datastore/gnunet-service-datastore.c:1543 |
1787 | #, c-format | 1974 | #, c-format |
1788 | msgid "Could not use specified filename `%s' for bloomfilter.\n" | 1975 | msgid "Could not use specified filename `%s' for bloomfilter.\n" |
1789 | msgstr "" | 1976 | msgstr "" |
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 |
1794 | msgid "Failed to remove bogus bloomfilter file `%s'\n" | 1981 | msgid "Failed to remove bogus bloomfilter file `%s'\n" |
1795 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | 1982 | msgstr "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 |
1799 | msgid "Failed to initialize bloomfilter.\n" | 1986 | msgid "Failed to initialize bloomfilter.\n" |
1800 | msgstr "Misslyckades att initiera tjänsten \"%s\".\n" | 1987 | msgstr "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 |
1803 | msgid "Heap database running\n" | 1990 | msgid "Heap database running\n" |
1804 | msgstr "" | 1991 | msgstr "" |
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 | ||
1996 | msgid "MySQL statement run failure" | ||
1997 | msgstr "" | ||
1998 | |||
1999 | #: src/datastore/plugin_datastore_mysql.c:410 | ||
2000 | #: src/datastore/plugin_datastore_sqlite.c:626 | ||
1808 | #, fuzzy | 2001 | #, fuzzy |
1809 | msgid "Data too large" | 2002 | msgid "Data too large" |
1810 | msgstr "antal iterationer" | 2003 | msgstr "antal iterationer" |
1811 | 2004 | ||
1812 | #: src/datastore/plugin_datastore_mysql.c:393 | 2005 | #: src/datastore/plugin_datastore_mysql.c:848 |
1813 | msgid "MySQL statement run failure" | ||
1814 | msgstr "" | ||
1815 | |||
1816 | #: src/datastore/plugin_datastore_mysql.c:936 | ||
1817 | #, fuzzy, c-format | 2006 | #, fuzzy, c-format |
1818 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" | 2007 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" |
1819 | msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n" | 2008 | msgstr "\"%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 |
1823 | msgid "Mysql database running\n" | 2012 | msgid "Mysql database running\n" |
1824 | msgstr "" | 2013 | msgstr "" |
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 | ||
1827 | msgid "Postgress exec failure" | 2017 | msgid "Postgress exec failure" |
1828 | msgstr "" | 2018 | msgstr "" |
1829 | 2019 | ||
1830 | #: src/datastore/plugin_datastore_postgres.c:866 | 2020 | #: src/datastore/plugin_datastore_postgres.c:852 |
1831 | #, fuzzy | 2021 | #, fuzzy |
1832 | msgid "Failed to drop table from database.\n" | 2022 | msgid "Failed to drop table from database.\n" |
1833 | msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n" | 2023 | msgstr "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 | ||
1839 | msgid "Postgres database running\n" | 2027 | msgid "Postgres database running\n" |
1840 | msgstr "" | 2028 | msgstr "" |
1841 | 2029 | ||
@@ -1847,7 +2035,8 @@ msgstr "" | |||
1847 | msgid "`%s' failed at %s:%u with error: %s" | 2035 | msgid "`%s' failed at %s:%u with error: %s" |
1848 | msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" | 2036 | msgstr "\"%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" | |||
1856 | msgid "Unable to initialize SQLite: %s.\n" | 2045 | msgid "Unable to initialize SQLite: %s.\n" |
1857 | msgstr "Kunde inte initiera SQLite.\n" | 2046 | msgstr "Kunde inte initiera SQLite.\n" |
1858 | 2047 | ||
1859 | #: src/datastore/plugin_datastore_sqlite.c:1234 | 2048 | #: src/datastore/plugin_datastore_sqlite.c:577 |
2049 | msgid "sqlite bind failure" | ||
2050 | msgstr "" | ||
2051 | |||
2052 | #: src/datastore/plugin_datastore_sqlite.c:1259 | ||
1860 | msgid "sqlite version to old to determine size, assuming zero\n" | 2053 | msgid "sqlite version to old to determine size, assuming zero\n" |
1861 | msgstr "" | 2054 | msgstr "" |
1862 | 2055 | ||
1863 | #: src/datastore/plugin_datastore_sqlite.c:1268 | 2056 | #: src/datastore/plugin_datastore_sqlite.c:1293 |
1864 | #, c-format | 2057 | #, c-format |
1865 | msgid "" | 2058 | msgid "" |
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" |
1868 | msgstr "" | 2061 | msgstr "" |
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 |
1873 | msgid "Sqlite database running\n" | 2067 | msgid "Sqlite database running\n" |
1874 | msgstr "" | 2068 | msgstr "" |
1875 | 2069 | ||
1876 | #: src/datastore/plugin_datastore_template.c:259 | 2070 | #: src/datastore/plugin_datastore_template.c:253 |
1877 | msgid "Template database running\n" | 2071 | msgid "Template database running\n" |
1878 | msgstr "" | 2072 | msgstr "" |
1879 | 2073 | ||
@@ -1935,53 +2129,6 @@ msgstr "" | |||
1935 | msgid "Prints all packets that go through the DHT." | 2129 | msgid "Prints all packets that go through the DHT." |
1936 | msgstr "" | 2130 | msgstr "" |
1937 | 2131 | ||
1938 | #: src/dht/gnunet_dht_profiler.c:1161 | ||
1939 | #: src/testbed/gnunet-testbed-profiler.c:255 | ||
1940 | #, fuzzy, c-format | ||
1941 | msgid "Exiting as the number of peers is %u\n" | ||
1942 | msgstr "Maximalt antal chattklienter uppnått.\n" | ||
1943 | |||
1944 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
1945 | #, fuzzy | ||
1946 | msgid "number of peers to start" | ||
1947 | msgstr "antal iterationer" | ||
1948 | |||
1949 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
1950 | msgid "" | ||
1951 | "maximum number of times we try to search for successor circle formation (0 " | ||
1952 | "for R5N)" | ||
1953 | msgstr "" | ||
1954 | |||
1955 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
1956 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
1957 | msgid "name of the file with the login information for the testbed" | ||
1958 | msgstr "" | ||
1959 | |||
1960 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
1961 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
1962 | msgstr "" | ||
1963 | |||
1964 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
1965 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
1966 | msgstr "" | ||
1967 | |||
1968 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
1969 | msgid "delay to start doing GETs (default: 5 min)" | ||
1970 | msgstr "" | ||
1971 | |||
1972 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
1973 | msgid "replication degree for DHT PUTs" | ||
1974 | msgstr "" | ||
1975 | |||
1976 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
1977 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
1978 | msgstr "" | ||
1979 | |||
1980 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
1981 | #, fuzzy | ||
1982 | msgid "Measure quality and performance of the DHT service." | ||
1983 | msgstr "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 |
1987 | msgid "PUT request sent with key" | 2134 | msgid "PUT request sent with key" |
@@ -2258,6 +2405,52 @@ msgstr "" | |||
2258 | msgid "# DHT requests combined" | 2405 | msgid "# DHT requests combined" |
2259 | msgstr "# byte mottogs via TCP" | 2406 | msgstr "# 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 | ||
2410 | msgid "Exiting as the number of peers is %u\n" | ||
2411 | msgstr "Maximalt antal chattklienter uppnått.\n" | ||
2412 | |||
2413 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
2414 | #, fuzzy | ||
2415 | msgid "number of peers to start" | ||
2416 | msgstr "antal iterationer" | ||
2417 | |||
2418 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2419 | msgid "" | ||
2420 | "maximum number of times we try to search for successor circle formation (0 " | ||
2421 | "for R5N)" | ||
2422 | msgstr "" | ||
2423 | |||
2424 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2425 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2426 | msgid "name of the file with the login information for the testbed" | ||
2427 | msgstr "" | ||
2428 | |||
2429 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
2430 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2431 | msgstr "" | ||
2432 | |||
2433 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2434 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2435 | msgstr "" | ||
2436 | |||
2437 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2438 | msgid "delay to start doing GETs (default: 5 min)" | ||
2439 | msgstr "" | ||
2440 | |||
2441 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2442 | msgid "replication degree for DHT PUTs" | ||
2443 | msgstr "" | ||
2444 | |||
2445 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2446 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2447 | msgstr "" | ||
2448 | |||
2449 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2450 | #, fuzzy | ||
2451 | msgid "Measure quality and performance of the DHT service." | ||
2452 | msgstr "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 |
2263 | msgid "Block not of type %u\n" | 2456 | msgid "Block not of type %u\n" |
@@ -2591,7 +2784,7 @@ msgstr "" | |||
2591 | msgid "No useful service enabled. Exiting.\n" | 2784 | msgid "No useful service enabled. Exiting.\n" |
2592 | msgstr "" | 2785 | msgstr "" |
2593 | 2786 | ||
2594 | #: src/exit/gnunet-daemon-exit.c:3969 | 2787 | #: src/exit/gnunet-daemon-exit.c:3970 |
2595 | msgid "Daemon to run to provide an IP exit node for the VPN" | 2788 | msgid "Daemon to run to provide an IP exit node for the VPN" |
2596 | msgstr "" | 2789 | msgstr "" |
2597 | 2790 | ||
@@ -3244,15 +3437,6 @@ msgid "" | |||
3244 | "chk/...)" | 3437 | "chk/...)" |
3245 | msgstr "" | 3438 | msgstr "" |
3246 | 3439 | ||
3247 | #: src/fs/gnunet-fs.c:119 | ||
3248 | msgid "print a list of all indexed files" | ||
3249 | msgstr "" | ||
3250 | |||
3251 | #: src/fs/gnunet-fs.c:130 | ||
3252 | #, fuzzy | ||
3253 | msgid "Special file-sharing operations" | ||
3254 | msgstr "Visa alla alternativ" | ||
3255 | |||
3256 | #: src/fs/gnunet-fs-profiler.c:211 | 3440 | #: src/fs/gnunet-fs-profiler.c:211 |
3257 | msgid "run the experiment with COUNT peers" | 3441 | msgid "run the experiment with COUNT peers" |
3258 | msgstr "" | 3442 | msgstr "" |
@@ -3269,6 +3453,15 @@ msgstr "" | |||
3269 | msgid "run a testbed to measure file-sharing performance" | 3453 | msgid "run a testbed to measure file-sharing performance" |
3270 | msgstr "" | 3454 | msgstr "" |
3271 | 3455 | ||
3456 | #: src/fs/gnunet-fs.c:119 | ||
3457 | msgid "print a list of all indexed files" | ||
3458 | msgstr "" | ||
3459 | |||
3460 | #: src/fs/gnunet-fs.c:130 | ||
3461 | #, fuzzy | ||
3462 | msgid "Special file-sharing operations" | ||
3463 | msgstr "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 |
3274 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" | 3467 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" |
@@ -3956,22 +4149,11 @@ msgstr "" | |||
3956 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" | 4149 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" |
3957 | msgstr "" | 4150 | msgstr "" |
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 | 4153 | msgid "Not ready to process requests, lacking ego data\n" |
3961 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
3962 | msgstr "" | ||
3963 | |||
3964 | #: src/gns/gnunet-gns.c:252 | ||
3965 | #, c-format | ||
3966 | msgid "Please specify name to lookup!\n" | ||
3967 | msgstr "" | ||
3968 | |||
3969 | #: src/gns/gnunet-gns.c:276 | ||
3970 | #, c-format | ||
3971 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
3972 | msgstr "" | 4154 | msgstr "" |
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 |
3977 | msgid "" | 4159 | msgid "" |
@@ -3979,59 +4161,12 @@ msgid "" | |||
3979 | "gns-import.sh?\n" | 4161 | "gns-import.sh?\n" |
3980 | msgstr "" | 4162 | msgstr "" |
3981 | 4163 | ||
3982 | #: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727 | ||
3983 | #, fuzzy, c-format | ||
3984 | msgid "Failed to connect to GNS\n" | ||
3985 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
3986 | |||
3987 | #: src/gns/gnunet-gns.c:374 | ||
3988 | #, c-format | ||
3989 | msgid "Public key `%s' is not well-formed\n" | ||
3990 | msgstr "" | ||
3991 | |||
3992 | #: src/gns/gnunet-gns.c:428 | ||
3993 | msgid "Lookup a record for the given name" | ||
3994 | msgstr "" | ||
3995 | |||
3996 | #: src/gns/gnunet-gns.c:434 | ||
3997 | #, fuzzy | ||
3998 | msgid "Specify the type of the record to lookup" | ||
3999 | msgstr "ange prioritet för innehållet" | ||
4000 | |||
4001 | #: src/gns/gnunet-gns.c:440 | ||
4002 | #, fuzzy | ||
4003 | msgid "Specify timeout for the lookup" | ||
4004 | msgstr "ange prioritet för innehållet" | ||
4005 | |||
4006 | #: src/gns/gnunet-gns.c:445 | ||
4007 | msgid "No unneeded output" | ||
4008 | msgstr "" | ||
4009 | |||
4010 | #: src/gns/gnunet-gns.c:451 | ||
4011 | #, fuzzy | ||
4012 | msgid "Specify the public key of the zone to lookup the record in" | ||
4013 | msgstr "ange prioritet för innehållet" | ||
4014 | |||
4015 | #: src/gns/gnunet-gns.c:457 | ||
4016 | #, fuzzy | ||
4017 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4018 | msgstr "ange prioritet för innehållet" | ||
4019 | |||
4020 | #: src/gns/gnunet-gns.c:476 | ||
4021 | #, fuzzy | ||
4022 | msgid "GNUnet GNS resolver tool" | ||
4023 | msgstr "Spåra GNUnets nätverkstopologi." | ||
4024 | |||
4025 | #: src/gns/gnunet-gns-helper-service-w32.c:602 | ||
4026 | msgid "Not ready to process requests, lacking ego data\n" | ||
4027 | msgstr "" | ||
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 |
4031 | msgid "Failed to connect to identity service\n" | 4166 | msgid "Failed to connect to identity service\n" |
4032 | msgstr "Misslyckades att ansluta till gnunetd.\n" | 4167 | msgstr "Misslyckades att ansluta till gnunetd.\n" |
4033 | 4168 | ||
4034 | #: src/gns/gnunet-gns-import.c:489 | 4169 | #: src/gns/gnunet-gns-import.c:452 |
4035 | msgid "This program will import some GNS authorities into your GNS namestore." | 4170 | msgid "This program will import some GNS authorities into your GNS namestore." |
4036 | msgstr "" | 4171 | msgstr "" |
4037 | 4172 | ||
@@ -4156,13 +4291,66 @@ msgstr "" | |||
4156 | msgid "GNUnet GNS proxy" | 4291 | msgid "GNUnet GNS proxy" |
4157 | msgstr "" | 4292 | msgstr "" |
4158 | 4293 | ||
4294 | #: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 | ||
4295 | #, c-format | ||
4296 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4297 | msgstr "" | ||
4298 | |||
4299 | #: src/gns/gnunet-gns.c:252 | ||
4300 | #, c-format | ||
4301 | msgid "Please specify name to lookup!\n" | ||
4302 | msgstr "" | ||
4303 | |||
4304 | #: src/gns/gnunet-gns.c:276 | ||
4305 | #, c-format | ||
4306 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4307 | msgstr "" | ||
4308 | |||
4309 | #: src/gns/gnunet-gns.c:374 | ||
4310 | #, c-format | ||
4311 | msgid "Public key `%s' is not well-formed\n" | ||
4312 | msgstr "" | ||
4313 | |||
4314 | #: src/gns/gnunet-gns.c:428 | ||
4315 | msgid "Lookup a record for the given name" | ||
4316 | msgstr "" | ||
4317 | |||
4318 | #: src/gns/gnunet-gns.c:434 | ||
4319 | #, fuzzy | ||
4320 | msgid "Specify the type of the record to lookup" | ||
4321 | msgstr "ange prioritet för innehållet" | ||
4322 | |||
4323 | #: src/gns/gnunet-gns.c:440 | ||
4324 | #, fuzzy | ||
4325 | msgid "Specify timeout for the lookup" | ||
4326 | msgstr "ange prioritet för innehållet" | ||
4327 | |||
4328 | #: src/gns/gnunet-gns.c:445 | ||
4329 | msgid "No unneeded output" | ||
4330 | msgstr "" | ||
4331 | |||
4332 | #: src/gns/gnunet-gns.c:451 | ||
4333 | #, fuzzy | ||
4334 | msgid "Specify the public key of the zone to lookup the record in" | ||
4335 | msgstr "ange prioritet för innehållet" | ||
4336 | |||
4337 | #: src/gns/gnunet-gns.c:457 | ||
4338 | #, fuzzy | ||
4339 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4340 | msgstr "ange prioritet för innehållet" | ||
4341 | |||
4342 | #: src/gns/gnunet-gns.c:476 | ||
4343 | #, fuzzy | ||
4344 | msgid "GNUnet GNS resolver tool" | ||
4345 | msgstr "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 |
4161 | msgid "Failed to connect to the namecache!\n" | 4349 | msgid "Failed to connect to the namecache!\n" |
4162 | msgstr "Misslyckades att ansluta till gnunetd.\n" | 4350 | msgstr "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 |
4167 | msgid "Could not connect to DHT!\n" | 4355 | msgid "Could not connect to DHT!\n" |
4168 | msgstr "Kunde inte ansluta till gnunetd.\n" | 4356 | msgstr "Kunde inte ansluta till gnunetd.\n" |
@@ -4220,45 +4408,35 @@ msgstr "" | |||
4220 | msgid "Hostname `%s' is not well-formed, resolution fails\n" | 4408 | msgid "Hostname `%s' is not well-formed, resolution fails\n" |
4221 | msgstr "" | 4409 | msgstr "" |
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 |
4225 | msgid "Unable to parse PKEY record `%s'\n" | 4413 | msgid "Unable to parse PKEY record `%s'\n" |
4226 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 4414 | msgstr "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 |
4230 | msgid "Unable to parse GNS2DNS record `%s'\n" | 4418 | msgid "Unable to parse GNS2DNS record `%s'\n" |
4231 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 4419 | msgstr "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 |
4235 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" | 4423 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" |
4236 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" | 4424 | msgstr "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 |
4240 | msgid "Unable to parse VPN record string `%s'\n" | 4428 | msgid "Unable to parse VPN record string `%s'\n" |
4241 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 4429 | msgstr "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 |
4245 | msgid "Unable to parse BOX record string `%s'\n" | 4433 | msgid "Unable to parse BOX record string `%s'\n" |
4246 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 4434 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" |
4247 | 4435 | ||
4248 | #: src/gns/plugin_gnsrecord_gns.c:360 | ||
4249 | #, fuzzy, c-format | ||
4250 | msgid "Unable to parse REVERSE record string `%s'\n" | ||
4251 | msgstr "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 |
4254 | msgid "Ego for not found, cannot perform lookup.\n" | 4437 | msgid "Ego for not found, cannot perform lookup.\n" |
4255 | msgstr "" | 4438 | msgstr "" |
4256 | 4439 | ||
4257 | #: src/gns/plugin_rest_gns.c:668 | ||
4258 | #, fuzzy | ||
4259 | msgid "GNS REST API initialized\n" | ||
4260 | msgstr " 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 |
4264 | msgid "Unable to parse IPv4 address `%s'\n" | 4442 | msgid "Unable to parse IPv4 address `%s'\n" |
@@ -4689,6 +4867,53 @@ msgstr "\"%s\" är inte tillgänglig." | |||
4689 | msgid "Could not start hostlist HTTP server on port %u\n" | 4867 | msgid "Could not start hostlist HTTP server on port %u\n" |
4690 | msgstr "" | 4868 | msgstr "" |
4691 | 4869 | ||
4870 | #: src/identity-provider/gnunet-idp.c:348 | ||
4871 | #, fuzzy | ||
4872 | msgid "Ego is required\n" | ||
4873 | msgstr "%s: flagga \"%s\" är tvetydig\n" | ||
4874 | |||
4875 | #: src/identity-provider/gnunet-idp.c:370 | ||
4876 | msgid "Add attribute" | ||
4877 | msgstr "" | ||
4878 | |||
4879 | #: src/identity-provider/gnunet-idp.c:376 | ||
4880 | msgid "Attribute value" | ||
4881 | msgstr "" | ||
4882 | |||
4883 | #: src/identity-provider/gnunet-idp.c:381 | ||
4884 | msgid "Ego" | ||
4885 | msgstr "" | ||
4886 | |||
4887 | #: src/identity-provider/gnunet-idp.c:386 | ||
4888 | msgid "Audience (relying party)" | ||
4889 | msgstr "" | ||
4890 | |||
4891 | #: src/identity-provider/gnunet-idp.c:390 | ||
4892 | msgid "List attributes for Ego" | ||
4893 | msgstr "" | ||
4894 | |||
4895 | #: src/identity-provider/gnunet-idp.c:395 | ||
4896 | msgid "Issue a ticket" | ||
4897 | msgstr "" | ||
4898 | |||
4899 | #: src/identity-provider/gnunet-idp.c:400 | ||
4900 | msgid "Consume a ticket" | ||
4901 | msgstr "" | ||
4902 | |||
4903 | #: src/identity-provider/gnunet-idp.c:405 | ||
4904 | msgid "Revoke a ticket" | ||
4905 | msgstr "" | ||
4906 | |||
4907 | #: src/identity-provider/identity_provider_api.c:429 | ||
4908 | #, fuzzy | ||
4909 | msgid "failed to store record\n" | ||
4910 | msgstr "Misslyckades att starta samling.\n" | ||
4911 | |||
4912 | #: src/identity-provider/plugin_rest_identity_provider.c:1175 | ||
4913 | #, fuzzy | ||
4914 | msgid "Identity Provider REST API initialized\n" | ||
4915 | msgstr " 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 |
4694 | msgid "Failed to create ego: %s\n" | 4919 | msgid "Failed to create ego: %s\n" |
@@ -4776,34 +5001,11 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":" | |||
4776 | msgid "Failed to create directory `%s' for storing egos\n" | 5001 | msgid "Failed to create directory `%s' for storing egos\n" |
4777 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 5002 | msgstr "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 |
4781 | msgid "Identity REST API initialized\n" | 5006 | msgid "Identity REST API initialized\n" |
4782 | msgstr " Anslutning misslyckades\n" | 5007 | msgstr " Anslutning misslyckades\n" |
4783 | 5008 | ||
4784 | #: src/identity-provider/gnunet-identity-token.c:66 | ||
4785 | #, fuzzy | ||
4786 | msgid "Option `-t' is required\n" | ||
4787 | msgstr "%s: flagga \"%s\" är tvetydig\n" | ||
4788 | |||
4789 | #: src/identity-provider/gnunet-identity-token.c:77 | ||
4790 | #, fuzzy, c-format | ||
4791 | msgid "Token `%s' is malformed\n" | ||
4792 | msgstr "Ogiltigt argument: \"%s\"\n" | ||
4793 | |||
4794 | #: src/identity-provider/gnunet-identity-token.c:166 | ||
4795 | msgid "GNUid token" | ||
4796 | msgstr "" | ||
4797 | |||
4798 | #: src/identity-provider/gnunet-identity-token.c:171 | ||
4799 | msgid "Print token contents" | ||
4800 | msgstr "" | ||
4801 | |||
4802 | #: src/identity-provider/plugin_rest_identity_provider.c:1166 | ||
4803 | #, fuzzy | ||
4804 | msgid "Identity Token REST API initialized\n" | ||
4805 | msgstr " Anslutning misslyckades\n" | ||
4806 | |||
4807 | #: src/json/json.c:119 | 5009 | #: src/json/json.c:119 |
4808 | #, fuzzy, c-format | 5010 | #, fuzzy, c-format |
4809 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" | 5011 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" |
@@ -4904,12 +5106,66 @@ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" | |||
4904 | msgid "flat plugin running\n" | 5106 | msgid "flat plugin running\n" |
4905 | msgstr "" | 5107 | msgstr "" |
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 | 5111 | msgid "Unsupported form value `%s'\n" |
4910 | msgid "Failed to create indices\n" | 5112 | msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" |
5113 | |||
5114 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
5115 | #, fuzzy, c-format | ||
5116 | msgid "Failed to create record for domain `%s': %s\n" | ||
5117 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" | ||
5118 | |||
5119 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5120 | msgid "Error when mapping zone to name\n" | ||
5121 | msgstr "" | ||
5122 | |||
5123 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5124 | #, c-format | ||
5125 | msgid "Found existing name `%s' for the given key\n" | ||
5126 | msgstr "" | ||
5127 | |||
5128 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5129 | #, c-format | ||
5130 | msgid "Found %u existing records for domain `%s'\n" | ||
5131 | msgstr "" | ||
5132 | |||
5133 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5134 | #, fuzzy, c-format | ||
5135 | msgid "Failed to create page for `%s'\n" | ||
4911 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" | 5136 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" |
4912 | 5137 | ||
5138 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5139 | #, fuzzy, c-format | ||
5140 | msgid "Failed to setup post processor for `%s'\n" | ||
5141 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5142 | |||
5143 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5144 | msgid "Domain name must not contain `.'\n" | ||
5145 | msgstr "" | ||
5146 | |||
5147 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5148 | msgid "Domain name must not contain `+'\n" | ||
5149 | msgstr "" | ||
5150 | |||
5151 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5152 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5153 | msgstr "" | ||
5154 | |||
5155 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5156 | #, fuzzy | ||
5157 | msgid "Failed to start HTTP server\n" | ||
5158 | msgstr "Misslyckades att starta samling.\n" | ||
5159 | |||
5160 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5161 | #, fuzzy | ||
5162 | msgid "Failed to connect to identity\n" | ||
5163 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
5164 | |||
5165 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5166 | msgid "GNU Name System First Come First Serve name registration service" | ||
5167 | msgstr "" | ||
5168 | |||
4913 | #: src/namestore/gnunet-namestore.c:301 | 5169 | #: src/namestore/gnunet-namestore.c:301 |
4914 | #, fuzzy, c-format | 5170 | #, fuzzy, c-format |
4915 | msgid "Adding record failed: %s\n" | 5171 | msgid "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 |
4923 | msgid "Deleting record failed, record does not exist%s%s\n" | 5179 | msgid "Deleting record failed, record does not exist%s%s\n" |
4924 | msgstr "" | 5180 | msgstr "" |
@@ -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 |
4931 | msgid "Deleting record failed%s%s\n" | 5187 | msgid "Deleting record failed%s%s\n" |
4932 | msgstr "" | 5188 | msgstr "" |
@@ -4946,7 +5202,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n" | |||
4946 | msgstr "" | 5202 | msgstr "" |
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 |
4951 | msgid "There are no records under label `%s' that could be deleted.\n" | 5207 | msgid "There are no records under label `%s' that could be deleted.\n" |
4952 | msgstr "" | 5208 | msgstr "" |
@@ -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" |
4958 | msgstr "" | 5214 | msgstr "" |
4959 | 5215 | ||
4960 | #: src/namestore/gnunet-namestore.c:776 | ||
4961 | #: src/namestore/plugin_rest_namestore.c:1004 | ||
4962 | #, fuzzy, c-format | ||
4963 | msgid "Ego `%s' not known to identity service\n" | ||
4964 | msgstr "\"%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 |
4968 | msgid "No options given\n" | 5218 | msgid "No options given\n" |
4969 | msgstr "" | 5219 | msgstr "" |
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 | ||
4975 | msgid "Failed to connect to namestore\n" | ||
4976 | msgstr "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" | |||
4988 | msgstr "" | 5231 | msgstr "" |
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 |
4993 | msgid "Unsupported type `%s'\n" | 5236 | msgid "Unsupported type `%s'\n" |
4994 | msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" | 5237 | msgstr "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 |
5000 | msgid "Value `%s' invalid for record type `%s'\n" | 5243 | msgid "Value `%s' invalid for record type `%s'\n" |
5001 | msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n" | 5244 | msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n" |
@@ -5014,8 +5257,7 @@ msgstr "" | |||
5014 | msgid "Invalid public key for reverse lookup `%s'\n" | 5257 | msgid "Invalid public key for reverse lookup `%s'\n" |
5015 | msgstr "Ogiltigt argument: \"%s\"\n" | 5258 | msgstr "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 |
5020 | msgid "Invalid URI `%s'\n" | 5262 | msgid "Invalid URI `%s'\n" |
5021 | msgstr "Ogiltiga argument: " | 5263 | msgstr "Ogiltiga argument: " |
@@ -5026,13 +5268,13 @@ msgid "Invalid nick `%s'\n" | |||
5026 | msgstr "Ogiltiga argument: " | 5268 | msgstr "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 |
5031 | msgid "No default ego configured in identity service\n" | 5273 | msgid "No default ego configured in identity service\n" |
5032 | msgstr "\"%s\": okänd tjänst: %s\n" | 5274 | msgstr "\"%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 |
5037 | msgid "Cannot connect to identity service\n" | 5279 | msgid "Cannot connect to identity service\n" |
5038 | msgstr "Kunde inte ansluta till gnunetd.\n" | 5280 | msgstr "Kunde inte ansluta till gnunetd.\n" |
@@ -5096,67 +5338,7 @@ msgstr "" | |||
5096 | msgid "name of the ego controlling the zone" | 5338 | msgid "name of the ego controlling the zone" |
5097 | msgstr "Visa värde av alternativet" | 5339 | msgstr "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 | ||
5101 | msgid "Unsupported form value `%s'\n" | ||
5102 | msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" | ||
5103 | |||
5104 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
5105 | #, fuzzy, c-format | ||
5106 | msgid "Failed to create record for domain `%s': %s\n" | ||
5107 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" | ||
5108 | |||
5109 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5110 | msgid "Error when mapping zone to name\n" | ||
5111 | msgstr "" | ||
5112 | |||
5113 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5114 | #, c-format | ||
5115 | msgid "Found existing name `%s' for the given key\n" | ||
5116 | msgstr "" | ||
5117 | |||
5118 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5119 | #, c-format | ||
5120 | msgid "Found %u existing records for domain `%s'\n" | ||
5121 | msgstr "" | ||
5122 | |||
5123 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5124 | #, fuzzy, c-format | ||
5125 | msgid "Failed to create page for `%s'\n" | ||
5126 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" | ||
5127 | |||
5128 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5129 | #, fuzzy, c-format | ||
5130 | msgid "Failed to setup post processor for `%s'\n" | ||
5131 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5132 | |||
5133 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5134 | msgid "Domain name must not contain `.'\n" | ||
5135 | msgstr "" | ||
5136 | |||
5137 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5138 | msgid "Domain name must not contain `+'\n" | ||
5139 | msgstr "" | ||
5140 | |||
5141 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5142 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5143 | msgstr "" | ||
5144 | |||
5145 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5146 | #, fuzzy | ||
5147 | msgid "Failed to start HTTP server\n" | ||
5148 | msgstr "Misslyckades att starta samling.\n" | ||
5149 | |||
5150 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5151 | #, fuzzy | ||
5152 | msgid "Failed to connect to identity\n" | ||
5153 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
5154 | |||
5155 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5156 | msgid "GNU Name System First Come First Serve name registration service" | ||
5157 | msgstr "" | ||
5158 | |||
5159 | #: src/namestore/gnunet-service-namestore.c:612 | ||
5160 | #, fuzzy, c-format | 5342 | #, fuzzy, c-format |
5161 | msgid "Failed to replicate block in namecache: %s\n" | 5343 | msgid "Failed to replicate block in namecache: %s\n" |
5162 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 5344 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" |
@@ -5169,7 +5351,7 @@ msgstr "" | |||
5169 | msgid "flat file database running\n" | 5351 | msgid "flat file database running\n" |
5170 | msgstr "" | 5352 | msgstr "" |
5171 | 5353 | ||
5172 | #: src/namestore/plugin_rest_namestore.c:1188 | 5354 | #: src/namestore/plugin_rest_namestore.c:1193 |
5173 | #, fuzzy | 5355 | #, fuzzy |
5174 | msgid "Namestore REST API initialized\n" | 5356 | msgid "Namestore REST API initialized\n" |
5175 | msgstr " Anslutning misslyckades\n" | 5357 | msgstr " Anslutning misslyckades\n" |
@@ -5460,11 +5642,6 @@ msgstr "" | |||
5460 | msgid "`upnpc' command not found\n" | 5642 | msgid "`upnpc' command not found\n" |
5461 | msgstr "" | 5643 | msgstr "" |
5462 | 5644 | ||
5463 | #: src/nse/gnunet-nse.c:122 | ||
5464 | #, fuzzy | ||
5465 | msgid "Show network size estimates from NSE service." | ||
5466 | msgstr "# 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 |
5470 | msgid "limit to the number of connections to NSE services, 0 for none" | 5647 | msgid "limit to the number of connections to NSE services, 0 for none" |
@@ -5491,66 +5668,16 @@ msgstr "" | |||
5491 | msgid "Measure quality and performance of the NSE service." | 5668 | msgid "Measure quality and performance of the NSE service." |
5492 | msgstr "Kan inte tillgå tjänsten" | 5669 | msgstr "Kan inte tillgå tjänsten" |
5493 | 5670 | ||
5671 | #: src/nse/gnunet-nse.c:122 | ||
5672 | #, fuzzy | ||
5673 | msgid "Show network size estimates from NSE service." | ||
5674 | msgstr "# 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 |
5496 | msgid "Value is too large.\n" | 5678 | msgid "Value is too large.\n" |
5497 | msgstr "" | 5679 | msgstr "" |
5498 | 5680 | ||
5499 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5500 | #, fuzzy, c-format | ||
5501 | msgid "Removing expired address of transport `%s'\n" | ||
5502 | msgstr "Tillgängliga transport(er): %s\n" | ||
5503 | |||
5504 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5505 | #, fuzzy, c-format | ||
5506 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5507 | msgstr "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 | ||
5512 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5513 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5514 | |||
5515 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5516 | msgid "# peers known" | ||
5517 | msgstr "" | ||
5518 | |||
5519 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5520 | #, c-format | ||
5521 | msgid "" | ||
5522 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5523 | msgstr "" | ||
5524 | |||
5525 | #: src/peerinfo/gnunet-service-peerinfo.c:655 | ||
5526 | #, fuzzy, c-format | ||
5527 | msgid "Scanning directory `%s'\n" | ||
5528 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5529 | |||
5530 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5531 | #, c-format | ||
5532 | msgid "Still no peers found in `%s'!\n" | ||
5533 | msgstr "" | ||
5534 | |||
5535 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5536 | #, fuzzy, c-format | ||
5537 | msgid "Cleaning up directory `%s'\n" | ||
5538 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5539 | |||
5540 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5541 | #, c-format | ||
5542 | msgid "Importing HELLOs from `%s'\n" | ||
5543 | msgstr "" | ||
5544 | |||
5545 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5546 | msgid "Skipping import of included HELLOs\n" | ||
5547 | msgstr "" | ||
5548 | |||
5549 | #: src/peerinfo/peerinfo_api.c:220 | ||
5550 | #, fuzzy | ||
5551 | msgid "Failed to receive response from `PEERINFO' service." | ||
5552 | msgstr "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 |
5556 | msgid "%sPeer `%s'\n" | 5683 | msgid "%sPeer `%s'\n" |
@@ -5641,6 +5768,61 @@ msgstr "Testar transport(er) %s\n" | |||
5641 | msgid "Failed to load transport plugin for `%s'\n" | 5768 | msgid "Failed to load transport plugin for `%s'\n" |
5642 | msgstr "Kunde inte slå upp \"%s\": %s\n" | 5769 | msgstr "Kunde inte slå upp \"%s\": %s\n" |
5643 | 5770 | ||
5771 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5772 | #, fuzzy, c-format | ||
5773 | msgid "Removing expired address of transport `%s'\n" | ||
5774 | msgstr "Tillgängliga transport(er): %s\n" | ||
5775 | |||
5776 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5777 | #, fuzzy, c-format | ||
5778 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5779 | msgstr "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 | ||
5784 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5785 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5786 | |||
5787 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5788 | msgid "# peers known" | ||
5789 | msgstr "" | ||
5790 | |||
5791 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5792 | #, c-format | ||
5793 | msgid "" | ||
5794 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5795 | msgstr "" | ||
5796 | |||
5797 | #: src/peerinfo/gnunet-service-peerinfo.c:655 | ||
5798 | #, fuzzy, c-format | ||
5799 | msgid "Scanning directory `%s'\n" | ||
5800 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5801 | |||
5802 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5803 | #, c-format | ||
5804 | msgid "Still no peers found in `%s'!\n" | ||
5805 | msgstr "" | ||
5806 | |||
5807 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5808 | #, fuzzy, c-format | ||
5809 | msgid "Cleaning up directory `%s'\n" | ||
5810 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | ||
5811 | |||
5812 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5813 | #, c-format | ||
5814 | msgid "Importing HELLOs from `%s'\n" | ||
5815 | msgstr "" | ||
5816 | |||
5817 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5818 | msgid "Skipping import of included HELLOs\n" | ||
5819 | msgstr "" | ||
5820 | |||
5821 | #: src/peerinfo/peerinfo_api.c:220 | ||
5822 | #, fuzzy | ||
5823 | msgid "Failed to receive response from `PEERINFO' service." | ||
5824 | msgstr "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 |
5645 | msgid "peerstore" | 5827 | msgid "peerstore" |
5646 | msgstr "" | 5828 | msgstr "" |
@@ -5690,15 +5872,10 @@ msgstr "Fel vid skapandet av användare" | |||
5690 | msgid "Unable to create indices: %s.\n" | 5872 | msgid "Unable to create indices: %s.\n" |
5691 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" | 5873 | msgstr "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 |
5695 | msgid "`%s:%s' failed at %s:%d with error: %s\n" | 5877 | msgid "PQprepare (`%s' as `%s') failed with error: %s\n" |
5696 | msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n" | 5878 | msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n" |
5697 | |||
5698 | #: src/postgres/postgres.c:192 | ||
5699 | #, fuzzy, c-format | ||
5700 | msgid "Unable to connect to Postgres database '%s': %s\n" | ||
5701 | msgstr "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" | |||
5878 | msgid "Daemon to announce regular expressions for the peer using cadet." | 6055 | msgid "Daemon to announce regular expressions for the peer using cadet." |
5879 | msgstr "" | 6056 | msgstr "" |
5880 | 6057 | ||
5881 | #: src/regex/gnunet-regex-profiler.c:1314 | 6058 | #: src/regex/gnunet-regex-profiler.c:1386 |
5882 | #, fuzzy | 6059 | #, fuzzy |
5883 | msgid "No configuration file given. Exiting\n" | 6060 | msgid "No configuration file given. Exiting\n" |
5884 | msgstr "använd konfigurationsfil FILNAMN" | 6061 | msgstr "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 |
5889 | msgid "No policy directory specified on command line. Exiting.\n" | 6066 | msgid "No policy directory specified on command line. Exiting.\n" |
5890 | msgstr "" | 6067 | msgstr "" |
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 |
5895 | msgid "Specified policies directory does not exist. Exiting.\n" | 6072 | msgid "Specified policies directory does not exist. Exiting.\n" |
5896 | msgstr "" | 6073 | msgstr "" |
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 |
5900 | msgid "No files found in `%s'\n" | 6077 | msgid "No files found in `%s'\n" |
5901 | msgstr "%d filer hittades i katalog.\n" | 6078 | msgstr "%d filer hittades i katalog.\n" |
5902 | 6079 | ||
5903 | #: src/regex/gnunet-regex-profiler.c:1377 | 6080 | #: src/regex/gnunet-regex-profiler.c:1449 |
5904 | msgid "No search strings file given. Exiting.\n" | 6081 | msgid "No search strings file given. Exiting.\n" |
5905 | msgstr "" | 6082 | msgstr "" |
5906 | 6083 | ||
5907 | #: src/regex/gnunet-regex-profiler.c:1397 | 6084 | #: src/regex/gnunet-regex-profiler.c:1469 |
5908 | #, fuzzy | 6085 | #, fuzzy |
5909 | msgid "Error loading search strings. Exiting.\n" | 6086 | msgid "Error loading search strings. Exiting.\n" |
5910 | msgstr "Fel vid lämning av DHT.\n" | 6087 | msgstr "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 |
5914 | msgid "name of the file for writing statistics" | 6091 | msgid "name of the file for writing statistics" |
5915 | msgstr "Visa värde av alternativet" | 6092 | msgstr "Visa värde av alternativet" |
5916 | 6093 | ||
5917 | #: src/regex/gnunet-regex-profiler.c:1491 | 6094 | #: src/regex/gnunet-regex-profiler.c:1563 |
5918 | msgid "wait TIMEOUT before ending the experiment" | 6095 | msgid "wait TIMEOUT before ending the experiment" |
5919 | msgstr "" | 6096 | msgstr "" |
5920 | 6097 | ||
5921 | #: src/regex/gnunet-regex-profiler.c:1497 | 6098 | #: src/regex/gnunet-regex-profiler.c:1569 |
5922 | msgid "directory with policy files" | 6099 | msgid "directory with policy files" |
5923 | msgstr "" | 6100 | msgstr "" |
5924 | 6101 | ||
5925 | #: src/regex/gnunet-regex-profiler.c:1504 | 6102 | #: src/regex/gnunet-regex-profiler.c:1576 |
5926 | #, fuzzy | 6103 | #, fuzzy |
5927 | msgid "name of file with input strings" | 6104 | msgid "name of file with input strings" |
5928 | msgstr "Visa värde av alternativet" | 6105 | msgstr "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 |
5932 | msgid "name of file with hosts' names" | 6109 | msgid "name of file with hosts' names" |
5933 | msgstr "Visa värde av alternativet" | 6110 | msgstr "Visa värde av alternativet" |
5934 | 6111 | ||
5935 | #: src/regex/gnunet-regex-profiler.c:1523 | 6112 | #: src/regex/gnunet-regex-profiler.c:1595 |
5936 | msgid "Profiler for regex" | 6113 | msgid "Profiler for regex" |
5937 | msgstr "" | 6114 | msgstr "" |
5938 | 6115 | ||
@@ -6166,10 +6343,10 @@ msgstr "" | |||
6166 | msgid "Calculate the Vectorproduct with a GNUnet peer." | 6343 | msgid "Calculate the Vectorproduct with a GNUnet peer." |
6167 | msgstr "" | 6344 | msgstr "" |
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 |
6174 | msgid "Connect to CADET failed\n" | 6351 | msgid "Connect to CADET failed\n" |
6175 | msgstr " Anslutning misslyckades (fel?)\n" | 6352 | msgstr " Anslutning misslyckades (fel?)\n" |
@@ -6194,7 +6371,7 @@ msgstr "" | |||
6194 | msgid "also profile decryption" | 6371 | msgid "also profile decryption" |
6195 | msgstr "" | 6372 | msgstr "" |
6196 | 6373 | ||
6197 | #: src/set/gnunet-service-set.c:1948 | 6374 | #: src/set/gnunet-service-set.c:1989 |
6198 | #, fuzzy | 6375 | #, fuzzy |
6199 | msgid "Could not connect to CADET service\n" | 6376 | msgid "Could not connect to CADET service\n" |
6200 | msgstr "Kunde inte ansluta till gnunetd.\n" | 6377 | msgstr "Kunde inte ansluta till gnunetd.\n" |
@@ -6254,116 +6431,116 @@ msgstr "" | |||
6254 | msgid "say good-bye and leave somebody else's place" | 6431 | msgid "say good-bye and leave somebody else's place" |
6255 | msgstr "" | 6432 | msgstr "" |
6256 | 6433 | ||
6257 | #: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 | 6434 | #: src/social/gnunet-social.c:1227 |
6258 | msgid "create a place" | 6435 | msgid "create a place" |
6259 | msgstr "" | 6436 | msgstr "" |
6260 | 6437 | ||
6261 | #: src/social/gnunet-social.c:1237 | 6438 | #: src/social/gnunet-social.c:1232 |
6262 | msgid "destroy a place we were hosting" | 6439 | msgid "destroy a place we were hosting" |
6263 | msgstr "" | 6440 | msgstr "" |
6264 | 6441 | ||
6265 | #: src/social/gnunet-social.c:1242 | 6442 | #: src/social/gnunet-social.c:1237 |
6266 | msgid "enter somebody else's place" | 6443 | msgid "enter somebody else's place" |
6267 | msgstr "" | 6444 | msgstr "" |
6268 | 6445 | ||
6269 | #: src/social/gnunet-social.c:1248 | 6446 | #: src/social/gnunet-social.c:1243 |
6270 | msgid "find state matching name prefix" | 6447 | msgid "find state matching name prefix" |
6271 | msgstr "" | 6448 | msgstr "" |
6272 | 6449 | ||
6273 | #: src/social/gnunet-social.c:1253 | 6450 | #: src/social/gnunet-social.c:1248 |
6274 | msgid "replay history of messages up to the given --limit" | 6451 | msgid "replay history of messages up to the given --limit" |
6275 | msgstr "" | 6452 | msgstr "" |
6276 | 6453 | ||
6277 | #: src/social/gnunet-social.c:1258 | 6454 | #: src/social/gnunet-social.c:1253 |
6278 | msgid "reconnect to a previously created place" | 6455 | msgid "reconnect to a previously created place" |
6279 | msgstr "" | 6456 | msgstr "" |
6280 | 6457 | ||
6281 | #: src/social/gnunet-social.c:1263 | 6458 | #: src/social/gnunet-social.c:1258 |
6282 | msgid "publish something to a place we are hosting" | 6459 | msgid "publish something to a place we are hosting" |
6283 | msgstr "" | 6460 | msgstr "" |
6284 | 6461 | ||
6285 | #: src/social/gnunet-social.c:1268 | 6462 | #: src/social/gnunet-social.c:1263 |
6286 | msgid "reconnect to a previously entered place" | 6463 | msgid "reconnect to a previously entered place" |
6287 | msgstr "" | 6464 | msgstr "" |
6288 | 6465 | ||
6289 | #: src/social/gnunet-social.c:1273 | 6466 | #: src/social/gnunet-social.c:1268 |
6290 | msgid "search for state matching exact name" | 6467 | msgid "search for state matching exact name" |
6291 | msgstr "" | 6468 | msgstr "" |
6292 | 6469 | ||
6293 | #: src/social/gnunet-social.c:1278 | 6470 | #: src/social/gnunet-social.c:1273 |
6294 | msgid "submit something to somebody's place" | 6471 | msgid "submit something to somebody's place" |
6295 | msgstr "" | 6472 | msgstr "" |
6296 | 6473 | ||
6297 | #: src/social/gnunet-social.c:1283 | 6474 | #: src/social/gnunet-social.c:1278 |
6298 | msgid "list of egos and subscribed places" | 6475 | msgid "list of egos and subscribed places" |
6299 | msgstr "" | 6476 | msgstr "" |
6300 | 6477 | ||
6301 | #: src/social/gnunet-social.c:1288 | 6478 | #: src/social/gnunet-social.c:1283 |
6302 | msgid "extract and replay history between message IDs --start and --until" | 6479 | msgid "extract and replay history between message IDs --start and --until" |
6303 | msgstr "" | 6480 | msgstr "" |
6304 | 6481 | ||
6305 | #: src/social/gnunet-social.c:1297 | 6482 | #: src/social/gnunet-social.c:1292 |
6306 | msgid "application ID to use when connecting" | 6483 | msgid "application ID to use when connecting" |
6307 | msgstr "" | 6484 | msgstr "" |
6308 | 6485 | ||
6309 | #: src/social/gnunet-social.c:1303 | 6486 | #: src/social/gnunet-social.c:1298 |
6310 | msgid "message body or state value" | 6487 | msgid "message body or state value" |
6311 | msgstr "" | 6488 | msgstr "" |
6312 | 6489 | ||
6313 | #: src/social/gnunet-social.c:1309 | 6490 | #: src/social/gnunet-social.c:1304 |
6314 | #, fuzzy | 6491 | #, fuzzy |
6315 | msgid "name or public key of ego" | 6492 | msgid "name or public key of ego" |
6316 | msgstr "Ogiltigt argument: \"%s\"\n" | 6493 | msgstr "Ogiltigt argument: \"%s\"\n" |
6317 | 6494 | ||
6318 | #: src/social/gnunet-social.c:1314 | 6495 | #: src/social/gnunet-social.c:1309 |
6319 | #, fuzzy | 6496 | #, fuzzy |
6320 | msgid "wait for incoming messages" | 6497 | msgid "wait for incoming messages" |
6321 | msgstr "Misslyckades att leverera \"%s\" meddelande.\n" | 6498 | msgstr "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 |
6325 | msgid "GNS name" | 6502 | msgid "GNS name" |
6326 | msgstr "Visa _namn" | 6503 | msgstr "Visa _namn" |
6327 | 6504 | ||
6328 | #: src/social/gnunet-social.c:1326 | 6505 | #: src/social/gnunet-social.c:1321 |
6329 | msgid "peer ID for --guest-enter" | 6506 | msgid "peer ID for --guest-enter" |
6330 | msgstr "" | 6507 | msgstr "" |
6331 | 6508 | ||
6332 | #: src/social/gnunet-social.c:1332 | 6509 | #: src/social/gnunet-social.c:1327 |
6333 | msgid "name (key) to query from state" | 6510 | msgid "name (key) to query from state" |
6334 | msgstr "" | 6511 | msgstr "" |
6335 | 6512 | ||
6336 | #: src/social/gnunet-social.c:1338 | 6513 | #: src/social/gnunet-social.c:1333 |
6337 | #, fuzzy | 6514 | #, fuzzy |
6338 | msgid "method name" | 6515 | msgid "method name" |
6339 | msgstr "Visa _namn" | 6516 | msgstr "Visa _namn" |
6340 | 6517 | ||
6341 | #: src/social/gnunet-social.c:1344 | 6518 | #: src/social/gnunet-social.c:1339 |
6342 | #, fuzzy | 6519 | #, fuzzy |
6343 | msgid "number of messages to replay from history" | 6520 | msgid "number of messages to replay from history" |
6344 | msgstr "antal meddelanden att använda per iteration" | 6521 | msgstr "antal meddelanden att använda per iteration" |
6345 | 6522 | ||
6346 | #: src/social/gnunet-social.c:1350 | 6523 | #: src/social/gnunet-social.c:1345 |
6347 | msgid "key address of place" | 6524 | msgid "key address of place" |
6348 | msgstr "" | 6525 | msgstr "" |
6349 | 6526 | ||
6350 | #: src/social/gnunet-social.c:1356 | 6527 | #: src/social/gnunet-social.c:1351 |
6351 | msgid "start message ID for history replay" | 6528 | msgid "start message ID for history replay" |
6352 | msgstr "" | 6529 | msgstr "" |
6353 | 6530 | ||
6354 | #: src/social/gnunet-social.c:1361 | 6531 | #: src/social/gnunet-social.c:1356 |
6355 | msgid "respond to entry requests by admitting all guests" | 6532 | msgid "respond to entry requests by admitting all guests" |
6356 | msgstr "" | 6533 | msgstr "" |
6357 | 6534 | ||
6358 | #: src/social/gnunet-social.c:1367 | 6535 | #: src/social/gnunet-social.c:1362 |
6359 | msgid "end message ID for history replay" | 6536 | msgid "end message ID for history replay" |
6360 | msgstr "" | 6537 | msgstr "" |
6361 | 6538 | ||
6362 | #: src/social/gnunet-social.c:1372 | 6539 | #: src/social/gnunet-social.c:1367 |
6363 | msgid "respond to entry requests by refusing all guests" | 6540 | msgid "respond to entry requests by refusing all guests" |
6364 | msgstr "" | 6541 | msgstr "" |
6365 | 6542 | ||
6366 | #: src/social/gnunet-social.c:1382 | 6543 | #: src/social/gnunet-social.c:1377 |
6367 | msgid "" | 6544 | msgid "" |
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 "" | |||
6556 | msgstr "" | 6733 | msgstr "" |
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 |
6561 | msgid "Incorrect hostkey file format: %s\n" | 6738 | msgid "Incorrect hostkey file format: %s\n" |
6562 | msgstr "" | 6739 | msgstr "" |
@@ -6626,16 +6803,6 @@ msgstr "" | |||
6626 | msgid "%.s Unknown result code." | 6803 | msgid "%.s Unknown result code." |
6627 | msgstr "" | 6804 | msgstr "" |
6628 | 6805 | ||
6629 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6630 | #, fuzzy | ||
6631 | msgid "Waiting for child to exit.\n" | ||
6632 | msgstr "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 | ||
6636 | msgid "Spawning process `%s'\n" | ||
6637 | msgstr "Startade samling \"%s\".\n" | ||
6638 | |||
6639 | #: src/testbed/gnunet-testbed-profiler.c:290 | 6806 | #: src/testbed/gnunet-testbed-profiler.c:290 |
6640 | msgid "tolerate COUNT number of continious timeout failures" | 6807 | msgid "tolerate COUNT number of continious timeout failures" |
6641 | msgstr "" | 6808 | msgstr "" |
@@ -6647,6 +6814,16 @@ msgid "" | |||
6647 | "signal is received" | 6814 | "signal is received" |
6648 | msgstr "" | 6815 | msgstr "" |
6649 | 6816 | ||
6817 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6818 | #, fuzzy | ||
6819 | msgid "Waiting for child to exit.\n" | ||
6820 | msgstr "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 | ||
6824 | msgid "Spawning process `%s'\n" | ||
6825 | msgstr "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 |
6652 | msgid "Adding host %u failed with error: %s\n" | 6829 | msgid "Adding host %u failed with error: %s\n" |
@@ -6943,10 +7120,6 @@ msgstr "# krypterade PONG-meddelanden mottagna" | |||
6943 | msgid "GNUnet topology control" | 7120 | msgid "GNUnet topology control" |
6944 | msgstr "" | 7121 | msgstr "" |
6945 | 7122 | ||
6946 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
6947 | msgid "# Addresses given to ATS" | ||
6948 | msgstr "" | ||
6949 | |||
6950 | #: src/transport/gnunet-service-transport.c:448 | 7123 | #: src/transport/gnunet-service-transport.c:448 |
6951 | msgid "# messages dropped due to slow client" | 7124 | msgid "# messages dropped due to slow client" |
6952 | msgstr "" | 7125 | msgstr "" |
@@ -6995,6 +7168,10 @@ msgstr "" | |||
6995 | msgid "Transport service is lacking key configuration settings. Exiting.\n" | 7168 | msgid "Transport service is lacking key configuration settings. Exiting.\n" |
6996 | msgstr "GNUnet-konfiguration" | 7169 | msgstr "GNUnet-konfiguration" |
6997 | 7170 | ||
7171 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
7172 | msgid "# Addresses given to ATS" | ||
7173 | msgstr "" | ||
7174 | |||
6998 | #: src/transport/gnunet-service-transport_hello.c:195 | 7175 | #: src/transport/gnunet-service-transport_hello.c:195 |
6999 | msgid "# refreshed my HELLO" | 7176 | msgid "# refreshed my HELLO" |
7000 | msgstr "" | 7177 | msgstr "" |
@@ -7326,6 +7503,46 @@ msgstr "" | |||
7326 | msgid "# validations succeeded" | 7503 | msgid "# validations succeeded" |
7327 | msgstr "" | 7504 | msgstr "" |
7328 | 7505 | ||
7506 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7507 | #, c-format | ||
7508 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7509 | msgstr "" | ||
7510 | |||
7511 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7512 | msgid "send data to peer" | ||
7513 | msgstr "" | ||
7514 | |||
7515 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7516 | #, fuzzy | ||
7517 | msgid "receive data from peer" | ||
7518 | msgstr "# byte mottagna av typen %d" | ||
7519 | |||
7520 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7521 | #, fuzzy | ||
7522 | msgid "iterations" | ||
7523 | msgstr "Visa alla alternativ" | ||
7524 | |||
7525 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7526 | #, fuzzy | ||
7527 | msgid "number of messages to send" | ||
7528 | msgstr "antal meddelanden att använda per iteration" | ||
7529 | |||
7530 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7531 | #, fuzzy | ||
7532 | msgid "message size to use" | ||
7533 | msgstr "meddelandestorlek" | ||
7534 | |||
7535 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7536 | #: src/transport/gnunet-transport.c:1462 | ||
7537 | msgid "peer identity" | ||
7538 | msgstr "" | ||
7539 | |||
7540 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7541 | #: src/transport/gnunet-transport.c:1482 | ||
7542 | #, fuzzy | ||
7543 | msgid "Direct access to transport service." | ||
7544 | msgstr "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 |
7331 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" | 7548 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" |
@@ -7465,11 +7682,6 @@ msgstr "Skriv ut information om GNUnets motparter." | |||
7465 | msgid "do not resolve hostnames" | 7682 | msgid "do not resolve hostnames" |
7466 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 7683 | msgstr "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 | ||
7470 | msgid "peer identity" | ||
7471 | msgstr "" | ||
7472 | |||
7473 | #: src/transport/gnunet-transport.c:1466 | 7685 | #: src/transport/gnunet-transport.c:1466 |
7474 | msgid "monitor plugin sessions" | 7686 | msgid "monitor plugin sessions" |
7475 | msgstr "" | 7687 | msgstr "" |
@@ -7478,44 +7690,9 @@ msgstr "" | |||
7478 | msgid "send data for benchmarking to the other peer (until CTRL-C)" | 7690 | msgid "send data for benchmarking to the other peer (until CTRL-C)" |
7479 | msgstr "" | 7691 | msgstr "" |
7480 | 7692 | ||
7481 | #: src/transport/gnunet-transport.c:1482 | ||
7482 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7483 | #, fuzzy | ||
7484 | msgid "Direct access to transport service." | ||
7485 | msgstr "Misslyckades att ansluta till gnunetd.\n" | ||
7486 | |||
7487 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7488 | #, c-format | ||
7489 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7490 | msgstr "" | ||
7491 | |||
7492 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7493 | msgid "send data to peer" | ||
7494 | msgstr "" | ||
7495 | |||
7496 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7497 | #, fuzzy | ||
7498 | msgid "receive data from peer" | ||
7499 | msgstr "# byte mottagna av typen %d" | ||
7500 | |||
7501 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7502 | #, fuzzy | ||
7503 | msgid "iterations" | ||
7504 | msgstr "Visa alla alternativ" | ||
7505 | |||
7506 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7507 | #, fuzzy | ||
7508 | msgid "number of messages to send" | ||
7509 | msgstr "antal meddelanden att använda per iteration" | ||
7510 | |||
7511 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7512 | #, fuzzy | ||
7513 | msgid "message size to use" | ||
7514 | msgstr "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 |
7521 | msgid "TCP_STEALTH not supported on this platform.\n" | 7698 | msgid "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" | |||
7527 | msgstr "" | 7704 | msgstr "" |
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 |
7532 | msgid "Shutting down plugin `%s'\n" | 7709 | msgid "Shutting down plugin `%s'\n" |
7533 | msgstr "Testar transport(er) %s\n" | 7710 | msgstr "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 |
7538 | msgid "Shutdown for plugin `%s' complete\n" | 7715 | msgid "Shutdown for plugin `%s' complete\n" |
7539 | msgstr "" | 7716 | msgstr "" |
@@ -7544,108 +7721,108 @@ msgstr "" | |||
7544 | msgid "Maximum number of requests is %u\n" | 7721 | msgid "Maximum number of requests is %u\n" |
7545 | msgstr "Maximalt antal chattklienter uppnått.\n" | 7722 | msgstr "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 |
7549 | msgid "" | 7726 | msgid "" |
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" |
7552 | msgstr "" | 7729 | msgstr "" |
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 |
7556 | msgid "Accepting connection (%u of %u) from `%s'\n" | 7733 | msgid "Accepting connection (%u of %u) from `%s'\n" |
7557 | msgstr "" | 7734 | msgstr "" |
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 |
7561 | msgid "" | 7738 | msgid "" |
7562 | "Server reached maximum number connections (%u), rejecting new connection\n" | 7739 | "Server reached maximum number connections (%u), rejecting new connection\n" |
7563 | msgstr "" | 7740 | msgstr "" |
7564 | 7741 | ||
7565 | #: src/transport/plugin_transport_http_server.c:2125 | 7742 | #: src/transport/plugin_transport_http_server.c:2186 |
7566 | msgid "" | 7743 | msgid "" |
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" |
7569 | msgstr "" | 7746 | msgstr "" |
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 |
7573 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" | 7750 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" |
7574 | msgstr "" | 7751 | msgstr "" |
7575 | 7752 | ||
7576 | #: src/transport/plugin_transport_http_server.c:2275 | 7753 | #: src/transport/plugin_transport_http_server.c:2338 |
7577 | msgid "Could not load or create server certificate! Loading plugin failed!\n" | 7754 | msgid "Could not load or create server certificate! Loading plugin failed!\n" |
7578 | msgstr "" | 7755 | msgstr "" |
7579 | 7756 | ||
7580 | #: src/transport/plugin_transport_http_server.c:2587 | 7757 | #: src/transport/plugin_transport_http_server.c:2650 |
7581 | #, fuzzy | 7758 | #, fuzzy |
7582 | msgid "Require valid port number for service in configuration!\n" | 7759 | msgid "Require valid port number for service in configuration!\n" |
7583 | msgstr "Inga applikationer definierade i konfiguration!\n" | 7760 | msgstr "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 |
7587 | msgid "Found %u addresses to report to NAT service\n" | 7764 | msgid "Found %u addresses to report to NAT service\n" |
7588 | msgstr "" | 7765 | msgstr "" |
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 |
7592 | msgid "Disabling IPv6 since it is not supported on this system!\n" | 7769 | msgid "Disabling IPv6 since it is not supported on this system!\n" |
7593 | msgstr "" | 7770 | msgstr "" |
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 |
7597 | msgid "IPv4 support is %s\n" | 7774 | msgid "IPv4 support is %s\n" |
7598 | msgstr "" | 7775 | msgstr "" |
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 |
7602 | msgid "IPv6 support is %s\n" | 7779 | msgid "IPv6 support is %s\n" |
7603 | msgstr "" | 7780 | msgstr "" |
7604 | 7781 | ||
7605 | #: src/transport/plugin_transport_http_server.c:2965 | 7782 | #: src/transport/plugin_transport_http_server.c:3028 |
7606 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" | 7783 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" |
7607 | msgstr "" | 7784 | msgstr "" |
7608 | 7785 | ||
7609 | #: src/transport/plugin_transport_http_server.c:2976 | 7786 | #: src/transport/plugin_transport_http_server.c:3039 |
7610 | #, fuzzy | 7787 | #, fuzzy |
7611 | msgid "Port is required! Fix in configuration\n" | 7788 | msgid "Port is required! Fix in configuration\n" |
7612 | msgstr " gconfig\tGTK-konfiguration\n" | 7789 | msgstr " 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 |
7616 | msgid "Using port %u\n" | 7793 | msgid "Using port %u\n" |
7617 | msgstr "Testar transport(er) %s\n" | 7794 | msgstr "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 |
7621 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" | 7798 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" |
7622 | msgstr "" | 7799 | msgstr "" |
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 |
7628 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" | 7805 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" |
7629 | msgstr "" | 7806 | msgstr "" |
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 |
7635 | msgid "Using external hostname `%s'\n" | 7812 | msgid "Using external hostname `%s'\n" |
7636 | msgstr "Startade samling \"%s\".\n" | 7813 | msgstr "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 |
7640 | msgid "Notifying transport only about hostname `%s'\n" | 7817 | msgid "Notifying transport only about hostname `%s'\n" |
7641 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 7818 | msgstr "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 |
7645 | msgid "Maximum number of connections is %u\n" | 7822 | msgid "Maximum number of connections is %u\n" |
7646 | msgstr "Maximalt antal chattklienter uppnått.\n" | 7823 | msgstr "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 |
7650 | msgid "Unable to compile URL regex\n" | 7827 | msgid "Unable to compile URL regex\n" |
7651 | msgstr "Kunde inte initiera SQLite.\n" | 7828 | msgstr "Kunde inte initiera SQLite.\n" |
@@ -7800,21 +7977,6 @@ msgstr "" | |||
7800 | msgid "TCP transport advertises itself as being on port %llu\n" | 7977 | msgid "TCP transport advertises itself as being on port %llu\n" |
7801 | msgstr "" | 7978 | msgstr "" |
7802 | 7979 | ||
7803 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7804 | #, fuzzy | ||
7805 | msgid "# Multicast HELLO beacons received via UDP" | ||
7806 | msgstr "# krypterade PONG-meddelanden mottagna" | ||
7807 | |||
7808 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7809 | msgid "" | ||
7810 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7811 | msgstr "" | ||
7812 | |||
7813 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7814 | #, c-format | ||
7815 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7816 | msgstr "" | ||
7817 | |||
7818 | #: src/transport/plugin_transport_udp.c:3366 | 7980 | #: src/transport/plugin_transport_udp.c:3366 |
7819 | #, c-format | 7981 | #, c-format |
7820 | msgid "" | 7982 | msgid "" |
@@ -7863,6 +8025,21 @@ msgstr "\"%s\" är inte tillgänglig." | |||
7863 | msgid "Failed to create UDP network sockets\n" | 8025 | msgid "Failed to create UDP network sockets\n" |
7864 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" | 8026 | msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n" |
7865 | 8027 | ||
8028 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
8029 | #, fuzzy | ||
8030 | msgid "# Multicast HELLO beacons received via UDP" | ||
8031 | msgstr "# krypterade PONG-meddelanden mottagna" | ||
8032 | |||
8033 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
8034 | msgid "" | ||
8035 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
8036 | msgstr "" | ||
8037 | |||
8038 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
8039 | #, c-format | ||
8040 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
8041 | msgstr "" | ||
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 |
7868 | msgid "Cannot create path to `%s'\n" | 8045 | msgid "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" |
7979 | msgstr "" | 8156 | msgstr "" |
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 |
7983 | msgid "Unknown address family %d\n" | 8160 | msgid "Unknown address family %d\n" |
7984 | msgstr "Okänd operation \"%s\"\n" | 8161 | msgstr "Okänd operation \"%s\"\n" |
@@ -8023,51 +8200,51 @@ msgstr "Fel vid %s:%d.\n" | |||
8023 | msgid "Service `%s' runs at %s\n" | 8200 | msgid "Service `%s' runs at %s\n" |
8024 | msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" | 8201 | msgstr "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 |
8027 | msgid "Service process failed to initialize\n" | 8204 | msgid "Service process failed to initialize\n" |
8028 | msgstr "" | 8205 | msgstr "" |
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 |
8031 | msgid "Service process could not initialize server function\n" | 8208 | msgid "Service process could not initialize server function\n" |
8032 | msgstr "" | 8209 | msgstr "" |
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 |
8035 | msgid "Service process failed to report status\n" | 8212 | msgid "Service process failed to report status\n" |
8036 | msgstr "" | 8213 | msgstr "" |
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 |
8041 | msgid "Cannot obtain information about user `%s': %s\n" | 8218 | msgid "Cannot obtain information about user `%s': %s\n" |
8042 | msgstr "Kan inte öppna konfigurationsfil \"%s\".\n" | 8219 | msgstr "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 |
8045 | msgid "No such user" | 8222 | msgid "No such user" |
8046 | msgstr "" | 8223 | msgstr "" |
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 |
8050 | msgid "Cannot change user/group to `%s': %s\n" | 8227 | msgid "Cannot change user/group to `%s': %s\n" |
8051 | msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n" | 8228 | msgstr "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 |
8054 | msgid "do daemonize (detach from terminal)" | 8231 | msgid "do daemonize (detach from terminal)" |
8055 | msgstr "" | 8232 | msgstr "" |
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 |
8060 | msgid "Malformed configuration file `%s', exit ...\n" | 8237 | msgid "Malformed configuration file `%s', exit ...\n" |
8061 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | 8238 | msgstr "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 |
8066 | msgid "Malformed configuration, exit ...\n" | 8243 | msgid "Malformed configuration, exit ...\n" |
8067 | msgstr "Kunde inte spara konfigurationsfil \"%s\":" | 8244 | msgstr "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 |
8072 | msgid "Could not access configuration file `%s'\n" | 8249 | msgid "Could not access configuration file `%s'\n" |
8073 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" | 8250 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" |
@@ -8112,86 +8289,86 @@ msgstr "" | |||
8112 | msgid "Need a non-empty hostname for service `%s'.\n" | 8289 | msgid "Need a non-empty hostname for service `%s'.\n" |
8113 | msgstr "" | 8290 | msgstr "" |
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 |
8116 | msgid "DEBUG" | 8293 | msgid "DEBUG" |
8117 | msgstr "FELSÖKNING" | 8294 | msgstr "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 |
8120 | msgid "INFO" | 8297 | msgid "INFO" |
8121 | msgstr "INFO" | 8298 | msgstr "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 |
8124 | msgid "MESSAGE" | 8301 | msgid "MESSAGE" |
8125 | msgstr "MEDDELANDE" | 8302 | msgstr "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 |
8128 | msgid "WARNING" | 8305 | msgid "WARNING" |
8129 | msgstr "VARNING" | 8306 | msgstr "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 |
8132 | msgid "ERROR" | 8309 | msgid "ERROR" |
8133 | msgstr "FEL" | 8310 | msgstr "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 |
8136 | msgid "NONE" | 8313 | msgid "NONE" |
8137 | msgstr "" | 8314 | msgstr "" |
8138 | 8315 | ||
8139 | #: src/util/common_logging.c:879 | 8316 | #: src/util/common_logging.c:882 |
8140 | #, c-format | 8317 | #, c-format |
8141 | msgid "Message `%.*s' repeated %u times in the last %s\n" | 8318 | msgid "Message `%.*s' repeated %u times in the last %s\n" |
8142 | msgstr "" | 8319 | msgstr "" |
8143 | 8320 | ||
8144 | #: src/util/common_logging.c:1132 | 8321 | #: src/util/common_logging.c:1135 |
8145 | msgid "INVALID" | 8322 | msgid "INVALID" |
8146 | msgstr "" | 8323 | msgstr "" |
8147 | 8324 | ||
8148 | #: src/util/common_logging.c:1302 | 8325 | #: src/util/common_logging.c:1326 |
8149 | msgid "unknown address" | 8326 | msgid "unknown address" |
8150 | msgstr "" | 8327 | msgstr "" |
8151 | 8328 | ||
8152 | #: src/util/common_logging.c:1344 | 8329 | #: src/util/common_logging.c:1368 |
8153 | msgid "invalid address" | 8330 | msgid "invalid address" |
8154 | msgstr "" | 8331 | msgstr "" |
8155 | 8332 | ||
8156 | #: src/util/common_logging.c:1362 | 8333 | #: src/util/common_logging.c:1386 |
8157 | #, fuzzy, c-format | 8334 | #, fuzzy, c-format |
8158 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" | 8335 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" |
8159 | msgstr "Konfigurationsfil \"%s\" skapad.\n" | 8336 | msgstr "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 |
8163 | msgid "" | 8340 | msgid "" |
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" |
8165 | msgstr "Konfigurationsfil \"%s\" hittades inte. Kör \"gnunet-setup -d\"!\n" | 8342 | msgstr "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 |
8169 | msgid "Syntax error while deserializing in line %u\n" | 8346 | msgid "Syntax error while deserializing in line %u\n" |
8170 | msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n" | 8347 | msgstr "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 |
8174 | msgid "Error while reading file `%s'\n" | 8351 | msgid "Error while reading file `%s'\n" |
8175 | msgstr "Fel vid nedladdning: %s\n" | 8352 | msgstr "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 |
8179 | msgid "" | 8356 | msgid "" |
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" |
8182 | msgstr "" | 8359 | msgstr "" |
8183 | 8360 | ||
8184 | #: src/util/configuration.c:1136 | 8361 | #: src/util/configuration.c:1153 |
8185 | #, c-format | 8362 | #, c-format |
8186 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" | 8363 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" |
8187 | msgstr "" | 8364 | msgstr "" |
8188 | 8365 | ||
8189 | #: src/util/configuration.c:1169 | 8366 | #: src/util/configuration.c:1186 |
8190 | #, fuzzy, c-format | 8367 | #, fuzzy, c-format |
8191 | msgid "Missing closing `%s' in option `%s'\n" | 8368 | msgid "Missing closing `%s' in option `%s'\n" |
8192 | msgstr "Konfigurationsfil \"%s\" skapad.\n" | 8369 | msgstr "Konfigurationsfil \"%s\" skapad.\n" |
8193 | 8370 | ||
8194 | #: src/util/configuration.c:1237 | 8371 | #: src/util/configuration.c:1254 |
8195 | #, c-format | 8372 | #, c-format |
8196 | msgid "" | 8373 | msgid "" |
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" | |||
8225 | msgid "EdDSA signature verification failed at %s:%d: %s\n" | 8402 | msgid "EdDSA signature verification failed at %s:%d: %s\n" |
8226 | msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" | 8403 | msgstr "\"%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 |
8231 | msgid "Could not acquire lock on file `%s': %s...\n" | 8408 | msgid "Could not acquire lock on file `%s': %s...\n" |
8232 | msgstr "Kunde inte slå upp \"%s\": %s\n" | 8409 | msgstr "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 |
8236 | msgid "Creating a new private key. This may take a while.\n" | 8413 | msgid "Creating a new private key. This may take a while.\n" |
8237 | msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n" | 8414 | msgstr "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 |
8240 | msgid "This may be ok if someone is currently generating a private key.\n" | 8417 | msgid "This may be ok if someone is currently generating a private key.\n" |
8241 | msgstr "" | 8418 | msgstr "" |
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 |
8245 | msgid "" | 8422 | msgid "" |
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" |
8247 | msgstr "" | 8424 | msgstr "" |
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 |
8250 | msgid "This may be ok if someone is currently generating a key.\n" | 8427 | msgid "This may be ok if someone is currently generating a key.\n" |
8251 | msgstr "" | 8428 | msgstr "" |
8252 | 8429 | ||
8253 | #: src/util/crypto_ecc_setup.c:413 | 8430 | #: src/util/crypto_ecc_setup.c:415 |
8254 | #, fuzzy | 8431 | #, fuzzy |
8255 | msgid "Could not load peer's private key\n" | 8432 | msgid "Could not load peer's private key\n" |
8256 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" | 8433 | msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n" |
@@ -8444,82 +8621,86 @@ msgstr "" | |||
8444 | msgid "Manipulate GNUnet configuration files" | 8621 | msgid "Manipulate GNUnet configuration files" |
8445 | msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" | 8622 | msgstr "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 |
8449 | msgid "Failed to open `%s': %s\n" | 8626 | msgid "Failed to open `%s': %s\n" |
8450 | msgstr "Misslyckades att leverera \"%s\" meddelande.\n" | 8627 | msgstr "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 |
8454 | msgid "Generating %u keys like %s, please wait" | 8631 | msgid "Generating %u keys like %s, please wait" |
8455 | msgstr "" | 8632 | msgstr "" |
8456 | 8633 | ||
8457 | #: src/util/gnunet-ecc.c:133 | 8634 | #: src/util/gnunet-ecc.c:138 |
8458 | #, c-format | 8635 | #, c-format |
8459 | msgid "Generating %u keys, please wait" | 8636 | msgid "Generating %u keys, please wait" |
8460 | msgstr "" | 8637 | msgstr "" |
8461 | 8638 | ||
8462 | #: src/util/gnunet-ecc.c:174 | 8639 | #: src/util/gnunet-ecc.c:179 |
8463 | #, fuzzy, c-format | 8640 | #, fuzzy, c-format |
8464 | msgid "" | 8641 | msgid "" |
8465 | "\n" | 8642 | "\n" |
8466 | "Failed to write to `%s': %s\n" | 8643 | "Failed to write to `%s': %s\n" |
8467 | msgstr "Fel vid %s:%d.\n" | 8644 | msgstr "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 |
8471 | msgid "" | 8648 | msgid "" |
8472 | "\n" | 8649 | "\n" |
8473 | "Finished!\n" | 8650 | "Finished!\n" |
8474 | msgstr "Slutför" | 8651 | msgstr "Slutför" |
8475 | 8652 | ||
8476 | #: src/util/gnunet-ecc.c:187 | 8653 | #: src/util/gnunet-ecc.c:192 |
8477 | #, c-format | 8654 | #, c-format |
8478 | msgid "" | 8655 | msgid "" |
8479 | "\n" | 8656 | "\n" |
8480 | "Error, %u keys not generated\n" | 8657 | "Error, %u keys not generated\n" |
8481 | msgstr "" | 8658 | msgstr "" |
8482 | 8659 | ||
8483 | #: src/util/gnunet-ecc.c:280 | 8660 | #: src/util/gnunet-ecc.c:283 |
8484 | #, fuzzy, c-format | 8661 | #, fuzzy, c-format |
8485 | msgid "Hostkeys file `%s' not found\n" | 8662 | msgid "Hostkeys file `%s' not found\n" |
8486 | msgstr "\"%s\" misslyckades: tabell hittades inte!\n" | 8663 | msgstr "\"%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 |
8490 | msgid "Hostkeys file `%s' is empty\n" | 8667 | msgid "Hostkeys file `%s' is empty\n" |
8491 | msgstr "antal meddelanden att använda per iteration" | 8668 | msgstr "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 |
8495 | msgid "Could not read hostkey file: %s\n" | 8672 | msgid "Could not read hostkey file: %s\n" |
8496 | msgstr "Kunde inte skapa värdnyckel!\n" | 8673 | msgstr "Kunde inte skapa värdnyckel!\n" |
8497 | 8674 | ||
8498 | #: src/util/gnunet-ecc.c:364 | 8675 | #: src/util/gnunet-ecc.c:367 |
8499 | msgid "No hostkey file specified on command line\n" | 8676 | msgid "No hostkey file specified on command line\n" |
8500 | msgstr "" | 8677 | msgstr "" |
8501 | 8678 | ||
8502 | #: src/util/gnunet-ecc.c:416 | 8679 | #: src/util/gnunet-ecc.c:425 |
8503 | msgid "list keys included in a file (for testing)" | 8680 | msgid "list keys included in a file (for testing)" |
8504 | msgstr "" | 8681 | msgstr "" |
8505 | 8682 | ||
8506 | #: src/util/gnunet-ecc.c:421 | 8683 | #: src/util/gnunet-ecc.c:430 |
8507 | msgid "number of keys to list included in a file (for testing)" | 8684 | msgid "number of keys to list included in a file (for testing)" |
8508 | msgstr "" | 8685 | msgstr "" |
8509 | 8686 | ||
8510 | #: src/util/gnunet-ecc.c:426 | 8687 | #: src/util/gnunet-ecc.c:435 |
8511 | msgid "create COUNT public-private key pairs (for testing)" | 8688 | msgid "create COUNT public-private key pairs (for testing)" |
8512 | msgstr "" | 8689 | msgstr "" |
8513 | 8690 | ||
8514 | #: src/util/gnunet-ecc.c:430 | 8691 | #: src/util/gnunet-ecc.c:439 |
8515 | msgid "print the public key in ASCII format" | 8692 | msgid "print the public key in ASCII format" |
8516 | msgstr "" | 8693 | msgstr "" |
8517 | 8694 | ||
8518 | #: src/util/gnunet-ecc.c:434 | 8695 | #: src/util/gnunet-ecc.c:443 |
8696 | msgid "print the public key in HEX format" | ||
8697 | msgstr "" | ||
8698 | |||
8699 | #: src/util/gnunet-ecc.c:447 | ||
8519 | msgid "print examples of ECC operations (used for compatibility testing)" | 8700 | msgid "print examples of ECC operations (used for compatibility testing)" |
8520 | msgstr "" | 8701 | msgstr "" |
8521 | 8702 | ||
8522 | #: src/util/gnunet-ecc.c:449 | 8703 | #: src/util/gnunet-ecc.c:463 |
8523 | #, fuzzy | 8704 | #, fuzzy |
8524 | msgid "Manipulate GNUnet private ECC key files" | 8705 | msgid "Manipulate GNUnet private ECC key files" |
8525 | msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" | 8706 | msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" |
@@ -8613,7 +8794,7 @@ msgstr "Fel vid skapandet av användare" | |||
8613 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" | 8794 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" |
8614 | msgstr "" | 8795 | msgstr "" |
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 |
8618 | msgid "" | 8799 | msgid "" |
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" | |||
8667 | msgid "Could not determine plugin installation path.\n" | 8848 | msgid "Could not determine plugin installation path.\n" |
8668 | msgstr "Kunde inte fastställa min publika IPv6-adress.\n" | 8849 | msgstr "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 |
8672 | msgid "" | 8853 | msgid "" |
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 |
8687 | msgid "Timeout trying to resolve hostname `%s'.\n" | 8868 | msgid "Timeout trying to resolve hostname `%s'.\n" |
8688 | msgstr "Misslyckades att läsa kompislista från \"%s\"\n" | 8869 | msgstr "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 |
8692 | msgid "Timeout trying to resolve IP address `%s'.\n" | 8873 | msgid "Timeout trying to resolve IP address `%s'.\n" |
8693 | msgstr "" | 8874 | msgstr "" |
8694 | 8875 | ||
8695 | #: src/util/resolver_api.c:1004 | 8876 | #: src/util/resolver_api.c:1023 |
8696 | msgid "Resolver not configured correctly.\n" | 8877 | msgid "Resolver not configured correctly.\n" |
8697 | msgstr "" | 8878 | msgstr "" |
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 |
8702 | msgid "Could not resolve our FQDN: %s\n" | 8883 | msgid "Could not resolve our FQDN: %s\n" |
8703 | msgstr "Kunde inte slå upp \"%s\": %s\n" | 8884 | msgstr "Kunde inte slå upp \"%s\": %s\n" |
8704 | 8885 | ||
8705 | #: src/util/service.c:1306 | 8886 | #: src/util/service.c:1305 |
8706 | msgid "" | 8887 | msgid "" |
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" |
8708 | msgstr "" | 8889 | msgstr "" |
8709 | 8890 | ||
8710 | #: src/util/service.c:2082 | 8891 | #: src/util/service.c:2081 |
8711 | #, c-format | 8892 | #, c-format |
8712 | msgid "" | 8893 | msgid "" |
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" | |||
8784 | msgid "end of time" | 8965 | msgid "end of time" |
8785 | msgstr "" | 8966 | msgstr "" |
8786 | 8967 | ||
8787 | #: src/util/strings.c:1269 | 8968 | #: src/util/strings.c:1270 |
8788 | msgid "IPv6 address did not start with `['\n" | 8969 | msgid "IPv6 address did not start with `['\n" |
8789 | msgstr "" | 8970 | msgstr "" |
8790 | 8971 | ||
8791 | #: src/util/strings.c:1277 | 8972 | #: src/util/strings.c:1278 |
8792 | msgid "IPv6 address did contain ':' to separate port number\n" | 8973 | msgid "IPv6 address did contain ':' to separate port number\n" |
8793 | msgstr "" | 8974 | msgstr "" |
8794 | 8975 | ||
8795 | #: src/util/strings.c:1283 | 8976 | #: src/util/strings.c:1284 |
8796 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" | 8977 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" |
8797 | msgstr "" | 8978 | msgstr "" |
8798 | 8979 | ||
8799 | #: src/util/strings.c:1290 | 8980 | #: src/util/strings.c:1291 |
8800 | msgid "IPv6 address did contain a valid port number after the last ':'\n" | 8981 | msgid "IPv6 address did contain a valid port number after the last ':'\n" |
8801 | msgstr "" | 8982 | msgstr "" |
8802 | 8983 | ||
8803 | #: src/util/strings.c:1299 | 8984 | #: src/util/strings.c:1300 |
8804 | #, fuzzy, c-format | 8985 | #, fuzzy, c-format |
8805 | msgid "Invalid IPv6 address `%s': %s\n" | 8986 | msgid "Invalid IPv6 address `%s': %s\n" |
8806 | msgstr "Ogiltigt svar på \"%s\".\n" | 8987 | msgstr "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 |
8809 | msgid "Port not in range\n" | 8990 | msgid "Port not in range\n" |
8810 | msgstr "" | 8991 | msgstr "" |
8811 | 8992 | ||
8812 | #: src/util/strings.c:1596 | 8993 | #: src/util/strings.c:1597 |
8813 | #, fuzzy, c-format | 8994 | #, fuzzy, c-format |
8814 | msgid "Malformed port policy `%s'\n" | 8995 | msgid "Malformed port policy `%s'\n" |
8815 | msgstr "Misslyckades att starta samling.\n" | 8996 | msgstr "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 |
8820 | msgid "Invalid format for IP: `%s'\n" | 9001 | msgid "Invalid format for IP: `%s'\n" |
8821 | msgstr "Ogiltigt format för IP: \"%s\"\n" | 9002 | msgstr "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 |
8825 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." | 9006 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." |
8826 | msgstr "Ogiltig nätverksnotation (\"/%d\" är inte giltig i IPv4 CIDR)." | 9007 | msgstr "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 |
8830 | msgid "Invalid format: `%s'\n" | 9011 | msgid "Invalid format: `%s'\n" |
8831 | msgstr "Ogiltigt format för IP: \"%s\"\n" | 9012 | msgstr "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 |
8835 | msgid "Invalid network notation (does not end with ';': `%s')\n" | 9016 | msgid "Invalid network notation (does not end with ';': `%s')\n" |
8836 | msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n" | 9017 | msgstr "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 |
8840 | msgid "Wrong format `%s' for netmask\n" | 9021 | msgid "Wrong format `%s' for netmask\n" |
8841 | msgstr "Fel format \"%s\" för nätmask: %s\n" | 9022 | msgstr "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 |
8845 | msgid "Wrong format `%s' for network\n" | 9026 | msgid "Wrong format `%s' for network\n" |
8846 | msgstr "Fel format \"%s\" för nätverk: %s\n" | 9027 | msgstr "Fel format \"%s\" för nätverk: %s\n" |
@@ -9023,28 +9204,44 @@ msgstr "# byte mottagna via UDP" | |||
9023 | msgid "Setup tunnels via VPN." | 9204 | msgid "Setup tunnels via VPN." |
9024 | msgstr "" | 9205 | msgstr "" |
9025 | 9206 | ||
9026 | #: src/zonemaster/gnunet-service-zonemaster.c:705 | 9207 | #: src/zonemaster/gnunet-service-zonemaster.c:706 |
9027 | #, fuzzy | 9208 | #, fuzzy |
9028 | msgid "Failed to connect to the namestore!\n" | 9209 | msgid "Failed to connect to the namestore!\n" |
9029 | msgstr "Misslyckades att ansluta till gnunetd.\n" | 9210 | msgstr "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 |
9034 | msgid "Assertion failed at %s:%d.\n" | 9215 | msgid "Assertion failed at %s:%d.\n" |
9035 | msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" | 9216 | msgstr "\"%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 |
9039 | msgid "External protocol violation detected at %s:%d.\n" | 9220 | msgid "External protocol violation detected at %s:%d.\n" |
9040 | msgstr "" | 9221 | msgstr "" |
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 |
9044 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" | 9225 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" |
9045 | msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" | 9226 | msgstr "\"%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 | ||
@@ -8,7 +8,7 @@ msgid "" | |||
8 | msgstr "" | 8 | msgstr "" |
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" | |||
280 | msgstr "" | 280 | msgstr "" |
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" | |||
288 | msgstr "Lá»—i mở táºp tin ghi sá»± kiện « %s »: %s\n" | 288 | msgstr "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 "" | |||
362 | msgid "Initiating shutdown as requested by client.\n" | 362 | msgid "Initiating shutdown as requested by client.\n" |
363 | msgstr "" | 363 | msgstr "" |
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 | ||
367 | msgid "" | ||
368 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
369 | "%llu\n" | ||
370 | msgstr "" | ||
371 | |||
372 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
373 | #, c-format | ||
374 | msgid "" | ||
375 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
376 | "%llu\n" | ||
377 | msgstr "" | ||
378 | |||
379 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
380 | #, c-format | ||
381 | msgid "" | ||
382 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
383 | "%llu\n" | ||
384 | msgstr "" | ||
385 | |||
386 | #: src/ats/gnunet-ats-solver-eval.c:3294 | ||
387 | #: src/ats-tests/gnunet-solver-eval.c:939 | ||
388 | msgid "solver to use" | ||
389 | msgstr "" | ||
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 | ||
394 | msgid "experiment to use" | ||
395 | msgstr "" | ||
396 | |||
397 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
398 | #, fuzzy | 366 | #, fuzzy |
399 | msgid "print logging" | 367 | msgid "Stop logging\n" |
400 | msgstr "Theo dõi" | 368 | msgstr "Theo dõi" |
401 | 369 | ||
402 | #: src/ats/gnunet-ats-solver-eval.c:3311 | 370 | #: src/ats-tests/ats-testing-log.c:892 |
403 | msgid "save logging to disk" | ||
404 | msgstr "" | ||
405 | |||
406 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
407 | msgid "disable normalization" | ||
408 | msgstr "" | ||
409 | |||
410 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
411 | #, c-format | ||
412 | msgid "" | ||
413 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
414 | "%llu\n" | ||
415 | msgstr "" | ||
416 | |||
417 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
418 | #, c-format | ||
419 | msgid "%s quota configured for network `%s' is %llu\n" | ||
420 | msgstr "" | ||
421 | |||
422 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
423 | #, c-format | ||
424 | msgid "" | ||
425 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
426 | msgstr "" | ||
427 | |||
428 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
429 | #, fuzzy, c-format | ||
430 | msgid "Failed to initialize solver `%s'!\n" | ||
431 | msgstr "Không thể sơ khởi SQLite: %s.\n" | ||
432 | |||
433 | #: src/ats/plugin_ats_mlp.c:1274 | ||
434 | msgid "Problem size too large, cannot allocate memory!\n" | ||
435 | msgstr "" | ||
436 | |||
437 | #: src/ats/plugin_ats_mlp.c:1869 | ||
438 | #, fuzzy, c-format | ||
439 | msgid "Adding address for peer `%s' multiple times\n" | ||
440 | msgstr "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 | ||
444 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
445 | msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n" | ||
446 | |||
447 | #: src/ats/plugin_ats_mlp.c:2475 | ||
448 | msgid "" | ||
449 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
450 | msgstr "" | ||
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 | ||
460 | msgid "Invalid %s configuration %f \n" | ||
461 | msgstr "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 | ||
465 | msgid "" | ||
466 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
467 | "%llu must be at least %llu\n" | ||
468 | msgstr "" | ||
469 | |||
470 | #: src/ats/plugin_ats_mlp.c:2679 | ||
471 | #, c-format | ||
472 | msgid "" | ||
473 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
474 | "must be at least %llu\n" | ||
475 | msgstr "" | ||
476 | |||
477 | #: src/ats/plugin_ats_mlp.c:2689 | ||
478 | #, c-format | ||
479 | msgid "" | ||
480 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
481 | msgstr "" | ||
482 | |||
483 | #: src/ats/plugin_ats_mlp.c:2698 | ||
484 | #, c-format | ||
485 | msgid "" | ||
486 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
487 | msgstr "" | ||
488 | |||
489 | #: src/ats/plugin_ats_proportional.c:1164 | ||
490 | #, fuzzy, c-format | 371 | #, fuzzy, c-format |
491 | msgid "Invalid %s configuration %f\n" | 372 | msgid "Start logging `%s'\n" |
492 | msgstr "Không thể lÆ°u táºp tin cấu hình « %s »:" | 373 | msgstr "Ä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 "" | |||
501 | msgid "Failed to connect master peer [%u] with slave [%u]\n" | 382 | msgid "Failed to connect master peer [%u] with slave [%u]\n" |
502 | msgstr "Lỗi kết nối đến gnunetd.\n" | 383 | msgstr "Lỗi kết nối đến gnunetd.\n" |
503 | 384 | ||
504 | #: src/ats-tests/ats-testing-log.c:837 | ||
505 | #, fuzzy | ||
506 | msgid "Stop logging\n" | ||
507 | msgstr "Theo dõi" | ||
508 | |||
509 | #: src/ats-tests/ats-testing-log.c:892 | ||
510 | #, fuzzy, c-format | ||
511 | msgid "Start logging `%s'\n" | ||
512 | msgstr "Ä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 |
516 | msgid "" | 387 | msgid "" |
@@ -518,6 +389,15 @@ msgid "" | |||
518 | "= %u KiB/s\n" | 389 | "= %u KiB/s\n" |
519 | msgstr "" | 390 | msgstr "" |
520 | 391 | ||
392 | #: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294 | ||
393 | msgid "solver to use" | ||
394 | msgstr "" | ||
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 | ||
398 | msgid "experiment to use" | ||
399 | msgstr "" | ||
400 | |||
521 | #: src/ats-tool/gnunet-ats.c:307 | 401 | #: src/ats-tool/gnunet-ats.c:307 |
522 | #, c-format | 402 | #, c-format |
523 | msgid "%u address resolutions had a timeout\n" | 403 | msgid "%u address resolutions had a timeout\n" |
@@ -640,6 +520,124 @@ msgstr "" | |||
640 | msgid "Print information about ATS state" | 520 | msgid "Print information about ATS state" |
641 | msgstr "In ra thông tin vỠcác đồng đẳng GNUnet." | 521 | msgstr "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 | ||
525 | msgid "" | ||
526 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
527 | "%llu\n" | ||
528 | msgstr "" | ||
529 | |||
530 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
531 | #, c-format | ||
532 | msgid "" | ||
533 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
534 | "%llu\n" | ||
535 | msgstr "" | ||
536 | |||
537 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
538 | #, c-format | ||
539 | msgid "" | ||
540 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
541 | "%llu\n" | ||
542 | msgstr "" | ||
543 | |||
544 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
545 | #, fuzzy | ||
546 | msgid "print logging" | ||
547 | msgstr "Theo dõi" | ||
548 | |||
549 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
550 | msgid "save logging to disk" | ||
551 | msgstr "" | ||
552 | |||
553 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
554 | msgid "disable normalization" | ||
555 | msgstr "" | ||
556 | |||
557 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
558 | #, c-format | ||
559 | msgid "" | ||
560 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
561 | "%llu\n" | ||
562 | msgstr "" | ||
563 | |||
564 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
565 | #, c-format | ||
566 | msgid "%s quota configured for network `%s' is %llu\n" | ||
567 | msgstr "" | ||
568 | |||
569 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
570 | #, c-format | ||
571 | msgid "" | ||
572 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
573 | msgstr "" | ||
574 | |||
575 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
576 | #, fuzzy, c-format | ||
577 | msgid "Failed to initialize solver `%s'!\n" | ||
578 | msgstr "Không thể sơ khởi SQLite: %s.\n" | ||
579 | |||
580 | #: src/ats/plugin_ats_mlp.c:1274 | ||
581 | msgid "Problem size too large, cannot allocate memory!\n" | ||
582 | msgstr "" | ||
583 | |||
584 | #: src/ats/plugin_ats_mlp.c:1869 | ||
585 | #, fuzzy, c-format | ||
586 | msgid "Adding address for peer `%s' multiple times\n" | ||
587 | msgstr "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 | ||
591 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
592 | msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n" | ||
593 | |||
594 | #: src/ats/plugin_ats_mlp.c:2475 | ||
595 | msgid "" | ||
596 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
597 | msgstr "" | ||
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 | ||
607 | msgid "Invalid %s configuration %f \n" | ||
608 | msgstr "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 | ||
612 | msgid "" | ||
613 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
614 | "%llu must be at least %llu\n" | ||
615 | msgstr "" | ||
616 | |||
617 | #: src/ats/plugin_ats_mlp.c:2679 | ||
618 | #, c-format | ||
619 | msgid "" | ||
620 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
621 | "must be at least %llu\n" | ||
622 | msgstr "" | ||
623 | |||
624 | #: src/ats/plugin_ats_mlp.c:2689 | ||
625 | #, c-format | ||
626 | msgid "" | ||
627 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
628 | msgstr "" | ||
629 | |||
630 | #: src/ats/plugin_ats_mlp.c:2698 | ||
631 | #, c-format | ||
632 | msgid "" | ||
633 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
634 | msgstr "" | ||
635 | |||
636 | #: src/ats/plugin_ats_proportional.c:1164 | ||
637 | #, fuzzy, c-format | ||
638 | msgid "Invalid %s configuration %f\n" | ||
639 | msgstr "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 |
644 | msgid "description of the item to be sold" | 642 | msgid "description of the item to be sold" |
645 | msgstr "" | 643 | msgstr "" |
@@ -788,6 +786,28 @@ msgstr "" | |||
788 | msgid "Connection to conversation service lost, trying to reconnect\n" | 786 | msgid "Connection to conversation service lost, trying to reconnect\n" |
789 | msgstr "" | 787 | msgstr "" |
790 | 788 | ||
789 | #: src/conversation/gnunet-conversation-test.c:119 | ||
790 | #, c-format | ||
791 | msgid "" | ||
792 | "\n" | ||
793 | "End of transmission. Have a GNU day.\n" | ||
794 | msgstr "" | ||
795 | |||
796 | #: src/conversation/gnunet-conversation-test.c:145 | ||
797 | #, c-format | ||
798 | msgid "" | ||
799 | "\n" | ||
800 | "We are now playing your recording back. If you can hear it, your audio " | ||
801 | "settings are working..." | ||
802 | msgstr "" | ||
803 | |||
804 | #: src/conversation/gnunet-conversation-test.c:210 | ||
805 | #, c-format | ||
806 | msgid "" | ||
807 | "We will now be recording you for %s. After that time, the recording will be " | ||
808 | "played back to you..." | ||
809 | msgstr "" | ||
810 | |||
791 | #: src/conversation/gnunet-conversation.c:269 | 811 | #: src/conversation/gnunet-conversation.c:269 |
792 | #, c-format | 812 | #, c-format |
793 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" | 813 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" |
@@ -1045,30 +1065,8 @@ msgstr "" | |||
1045 | msgid "Enables having a conversation with other GNUnet users." | 1065 | msgid "Enables having a conversation with other GNUnet users." |
1046 | msgstr "" | 1066 | msgstr "" |
1047 | 1067 | ||
1048 | #: src/conversation/gnunet-conversation-test.c:119 | ||
1049 | #, c-format | ||
1050 | msgid "" | ||
1051 | "\n" | ||
1052 | "End of transmission. Have a GNU day.\n" | ||
1053 | msgstr "" | ||
1054 | |||
1055 | #: src/conversation/gnunet-conversation-test.c:145 | ||
1056 | #, c-format | ||
1057 | msgid "" | ||
1058 | "\n" | ||
1059 | "We are now playing your recording back. If you can hear it, your audio " | ||
1060 | "settings are working..." | ||
1061 | msgstr "" | ||
1062 | |||
1063 | #: src/conversation/gnunet-conversation-test.c:210 | ||
1064 | #, c-format | ||
1065 | msgid "" | ||
1066 | "We will now be recording you for %s. After that time, the recording will be " | ||
1067 | "played back to you..." | ||
1068 | msgstr "" | ||
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 |
1073 | msgid "Read error from STDIN: %d %s\n" | 1071 | msgid "Read error from STDIN: %d %s\n" |
1074 | msgstr "" | 1072 | msgstr "" |
@@ -1198,6 +1196,11 @@ msgstr "SMTP: « %s » bị lỗi: %s\n" | |||
1198 | msgid "Failed to allocate %u bytes for second packet\n" | 1196 | msgid "Failed to allocate %u bytes for second packet\n" |
1199 | msgstr "Lá»—i tạo thÆ° mục tạm thá»i." | 1197 | msgstr "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 | ||
1201 | msgid "Could not open line, port %s already in use!\n" | ||
1202 | msgstr "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 |
1203 | msgid "Could not start record audio helper\n" | 1206 | msgid "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" | |||
1499 | msgid "# updates to my type map" | 1502 | msgid "# updates to my type map" |
1500 | msgstr "" | 1503 | msgstr "" |
1501 | 1504 | ||
1505 | #: src/credential/credential_misc.c:88 | ||
1506 | #, fuzzy, c-format | ||
1507 | msgid "Unable to parse CRED record string `%s'\n" | ||
1508 | msgstr "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 | ||
1513 | msgid "Ego `%s' not known to identity service\n" | ||
1514 | msgstr "" | ||
1515 | |||
1516 | #: src/credential/gnunet-credential.c:294 | ||
1517 | #: src/credential/gnunet-credential.c:446 | ||
1518 | #, fuzzy, c-format | ||
1519 | msgid "Issuer public key `%s' is not well-formed\n" | ||
1520 | msgstr "Äố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 | ||
1525 | msgid "Issuer public key not well-formed\n" | ||
1526 | msgstr "Äố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 | ||
1531 | msgid "Failed to connect to CREDENTIAL\n" | ||
1532 | msgstr "Lỗi kết nối đến gnunetd.\n" | ||
1533 | |||
1534 | #: src/credential/gnunet-credential.c:392 | ||
1535 | #, c-format | ||
1536 | msgid "You must provide issuer the attribute\n" | ||
1537 | msgstr "" | ||
1538 | |||
1539 | #: src/credential/gnunet-credential.c:399 | ||
1540 | #, c-format | ||
1541 | msgid "ego required\n" | ||
1542 | msgstr "" | ||
1543 | |||
1544 | #: src/credential/gnunet-credential.c:415 | ||
1545 | #, c-format | ||
1546 | msgid "Subject public key needed\n" | ||
1547 | msgstr "" | ||
1548 | |||
1549 | #: src/credential/gnunet-credential.c:426 | ||
1550 | #, fuzzy, c-format | ||
1551 | msgid "Subject public key `%s' is not well-formed\n" | ||
1552 | msgstr "Äối số không hợp lệ cho « %s ».\n" | ||
1553 | |||
1554 | #: src/credential/gnunet-credential.c:461 | ||
1555 | #, c-format | ||
1556 | msgid "You must provide issuer and subject attributes\n" | ||
1557 | msgstr "" | ||
1558 | |||
1559 | #: src/credential/gnunet-credential.c:511 | ||
1560 | #, c-format | ||
1561 | msgid "Issuer ego required\n" | ||
1562 | msgstr "" | ||
1563 | |||
1564 | #: src/credential/gnunet-credential.c:523 | ||
1565 | #, c-format | ||
1566 | msgid "Please specify name to lookup, subject key and issuer key!\n" | ||
1567 | msgstr "" | ||
1568 | |||
1569 | #: src/credential/gnunet-credential.c:543 | ||
1570 | msgid "create credential" | ||
1571 | msgstr "" | ||
1572 | |||
1573 | #: src/credential/gnunet-credential.c:547 | ||
1574 | msgid "verify credential against attribute" | ||
1575 | msgstr "" | ||
1576 | |||
1577 | #: src/credential/gnunet-credential.c:552 | ||
1578 | #, fuzzy | ||
1579 | msgid "The public key of the subject to lookup the credential for" | ||
1580 | msgstr "xác định mức ưu tiên của nội dung" | ||
1581 | |||
1582 | #: src/credential/gnunet-credential.c:557 | ||
1583 | msgid "The name of the credential presented by the subject" | ||
1584 | msgstr "" | ||
1585 | |||
1586 | #: src/credential/gnunet-credential.c:562 | ||
1587 | #, fuzzy | ||
1588 | msgid "The public key of the authority to verify the credential against" | ||
1589 | msgstr "xác định mức ưu tiên của nội dung" | ||
1590 | |||
1591 | #: src/credential/gnunet-credential.c:567 | ||
1592 | #, fuzzy | ||
1593 | msgid "The ego to use" | ||
1594 | msgstr "kÃch cỡ tin nhắn" | ||
1595 | |||
1596 | #: src/credential/gnunet-credential.c:572 | ||
1597 | msgid "The issuer attribute to verify against or to issue" | ||
1598 | msgstr "" | ||
1599 | |||
1600 | #: src/credential/gnunet-credential.c:577 | ||
1601 | msgid "The time to live for the credential" | ||
1602 | msgstr "" | ||
1603 | |||
1604 | #: src/credential/gnunet-credential.c:581 | ||
1605 | msgid "collect credentials" | ||
1606 | msgstr "" | ||
1607 | |||
1608 | #: src/credential/gnunet-credential.c:595 | ||
1609 | #, fuzzy | ||
1610 | msgid "GNUnet credential resolver tool" | ||
1611 | msgstr "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 | ||
1616 | msgid "Failed to connect to GNS\n" | ||
1617 | msgstr "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 | ||
1624 | msgid "Failed to connect to namestore\n" | ||
1625 | msgstr "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 | ||
1629 | msgid "Unable to parse ATTR record string `%s'\n" | ||
1630 | msgstr "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 | ||
1634 | msgid "GNS REST API initialized\n" | ||
1635 | msgstr "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 |
1505 | msgid "# bytes stored" | 1640 | msgid "# bytes stored" |
1506 | msgstr "# các byte trong kho dữ liệu" | 1641 | msgstr "# 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 |
1567 | msgid "`%s' failed at %s:%d with error: %s\n" | 1701 | msgid "`%s' failed at %s:%d with error: %s\n" |
1568 | msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" | 1702 | msgstr "« %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 |
1574 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" | 1709 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" |
@@ -1640,23 +1775,77 @@ msgstr "" | |||
1640 | msgid "# GET requests executed" | 1775 | msgid "# GET requests executed" |
1641 | msgstr "# các yêu cầu dht được định tuyến" | 1776 | msgstr "# 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 | ||
1780 | msgid "Dumped %<PRIu64> records\n" | ||
1781 | msgstr "" | ||
1782 | |||
1783 | #: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 | ||
1784 | #, c-format | ||
1785 | msgid "Short write to file: %zd bytes expecting %zd\n" | ||
1786 | msgstr "" | ||
1787 | |||
1788 | #: src/datastore/gnunet-datastore.c:261 | ||
1789 | #, fuzzy | ||
1790 | msgid "Error queueing datastore GET operation\n" | ||
1791 | msgstr "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 | ||
1795 | msgid "Unable to open dump file: %s\n" | ||
1796 | msgstr "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 |
1645 | msgid "Failed to store item: %s, aborting\n" | 1800 | msgid "Failed to store item: %s, aborting\n" |
1646 | msgstr "Lá»—i mở táºp tin ghi sá»± kiện « %s »: %s\n" | 1801 | msgstr "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 |
1650 | msgid "Cannot use the same configuration for source and destination\n" | 1805 | msgid "Inserted %<PRIu64> records\n" |
1651 | msgstr "" | 1806 | msgstr "" |
1652 | 1807 | ||
1653 | #: src/datastore/gnunet-datastore.c:256 | 1808 | #: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 |
1654 | msgid "" | 1809 | #, c-format |
1655 | "specifies the configuration to use to access an alternative datastore; will " | 1810 | msgid "Short read from file: %zd bytes expecting %zd\n" |
1656 | "merge that datastore into our current datastore" | 1811 | msgstr "" |
1812 | |||
1813 | #: src/datastore/gnunet-datastore.c:389 | ||
1814 | #, fuzzy | ||
1815 | msgid "Error queueing datastore PUT operation\n" | ||
1816 | msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng" | ||
1817 | |||
1818 | #: src/datastore/gnunet-datastore.c:432 | ||
1819 | msgid "Input file is not of a supported format\n" | ||
1820 | msgstr "" | ||
1821 | |||
1822 | #: src/datastore/gnunet-datastore.c:458 | ||
1823 | #, fuzzy | ||
1824 | msgid "Failed connecting to the datastore.\n" | ||
1825 | msgstr "Không kết nối được đến trình ná»n gnunetd." | ||
1826 | |||
1827 | #: src/datastore/gnunet-datastore.c:470 | ||
1828 | #, c-format | ||
1829 | msgid "Please choose at least one operation: %s, %s\n" | ||
1830 | msgstr "" | ||
1831 | |||
1832 | #: src/datastore/gnunet-datastore.c:493 | ||
1833 | #, fuzzy | ||
1834 | msgid "Dump all records from the datastore" | ||
1835 | msgstr "" | ||
1836 | "\n" | ||
1837 | "Không nháºn được đáp ứng từ gnunetd.\n" | ||
1838 | |||
1839 | #: src/datastore/gnunet-datastore.c:497 | ||
1840 | #, fuzzy | ||
1841 | msgid "Insert records into the datastore" | ||
1842 | msgstr "# các byte trong kho dữ liệu" | ||
1843 | |||
1844 | #: src/datastore/gnunet-datastore.c:502 | ||
1845 | msgid "File to dump or insert" | ||
1657 | msgstr "" | 1846 | msgstr "" |
1658 | 1847 | ||
1659 | #: src/datastore/gnunet-datastore.c:265 | 1848 | #: src/datastore/gnunet-datastore.c:511 |
1660 | #, fuzzy | 1849 | #, fuzzy |
1661 | msgid "Manipulate GNUnet datastore" | 1850 | msgid "Manipulate GNUnet datastore" |
1662 | msgstr "cáºp nháºt má»™t giá trị trong táºp tin cấu hình" | 1851 | msgstr "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 |
1705 | msgid "# reserved" | 1894 | msgid "# reserved" |
1706 | msgstr "" | 1895 | msgstr "" |
1707 | 1896 | ||
@@ -1709,152 +1898,153 @@ msgstr "" | |||
1709 | msgid "Could not find matching reservation" | 1898 | msgid "Could not find matching reservation" |
1710 | msgstr "" | 1899 | msgstr "" |
1711 | 1900 | ||
1712 | #: src/datastore/gnunet-service-datastore.c:792 | 1901 | #: src/datastore/gnunet-service-datastore.c:773 |
1713 | #, c-format | 1902 | #, c-format |
1714 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" | 1903 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" |
1715 | msgstr "" | 1904 | msgstr "" |
1716 | 1905 | ||
1717 | #: src/datastore/gnunet-service-datastore.c:1026 | 1906 | #: src/datastore/gnunet-service-datastore.c:876 |
1718 | #, fuzzy | 1907 | #, fuzzy |
1719 | msgid "# GET requests received" | 1908 | msgid "# GET requests received" |
1720 | msgstr "# các yêu cầu get (lấy) dht được nháºn" | 1909 | msgstr "# 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 |
1724 | msgid "# GET KEY requests received" | 1913 | msgid "# GET KEY requests received" |
1725 | msgstr "# các yêu cầu get (lấy) dht được nháºn" | 1914 | msgstr "# 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 |
1729 | msgid "# requests filtered by bloomfilter" | 1918 | msgid "# requests filtered by bloomfilter" |
1730 | msgstr "# các yêu cầu được lá»c theo bá»™ lá»c bloom" | 1919 | msgstr "# 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 |
1734 | msgid "# GET REPLICATION requests received" | 1923 | msgid "# GET REPLICATION requests received" |
1735 | msgstr "# các yêu cầu get (lấy) dht được nháºn" | 1924 | msgstr "# 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 |
1739 | msgid "# GET ZERO ANONYMITY requests received" | 1928 | msgid "# GET ZERO ANONYMITY requests received" |
1740 | msgstr "# các yêu cầu get (lấy) dht được nháºn" | 1929 | msgstr "# 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 |
1743 | msgid "Content not found" | 1932 | msgid "Content not found" |
1744 | msgstr "" | 1933 | msgstr "" |
1745 | 1934 | ||
1746 | #: src/datastore/gnunet-service-datastore.c:1199 | 1935 | #: src/datastore/gnunet-service-datastore.c:1043 |
1747 | msgid "# bytes removed (explicit request)" | 1936 | msgid "# bytes removed (explicit request)" |
1748 | msgstr "" | 1937 | msgstr "" |
1749 | 1938 | ||
1750 | #: src/datastore/gnunet-service-datastore.c:1246 | 1939 | #: src/datastore/gnunet-service-datastore.c:1088 |
1751 | #, fuzzy | 1940 | #, fuzzy |
1752 | msgid "# REMOVE requests received" | 1941 | msgid "# REMOVE requests received" |
1753 | msgstr "# các yêu cầu get (lấy) dht được nháºn" | 1942 | msgstr "# 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 |
1757 | msgid "" | 1946 | msgid "" |
1758 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" | 1947 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" |
1759 | msgstr "" | 1948 | msgstr "" |
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 |
1764 | msgid "New payload: %lld\n" | 1953 | msgid "New payload: %lld\n" |
1765 | msgstr "" | 1954 | msgstr "" |
1766 | 1955 | ||
1767 | #: src/datastore/gnunet-service-datastore.c:1361 | 1956 | #: src/datastore/gnunet-service-datastore.c:1197 |
1768 | #, c-format | 1957 | #, c-format |
1769 | msgid "Loading `%s' datastore plugin\n" | 1958 | msgid "Loading `%s' datastore plugin\n" |
1770 | msgstr "" | 1959 | msgstr "" |
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 |
1774 | msgid "Failed to load datastore plugin for `%s'\n" | 1963 | msgid "Failed to load datastore plugin for `%s'\n" |
1775 | msgstr "Không thể nạp phần bổ sung truyá»n tải « %s »\n" | 1964 | msgstr "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 |
1778 | msgid "Bloomfilter construction complete.\n" | 1967 | msgid "Bloomfilter construction complete.\n" |
1779 | msgstr "" | 1968 | msgstr "" |
1780 | 1969 | ||
1781 | #: src/datastore/gnunet-service-datastore.c:1489 | 1970 | #: src/datastore/gnunet-service-datastore.c:1325 |
1782 | msgid "Rebuilding bloomfilter. Please be patient.\n" | 1971 | msgid "Rebuilding bloomfilter. Please be patient.\n" |
1783 | msgstr "" | 1972 | msgstr "" |
1784 | 1973 | ||
1785 | #: src/datastore/gnunet-service-datastore.c:1500 | 1974 | #: src/datastore/gnunet-service-datastore.c:1336 |
1786 | msgid "Plugin does not support get_keys function. Please fix!\n" | 1975 | msgid "Plugin does not support get_keys function. Please fix!\n" |
1787 | msgstr "" | 1976 | msgstr "" |
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 |
1791 | msgid "# bytes used in file-sharing datastore `%s'" | 1980 | msgid "# bytes used in file-sharing datastore `%s'" |
1792 | msgstr "# các byte được phép trong kho dữ liệu" | 1981 | msgstr "# 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 |
1795 | msgid "# quota" | 1984 | msgid "# quota" |
1796 | msgstr "" | 1985 | msgstr "" |
1797 | 1986 | ||
1798 | #: src/datastore/gnunet-service-datastore.c:1691 | 1987 | #: src/datastore/gnunet-service-datastore.c:1527 |
1799 | msgid "# cache size" | 1988 | msgid "# cache size" |
1800 | msgstr "" | 1989 | msgstr "" |
1801 | 1990 | ||
1802 | #: src/datastore/gnunet-service-datastore.c:1707 | 1991 | #: src/datastore/gnunet-service-datastore.c:1543 |
1803 | #, c-format | 1992 | #, c-format |
1804 | msgid "Could not use specified filename `%s' for bloomfilter.\n" | 1993 | msgid "Could not use specified filename `%s' for bloomfilter.\n" |
1805 | msgstr "" | 1994 | msgstr "" |
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 |
1810 | msgid "Failed to remove bogus bloomfilter file `%s'\n" | 1999 | msgid "Failed to remove bogus bloomfilter file `%s'\n" |
1811 | msgstr "Không thể lÆ°u táºp tin cấu hình « %s »:" | 2000 | msgstr "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 |
1815 | msgid "Failed to initialize bloomfilter.\n" | 2004 | msgid "Failed to initialize bloomfilter.\n" |
1816 | msgstr "Lỗi sơ khởi dịch vụ « %s ».\n" | 2005 | msgstr "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 |
1820 | msgid "Heap database running\n" | 2009 | msgid "Heap database running\n" |
1821 | msgstr "kho dữ liệu sqlite" | 2010 | msgstr "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 | ||
2015 | msgid "MySQL statement run failure" | ||
2016 | msgstr "" | ||
2017 | |||
2018 | #: src/datastore/plugin_datastore_mysql.c:410 | ||
2019 | #: src/datastore/plugin_datastore_sqlite.c:626 | ||
1825 | #, fuzzy | 2020 | #, fuzzy |
1826 | msgid "Data too large" | 2021 | msgid "Data too large" |
1827 | msgstr "số lần lặp lại" | 2022 | msgstr "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 |
1830 | msgid "MySQL statement run failure" | ||
1831 | msgstr "" | ||
1832 | |||
1833 | #: src/datastore/plugin_datastore_mysql.c:936 | ||
1834 | #, fuzzy, c-format | 2025 | #, fuzzy, c-format |
1835 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" | 2026 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" |
1836 | msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n" | 2027 | msgstr "« %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 |
1840 | msgid "Mysql database running\n" | 2031 | msgid "Mysql database running\n" |
1841 | msgstr "" | 2032 | msgstr "" |
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 | ||
1844 | msgid "Postgress exec failure" | 2036 | msgid "Postgress exec failure" |
1845 | msgstr "" | 2037 | msgstr "" |
1846 | 2038 | ||
1847 | #: src/datastore/plugin_datastore_postgres.c:866 | 2039 | #: src/datastore/plugin_datastore_postgres.c:852 |
1848 | #, fuzzy | 2040 | #, fuzzy |
1849 | msgid "Failed to drop table from database.\n" | 2041 | msgid "Failed to drop table from database.\n" |
1850 | msgstr "" | 2042 | msgstr "" |
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 | ||
1858 | msgid "Postgres database running\n" | 2048 | msgid "Postgres database running\n" |
1859 | msgstr "" | 2049 | msgstr "" |
1860 | 2050 | ||
@@ -1866,7 +2056,8 @@ msgstr "" | |||
1866 | msgid "`%s' failed at %s:%u with error: %s" | 2056 | msgid "`%s' failed at %s:%u with error: %s" |
1867 | msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s" | 2057 | msgstr "« %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" | |||
1875 | msgid "Unable to initialize SQLite: %s.\n" | 2066 | msgid "Unable to initialize SQLite: %s.\n" |
1876 | msgstr "Không thể sơ khởi SQLite: %s.\n" | 2067 | msgstr "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 |
2070 | msgid "sqlite bind failure" | ||
2071 | msgstr "" | ||
2072 | |||
2073 | #: src/datastore/plugin_datastore_sqlite.c:1259 | ||
1879 | msgid "sqlite version to old to determine size, assuming zero\n" | 2074 | msgid "sqlite version to old to determine size, assuming zero\n" |
1880 | msgstr "" | 2075 | msgstr "" |
1881 | 2076 | ||
1882 | #: src/datastore/plugin_datastore_sqlite.c:1268 | 2077 | #: src/datastore/plugin_datastore_sqlite.c:1293 |
1883 | #, c-format | 2078 | #, c-format |
1884 | msgid "" | 2079 | msgid "" |
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" |
1887 | msgstr "" | 2082 | msgstr "" |
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 |
1893 | msgid "Sqlite database running\n" | 2089 | msgid "Sqlite database running\n" |
1894 | msgstr "kho dữ liệu sqlite" | 2090 | msgstr "kho dữ liệu sqlite" |
1895 | 2091 | ||
1896 | #: src/datastore/plugin_datastore_template.c:259 | 2092 | #: src/datastore/plugin_datastore_template.c:253 |
1897 | msgid "Template database running\n" | 2093 | msgid "Template database running\n" |
1898 | msgstr "" | 2094 | msgstr "" |
1899 | 2095 | ||
@@ -1955,53 +2151,6 @@ msgstr "" | |||
1955 | msgid "Prints all packets that go through the DHT." | 2151 | msgid "Prints all packets that go through the DHT." |
1956 | msgstr "" | 2152 | msgstr "" |
1957 | 2153 | ||
1958 | #: src/dht/gnunet_dht_profiler.c:1161 | ||
1959 | #: src/testbed/gnunet-testbed-profiler.c:255 | ||
1960 | #, fuzzy, c-format | ||
1961 | msgid "Exiting as the number of peers is %u\n" | ||
1962 | msgstr "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 | ||
1966 | msgid "number of peers to start" | ||
1967 | msgstr "số lần lặp lại" | ||
1968 | |||
1969 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
1970 | msgid "" | ||
1971 | "maximum number of times we try to search for successor circle formation (0 " | ||
1972 | "for R5N)" | ||
1973 | msgstr "" | ||
1974 | |||
1975 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
1976 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
1977 | msgid "name of the file with the login information for the testbed" | ||
1978 | msgstr "" | ||
1979 | |||
1980 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
1981 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
1982 | msgstr "" | ||
1983 | |||
1984 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
1985 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
1986 | msgstr "" | ||
1987 | |||
1988 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
1989 | msgid "delay to start doing GETs (default: 5 min)" | ||
1990 | msgstr "" | ||
1991 | |||
1992 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
1993 | msgid "replication degree for DHT PUTs" | ||
1994 | msgstr "" | ||
1995 | |||
1996 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
1997 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
1998 | msgstr "" | ||
1999 | |||
2000 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2001 | #, fuzzy | ||
2002 | msgid "Measure quality and performance of the DHT service." | ||
2003 | msgstr "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 |
2007 | msgid "PUT request sent with key" | 2156 | msgid "PUT request sent with key" |
@@ -2279,6 +2428,52 @@ msgstr "" | |||
2279 | msgid "# DHT requests combined" | 2428 | msgid "# DHT requests combined" |
2280 | msgstr "# các yêu cầu get (lấy) dht được nháºn" | 2429 | msgstr "# 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 | ||
2433 | msgid "Exiting as the number of peers is %u\n" | ||
2434 | msgstr "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 | ||
2438 | msgid "number of peers to start" | ||
2439 | msgstr "số lần lặp lại" | ||
2440 | |||
2441 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2442 | msgid "" | ||
2443 | "maximum number of times we try to search for successor circle formation (0 " | ||
2444 | "for R5N)" | ||
2445 | msgstr "" | ||
2446 | |||
2447 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2448 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2449 | msgid "name of the file with the login information for the testbed" | ||
2450 | msgstr "" | ||
2451 | |||
2452 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
2453 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2454 | msgstr "" | ||
2455 | |||
2456 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2457 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2458 | msgstr "" | ||
2459 | |||
2460 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2461 | msgid "delay to start doing GETs (default: 5 min)" | ||
2462 | msgstr "" | ||
2463 | |||
2464 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2465 | msgid "replication degree for DHT PUTs" | ||
2466 | msgstr "" | ||
2467 | |||
2468 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2469 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2470 | msgstr "" | ||
2471 | |||
2472 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2473 | #, fuzzy | ||
2474 | msgid "Measure quality and performance of the DHT service." | ||
2475 | msgstr "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 |
2284 | msgid "Block not of type %u\n" | 2479 | msgid "Block not of type %u\n" |
@@ -2612,7 +2807,7 @@ msgstr "" | |||
2612 | msgid "No useful service enabled. Exiting.\n" | 2807 | msgid "No useful service enabled. Exiting.\n" |
2613 | msgstr "" | 2808 | msgstr "" |
2614 | 2809 | ||
2615 | #: src/exit/gnunet-daemon-exit.c:3969 | 2810 | #: src/exit/gnunet-daemon-exit.c:3970 |
2616 | msgid "Daemon to run to provide an IP exit node for the VPN" | 2811 | msgid "Daemon to run to provide an IP exit node for the VPN" |
2617 | msgstr "" | 2812 | msgstr "" |
2618 | 2813 | ||
@@ -3265,15 +3460,6 @@ msgid "" | |||
3265 | "chk/...)" | 3460 | "chk/...)" |
3266 | msgstr "" | 3461 | msgstr "" |
3267 | 3462 | ||
3268 | #: src/fs/gnunet-fs.c:119 | ||
3269 | msgid "print a list of all indexed files" | ||
3270 | msgstr "" | ||
3271 | |||
3272 | #: src/fs/gnunet-fs.c:130 | ||
3273 | #, fuzzy | ||
3274 | msgid "Special file-sharing operations" | ||
3275 | msgstr "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 |
3278 | msgid "run the experiment with COUNT peers" | 3464 | msgid "run the experiment with COUNT peers" |
3279 | msgstr "" | 3465 | msgstr "" |
@@ -3290,6 +3476,15 @@ msgstr "" | |||
3290 | msgid "run a testbed to measure file-sharing performance" | 3476 | msgid "run a testbed to measure file-sharing performance" |
3291 | msgstr "" | 3477 | msgstr "" |
3292 | 3478 | ||
3479 | #: src/fs/gnunet-fs.c:119 | ||
3480 | msgid "print a list of all indexed files" | ||
3481 | msgstr "" | ||
3482 | |||
3483 | #: src/fs/gnunet-fs.c:130 | ||
3484 | #, fuzzy | ||
3485 | msgid "Special file-sharing operations" | ||
3486 | msgstr "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 |
3295 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" | 3490 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" |
@@ -4000,22 +4195,11 @@ msgstr "" | |||
4000 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" | 4195 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" |
4001 | msgstr "" | 4196 | msgstr "" |
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 | 4199 | msgid "Not ready to process requests, lacking ego data\n" |
4005 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4006 | msgstr "" | ||
4007 | |||
4008 | #: src/gns/gnunet-gns.c:252 | ||
4009 | #, c-format | ||
4010 | msgid "Please specify name to lookup!\n" | ||
4011 | msgstr "" | ||
4012 | |||
4013 | #: src/gns/gnunet-gns.c:276 | ||
4014 | #, c-format | ||
4015 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4016 | msgstr "" | 4200 | msgstr "" |
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 |
4021 | msgid "" | 4205 | msgid "" |
@@ -4023,59 +4207,12 @@ msgid "" | |||
4023 | "gns-import.sh?\n" | 4207 | "gns-import.sh?\n" |
4024 | msgstr "" | 4208 | msgstr "" |
4025 | 4209 | ||
4026 | #: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727 | ||
4027 | #, fuzzy, c-format | ||
4028 | msgid "Failed to connect to GNS\n" | ||
4029 | msgstr "Lỗi kết nối đến gnunetd.\n" | ||
4030 | |||
4031 | #: src/gns/gnunet-gns.c:374 | ||
4032 | #, c-format | ||
4033 | msgid "Public key `%s' is not well-formed\n" | ||
4034 | msgstr "" | ||
4035 | |||
4036 | #: src/gns/gnunet-gns.c:428 | ||
4037 | msgid "Lookup a record for the given name" | ||
4038 | msgstr "" | ||
4039 | |||
4040 | #: src/gns/gnunet-gns.c:434 | ||
4041 | #, fuzzy | ||
4042 | msgid "Specify the type of the record to lookup" | ||
4043 | msgstr "xác định mức ưu tiên của nội dung" | ||
4044 | |||
4045 | #: src/gns/gnunet-gns.c:440 | ||
4046 | #, fuzzy | ||
4047 | msgid "Specify timeout for the lookup" | ||
4048 | msgstr "xác định mức ưu tiên của nội dung" | ||
4049 | |||
4050 | #: src/gns/gnunet-gns.c:445 | ||
4051 | msgid "No unneeded output" | ||
4052 | msgstr "" | ||
4053 | |||
4054 | #: src/gns/gnunet-gns.c:451 | ||
4055 | #, fuzzy | ||
4056 | msgid "Specify the public key of the zone to lookup the record in" | ||
4057 | msgstr "xác định mức ưu tiên của nội dung" | ||
4058 | |||
4059 | #: src/gns/gnunet-gns.c:457 | ||
4060 | #, fuzzy | ||
4061 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4062 | msgstr "xác định mức ưu tiên của nội dung" | ||
4063 | |||
4064 | #: src/gns/gnunet-gns.c:476 | ||
4065 | #, fuzzy | ||
4066 | msgid "GNUnet GNS resolver tool" | ||
4067 | msgstr "Bản ghi lỗi GNUnet" | ||
4068 | |||
4069 | #: src/gns/gnunet-gns-helper-service-w32.c:602 | ||
4070 | msgid "Not ready to process requests, lacking ego data\n" | ||
4071 | msgstr "" | ||
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 |
4075 | msgid "Failed to connect to identity service\n" | 4212 | msgid "Failed to connect to identity service\n" |
4076 | msgstr "Lỗi kết nối đến gnunetd.\n" | 4213 | msgstr "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 |
4079 | msgid "This program will import some GNS authorities into your GNS namestore." | 4216 | msgid "This program will import some GNS authorities into your GNS namestore." |
4080 | msgstr "" | 4217 | msgstr "" |
4081 | 4218 | ||
@@ -4200,13 +4337,66 @@ msgstr "" | |||
4200 | msgid "GNUnet GNS proxy" | 4337 | msgid "GNUnet GNS proxy" |
4201 | msgstr "" | 4338 | msgstr "" |
4202 | 4339 | ||
4340 | #: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 | ||
4341 | #, c-format | ||
4342 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4343 | msgstr "" | ||
4344 | |||
4345 | #: src/gns/gnunet-gns.c:252 | ||
4346 | #, c-format | ||
4347 | msgid "Please specify name to lookup!\n" | ||
4348 | msgstr "" | ||
4349 | |||
4350 | #: src/gns/gnunet-gns.c:276 | ||
4351 | #, c-format | ||
4352 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4353 | msgstr "" | ||
4354 | |||
4355 | #: src/gns/gnunet-gns.c:374 | ||
4356 | #, c-format | ||
4357 | msgid "Public key `%s' is not well-formed\n" | ||
4358 | msgstr "" | ||
4359 | |||
4360 | #: src/gns/gnunet-gns.c:428 | ||
4361 | msgid "Lookup a record for the given name" | ||
4362 | msgstr "" | ||
4363 | |||
4364 | #: src/gns/gnunet-gns.c:434 | ||
4365 | #, fuzzy | ||
4366 | msgid "Specify the type of the record to lookup" | ||
4367 | msgstr "xác định mức ưu tiên của nội dung" | ||
4368 | |||
4369 | #: src/gns/gnunet-gns.c:440 | ||
4370 | #, fuzzy | ||
4371 | msgid "Specify timeout for the lookup" | ||
4372 | msgstr "xác định mức ưu tiên của nội dung" | ||
4373 | |||
4374 | #: src/gns/gnunet-gns.c:445 | ||
4375 | msgid "No unneeded output" | ||
4376 | msgstr "" | ||
4377 | |||
4378 | #: src/gns/gnunet-gns.c:451 | ||
4379 | #, fuzzy | ||
4380 | msgid "Specify the public key of the zone to lookup the record in" | ||
4381 | msgstr "xác định mức ưu tiên của nội dung" | ||
4382 | |||
4383 | #: src/gns/gnunet-gns.c:457 | ||
4384 | #, fuzzy | ||
4385 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4386 | msgstr "xác định mức ưu tiên của nội dung" | ||
4387 | |||
4388 | #: src/gns/gnunet-gns.c:476 | ||
4389 | #, fuzzy | ||
4390 | msgid "GNUnet GNS resolver tool" | ||
4391 | msgstr "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 |
4205 | msgid "Failed to connect to the namecache!\n" | 4395 | msgid "Failed to connect to the namecache!\n" |
4206 | msgstr "Không kết nối được đến trình ná»n gnunetd." | 4396 | msgstr "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 |
4211 | msgid "Could not connect to DHT!\n" | 4401 | msgid "Could not connect to DHT!\n" |
4212 | msgstr "Không thể kết nối tới %s:%u: %s\n" | 4402 | msgstr "Không thể kết nối tới %s:%u: %s\n" |
@@ -4265,45 +4455,35 @@ msgstr "" | |||
4265 | msgid "Hostname `%s' is not well-formed, resolution fails\n" | 4455 | msgid "Hostname `%s' is not well-formed, resolution fails\n" |
4266 | msgstr "" | 4456 | msgstr "" |
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 |
4270 | msgid "Unable to parse PKEY record `%s'\n" | 4460 | msgid "Unable to parse PKEY record `%s'\n" |
4271 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | 4461 | msgstr "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 |
4275 | msgid "Unable to parse GNS2DNS record `%s'\n" | 4465 | msgid "Unable to parse GNS2DNS record `%s'\n" |
4276 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | 4466 | msgstr "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 |
4280 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" | 4470 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" |
4281 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" | 4471 | msgstr "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 |
4285 | msgid "Unable to parse VPN record string `%s'\n" | 4475 | msgid "Unable to parse VPN record string `%s'\n" |
4286 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | 4476 | msgstr "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 |
4290 | msgid "Unable to parse BOX record string `%s'\n" | 4480 | msgid "Unable to parse BOX record string `%s'\n" |
4291 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | 4481 | msgstr "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 | ||
4295 | msgid "Unable to parse REVERSE record string `%s'\n" | ||
4296 | msgstr "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 |
4299 | msgid "Ego for not found, cannot perform lookup.\n" | 4484 | msgid "Ego for not found, cannot perform lookup.\n" |
4300 | msgstr "" | 4485 | msgstr "" |
4301 | 4486 | ||
4302 | #: src/gns/plugin_rest_gns.c:668 | ||
4303 | #, fuzzy | ||
4304 | msgid "GNS REST API initialized\n" | ||
4305 | msgstr "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 |
4309 | msgid "Unable to parse IPv4 address `%s'\n" | 4489 | msgid "Unable to parse IPv4 address `%s'\n" |
@@ -4746,6 +4926,53 @@ msgstr "« %s » không sẵn sà ng.\n" | |||
4746 | msgid "Could not start hostlist HTTP server on port %u\n" | 4926 | msgid "Could not start hostlist HTTP server on port %u\n" |
4747 | msgstr "Cổng cho trình phục vụ HTTP danh sách máy chủ thống nhất" | 4927 | msgstr "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 | ||
4931 | msgid "Ego is required\n" | ||
4932 | msgstr "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 | ||
4935 | msgid "Add attribute" | ||
4936 | msgstr "" | ||
4937 | |||
4938 | #: src/identity-provider/gnunet-idp.c:376 | ||
4939 | msgid "Attribute value" | ||
4940 | msgstr "" | ||
4941 | |||
4942 | #: src/identity-provider/gnunet-idp.c:381 | ||
4943 | msgid "Ego" | ||
4944 | msgstr "" | ||
4945 | |||
4946 | #: src/identity-provider/gnunet-idp.c:386 | ||
4947 | msgid "Audience (relying party)" | ||
4948 | msgstr "" | ||
4949 | |||
4950 | #: src/identity-provider/gnunet-idp.c:390 | ||
4951 | msgid "List attributes for Ego" | ||
4952 | msgstr "" | ||
4953 | |||
4954 | #: src/identity-provider/gnunet-idp.c:395 | ||
4955 | msgid "Issue a ticket" | ||
4956 | msgstr "" | ||
4957 | |||
4958 | #: src/identity-provider/gnunet-idp.c:400 | ||
4959 | msgid "Consume a ticket" | ||
4960 | msgstr "" | ||
4961 | |||
4962 | #: src/identity-provider/gnunet-idp.c:405 | ||
4963 | msgid "Revoke a ticket" | ||
4964 | msgstr "" | ||
4965 | |||
4966 | #: src/identity-provider/identity_provider_api.c:429 | ||
4967 | #, fuzzy | ||
4968 | msgid "failed to store record\n" | ||
4969 | msgstr "Lá»—i bắt đầu thu tháºp.\n" | ||
4970 | |||
4971 | #: src/identity-provider/plugin_rest_identity_provider.c:1175 | ||
4972 | #, fuzzy | ||
4973 | msgid "Identity Provider REST API initialized\n" | ||
4974 | msgstr "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 |
4751 | msgid "Failed to create ego: %s\n" | 4978 | msgid "Failed to create ego: %s\n" |
@@ -4833,34 +5060,11 @@ msgstr "Không thể lÆ°u táºp tin cấu hình « %s »:" | |||
4833 | msgid "Failed to create directory `%s' for storing egos\n" | 5060 | msgid "Failed to create directory `%s' for storing egos\n" |
4834 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | 5061 | msgstr "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 |
4838 | msgid "Identity REST API initialized\n" | 5065 | msgid "Identity REST API initialized\n" |
4839 | msgstr "Lỗi sơ khởi lõi.\n" | 5066 | msgstr "Lỗi sơ khởi lõi.\n" |
4840 | 5067 | ||
4841 | #: src/identity-provider/gnunet-identity-token.c:66 | ||
4842 | #, fuzzy | ||
4843 | msgid "Option `-t' is required\n" | ||
4844 | msgstr "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 | ||
4848 | msgid "Token `%s' is malformed\n" | ||
4849 | msgstr "Äối số không hợp lệ cho « %s ».\n" | ||
4850 | |||
4851 | #: src/identity-provider/gnunet-identity-token.c:166 | ||
4852 | msgid "GNUid token" | ||
4853 | msgstr "" | ||
4854 | |||
4855 | #: src/identity-provider/gnunet-identity-token.c:171 | ||
4856 | msgid "Print token contents" | ||
4857 | msgstr "" | ||
4858 | |||
4859 | #: src/identity-provider/plugin_rest_identity_provider.c:1166 | ||
4860 | #, fuzzy | ||
4861 | msgid "Identity Token REST API initialized\n" | ||
4862 | msgstr "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 |
4866 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" | 5070 | msgid "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" | |||
4962 | msgid "flat plugin running\n" | 5166 | msgid "flat plugin running\n" |
4963 | msgstr "kho dữ liệu sqlite" | 5167 | msgstr "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 | 5171 | msgid "Unsupported form value `%s'\n" |
4968 | msgid "Failed to create indices\n" | 5172 | msgstr "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 | ||
5176 | msgid "Failed to create record for domain `%s': %s\n" | ||
5177 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" | ||
5178 | |||
5179 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5180 | msgid "Error when mapping zone to name\n" | ||
5181 | msgstr "" | ||
5182 | |||
5183 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5184 | #, c-format | ||
5185 | msgid "Found existing name `%s' for the given key\n" | ||
5186 | msgstr "" | ||
5187 | |||
5188 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5189 | #, c-format | ||
5190 | msgid "Found %u existing records for domain `%s'\n" | ||
5191 | msgstr "" | ||
5192 | |||
5193 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5194 | #, fuzzy, c-format | ||
5195 | msgid "Failed to create page for `%s'\n" | ||
4969 | msgstr "Không thể tạo miá»n tên.\n" | 5196 | msgstr "Không thể tạo miá»n tên.\n" |
4970 | 5197 | ||
5198 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5199 | #, fuzzy, c-format | ||
5200 | msgid "Failed to setup post processor for `%s'\n" | ||
5201 | msgstr "Lá»—i cáºp nháºt dữ liệu cho mô-Ä‘un « %s »\n" | ||
5202 | |||
5203 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5204 | msgid "Domain name must not contain `.'\n" | ||
5205 | msgstr "" | ||
5206 | |||
5207 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5208 | msgid "Domain name must not contain `+'\n" | ||
5209 | msgstr "" | ||
5210 | |||
5211 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5212 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5213 | msgstr "" | ||
5214 | |||
5215 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5216 | #, fuzzy | ||
5217 | msgid "Failed to start HTTP server\n" | ||
5218 | msgstr "Lá»—i bắt đầu thu tháºp.\n" | ||
5219 | |||
5220 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5221 | #, fuzzy | ||
5222 | msgid "Failed to connect to identity\n" | ||
5223 | msgstr "Lỗi kết nối đến gnunetd.\n" | ||
5224 | |||
5225 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5226 | msgid "GNU Name System First Come First Serve name registration service" | ||
5227 | msgstr "" | ||
5228 | |||
4971 | #: src/namestore/gnunet-namestore.c:301 | 5229 | #: src/namestore/gnunet-namestore.c:301 |
4972 | #, fuzzy, c-format | 5230 | #, fuzzy, c-format |
4973 | msgid "Adding record failed: %s\n" | 5231 | msgid "Adding record failed: %s\n" |
4974 | msgstr "Gặp lá»—i khi tải lên táºp tin: %s\n" | 5232 | msgstr "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 |
4979 | msgid "Deleting record failed, record does not exist%s%s\n" | 5237 | msgid "Deleting record failed, record does not exist%s%s\n" |
4980 | msgstr "Gặp lá»—i khi tải lên táºp tin: %s\n" | 5238 | msgstr "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 |
4985 | msgid "Deleting record failed%s%s\n" | 5243 | msgid "Deleting record failed%s%s\n" |
4986 | msgstr "Gặp lá»—i khi tải lên táºp tin: %s\n" | 5244 | msgstr "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" | |||
4998 | msgstr "" | 5256 | msgstr "" |
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 |
5003 | msgid "There are no records under label `%s' that could be deleted.\n" | 5261 | msgid "There are no records under label `%s' that could be deleted.\n" |
5004 | msgstr "" | 5262 | msgstr "" |
@@ -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" |
5010 | msgstr "" | 5268 | msgstr "" |
5011 | 5269 | ||
5012 | #: src/namestore/gnunet-namestore.c:776 | ||
5013 | #: src/namestore/plugin_rest_namestore.c:1004 | ||
5014 | #, c-format | ||
5015 | msgid "Ego `%s' not known to identity service\n" | ||
5016 | msgstr "" | ||
5017 | |||
5018 | #: src/namestore/gnunet-namestore.c:791 | 5270 | #: src/namestore/gnunet-namestore.c:791 |
5019 | #, fuzzy, c-format | 5271 | #, fuzzy, c-format |
5020 | msgid "No options given\n" | 5272 | msgid "No options given\n" |
5021 | msgstr "chưa đưa ra tên" | 5273 | msgstr "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 | ||
5027 | msgid "Failed to connect to namestore\n" | ||
5028 | msgstr "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" | |||
5040 | msgstr "" | 5285 | msgstr "" |
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 |
5045 | msgid "Unsupported type `%s'\n" | 5290 | msgid "Unsupported type `%s'\n" |
5046 | msgstr "Lệnh không được há»— trợ « %s ». Äang hủy bá».\n" | 5291 | msgstr "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 |
5052 | msgid "Value `%s' invalid for record type `%s'\n" | 5297 | msgid "Value `%s' invalid for record type `%s'\n" |
5053 | msgstr "" | 5298 | msgstr "" |
@@ -5066,8 +5311,7 @@ msgstr "" | |||
5066 | msgid "Invalid public key for reverse lookup `%s'\n" | 5311 | msgid "Invalid public key for reverse lookup `%s'\n" |
5067 | msgstr "Äối số không hợp lệ cho « %s ».\n" | 5312 | msgstr "Äố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 |
5072 | msgid "Invalid URI `%s'\n" | 5316 | msgid "Invalid URI `%s'\n" |
5073 | msgstr "Dữ liệu nháºp không hợp lệ.\n" | 5317 | msgstr "Dữ liệu nháºp không hợp lệ.\n" |
@@ -5078,13 +5322,13 @@ msgid "Invalid nick `%s'\n" | |||
5078 | msgstr "Dữ liệu nháºp không hợp lệ.\n" | 5322 | msgstr "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 |
5083 | msgid "No default ego configured in identity service\n" | 5327 | msgid "No default ego configured in identity service\n" |
5084 | msgstr "" | 5328 | msgstr "" |
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 |
5089 | msgid "Cannot connect to identity service\n" | 5333 | msgid "Cannot connect to identity service\n" |
5090 | msgstr "Không thể kết nối tới %s:%u: %s\n" | 5334 | msgstr "Không thể kết nối tới %s:%u: %s\n" |
@@ -5147,67 +5391,7 @@ msgstr "" | |||
5147 | msgid "name of the ego controlling the zone" | 5391 | msgid "name of the ego controlling the zone" |
5148 | msgstr "" | 5392 | msgstr "" |
5149 | 5393 | ||
5150 | #: src/namestore/gnunet-namestore-fcfsd.c:508 | 5394 | #: src/namestore/gnunet-service-namestore.c:615 |
5151 | #, fuzzy, c-format | ||
5152 | msgid "Unsupported form value `%s'\n" | ||
5153 | msgstr "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 | ||
5157 | msgid "Failed to create record for domain `%s': %s\n" | ||
5158 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" | ||
5159 | |||
5160 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
5161 | msgid "Error when mapping zone to name\n" | ||
5162 | msgstr "" | ||
5163 | |||
5164 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
5165 | #, c-format | ||
5166 | msgid "Found existing name `%s' for the given key\n" | ||
5167 | msgstr "" | ||
5168 | |||
5169 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
5170 | #, c-format | ||
5171 | msgid "Found %u existing records for domain `%s'\n" | ||
5172 | msgstr "" | ||
5173 | |||
5174 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
5175 | #, fuzzy, c-format | ||
5176 | msgid "Failed to create page for `%s'\n" | ||
5177 | msgstr "Không thể tạo miá»n tên.\n" | ||
5178 | |||
5179 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
5180 | #, fuzzy, c-format | ||
5181 | msgid "Failed to setup post processor for `%s'\n" | ||
5182 | msgstr "Lá»—i cáºp nháºt dữ liệu cho mô-Ä‘un « %s »\n" | ||
5183 | |||
5184 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
5185 | msgid "Domain name must not contain `.'\n" | ||
5186 | msgstr "" | ||
5187 | |||
5188 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
5189 | msgid "Domain name must not contain `+'\n" | ||
5190 | msgstr "" | ||
5191 | |||
5192 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
5193 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
5194 | msgstr "" | ||
5195 | |||
5196 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
5197 | #, fuzzy | ||
5198 | msgid "Failed to start HTTP server\n" | ||
5199 | msgstr "Lá»—i bắt đầu thu tháºp.\n" | ||
5200 | |||
5201 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
5202 | #, fuzzy | ||
5203 | msgid "Failed to connect to identity\n" | ||
5204 | msgstr "Lỗi kết nối đến gnunetd.\n" | ||
5205 | |||
5206 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5207 | msgid "GNU Name System First Come First Serve name registration service" | ||
5208 | msgstr "" | ||
5209 | |||
5210 | #: src/namestore/gnunet-service-namestore.c:612 | ||
5211 | #, fuzzy, c-format | 5395 | #, fuzzy, c-format |
5212 | msgid "Failed to replicate block in namecache: %s\n" | 5396 | msgid "Failed to replicate block in namecache: %s\n" |
5213 | msgstr "Lá»—i cáºp nháºt dữ liệu cho mô-Ä‘un « %s »\n" | 5397 | msgstr "Lá»—i cáºp nháºt dữ liệu cho mô-Ä‘un « %s »\n" |
@@ -5221,7 +5405,7 @@ msgstr "" | |||
5221 | msgid "flat file database running\n" | 5405 | msgid "flat file database running\n" |
5222 | msgstr "kho dữ liệu sqlite" | 5406 | msgstr "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 |
5226 | msgid "Namestore REST API initialized\n" | 5410 | msgid "Namestore REST API initialized\n" |
5227 | msgstr "Lỗi sơ khởi lõi.\n" | 5411 | msgstr "Lỗi sơ khởi lõi.\n" |
@@ -5508,11 +5692,6 @@ msgstr "" | |||
5508 | msgid "`upnpc' command not found\n" | 5692 | msgid "`upnpc' command not found\n" |
5509 | msgstr "" | 5693 | msgstr "" |
5510 | 5694 | ||
5511 | #: src/nse/gnunet-nse.c:122 | ||
5512 | #, fuzzy | ||
5513 | msgid "Show network size estimates from NSE service." | ||
5514 | msgstr "# 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 |
5518 | msgid "limit to the number of connections to NSE services, 0 for none" | 5697 | msgid "limit to the number of connections to NSE services, 0 for none" |
@@ -5539,71 +5718,17 @@ msgstr "" | |||
5539 | msgid "Measure quality and performance of the NSE service." | 5718 | msgid "Measure quality and performance of the NSE service." |
5540 | msgstr "Không thể truy cáºp đến dịch vụ" | 5719 | msgstr "Không thể truy cáºp đến dịch vụ" |
5541 | 5720 | ||
5721 | #: src/nse/gnunet-nse.c:122 | ||
5722 | #, fuzzy | ||
5723 | msgid "Show network size estimates from NSE service." | ||
5724 | msgstr "# 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 |
5545 | msgid "Value is too large.\n" | 5729 | msgid "Value is too large.\n" |
5546 | msgstr "Giá trị không nằm trong phạm vi được phép." | 5730 | msgstr "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 | ||
5550 | msgid "Removing expired address of transport `%s'\n" | ||
5551 | msgstr "Äã nạp truyá»n tải « %s »\n" | ||
5552 | |||
5553 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5554 | #, fuzzy, c-format | ||
5555 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5556 | msgstr "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 | ||
5561 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5562 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | ||
5563 | |||
5564 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5565 | msgid "# peers known" | ||
5566 | msgstr "" | ||
5567 | |||
5568 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5569 | #, c-format | ||
5570 | msgid "" | ||
5571 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5572 | msgstr "" | ||
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 | ||
5578 | msgid "Scanning directory `%s'\n" | ||
5579 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | ||
5580 | |||
5581 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5582 | #, c-format | ||
5583 | msgid "Still no peers found in `%s'!\n" | ||
5584 | msgstr "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 | ||
5588 | msgid "Cleaning up directory `%s'\n" | ||
5589 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | ||
5590 | |||
5591 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5592 | #, c-format | ||
5593 | msgid "Importing HELLOs from `%s'\n" | ||
5594 | msgstr "" | ||
5595 | |||
5596 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5597 | msgid "Skipping import of included HELLOs\n" | ||
5598 | msgstr "" | ||
5599 | |||
5600 | #: src/peerinfo/peerinfo_api.c:220 | ||
5601 | #, fuzzy | ||
5602 | msgid "Failed to receive response from `PEERINFO' service." | ||
5603 | msgstr "" | ||
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 |
5609 | msgid "%sPeer `%s'\n" | 5734 | msgid "%sPeer `%s'\n" |
@@ -5695,6 +5820,65 @@ msgstr "Äang nạp các truyá»n tải « %s »\n" | |||
5695 | msgid "Failed to load transport plugin for `%s'\n" | 5820 | msgid "Failed to load transport plugin for `%s'\n" |
5696 | msgstr "Không thể nạp phần bổ sung truyá»n tải « %s »\n" | 5821 | msgstr "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 | ||
5825 | msgid "Removing expired address of transport `%s'\n" | ||
5826 | msgstr "Äã nạp truyá»n tải « %s »\n" | ||
5827 | |||
5828 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5829 | #, fuzzy, c-format | ||
5830 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5831 | msgstr "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 | ||
5836 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5837 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | ||
5838 | |||
5839 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5840 | msgid "# peers known" | ||
5841 | msgstr "" | ||
5842 | |||
5843 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5844 | #, c-format | ||
5845 | msgid "" | ||
5846 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5847 | msgstr "" | ||
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 | ||
5853 | msgid "Scanning directory `%s'\n" | ||
5854 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | ||
5855 | |||
5856 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5857 | #, c-format | ||
5858 | msgid "Still no peers found in `%s'!\n" | ||
5859 | msgstr "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 | ||
5863 | msgid "Cleaning up directory `%s'\n" | ||
5864 | msgstr "Lá»—i Ä‘á»c danh sách bạn bè từ « %s »\n" | ||
5865 | |||
5866 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5867 | #, c-format | ||
5868 | msgid "Importing HELLOs from `%s'\n" | ||
5869 | msgstr "" | ||
5870 | |||
5871 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5872 | msgid "Skipping import of included HELLOs\n" | ||
5873 | msgstr "" | ||
5874 | |||
5875 | #: src/peerinfo/peerinfo_api.c:220 | ||
5876 | #, fuzzy | ||
5877 | msgid "Failed to receive response from `PEERINFO' service." | ||
5878 | msgstr "" | ||
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 |
5699 | msgid "peerstore" | 5883 | msgid "peerstore" |
5700 | msgstr "" | 5884 | msgstr "" |
@@ -5744,15 +5928,10 @@ msgstr "Gặp lá»—i khi tạo ngÆ°á»i dùng" | |||
5744 | msgid "Unable to create indices: %s.\n" | 5928 | msgid "Unable to create indices: %s.\n" |
5745 | msgstr "Không thể tạo miá»n tên.\n" | 5929 | msgstr "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 | ||
5749 | msgid "`%s:%s' failed at %s:%d with error: %s\n" | ||
5750 | msgstr "« %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 |
5754 | msgid "Unable to connect to Postgres database '%s': %s\n" | 5933 | msgid "PQprepare (`%s' as `%s') failed with error: %s\n" |
5755 | msgstr "Không thể lÆ°u táºp tin cấu hình « %s »:" | 5934 | msgstr "« %s » bị lá»—i tại %s:%d vá»›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?" | |||
5932 | msgid "Daemon to announce regular expressions for the peer using cadet." | 6111 | msgid "Daemon to announce regular expressions for the peer using cadet." |
5933 | msgstr "" | 6112 | msgstr "" |
5934 | 6113 | ||
5935 | #: src/regex/gnunet-regex-profiler.c:1314 | 6114 | #: src/regex/gnunet-regex-profiler.c:1386 |
5936 | #, fuzzy | 6115 | #, fuzzy |
5937 | msgid "No configuration file given. Exiting\n" | 6116 | msgid "No configuration file given. Exiting\n" |
5938 | msgstr "dùng táºp tin cấu hình TÊN_TẬP_TIN" | 6117 | msgstr "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 |
5943 | msgid "No policy directory specified on command line. Exiting.\n" | 6122 | msgid "No policy directory specified on command line. Exiting.\n" |
5944 | msgstr "" | 6123 | msgstr "" |
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 |
5949 | msgid "Specified policies directory does not exist. Exiting.\n" | 6128 | msgid "Specified policies directory does not exist. Exiting.\n" |
5950 | msgstr "" | 6129 | msgstr "" |
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 |
5954 | msgid "No files found in `%s'\n" | 6133 | msgid "No files found in `%s'\n" |
5955 | msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n" | 6134 | msgstr "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 |
5958 | msgid "No search strings file given. Exiting.\n" | 6137 | msgid "No search strings file given. Exiting.\n" |
5959 | msgstr "" | 6138 | msgstr "" |
5960 | 6139 | ||
5961 | #: src/regex/gnunet-regex-profiler.c:1397 | 6140 | #: src/regex/gnunet-regex-profiler.c:1469 |
5962 | #, fuzzy | 6141 | #, fuzzy |
5963 | msgid "Error loading search strings. Exiting.\n" | 6142 | msgid "Error loading search strings. Exiting.\n" |
5964 | msgstr "Gặp lỗi khi tải xuống: %s\n" | 6143 | msgstr "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 |
5968 | msgid "name of the file for writing statistics" | 6147 | msgid "name of the file for writing statistics" |
5969 | msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n" | 6148 | msgstr "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 |
5972 | msgid "wait TIMEOUT before ending the experiment" | 6151 | msgid "wait TIMEOUT before ending the experiment" |
5973 | msgstr "" | 6152 | msgstr "" |
5974 | 6153 | ||
5975 | #: src/regex/gnunet-regex-profiler.c:1497 | 6154 | #: src/regex/gnunet-regex-profiler.c:1569 |
5976 | msgid "directory with policy files" | 6155 | msgid "directory with policy files" |
5977 | msgstr "" | 6156 | msgstr "" |
5978 | 6157 | ||
5979 | #: src/regex/gnunet-regex-profiler.c:1504 | 6158 | #: src/regex/gnunet-regex-profiler.c:1576 |
5980 | #, fuzzy | 6159 | #, fuzzy |
5981 | msgid "name of file with input strings" | 6160 | msgid "name of file with input strings" |
5982 | msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n" | 6161 | msgstr "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 |
5986 | msgid "name of file with hosts' names" | 6165 | msgid "name of file with hosts' names" |
5987 | msgstr "Lá»—i lấy thông kê vá» truyá»n tải.\n" | 6166 | msgstr "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 |
5990 | msgid "Profiler for regex" | 6169 | msgid "Profiler for regex" |
5991 | msgstr "" | 6170 | msgstr "" |
5992 | 6171 | ||
@@ -6219,10 +6398,10 @@ msgstr "" | |||
6219 | msgid "Calculate the Vectorproduct with a GNUnet peer." | 6398 | msgid "Calculate the Vectorproduct with a GNUnet peer." |
6220 | msgstr "" | 6399 | msgstr "" |
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 |
6227 | msgid "Connect to CADET failed\n" | 6406 | msgid "Connect to CADET failed\n" |
6228 | msgstr " Không kết nối được (lỗi ?)\n" | 6407 | msgstr " Không kết nối được (lỗi ?)\n" |
@@ -6247,7 +6426,7 @@ msgstr "" | |||
6247 | msgid "also profile decryption" | 6426 | msgid "also profile decryption" |
6248 | msgstr "" | 6427 | msgstr "" |
6249 | 6428 | ||
6250 | #: src/set/gnunet-service-set.c:1948 | 6429 | #: src/set/gnunet-service-set.c:1989 |
6251 | #, fuzzy | 6430 | #, fuzzy |
6252 | msgid "Could not connect to CADET service\n" | 6431 | msgid "Could not connect to CADET service\n" |
6253 | msgstr "Không thể kết nối tới %s:%u: %s\n" | 6432 | msgstr "Không thể kết nối tới %s:%u: %s\n" |
@@ -6307,114 +6486,114 @@ msgstr "" | |||
6307 | msgid "say good-bye and leave somebody else's place" | 6486 | msgid "say good-bye and leave somebody else's place" |
6308 | msgstr "" | 6487 | msgstr "" |
6309 | 6488 | ||
6310 | #: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 | 6489 | #: src/social/gnunet-social.c:1227 |
6311 | msgid "create a place" | 6490 | msgid "create a place" |
6312 | msgstr "" | 6491 | msgstr "" |
6313 | 6492 | ||
6314 | #: src/social/gnunet-social.c:1237 | 6493 | #: src/social/gnunet-social.c:1232 |
6315 | msgid "destroy a place we were hosting" | 6494 | msgid "destroy a place we were hosting" |
6316 | msgstr "" | 6495 | msgstr "" |
6317 | 6496 | ||
6318 | #: src/social/gnunet-social.c:1242 | 6497 | #: src/social/gnunet-social.c:1237 |
6319 | msgid "enter somebody else's place" | 6498 | msgid "enter somebody else's place" |
6320 | msgstr "" | 6499 | msgstr "" |
6321 | 6500 | ||
6322 | #: src/social/gnunet-social.c:1248 | 6501 | #: src/social/gnunet-social.c:1243 |
6323 | msgid "find state matching name prefix" | 6502 | msgid "find state matching name prefix" |
6324 | msgstr "" | 6503 | msgstr "" |
6325 | 6504 | ||
6326 | #: src/social/gnunet-social.c:1253 | 6505 | #: src/social/gnunet-social.c:1248 |
6327 | msgid "replay history of messages up to the given --limit" | 6506 | msgid "replay history of messages up to the given --limit" |
6328 | msgstr "" | 6507 | msgstr "" |
6329 | 6508 | ||
6330 | #: src/social/gnunet-social.c:1258 | 6509 | #: src/social/gnunet-social.c:1253 |
6331 | msgid "reconnect to a previously created place" | 6510 | msgid "reconnect to a previously created place" |
6332 | msgstr "" | 6511 | msgstr "" |
6333 | 6512 | ||
6334 | #: src/social/gnunet-social.c:1263 | 6513 | #: src/social/gnunet-social.c:1258 |
6335 | msgid "publish something to a place we are hosting" | 6514 | msgid "publish something to a place we are hosting" |
6336 | msgstr "" | 6515 | msgstr "" |
6337 | 6516 | ||
6338 | #: src/social/gnunet-social.c:1268 | 6517 | #: src/social/gnunet-social.c:1263 |
6339 | msgid "reconnect to a previously entered place" | 6518 | msgid "reconnect to a previously entered place" |
6340 | msgstr "" | 6519 | msgstr "" |
6341 | 6520 | ||
6342 | #: src/social/gnunet-social.c:1273 | 6521 | #: src/social/gnunet-social.c:1268 |
6343 | msgid "search for state matching exact name" | 6522 | msgid "search for state matching exact name" |
6344 | msgstr "" | 6523 | msgstr "" |
6345 | 6524 | ||
6346 | #: src/social/gnunet-social.c:1278 | 6525 | #: src/social/gnunet-social.c:1273 |
6347 | msgid "submit something to somebody's place" | 6526 | msgid "submit something to somebody's place" |
6348 | msgstr "" | 6527 | msgstr "" |
6349 | 6528 | ||
6350 | #: src/social/gnunet-social.c:1283 | 6529 | #: src/social/gnunet-social.c:1278 |
6351 | msgid "list of egos and subscribed places" | 6530 | msgid "list of egos and subscribed places" |
6352 | msgstr "" | 6531 | msgstr "" |
6353 | 6532 | ||
6354 | #: src/social/gnunet-social.c:1288 | 6533 | #: src/social/gnunet-social.c:1283 |
6355 | msgid "extract and replay history between message IDs --start and --until" | 6534 | msgid "extract and replay history between message IDs --start and --until" |
6356 | msgstr "" | 6535 | msgstr "" |
6357 | 6536 | ||
6358 | #: src/social/gnunet-social.c:1297 | 6537 | #: src/social/gnunet-social.c:1292 |
6359 | msgid "application ID to use when connecting" | 6538 | msgid "application ID to use when connecting" |
6360 | msgstr "" | 6539 | msgstr "" |
6361 | 6540 | ||
6362 | #: src/social/gnunet-social.c:1303 | 6541 | #: src/social/gnunet-social.c:1298 |
6363 | msgid "message body or state value" | 6542 | msgid "message body or state value" |
6364 | msgstr "" | 6543 | msgstr "" |
6365 | 6544 | ||
6366 | #: src/social/gnunet-social.c:1309 | 6545 | #: src/social/gnunet-social.c:1304 |
6367 | #, fuzzy | 6546 | #, fuzzy |
6368 | msgid "name or public key of ego" | 6547 | msgid "name or public key of ego" |
6369 | msgstr "Äối số không hợp lệ cho « %s ».\n" | 6548 | msgstr "Äố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 |
6373 | msgid "wait for incoming messages" | 6552 | msgid "wait for incoming messages" |
6374 | msgstr "Lá»—i gá»i tin nhẳn.\n" | 6553 | msgstr "Lá»—i gá»i tin nhẳn.\n" |
6375 | 6554 | ||
6376 | #: src/social/gnunet-social.c:1320 | 6555 | #: src/social/gnunet-social.c:1315 |
6377 | msgid "GNS name" | 6556 | msgid "GNS name" |
6378 | msgstr "" | 6557 | msgstr "" |
6379 | 6558 | ||
6380 | #: src/social/gnunet-social.c:1326 | 6559 | #: src/social/gnunet-social.c:1321 |
6381 | msgid "peer ID for --guest-enter" | 6560 | msgid "peer ID for --guest-enter" |
6382 | msgstr "" | 6561 | msgstr "" |
6383 | 6562 | ||
6384 | #: src/social/gnunet-social.c:1332 | 6563 | #: src/social/gnunet-social.c:1327 |
6385 | msgid "name (key) to query from state" | 6564 | msgid "name (key) to query from state" |
6386 | msgstr "" | 6565 | msgstr "" |
6387 | 6566 | ||
6388 | #: src/social/gnunet-social.c:1338 | 6567 | #: src/social/gnunet-social.c:1333 |
6389 | msgid "method name" | 6568 | msgid "method name" |
6390 | msgstr "" | 6569 | msgstr "" |
6391 | 6570 | ||
6392 | #: src/social/gnunet-social.c:1344 | 6571 | #: src/social/gnunet-social.c:1339 |
6393 | #, fuzzy | 6572 | #, fuzzy |
6394 | msgid "number of messages to replay from history" | 6573 | msgid "number of messages to replay from history" |
6395 | msgstr "số tin nhắn cần dùng mỗi lần lặp" | 6574 | msgstr "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 |
6398 | msgid "key address of place" | 6577 | msgid "key address of place" |
6399 | msgstr "" | 6578 | msgstr "" |
6400 | 6579 | ||
6401 | #: src/social/gnunet-social.c:1356 | 6580 | #: src/social/gnunet-social.c:1351 |
6402 | msgid "start message ID for history replay" | 6581 | msgid "start message ID for history replay" |
6403 | msgstr "" | 6582 | msgstr "" |
6404 | 6583 | ||
6405 | #: src/social/gnunet-social.c:1361 | 6584 | #: src/social/gnunet-social.c:1356 |
6406 | msgid "respond to entry requests by admitting all guests" | 6585 | msgid "respond to entry requests by admitting all guests" |
6407 | msgstr "" | 6586 | msgstr "" |
6408 | 6587 | ||
6409 | #: src/social/gnunet-social.c:1367 | 6588 | #: src/social/gnunet-social.c:1362 |
6410 | msgid "end message ID for history replay" | 6589 | msgid "end message ID for history replay" |
6411 | msgstr "" | 6590 | msgstr "" |
6412 | 6591 | ||
6413 | #: src/social/gnunet-social.c:1372 | 6592 | #: src/social/gnunet-social.c:1367 |
6414 | msgid "respond to entry requests by refusing all guests" | 6593 | msgid "respond to entry requests by refusing all guests" |
6415 | msgstr "" | 6594 | msgstr "" |
6416 | 6595 | ||
6417 | #: src/social/gnunet-social.c:1382 | 6596 | #: src/social/gnunet-social.c:1377 |
6418 | msgid "" | 6597 | msgid "" |
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 "" | |||
6607 | msgstr "" | 6786 | msgstr "" |
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 |
6612 | msgid "Incorrect hostkey file format: %s\n" | 6791 | msgid "Incorrect hostkey file format: %s\n" |
6613 | msgstr "" | 6792 | msgstr "" |
@@ -6677,16 +6856,6 @@ msgstr "« %s » đang tắt.\n" | |||
6677 | msgid "%.s Unknown result code." | 6856 | msgid "%.s Unknown result code." |
6678 | msgstr "" | 6857 | msgstr "" |
6679 | 6858 | ||
6680 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6681 | #, fuzzy | ||
6682 | msgid "Waiting for child to exit.\n" | ||
6683 | msgstr "Äang đợi các đồng đẳng kết nối" | ||
6684 | |||
6685 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6686 | #, fuzzy, c-format | ||
6687 | msgid "Spawning process `%s'\n" | ||
6688 | msgstr "Ä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 |
6691 | msgid "tolerate COUNT number of continious timeout failures" | 6860 | msgid "tolerate COUNT number of continious timeout failures" |
6692 | msgstr "" | 6861 | msgstr "" |
@@ -6698,6 +6867,16 @@ msgid "" | |||
6698 | "signal is received" | 6867 | "signal is received" |
6699 | msgstr "" | 6868 | msgstr "" |
6700 | 6869 | ||
6870 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6871 | #, fuzzy | ||
6872 | msgid "Waiting for child to exit.\n" | ||
6873 | msgstr "Äang đợi các đồng đẳng kết nối" | ||
6874 | |||
6875 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6876 | #, fuzzy, c-format | ||
6877 | msgid "Spawning process `%s'\n" | ||
6878 | msgstr "Ä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 |
6703 | msgid "Adding host %u failed with error: %s\n" | 6882 | msgid "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" | |||
7000 | msgid "GNUnet topology control" | 7179 | msgid "GNUnet topology control" |
7001 | msgstr "" | 7180 | msgstr "" |
7002 | 7181 | ||
7003 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
7004 | msgid "# Addresses given to ATS" | ||
7005 | msgstr "" | ||
7006 | |||
7007 | #: src/transport/gnunet-service-transport.c:448 | 7182 | #: src/transport/gnunet-service-transport.c:448 |
7008 | #, fuzzy | 7183 | #, fuzzy |
7009 | msgid "# messages dropped due to slow client" | 7184 | msgid "# messages dropped due to slow client" |
@@ -7053,6 +7228,10 @@ msgstr "" | |||
7053 | msgid "Transport service is lacking key configuration settings. Exiting.\n" | 7228 | msgid "Transport service is lacking key configuration settings. Exiting.\n" |
7054 | msgstr "Lưu cấu hình ngay bây giỠkhông?" | 7229 | msgstr "Lưu cấu hình ngay bây giỠkhông?" |
7055 | 7230 | ||
7231 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
7232 | msgid "# Addresses given to ATS" | ||
7233 | msgstr "" | ||
7234 | |||
7056 | #: src/transport/gnunet-service-transport_hello.c:195 | 7235 | #: src/transport/gnunet-service-transport_hello.c:195 |
7057 | msgid "# refreshed my HELLO" | 7236 | msgid "# refreshed my HELLO" |
7058 | msgstr "" | 7237 | msgstr "" |
@@ -7387,6 +7566,46 @@ msgstr "" | |||
7387 | msgid "# validations succeeded" | 7566 | msgid "# validations succeeded" |
7388 | msgstr "" | 7567 | msgstr "" |
7389 | 7568 | ||
7569 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7570 | #, c-format | ||
7571 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7572 | msgstr "" | ||
7573 | |||
7574 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7575 | msgid "send data to peer" | ||
7576 | msgstr "" | ||
7577 | |||
7578 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7579 | #, fuzzy | ||
7580 | msgid "receive data from peer" | ||
7581 | msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n" | ||
7582 | |||
7583 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7584 | #, fuzzy | ||
7585 | msgid "iterations" | ||
7586 | msgstr "Tùy chá»n chung" | ||
7587 | |||
7588 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7589 | #, fuzzy | ||
7590 | msgid "number of messages to send" | ||
7591 | msgstr "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 | ||
7595 | msgid "message size to use" | ||
7596 | msgstr "kÃch cỡ tin nhắn" | ||
7597 | |||
7598 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7599 | #: src/transport/gnunet-transport.c:1462 | ||
7600 | msgid "peer identity" | ||
7601 | msgstr "" | ||
7602 | |||
7603 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7604 | #: src/transport/gnunet-transport.c:1482 | ||
7605 | #, fuzzy | ||
7606 | msgid "Direct access to transport service." | ||
7607 | msgstr "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 |
7392 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" | 7611 | msgid "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." | |||
7526 | msgid "do not resolve hostnames" | 7745 | msgid "do not resolve hostnames" |
7527 | msgstr "không quyết định các tên máy" | 7746 | msgstr "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 | ||
7531 | msgid "peer identity" | ||
7532 | msgstr "" | ||
7533 | |||
7534 | #: src/transport/gnunet-transport.c:1466 | 7748 | #: src/transport/gnunet-transport.c:1466 |
7535 | msgid "monitor plugin sessions" | 7749 | msgid "monitor plugin sessions" |
7536 | msgstr "" | 7750 | msgstr "" |
@@ -7539,44 +7753,9 @@ msgstr "" | |||
7539 | msgid "send data for benchmarking to the other peer (until CTRL-C)" | 7753 | msgid "send data for benchmarking to the other peer (until CTRL-C)" |
7540 | msgstr "" | 7754 | msgstr "" |
7541 | 7755 | ||
7542 | #: src/transport/gnunet-transport.c:1482 | ||
7543 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7544 | #, fuzzy | ||
7545 | msgid "Direct access to transport service." | ||
7546 | msgstr "Lỗi kết nối đến gnunetd.\n" | ||
7547 | |||
7548 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7549 | #, c-format | ||
7550 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7551 | msgstr "" | ||
7552 | |||
7553 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7554 | msgid "send data to peer" | ||
7555 | msgstr "" | ||
7556 | |||
7557 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7558 | #, fuzzy | ||
7559 | msgid "receive data from peer" | ||
7560 | msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n" | ||
7561 | |||
7562 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7563 | #, fuzzy | ||
7564 | msgid "iterations" | ||
7565 | msgstr "Tùy chá»n chung" | ||
7566 | |||
7567 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7568 | #, fuzzy | ||
7569 | msgid "number of messages to send" | ||
7570 | msgstr "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 | ||
7574 | msgid "message size to use" | ||
7575 | msgstr "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 |
7582 | msgid "TCP_STEALTH not supported on this platform.\n" | 7761 | msgid "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" | |||
7588 | msgstr "" | 7767 | msgstr "" |
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 |
7593 | msgid "Shutting down plugin `%s'\n" | 7772 | msgid "Shutting down plugin `%s'\n" |
7594 | msgstr "Äang nạp các truyá»n tải « %s »\n" | 7773 | msgstr "Ä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 |
7599 | msgid "Shutdown for plugin `%s' complete\n" | 7778 | msgid "Shutdown for plugin `%s' complete\n" |
7600 | msgstr "Tải lên « %s » hoà n thà nh, địa chỉ URI là « %s ».\n" | 7779 | msgstr "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" | |||
7604 | msgid "Maximum number of requests is %u\n" | 7783 | msgid "Maximum number of requests is %u\n" |
7605 | msgstr "tăng sổ tối đa các kết nối TCP/IP" | 7784 | msgstr "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 |
7609 | msgid "" | 7788 | msgid "" |
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" |
7612 | msgstr "" | 7791 | msgstr "" |
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 |
7616 | msgid "Accepting connection (%u of %u) from `%s'\n" | 7795 | msgid "Accepting connection (%u of %u) from `%s'\n" |
7617 | msgstr "" | 7796 | msgstr "" |
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 |
7621 | msgid "" | 7800 | msgid "" |
7622 | "Server reached maximum number connections (%u), rejecting new connection\n" | 7801 | "Server reached maximum number connections (%u), rejecting new connection\n" |
7623 | msgstr "" | 7802 | msgstr "" |
7624 | 7803 | ||
7625 | #: src/transport/plugin_transport_http_server.c:2125 | 7804 | #: src/transport/plugin_transport_http_server.c:2186 |
7626 | msgid "" | 7805 | msgid "" |
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" |
7629 | msgstr "" | 7808 | msgstr "" |
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 |
7633 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" | 7812 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" |
7634 | msgstr "" | 7813 | msgstr "" |
7635 | 7814 | ||
7636 | #: src/transport/plugin_transport_http_server.c:2275 | 7815 | #: src/transport/plugin_transport_http_server.c:2338 |
7637 | msgid "Could not load or create server certificate! Loading plugin failed!\n" | 7816 | msgid "Could not load or create server certificate! Loading plugin failed!\n" |
7638 | msgstr "" | 7817 | msgstr "" |
7639 | 7818 | ||
7640 | #: src/transport/plugin_transport_http_server.c:2587 | 7819 | #: src/transport/plugin_transport_http_server.c:2650 |
7641 | #, fuzzy | 7820 | #, fuzzy |
7642 | msgid "Require valid port number for service in configuration!\n" | 7821 | msgid "Require valid port number for service in configuration!\n" |
7643 | msgstr "Lỗi lưu cấu hình." | 7822 | msgstr "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 |
7647 | msgid "Found %u addresses to report to NAT service\n" | 7826 | msgid "Found %u addresses to report to NAT service\n" |
7648 | msgstr "" | 7827 | msgstr "" |
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 |
7652 | msgid "Disabling IPv6 since it is not supported on this system!\n" | 7831 | msgid "Disabling IPv6 since it is not supported on this system!\n" |
7653 | msgstr "" | 7832 | msgstr "" |
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 |
7657 | msgid "IPv4 support is %s\n" | 7836 | msgid "IPv4 support is %s\n" |
7658 | msgstr "" | 7837 | msgstr "" |
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 |
7662 | msgid "IPv6 support is %s\n" | 7841 | msgid "IPv6 support is %s\n" |
7663 | msgstr "" | 7842 | msgstr "" |
7664 | 7843 | ||
7665 | #: src/transport/plugin_transport_http_server.c:2965 | 7844 | #: src/transport/plugin_transport_http_server.c:3028 |
7666 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" | 7845 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" |
7667 | msgstr "" | 7846 | msgstr "" |
7668 | 7847 | ||
7669 | #: src/transport/plugin_transport_http_server.c:2976 | 7848 | #: src/transport/plugin_transport_http_server.c:3039 |
7670 | #, fuzzy | 7849 | #, fuzzy |
7671 | msgid "Port is required! Fix in configuration\n" | 7850 | msgid "Port is required! Fix in configuration\n" |
7672 | msgstr "" | 7851 | msgstr "" |
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 |
7678 | msgid "Using port %u\n" | 7857 | msgid "Using port %u\n" |
7679 | msgstr "Äang thá» nghiệm (các) truyá»n tải %s\n" | 7858 | msgstr "Ä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 |
7683 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" | 7862 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" |
7684 | msgstr "Äang thá» dùng táºp tin « %s » cho cấu hình MySQL.\n" | 7863 | msgstr "Ä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 |
7688 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" | 7867 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" |
7689 | msgstr "Äang thá» dùng táºp tin « %s » cho cấu hình MySQL.\n" | 7868 | msgstr "Ä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 |
7693 | msgid "Using external hostname `%s'\n" | 7872 | msgid "Using external hostname `%s'\n" |
7694 | msgstr "Äang bắt đầu tà i vỠ« %s »\n" | 7873 | msgstr "Ä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 |
7698 | msgid "Notifying transport only about hostname `%s'\n" | 7877 | msgid "Notifying transport only about hostname `%s'\n" |
7699 | msgstr "không quyết định các tên máy" | 7878 | msgstr "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 |
7703 | msgid "Maximum number of connections is %u\n" | 7882 | msgid "Maximum number of connections is %u\n" |
7704 | msgstr "tăng sổ tối đa các kết nối TCP/IP" | 7883 | msgstr "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 |
7708 | msgid "Unable to compile URL regex\n" | 7887 | msgid "Unable to compile URL regex\n" |
7709 | msgstr "Không thể sơ khởi SQLite: %s.\n" | 7888 | msgstr "Không thể sơ khởi SQLite: %s.\n" |
@@ -7852,21 +8031,6 @@ msgstr "" | |||
7852 | msgid "TCP transport advertises itself as being on port %llu\n" | 8031 | msgid "TCP transport advertises itself as being on port %llu\n" |
7853 | msgstr "" | 8032 | msgstr "" |
7854 | 8033 | ||
7855 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7856 | #, fuzzy | ||
7857 | msgid "# Multicast HELLO beacons received via UDP" | ||
7858 | msgstr "# các thông báo PONG đã máºt mã được nháºn" | ||
7859 | |||
7860 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7861 | msgid "" | ||
7862 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7863 | msgstr "" | ||
7864 | |||
7865 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7866 | #, c-format | ||
7867 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7868 | msgstr "" | ||
7869 | |||
7870 | #: src/transport/plugin_transport_udp.c:3366 | 8034 | #: src/transport/plugin_transport_udp.c:3366 |
7871 | #, c-format | 8035 | #, c-format |
7872 | msgid "" | 8036 | msgid "" |
@@ -7915,6 +8079,21 @@ msgstr "« %s » không sẵn sà ng.\n" | |||
7915 | msgid "Failed to create UDP network sockets\n" | 8079 | msgid "Failed to create UDP network sockets\n" |
7916 | msgstr "Không thể tạo miá»n tên.\n" | 8080 | msgstr "Không thể tạo miá»n tên.\n" |
7917 | 8081 | ||
8082 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
8083 | #, fuzzy | ||
8084 | msgid "# Multicast HELLO beacons received via UDP" | ||
8085 | msgstr "# các thông báo PONG đã máºt mã được nháºn" | ||
8086 | |||
8087 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
8088 | msgid "" | ||
8089 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
8090 | msgstr "" | ||
8091 | |||
8092 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
8093 | #, c-format | ||
8094 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
8095 | msgstr "" | ||
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 |
7920 | msgid "Cannot create path to `%s'\n" | 8099 | msgid "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" |
8030 | msgstr "" | 8209 | msgstr "" |
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 |
8034 | msgid "Unknown address family %d\n" | 8213 | msgid "Unknown address family %d\n" |
8035 | msgstr "\tKhông rõ miá»n tên « %s »\n" | 8214 | msgstr "\tKhông rõ miá»n tên « %s »\n" |
@@ -8074,51 +8253,51 @@ msgstr "Lỗi chạy %s: %s %d\n" | |||
8074 | msgid "Service `%s' runs at %s\n" | 8253 | msgid "Service `%s' runs at %s\n" |
8075 | msgstr "Äồng đẳng « %s » có mức tin cáºy %8u\n" | 8254 | msgstr "Äồ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 |
8078 | msgid "Service process failed to initialize\n" | 8257 | msgid "Service process failed to initialize\n" |
8079 | msgstr "" | 8258 | msgstr "" |
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 |
8082 | msgid "Service process could not initialize server function\n" | 8261 | msgid "Service process could not initialize server function\n" |
8083 | msgstr "" | 8262 | msgstr "" |
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 |
8086 | msgid "Service process failed to report status\n" | 8265 | msgid "Service process failed to report status\n" |
8087 | msgstr "" | 8266 | msgstr "" |
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 |
8092 | msgid "Cannot obtain information about user `%s': %s\n" | 8271 | msgid "Cannot obtain information about user `%s': %s\n" |
8093 | msgstr "Không thể lấy thông tin vá» ngÆ°á»i dùng « %s »: %s\n" | 8272 | msgstr "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 |
8096 | msgid "No such user" | 8275 | msgid "No such user" |
8097 | msgstr "Không có ngÆ°á»i dùng nhÆ° váºy" | 8276 | msgstr "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 |
8101 | msgid "Cannot change user/group to `%s': %s\n" | 8280 | msgid "Cannot change user/group to `%s': %s\n" |
8102 | msgstr "Không thể thay đổi ngÆ°á»i dùng/nhóm thà nh « %s »: %s\n" | 8281 | msgstr "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 |
8105 | msgid "do daemonize (detach from terminal)" | 8284 | msgid "do daemonize (detach from terminal)" |
8106 | msgstr "" | 8285 | msgstr "" |
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 |
8111 | msgid "Malformed configuration file `%s', exit ...\n" | 8290 | msgid "Malformed configuration file `%s', exit ...\n" |
8112 | msgstr "Không thể lÆ°u táºp tin cấu hình « %s »:" | 8291 | msgstr "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 |
8117 | msgid "Malformed configuration, exit ...\n" | 8296 | msgid "Malformed configuration, exit ...\n" |
8118 | msgstr "Không thể lÆ°u táºp tin cấu hình « %s »:" | 8297 | msgstr "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 |
8123 | msgid "Could not access configuration file `%s'\n" | 8302 | msgid "Could not access configuration file `%s'\n" |
8124 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" | 8303 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" |
@@ -8162,71 +8341,71 @@ msgstr "" | |||
8162 | msgid "Need a non-empty hostname for service `%s'.\n" | 8341 | msgid "Need a non-empty hostname for service `%s'.\n" |
8163 | msgstr "" | 8342 | msgstr "" |
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 |
8166 | msgid "DEBUG" | 8345 | msgid "DEBUG" |
8167 | msgstr "Gá» Lá»–I" | 8346 | msgstr "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 |
8170 | msgid "INFO" | 8349 | msgid "INFO" |
8171 | msgstr "TIN" | 8350 | msgstr "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 |
8174 | msgid "MESSAGE" | 8353 | msgid "MESSAGE" |
8175 | msgstr "" | 8354 | msgstr "" |
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 |
8178 | msgid "WARNING" | 8357 | msgid "WARNING" |
8179 | msgstr "CẢNH BÃO" | 8358 | msgstr "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 |
8182 | msgid "ERROR" | 8361 | msgid "ERROR" |
8183 | msgstr "Lá»–I" | 8362 | msgstr "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 |
8186 | msgid "NONE" | 8365 | msgid "NONE" |
8187 | msgstr "" | 8366 | msgstr "" |
8188 | 8367 | ||
8189 | #: src/util/common_logging.c:879 | 8368 | #: src/util/common_logging.c:882 |
8190 | #, fuzzy, c-format | 8369 | #, fuzzy, c-format |
8191 | msgid "Message `%.*s' repeated %u times in the last %s\n" | 8370 | msgid "Message `%.*s' repeated %u times in the last %s\n" |
8192 | msgstr "Thông điệp « %.*s » đã lặp lại %u lần trong %llu giây trước\n" | 8371 | msgstr "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 |
8195 | msgid "INVALID" | 8374 | msgid "INVALID" |
8196 | msgstr "" | 8375 | msgstr "" |
8197 | 8376 | ||
8198 | #: src/util/common_logging.c:1302 | 8377 | #: src/util/common_logging.c:1326 |
8199 | msgid "unknown address" | 8378 | msgid "unknown address" |
8200 | msgstr "" | 8379 | msgstr "" |
8201 | 8380 | ||
8202 | #: src/util/common_logging.c:1344 | 8381 | #: src/util/common_logging.c:1368 |
8203 | msgid "invalid address" | 8382 | msgid "invalid address" |
8204 | msgstr "" | 8383 | msgstr "" |
8205 | 8384 | ||
8206 | #: src/util/common_logging.c:1362 | 8385 | #: src/util/common_logging.c:1386 |
8207 | #, fuzzy, c-format | 8386 | #, fuzzy, c-format |
8208 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" | 8387 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" |
8209 | msgstr "" | 8388 | msgstr "" |
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 |
8214 | msgid "" | 8393 | msgid "" |
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" |
8216 | msgstr "" | 8395 | msgstr "" |
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 |
8221 | msgid "Syntax error while deserializing in line %u\n" | 8400 | msgid "Syntax error while deserializing in line %u\n" |
8222 | msgstr "Gặp lá»—i cú pháp trong táºp tin cấu hình « %s » tại dòng %d.\n" | 8401 | msgstr "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 |
8226 | msgid "Error while reading file `%s'\n" | 8405 | msgid "Error while reading file `%s'\n" |
8227 | msgstr "Gặp lỗi khi tải xuống: %s\n" | 8406 | msgstr "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 |
8231 | msgid "" | 8410 | msgid "" |
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 |
8240 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" | 8419 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" |
8241 | msgstr "" | 8420 | msgstr "" |
8242 | 8421 | ||
8243 | #: src/util/configuration.c:1169 | 8422 | #: src/util/configuration.c:1186 |
8244 | #, fuzzy, c-format | 8423 | #, fuzzy, c-format |
8245 | msgid "Missing closing `%s' in option `%s'\n" | 8424 | msgid "Missing closing `%s' in option `%s'\n" |
8246 | msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n" | 8425 | msgstr "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 |
8250 | msgid "" | 8429 | msgid "" |
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" | |||
8279 | msgid "EdDSA signature verification failed at %s:%d: %s\n" | 8458 | msgid "EdDSA signature verification failed at %s:%d: %s\n" |
8280 | msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n" | 8459 | msgstr "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 |
8285 | msgid "Could not acquire lock on file `%s': %s...\n" | 8464 | msgid "Could not acquire lock on file `%s': %s...\n" |
8286 | msgstr "Lá»—i mở táºp tin theo dõi « %s »: %s\n" | 8465 | msgstr "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 |
8290 | msgid "Creating a new private key. This may take a while.\n" | 8469 | msgid "Creating a new private key. This may take a while.\n" |
8291 | msgstr "Äang tạo khoá máy má»›i (có thể hÆ¡i lâu).\n" | 8470 | msgstr "Ä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 |
8294 | msgid "This may be ok if someone is currently generating a private key.\n" | 8473 | msgid "This may be ok if someone is currently generating a private key.\n" |
8295 | msgstr "" | 8474 | msgstr "" |
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 |
8299 | msgid "" | 8478 | msgid "" |
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" |
8301 | msgstr "" | 8480 | msgstr "" |
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 |
8304 | msgid "This may be ok if someone is currently generating a key.\n" | 8483 | msgid "This may be ok if someone is currently generating a key.\n" |
8305 | msgstr "" | 8484 | msgstr "" |
8306 | 8485 | ||
8307 | #: src/util/crypto_ecc_setup.c:413 | 8486 | #: src/util/crypto_ecc_setup.c:415 |
8308 | #, fuzzy | 8487 | #, fuzzy |
8309 | msgid "Could not load peer's private key\n" | 8488 | msgid "Could not load peer's private key\n" |
8310 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" | 8489 | msgstr "Không thể truy cáºp đến táºp tin gnunet-directory « %s »\n" |
@@ -8499,82 +8678,86 @@ msgstr "" | |||
8499 | msgid "Manipulate GNUnet configuration files" | 8678 | msgid "Manipulate GNUnet configuration files" |
8500 | msgstr "cáºp nháºt má»™t giá trị trong táºp tin cấu hình" | 8679 | msgstr "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 |
8504 | msgid "Failed to open `%s': %s\n" | 8683 | msgid "Failed to open `%s': %s\n" |
8505 | msgstr "Lá»—i mở táºp tin ghi sá»± kiện « %s »: %s\n" | 8684 | msgstr "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 |
8509 | msgid "Generating %u keys like %s, please wait" | 8688 | msgid "Generating %u keys like %s, please wait" |
8510 | msgstr "" | 8689 | msgstr "" |
8511 | 8690 | ||
8512 | #: src/util/gnunet-ecc.c:133 | 8691 | #: src/util/gnunet-ecc.c:138 |
8513 | #, c-format | 8692 | #, c-format |
8514 | msgid "Generating %u keys, please wait" | 8693 | msgid "Generating %u keys, please wait" |
8515 | msgstr "" | 8694 | msgstr "" |
8516 | 8695 | ||
8517 | #: src/util/gnunet-ecc.c:174 | 8696 | #: src/util/gnunet-ecc.c:179 |
8518 | #, fuzzy, c-format | 8697 | #, fuzzy, c-format |
8519 | msgid "" | 8698 | msgid "" |
8520 | "\n" | 8699 | "\n" |
8521 | "Failed to write to `%s': %s\n" | 8700 | "Failed to write to `%s': %s\n" |
8522 | msgstr "Lỗi chạy %s: %s %d\n" | 8701 | msgstr "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 |
8526 | msgid "" | 8705 | msgid "" |
8527 | "\n" | 8706 | "\n" |
8528 | "Finished!\n" | 8707 | "Finished!\n" |
8529 | msgstr "" | 8708 | msgstr "" |
8530 | 8709 | ||
8531 | #: src/util/gnunet-ecc.c:187 | 8710 | #: src/util/gnunet-ecc.c:192 |
8532 | #, c-format | 8711 | #, c-format |
8533 | msgid "" | 8712 | msgid "" |
8534 | "\n" | 8713 | "\n" |
8535 | "Error, %u keys not generated\n" | 8714 | "Error, %u keys not generated\n" |
8536 | msgstr "" | 8715 | msgstr "" |
8537 | 8716 | ||
8538 | #: src/util/gnunet-ecc.c:280 | 8717 | #: src/util/gnunet-ecc.c:283 |
8539 | #, fuzzy, c-format | 8718 | #, fuzzy, c-format |
8540 | msgid "Hostkeys file `%s' not found\n" | 8719 | msgid "Hostkeys file `%s' not found\n" |
8541 | msgstr "Khoá phiên chạy từ đồng đẳng « %s » không thể được thẩm tra.\n" | 8720 | msgstr "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 |
8545 | msgid "Hostkeys file `%s' is empty\n" | 8724 | msgid "Hostkeys file `%s' is empty\n" |
8546 | msgstr "Äịnh dạng của táºp tin « %s » là không hợp lệ.\n" | 8725 | msgstr "Äị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 |
8550 | msgid "Could not read hostkey file: %s\n" | 8729 | msgid "Could not read hostkey file: %s\n" |
8551 | msgstr "Không thể Ä‘á»c danh sách bạn bè « %s »\n" | 8730 | msgstr "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 |
8554 | msgid "No hostkey file specified on command line\n" | 8733 | msgid "No hostkey file specified on command line\n" |
8555 | msgstr "" | 8734 | msgstr "" |
8556 | 8735 | ||
8557 | #: src/util/gnunet-ecc.c:416 | 8736 | #: src/util/gnunet-ecc.c:425 |
8558 | msgid "list keys included in a file (for testing)" | 8737 | msgid "list keys included in a file (for testing)" |
8559 | msgstr "" | 8738 | msgstr "" |
8560 | 8739 | ||
8561 | #: src/util/gnunet-ecc.c:421 | 8740 | #: src/util/gnunet-ecc.c:430 |
8562 | msgid "number of keys to list included in a file (for testing)" | 8741 | msgid "number of keys to list included in a file (for testing)" |
8563 | msgstr "" | 8742 | msgstr "" |
8564 | 8743 | ||
8565 | #: src/util/gnunet-ecc.c:426 | 8744 | #: src/util/gnunet-ecc.c:435 |
8566 | msgid "create COUNT public-private key pairs (for testing)" | 8745 | msgid "create COUNT public-private key pairs (for testing)" |
8567 | msgstr "" | 8746 | msgstr "" |
8568 | 8747 | ||
8569 | #: src/util/gnunet-ecc.c:430 | 8748 | #: src/util/gnunet-ecc.c:439 |
8570 | msgid "print the public key in ASCII format" | 8749 | msgid "print the public key in ASCII format" |
8571 | msgstr "" | 8750 | msgstr "" |
8572 | 8751 | ||
8573 | #: src/util/gnunet-ecc.c:434 | 8752 | #: src/util/gnunet-ecc.c:443 |
8753 | msgid "print the public key in HEX format" | ||
8754 | msgstr "" | ||
8755 | |||
8756 | #: src/util/gnunet-ecc.c:447 | ||
8574 | msgid "print examples of ECC operations (used for compatibility testing)" | 8757 | msgid "print examples of ECC operations (used for compatibility testing)" |
8575 | msgstr "" | 8758 | msgstr "" |
8576 | 8759 | ||
8577 | #: src/util/gnunet-ecc.c:449 | 8760 | #: src/util/gnunet-ecc.c:463 |
8578 | #, fuzzy | 8761 | #, fuzzy |
8579 | msgid "Manipulate GNUnet private ECC key files" | 8762 | msgid "Manipulate GNUnet private ECC key files" |
8580 | msgstr "cáºp nháºt má»™t giá trị trong táºp tin cấu hình" | 8763 | msgstr "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" | |||
8668 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" | 8851 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" |
8669 | msgstr "" | 8852 | msgstr "" |
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 |
8673 | msgid "" | 8856 | msgid "" |
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" | |||
8721 | msgid "Could not determine plugin installation path.\n" | 8904 | msgid "Could not determine plugin installation path.\n" |
8722 | msgstr "Không thể truy cáºp đến thông tin vá» không gian tên.\n" | 8905 | msgstr "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 |
8726 | msgid "" | 8909 | msgid "" |
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" |
8735 | msgstr "" | 8918 | msgstr "" |
8736 | 8919 | ||
8737 | #: src/util/resolver_api.c:815 | 8920 | #: src/util/resolver_api.c:826 |
8738 | #, fuzzy, c-format | 8921 | #, fuzzy, c-format |
8739 | msgid "Timeout trying to resolve hostname `%s'.\n" | 8922 | msgid "Timeout trying to resolve hostname `%s'.\n" |
8740 | msgstr "không quyết định các tên máy" | 8923 | msgstr "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 |
8744 | msgid "Timeout trying to resolve IP address `%s'.\n" | 8927 | msgid "Timeout trying to resolve IP address `%s'.\n" |
8745 | msgstr "GNUnet bây giỠsỠdụng địa chỉ IP %s.\n" | 8928 | msgstr "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 |
8748 | msgid "Resolver not configured correctly.\n" | 8931 | msgid "Resolver not configured correctly.\n" |
8749 | msgstr "" | 8932 | msgstr "" |
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 |
8754 | msgid "Could not resolve our FQDN: %s\n" | 8937 | msgid "Could not resolve our FQDN: %s\n" |
8755 | msgstr "Không thể giải quyết « %s » (%s): %s\n" | 8938 | msgstr "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 |
8758 | msgid "" | 8941 | msgid "" |
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" |
8760 | msgstr "" | 8943 | msgstr "" |
8761 | 8944 | ||
8762 | #: src/util/service.c:2082 | 8945 | #: src/util/service.c:2081 |
8763 | #, c-format | 8946 | #, c-format |
8764 | msgid "" | 8947 | msgid "" |
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" | |||
8837 | msgid "end of time" | 9020 | msgid "end of time" |
8838 | msgstr "" | 9021 | msgstr "" |
8839 | 9022 | ||
8840 | #: src/util/strings.c:1269 | 9023 | #: src/util/strings.c:1270 |
8841 | msgid "IPv6 address did not start with `['\n" | 9024 | msgid "IPv6 address did not start with `['\n" |
8842 | msgstr "" | 9025 | msgstr "" |
8843 | 9026 | ||
8844 | #: src/util/strings.c:1277 | 9027 | #: src/util/strings.c:1278 |
8845 | msgid "IPv6 address did contain ':' to separate port number\n" | 9028 | msgid "IPv6 address did contain ':' to separate port number\n" |
8846 | msgstr "" | 9029 | msgstr "" |
8847 | 9030 | ||
8848 | #: src/util/strings.c:1283 | 9031 | #: src/util/strings.c:1284 |
8849 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" | 9032 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" |
8850 | msgstr "" | 9033 | msgstr "" |
8851 | 9034 | ||
8852 | #: src/util/strings.c:1290 | 9035 | #: src/util/strings.c:1291 |
8853 | msgid "IPv6 address did contain a valid port number after the last ':'\n" | 9036 | msgid "IPv6 address did contain a valid port number after the last ':'\n" |
8854 | msgstr "" | 9037 | msgstr "" |
8855 | 9038 | ||
8856 | #: src/util/strings.c:1299 | 9039 | #: src/util/strings.c:1300 |
8857 | #, fuzzy, c-format | 9040 | #, fuzzy, c-format |
8858 | msgid "Invalid IPv6 address `%s': %s\n" | 9041 | msgid "Invalid IPv6 address `%s': %s\n" |
8859 | msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n" | 9042 | msgstr "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 |
8862 | msgid "Port not in range\n" | 9045 | msgid "Port not in range\n" |
8863 | msgstr "" | 9046 | msgstr "" |
8864 | 9047 | ||
8865 | #: src/util/strings.c:1596 | 9048 | #: src/util/strings.c:1597 |
8866 | #, fuzzy, c-format | 9049 | #, fuzzy, c-format |
8867 | msgid "Malformed port policy `%s'\n" | 9050 | msgid "Malformed port policy `%s'\n" |
8868 | msgstr "Lá»—i bắt đầu thu tháºp.\n" | 9051 | msgstr "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 |
8873 | msgid "Invalid format for IP: `%s'\n" | 9056 | msgid "Invalid format for IP: `%s'\n" |
8874 | msgstr "Äịa chỉ IP định dạng sai: %s\n" | 9057 | msgstr "Äị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 |
8878 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." | 9061 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." |
8879 | msgstr "Ký hiệu mạng sai (« /%d » không hợp lệ trong CIDR IPv4)." | 9062 | msgstr "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 |
8883 | msgid "Invalid format: `%s'\n" | 9066 | msgid "Invalid format: `%s'\n" |
8884 | msgstr "Äịa chỉ IP định dạng sai: %s\n" | 9067 | msgstr "Äị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 |
8888 | msgid "Invalid network notation (does not end with ';': `%s')\n" | 9071 | msgid "Invalid network notation (does not end with ';': `%s')\n" |
8889 | msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n" | 9072 | msgstr "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 |
8893 | msgid "Wrong format `%s' for netmask\n" | 9076 | msgid "Wrong format `%s' for netmask\n" |
8894 | msgstr "Mặt nạ mạng có định dạng sai « %s »: %s\n" | 9077 | msgstr "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 |
8898 | msgid "Wrong format `%s' for network\n" | 9081 | msgid "Wrong format `%s' for network\n" |
8899 | msgstr "Mạng có định dạng sai « %s »: %s\n" | 9082 | msgstr "Mạng có định dạng sai « %s »: %s\n" |
@@ -9076,28 +9259,44 @@ msgstr "# các byte đã nháºn qua UDP" | |||
9076 | msgid "Setup tunnels via VPN." | 9259 | msgid "Setup tunnels via VPN." |
9077 | msgstr "" | 9260 | msgstr "" |
9078 | 9261 | ||
9079 | #: src/zonemaster/gnunet-service-zonemaster.c:705 | 9262 | #: src/zonemaster/gnunet-service-zonemaster.c:706 |
9080 | #, fuzzy | 9263 | #, fuzzy |
9081 | msgid "Failed to connect to the namestore!\n" | 9264 | msgid "Failed to connect to the namestore!\n" |
9082 | msgstr "Không kết nối được đến trình ná»n gnunetd." | 9265 | msgstr "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 |
9087 | msgid "Assertion failed at %s:%d.\n" | 9270 | msgid "Assertion failed at %s:%d.\n" |
9088 | msgstr "Lỗi nội bộ : khẳng định không thà nh công tại %s:%d.\n" | 9271 | msgstr "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 |
9092 | msgid "External protocol violation detected at %s:%d.\n" | 9275 | msgid "External protocol violation detected at %s:%d.\n" |
9093 | msgstr "Lỗi nội bộ : khẳng định không thà nh công tại %s:%d.\n" | 9276 | msgstr "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 |
9097 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" | 9280 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" |
9098 | msgstr "« %s » thất bại ở táºp tin « %s » tại %s:%d vá»›i lá»—i: %s\n" | 9281 | msgstr "« %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 "" | |||
7 | msgstr "" | 7 | msgstr "" |
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" | |||
267 | msgstr "" | 267 | msgstr "" |
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" | |||
275 | msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" | 275 | msgstr "打开日志文件“%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 "" | |||
349 | msgid "Initiating shutdown as requested by client.\n" | 349 | msgid "Initiating shutdown as requested by client.\n" |
350 | msgstr "" | 350 | msgstr "" |
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 | 353 | msgid "Stop logging\n" |
354 | msgid "" | ||
355 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
356 | "%llu\n" | ||
357 | msgstr "" | ||
358 | |||
359 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
360 | #, c-format | ||
361 | msgid "" | ||
362 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
363 | "%llu\n" | ||
364 | msgstr "" | ||
365 | |||
366 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
367 | #, c-format | ||
368 | msgid "" | ||
369 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
370 | "%llu\n" | ||
371 | msgstr "" | ||
372 | |||
373 | #: src/ats/gnunet-ats-solver-eval.c:3294 | ||
374 | #: src/ats-tests/gnunet-solver-eval.c:939 | ||
375 | msgid "solver to use" | ||
376 | msgstr "" | ||
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 | ||
381 | msgid "experiment to use" | ||
382 | msgstr "" | ||
383 | |||
384 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
385 | #, fuzzy | ||
386 | msgid "print logging" | ||
387 | msgstr "未知的命令“%sâ€ã€‚\n" | ||
388 | |||
389 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
390 | msgid "save logging to disk" | ||
391 | msgstr "" | ||
392 | |||
393 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
394 | msgid "disable normalization" | ||
395 | msgstr "" | ||
396 | |||
397 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
398 | #, c-format | ||
399 | msgid "" | ||
400 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
401 | "%llu\n" | ||
402 | msgstr "" | ||
403 | |||
404 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
405 | #, c-format | ||
406 | msgid "%s quota configured for network `%s' is %llu\n" | ||
407 | msgstr "" | ||
408 | |||
409 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
410 | #, c-format | ||
411 | msgid "" | ||
412 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
413 | msgstr "" | ||
414 | |||
415 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
416 | #, fuzzy, c-format | ||
417 | msgid "Failed to initialize solver `%s'!\n" | ||
418 | msgstr "æ— æ³•åˆå§‹åŒ– SQLite:%s。\n" | ||
419 | |||
420 | #: src/ats/plugin_ats_mlp.c:1274 | ||
421 | msgid "Problem size too large, cannot allocate memory!\n" | ||
422 | msgstr "" | ||
423 | |||
424 | #: src/ats/plugin_ats_mlp.c:1869 | ||
425 | #, c-format | ||
426 | msgid "Adding address for peer `%s' multiple times\n" | ||
427 | msgstr "" | ||
428 | |||
429 | #: src/ats/plugin_ats_mlp.c:1913 | ||
430 | #, c-format | ||
431 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
432 | msgstr "" | ||
433 | |||
434 | #: src/ats/plugin_ats_mlp.c:2475 | ||
435 | msgid "" | ||
436 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
437 | msgstr "" | ||
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 | ||
447 | msgid "Invalid %s configuration %f \n" | ||
448 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
449 | |||
450 | #: src/ats/plugin_ats_mlp.c:2670 | ||
451 | #, c-format | ||
452 | msgid "" | ||
453 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
454 | "%llu must be at least %llu\n" | ||
455 | msgstr "" | ||
456 | |||
457 | #: src/ats/plugin_ats_mlp.c:2679 | ||
458 | #, c-format | ||
459 | msgid "" | ||
460 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
461 | "must be at least %llu\n" | ||
462 | msgstr "" | ||
463 | |||
464 | #: src/ats/plugin_ats_mlp.c:2689 | ||
465 | #, c-format | ||
466 | msgid "" | ||
467 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
468 | msgstr "" | ||
469 | |||
470 | #: src/ats/plugin_ats_mlp.c:2698 | ||
471 | #, c-format | ||
472 | msgid "" | ||
473 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
474 | msgstr "" | 354 | msgstr "" |
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 |
478 | msgid "Invalid %s configuration %f\n" | 358 | msgid "Start logging `%s'\n" |
479 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 359 | msgstr "未知的命令“%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 "" | |||
488 | msgid "Failed to connect master peer [%u] with slave [%u]\n" | 368 | msgid "Failed to connect master peer [%u] with slave [%u]\n" |
489 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 369 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
490 | 370 | ||
491 | #: src/ats-tests/ats-testing-log.c:837 | ||
492 | msgid "Stop logging\n" | ||
493 | msgstr "" | ||
494 | |||
495 | #: src/ats-tests/ats-testing-log.c:892 | ||
496 | #, fuzzy, c-format | ||
497 | msgid "Start logging `%s'\n" | ||
498 | msgstr "未知的命令“%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 |
502 | msgid "" | 373 | msgid "" |
@@ -504,6 +375,15 @@ msgid "" | |||
504 | "= %u KiB/s\n" | 375 | "= %u KiB/s\n" |
505 | msgstr "" | 376 | msgstr "" |
506 | 377 | ||
378 | #: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294 | ||
379 | msgid "solver to use" | ||
380 | msgstr "" | ||
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 | ||
384 | msgid "experiment to use" | ||
385 | msgstr "" | ||
386 | |||
507 | #: src/ats-tool/gnunet-ats.c:307 | 387 | #: src/ats-tool/gnunet-ats.c:307 |
508 | #, c-format | 388 | #, c-format |
509 | msgid "%u address resolutions had a timeout\n" | 389 | msgid "%u address resolutions had a timeout\n" |
@@ -625,6 +505,124 @@ msgstr "" | |||
625 | msgid "Print information about ATS state" | 505 | msgid "Print information about ATS state" |
626 | msgstr "æ— æ³•èŽ·å–有关用户“%sâ€çš„ä¿¡æ¯ï¼š%s\n" | 506 | msgstr "æ— æ³•èŽ·å–有关用户“%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 | ||
510 | msgid "" | ||
511 | "Could not load quota for network `%s': `%s', assigning default bandwidth " | ||
512 | "%llu\n" | ||
513 | msgstr "" | ||
514 | |||
515 | #: src/ats/gnunet-ats-solver-eval.c:2799 | ||
516 | #, c-format | ||
517 | msgid "" | ||
518 | "No outbound quota configured for network `%s', assigning default bandwidth " | ||
519 | "%llu\n" | ||
520 | msgstr "" | ||
521 | |||
522 | #: src/ats/gnunet-ats-solver-eval.c:2840 | ||
523 | #, c-format | ||
524 | msgid "" | ||
525 | "No outbound quota configure for network `%s', assigning default bandwidth " | ||
526 | "%llu\n" | ||
527 | msgstr "" | ||
528 | |||
529 | #: src/ats/gnunet-ats-solver-eval.c:3306 | ||
530 | #, fuzzy | ||
531 | msgid "print logging" | ||
532 | msgstr "未知的命令“%sâ€ã€‚\n" | ||
533 | |||
534 | #: src/ats/gnunet-ats-solver-eval.c:3311 | ||
535 | msgid "save logging to disk" | ||
536 | msgstr "" | ||
537 | |||
538 | #: src/ats/gnunet-ats-solver-eval.c:3316 | ||
539 | msgid "disable normalization" | ||
540 | msgstr "" | ||
541 | |||
542 | #: src/ats/gnunet-service-ats_plugins.c:304 | ||
543 | #, c-format | ||
544 | msgid "" | ||
545 | "Could not load %s quota for network `%s': `%s', assigning default bandwidth " | ||
546 | "%llu\n" | ||
547 | msgstr "" | ||
548 | |||
549 | #: src/ats/gnunet-service-ats_plugins.c:314 | ||
550 | #, c-format | ||
551 | msgid "%s quota configured for network `%s' is %llu\n" | ||
552 | msgstr "" | ||
553 | |||
554 | #: src/ats/gnunet-service-ats_plugins.c:359 | ||
555 | #, c-format | ||
556 | msgid "" | ||
557 | "No %s-quota configured for network `%s', assigning default bandwidth %llu\n" | ||
558 | msgstr "" | ||
559 | |||
560 | #: src/ats/gnunet-service-ats_plugins.c:451 | ||
561 | #, fuzzy, c-format | ||
562 | msgid "Failed to initialize solver `%s'!\n" | ||
563 | msgstr "æ— æ³•åˆå§‹åŒ– SQLite:%s。\n" | ||
564 | |||
565 | #: src/ats/plugin_ats_mlp.c:1274 | ||
566 | msgid "Problem size too large, cannot allocate memory!\n" | ||
567 | msgstr "" | ||
568 | |||
569 | #: src/ats/plugin_ats_mlp.c:1869 | ||
570 | #, c-format | ||
571 | msgid "Adding address for peer `%s' multiple times\n" | ||
572 | msgstr "" | ||
573 | |||
574 | #: src/ats/plugin_ats_mlp.c:1913 | ||
575 | #, c-format | ||
576 | msgid "Updating address property for peer `%s' %p not added before\n" | ||
577 | msgstr "" | ||
578 | |||
579 | #: src/ats/plugin_ats_mlp.c:2475 | ||
580 | msgid "" | ||
581 | "MLP solver is not optimizing for anything, changing to feasibility check\n" | ||
582 | msgstr "" | ||
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 | ||
592 | msgid "Invalid %s configuration %f \n" | ||
593 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
594 | |||
595 | #: src/ats/plugin_ats_mlp.c:2670 | ||
596 | #, c-format | ||
597 | msgid "" | ||
598 | "Adjusting inconsistent outbound quota configuration for network `%s', is " | ||
599 | "%llu must be at least %llu\n" | ||
600 | msgstr "" | ||
601 | |||
602 | #: src/ats/plugin_ats_mlp.c:2679 | ||
603 | #, c-format | ||
604 | msgid "" | ||
605 | "Adjusting inconsistent inbound quota configuration for network `%s', is %llu " | ||
606 | "must be at least %llu\n" | ||
607 | msgstr "" | ||
608 | |||
609 | #: src/ats/plugin_ats_mlp.c:2689 | ||
610 | #, c-format | ||
611 | msgid "" | ||
612 | "Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n" | ||
613 | msgstr "" | ||
614 | |||
615 | #: src/ats/plugin_ats_mlp.c:2698 | ||
616 | #, c-format | ||
617 | msgid "" | ||
618 | "Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n" | ||
619 | msgstr "" | ||
620 | |||
621 | #: src/ats/plugin_ats_proportional.c:1164 | ||
622 | #, fuzzy, c-format | ||
623 | msgid "Invalid %s configuration %f\n" | ||
624 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
625 | |||
628 | #: src/auction/gnunet-auction-create.c:163 | 626 | #: src/auction/gnunet-auction-create.c:163 |
629 | msgid "description of the item to be sold" | 627 | msgid "description of the item to be sold" |
630 | msgstr "" | 628 | msgstr "" |
@@ -770,6 +768,28 @@ msgstr "" | |||
770 | msgid "Connection to conversation service lost, trying to reconnect\n" | 768 | msgid "Connection to conversation service lost, trying to reconnect\n" |
771 | msgstr "" | 769 | msgstr "" |
772 | 770 | ||
771 | #: src/conversation/gnunet-conversation-test.c:119 | ||
772 | #, c-format | ||
773 | msgid "" | ||
774 | "\n" | ||
775 | "End of transmission. Have a GNU day.\n" | ||
776 | msgstr "" | ||
777 | |||
778 | #: src/conversation/gnunet-conversation-test.c:145 | ||
779 | #, c-format | ||
780 | msgid "" | ||
781 | "\n" | ||
782 | "We are now playing your recording back. If you can hear it, your audio " | ||
783 | "settings are working..." | ||
784 | msgstr "" | ||
785 | |||
786 | #: src/conversation/gnunet-conversation-test.c:210 | ||
787 | #, c-format | ||
788 | msgid "" | ||
789 | "We will now be recording you for %s. After that time, the recording will be " | ||
790 | "played back to you..." | ||
791 | msgstr "" | ||
792 | |||
773 | #: src/conversation/gnunet-conversation.c:269 | 793 | #: src/conversation/gnunet-conversation.c:269 |
774 | #, c-format | 794 | #, c-format |
775 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" | 795 | msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n" |
@@ -1026,30 +1046,8 @@ msgstr "" | |||
1026 | msgid "Enables having a conversation with other GNUnet users." | 1046 | msgid "Enables having a conversation with other GNUnet users." |
1027 | msgstr "" | 1047 | msgstr "" |
1028 | 1048 | ||
1029 | #: src/conversation/gnunet-conversation-test.c:119 | ||
1030 | #, c-format | ||
1031 | msgid "" | ||
1032 | "\n" | ||
1033 | "End of transmission. Have a GNU day.\n" | ||
1034 | msgstr "" | ||
1035 | |||
1036 | #: src/conversation/gnunet-conversation-test.c:145 | ||
1037 | #, c-format | ||
1038 | msgid "" | ||
1039 | "\n" | ||
1040 | "We are now playing your recording back. If you can hear it, your audio " | ||
1041 | "settings are working..." | ||
1042 | msgstr "" | ||
1043 | |||
1044 | #: src/conversation/gnunet-conversation-test.c:210 | ||
1045 | #, c-format | ||
1046 | msgid "" | ||
1047 | "We will now be recording you for %s. After that time, the recording will be " | ||
1048 | "played back to you..." | ||
1049 | msgstr "" | ||
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 |
1054 | msgid "Read error from STDIN: %d %s\n" | 1052 | msgid "Read error from STDIN: %d %s\n" |
1055 | msgstr "" | 1053 | msgstr "" |
@@ -1175,6 +1173,11 @@ msgstr "“%sâ€è¯´ï¼š%s\n" | |||
1175 | msgid "Failed to allocate %u bytes for second packet\n" | 1173 | msgid "Failed to allocate %u bytes for second packet\n" |
1176 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 1174 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
1177 | 1175 | ||
1176 | #: src/conversation/gnunet-service-conversation.c:1276 | ||
1177 | #, fuzzy, c-format | ||
1178 | msgid "Could not open line, port %s already in use!\n" | ||
1179 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" | ||
1180 | |||
1178 | #: src/conversation/microphone.c:119 | 1181 | #: src/conversation/microphone.c:119 |
1179 | #, fuzzy | 1182 | #, fuzzy |
1180 | msgid "Could not start record audio helper\n" | 1183 | msgid "Could not start record audio helper\n" |
@@ -1448,8 +1451,137 @@ msgstr "" | |||
1448 | msgid "# updates to my type map" | 1451 | msgid "# updates to my type map" |
1449 | msgstr "" | 1452 | msgstr "" |
1450 | 1453 | ||
1454 | #: src/credential/credential_misc.c:88 | ||
1455 | #, fuzzy, c-format | ||
1456 | msgid "Unable to parse CRED record string `%s'\n" | ||
1457 | msgstr "解æžé…置文件“%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 | ||
1462 | msgid "Ego `%s' not known to identity service\n" | ||
1463 | msgstr "" | ||
1464 | |||
1465 | #: src/credential/gnunet-credential.c:294 | ||
1466 | #: src/credential/gnunet-credential.c:446 | ||
1467 | #, fuzzy, c-format | ||
1468 | msgid "Issuer public key `%s' is not well-formed\n" | ||
1469 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" | ||
1470 | |||
1471 | #: src/credential/gnunet-credential.c:375 | ||
1472 | #: src/credential/gnunet-credential.c:435 | ||
1473 | #, fuzzy, c-format | ||
1474 | msgid "Issuer public key not well-formed\n" | ||
1475 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" | ||
1476 | |||
1477 | #: src/credential/gnunet-credential.c:386 | ||
1478 | #: src/credential/gnunet-credential.c:455 | ||
1479 | #, fuzzy, c-format | ||
1480 | msgid "Failed to connect to CREDENTIAL\n" | ||
1481 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
1482 | |||
1483 | #: src/credential/gnunet-credential.c:392 | ||
1484 | #, c-format | ||
1485 | msgid "You must provide issuer the attribute\n" | ||
1486 | msgstr "" | ||
1487 | |||
1488 | #: src/credential/gnunet-credential.c:399 | ||
1489 | #, c-format | ||
1490 | msgid "ego required\n" | ||
1491 | msgstr "" | ||
1492 | |||
1493 | #: src/credential/gnunet-credential.c:415 | ||
1494 | #, c-format | ||
1495 | msgid "Subject public key needed\n" | ||
1496 | msgstr "" | ||
1497 | |||
1498 | #: src/credential/gnunet-credential.c:426 | ||
1499 | #, fuzzy, c-format | ||
1500 | msgid "Subject public key `%s' is not well-formed\n" | ||
1501 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" | ||
1502 | |||
1503 | #: src/credential/gnunet-credential.c:461 | ||
1504 | #, c-format | ||
1505 | msgid "You must provide issuer and subject attributes\n" | ||
1506 | msgstr "" | ||
1507 | |||
1508 | #: src/credential/gnunet-credential.c:511 | ||
1509 | #, c-format | ||
1510 | msgid "Issuer ego required\n" | ||
1511 | msgstr "" | ||
1512 | |||
1513 | #: src/credential/gnunet-credential.c:523 | ||
1514 | #, c-format | ||
1515 | msgid "Please specify name to lookup, subject key and issuer key!\n" | ||
1516 | msgstr "" | ||
1517 | |||
1518 | #: src/credential/gnunet-credential.c:543 | ||
1519 | msgid "create credential" | ||
1520 | msgstr "" | ||
1521 | |||
1522 | #: src/credential/gnunet-credential.c:547 | ||
1523 | msgid "verify credential against attribute" | ||
1524 | msgstr "" | ||
1525 | |||
1526 | #: src/credential/gnunet-credential.c:552 | ||
1527 | msgid "The public key of the subject to lookup the credential for" | ||
1528 | msgstr "" | ||
1529 | |||
1530 | #: src/credential/gnunet-credential.c:557 | ||
1531 | msgid "The name of the credential presented by the subject" | ||
1532 | msgstr "" | ||
1533 | |||
1534 | #: src/credential/gnunet-credential.c:562 | ||
1535 | msgid "The public key of the authority to verify the credential against" | ||
1536 | msgstr "" | ||
1537 | |||
1538 | #: src/credential/gnunet-credential.c:567 | ||
1539 | #, fuzzy | ||
1540 | msgid "The ego to use" | ||
1541 | msgstr "消æ¯å°ºå¯¸" | ||
1542 | |||
1543 | #: src/credential/gnunet-credential.c:572 | ||
1544 | msgid "The issuer attribute to verify against or to issue" | ||
1545 | msgstr "" | ||
1546 | |||
1547 | #: src/credential/gnunet-credential.c:577 | ||
1548 | msgid "The time to live for the credential" | ||
1549 | msgstr "" | ||
1550 | |||
1551 | #: src/credential/gnunet-credential.c:581 | ||
1552 | msgid "collect credentials" | ||
1553 | msgstr "" | ||
1554 | |||
1555 | #: src/credential/gnunet-credential.c:595 | ||
1556 | #, fuzzy | ||
1557 | msgid "GNUnet credential resolver tool" | ||
1558 | msgstr "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 | ||
1563 | msgid "Failed to connect to GNS\n" | ||
1564 | msgstr "åˆå§‹åŒ–“%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 | ||
1571 | msgid "Failed to connect to namestore\n" | ||
1572 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
1573 | |||
1574 | #: src/credential/plugin_gnsrecord_credential.c:186 | ||
1575 | #, fuzzy, c-format | ||
1576 | msgid "Unable to parse ATTR record string `%s'\n" | ||
1577 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
1578 | |||
1579 | #: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668 | ||
1580 | msgid "GNS REST API initialized\n" | ||
1581 | msgstr "" | ||
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 |
1453 | msgid "# bytes stored" | 1585 | msgid "# bytes stored" |
1454 | msgstr "" | 1586 | msgstr "" |
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 |
1511 | msgid "`%s' failed at %s:%d with error: %s\n" | 1642 | msgid "`%s' failed at %s:%d with error: %s\n" |
1512 | msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" | 1643 | msgstr "“%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 |
1518 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" | 1650 | msgid "Tried to close sqlite without finalizing all prepared statements.\n" |
@@ -1576,23 +1708,74 @@ msgstr "" | |||
1576 | msgid "# GET requests executed" | 1708 | msgid "# GET requests executed" |
1577 | msgstr "" | 1709 | msgstr "" |
1578 | 1710 | ||
1579 | #: src/datastore/gnunet-datastore.c:113 | 1711 | #: src/datastore/gnunet-datastore.c:189 |
1712 | #, c-format | ||
1713 | msgid "Dumped %<PRIu64> records\n" | ||
1714 | msgstr "" | ||
1715 | |||
1716 | #: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229 | ||
1717 | #, c-format | ||
1718 | msgid "Short write to file: %zd bytes expecting %zd\n" | ||
1719 | msgstr "" | ||
1720 | |||
1721 | #: src/datastore/gnunet-datastore.c:261 | ||
1722 | #, fuzzy | ||
1723 | msgid "Error queueing datastore GET operation\n" | ||
1724 | msgstr "创建用户出错" | ||
1725 | |||
1726 | #: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412 | ||
1727 | #, fuzzy, c-format | ||
1728 | msgid "Unable to open dump file: %s\n" | ||
1729 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | ||
1730 | |||
1731 | #: src/datastore/gnunet-datastore.c:326 | ||
1580 | #, fuzzy, c-format | 1732 | #, fuzzy, c-format |
1581 | msgid "Failed to store item: %s, aborting\n" | 1733 | msgid "Failed to store item: %s, aborting\n" |
1582 | msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" | 1734 | msgstr "打开日志文件“%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 |
1586 | msgid "Cannot use the same configuration for source and destination\n" | 1738 | msgid "Inserted %<PRIu64> records\n" |
1587 | msgstr "" | 1739 | msgstr "" |
1588 | 1740 | ||
1589 | #: src/datastore/gnunet-datastore.c:256 | 1741 | #: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363 |
1590 | msgid "" | 1742 | #, c-format |
1591 | "specifies the configuration to use to access an alternative datastore; will " | 1743 | msgid "Short read from file: %zd bytes expecting %zd\n" |
1592 | "merge that datastore into our current datastore" | 1744 | msgstr "" |
1745 | |||
1746 | #: src/datastore/gnunet-datastore.c:389 | ||
1747 | #, fuzzy | ||
1748 | msgid "Error queueing datastore PUT operation\n" | ||
1749 | msgstr "创建用户出错" | ||
1750 | |||
1751 | #: src/datastore/gnunet-datastore.c:432 | ||
1752 | msgid "Input file is not of a supported format\n" | ||
1753 | msgstr "" | ||
1754 | |||
1755 | #: src/datastore/gnunet-datastore.c:458 | ||
1756 | #, fuzzy | ||
1757 | msgid "Failed connecting to the datastore.\n" | ||
1758 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
1759 | |||
1760 | #: src/datastore/gnunet-datastore.c:470 | ||
1761 | #, c-format | ||
1762 | msgid "Please choose at least one operation: %s, %s\n" | ||
1763 | msgstr "" | ||
1764 | |||
1765 | #: src/datastore/gnunet-datastore.c:493 | ||
1766 | #, fuzzy | ||
1767 | msgid "Dump all records from the datastore" | ||
1768 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | ||
1769 | |||
1770 | #: src/datastore/gnunet-datastore.c:497 | ||
1771 | msgid "Insert records into the datastore" | ||
1772 | msgstr "" | ||
1773 | |||
1774 | #: src/datastore/gnunet-datastore.c:502 | ||
1775 | msgid "File to dump or insert" | ||
1593 | msgstr "" | 1776 | msgstr "" |
1594 | 1777 | ||
1595 | #: src/datastore/gnunet-datastore.c:265 | 1778 | #: src/datastore/gnunet-datastore.c:511 |
1596 | #, fuzzy | 1779 | #, fuzzy |
1597 | msgid "Manipulate GNUnet datastore" | 1780 | msgid "Manipulate GNUnet datastore" |
1598 | msgstr "更改é…置文件ä¸çš„一个值" | 1781 | msgstr "更改é…置文件ä¸çš„一个值" |
@@ -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 |
1640 | msgid "# reserved" | 1823 | msgid "# reserved" |
1641 | msgstr "" | 1824 | msgstr "" |
1642 | 1825 | ||
@@ -1644,144 +1827,145 @@ msgstr "" | |||
1644 | msgid "Could not find matching reservation" | 1827 | msgid "Could not find matching reservation" |
1645 | msgstr "" | 1828 | msgstr "" |
1646 | 1829 | ||
1647 | #: src/datastore/gnunet-service-datastore.c:792 | 1830 | #: src/datastore/gnunet-service-datastore.c:773 |
1648 | #, c-format | 1831 | #, c-format |
1649 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" | 1832 | msgid "Need %llu bytes more space (%llu allowed, using %llu)\n" |
1650 | msgstr "" | 1833 | msgstr "" |
1651 | 1834 | ||
1652 | #: src/datastore/gnunet-service-datastore.c:1026 | 1835 | #: src/datastore/gnunet-service-datastore.c:876 |
1653 | msgid "# GET requests received" | 1836 | msgid "# GET requests received" |
1654 | msgstr "" | 1837 | msgstr "" |
1655 | 1838 | ||
1656 | #: src/datastore/gnunet-service-datastore.c:1058 | 1839 | #: src/datastore/gnunet-service-datastore.c:907 |
1657 | msgid "# GET KEY requests received" | 1840 | msgid "# GET KEY requests received" |
1658 | msgstr "" | 1841 | msgstr "" |
1659 | 1842 | ||
1660 | #: src/datastore/gnunet-service-datastore.c:1071 | 1843 | #: src/datastore/gnunet-service-datastore.c:920 |
1661 | msgid "# requests filtered by bloomfilter" | 1844 | msgid "# requests filtered by bloomfilter" |
1662 | msgstr "" | 1845 | msgstr "" |
1663 | 1846 | ||
1664 | #: src/datastore/gnunet-service-datastore.c:1108 | 1847 | #: src/datastore/gnunet-service-datastore.c:956 |
1665 | msgid "# GET REPLICATION requests received" | 1848 | msgid "# GET REPLICATION requests received" |
1666 | msgstr "" | 1849 | msgstr "" |
1667 | 1850 | ||
1668 | #: src/datastore/gnunet-service-datastore.c:1141 | 1851 | #: src/datastore/gnunet-service-datastore.c:989 |
1669 | msgid "# GET ZERO ANONYMITY requests received" | 1852 | msgid "# GET ZERO ANONYMITY requests received" |
1670 | msgstr "" | 1853 | msgstr "" |
1671 | 1854 | ||
1672 | #: src/datastore/gnunet-service-datastore.c:1190 | 1855 | #: src/datastore/gnunet-service-datastore.c:1036 |
1673 | msgid "Content not found" | 1856 | msgid "Content not found" |
1674 | msgstr "" | 1857 | msgstr "" |
1675 | 1858 | ||
1676 | #: src/datastore/gnunet-service-datastore.c:1199 | 1859 | #: src/datastore/gnunet-service-datastore.c:1043 |
1677 | msgid "# bytes removed (explicit request)" | 1860 | msgid "# bytes removed (explicit request)" |
1678 | msgstr "" | 1861 | msgstr "" |
1679 | 1862 | ||
1680 | #: src/datastore/gnunet-service-datastore.c:1246 | 1863 | #: src/datastore/gnunet-service-datastore.c:1088 |
1681 | msgid "# REMOVE requests received" | 1864 | msgid "# REMOVE requests received" |
1682 | msgstr "" | 1865 | msgstr "" |
1683 | 1866 | ||
1684 | #: src/datastore/gnunet-service-datastore.c:1301 | 1867 | #: src/datastore/gnunet-service-datastore.c:1137 |
1685 | #, c-format | 1868 | #, c-format |
1686 | msgid "" | 1869 | msgid "" |
1687 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" | 1870 | "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n" |
1688 | msgstr "" | 1871 | msgstr "" |
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 |
1693 | msgid "New payload: %lld\n" | 1876 | msgid "New payload: %lld\n" |
1694 | msgstr "" | 1877 | msgstr "" |
1695 | 1878 | ||
1696 | #: src/datastore/gnunet-service-datastore.c:1361 | 1879 | #: src/datastore/gnunet-service-datastore.c:1197 |
1697 | #, c-format | 1880 | #, c-format |
1698 | msgid "Loading `%s' datastore plugin\n" | 1881 | msgid "Loading `%s' datastore plugin\n" |
1699 | msgstr "" | 1882 | msgstr "" |
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 |
1703 | msgid "Failed to load datastore plugin for `%s'\n" | 1886 | msgid "Failed to load datastore plugin for `%s'\n" |
1704 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 1887 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" |
1705 | 1888 | ||
1706 | #: src/datastore/gnunet-service-datastore.c:1433 | 1889 | #: src/datastore/gnunet-service-datastore.c:1269 |
1707 | msgid "Bloomfilter construction complete.\n" | 1890 | msgid "Bloomfilter construction complete.\n" |
1708 | msgstr "" | 1891 | msgstr "" |
1709 | 1892 | ||
1710 | #: src/datastore/gnunet-service-datastore.c:1489 | 1893 | #: src/datastore/gnunet-service-datastore.c:1325 |
1711 | msgid "Rebuilding bloomfilter. Please be patient.\n" | 1894 | msgid "Rebuilding bloomfilter. Please be patient.\n" |
1712 | msgstr "" | 1895 | msgstr "" |
1713 | 1896 | ||
1714 | #: src/datastore/gnunet-service-datastore.c:1500 | 1897 | #: src/datastore/gnunet-service-datastore.c:1336 |
1715 | msgid "Plugin does not support get_keys function. Please fix!\n" | 1898 | msgid "Plugin does not support get_keys function. Please fix!\n" |
1716 | msgstr "" | 1899 | msgstr "" |
1717 | 1900 | ||
1718 | #: src/datastore/gnunet-service-datastore.c:1670 | 1901 | #: src/datastore/gnunet-service-datastore.c:1506 |
1719 | #, c-format | 1902 | #, c-format |
1720 | msgid "# bytes used in file-sharing datastore `%s'" | 1903 | msgid "# bytes used in file-sharing datastore `%s'" |
1721 | msgstr "" | 1904 | msgstr "" |
1722 | 1905 | ||
1723 | #: src/datastore/gnunet-service-datastore.c:1686 | 1906 | #: src/datastore/gnunet-service-datastore.c:1522 |
1724 | msgid "# quota" | 1907 | msgid "# quota" |
1725 | msgstr "" | 1908 | msgstr "" |
1726 | 1909 | ||
1727 | #: src/datastore/gnunet-service-datastore.c:1691 | 1910 | #: src/datastore/gnunet-service-datastore.c:1527 |
1728 | msgid "# cache size" | 1911 | msgid "# cache size" |
1729 | msgstr "" | 1912 | msgstr "" |
1730 | 1913 | ||
1731 | #: src/datastore/gnunet-service-datastore.c:1707 | 1914 | #: src/datastore/gnunet-service-datastore.c:1543 |
1732 | #, c-format | 1915 | #, c-format |
1733 | msgid "Could not use specified filename `%s' for bloomfilter.\n" | 1916 | msgid "Could not use specified filename `%s' for bloomfilter.\n" |
1734 | msgstr "" | 1917 | msgstr "" |
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 |
1739 | msgid "Failed to remove bogus bloomfilter file `%s'\n" | 1922 | msgid "Failed to remove bogus bloomfilter file `%s'\n" |
1740 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 1923 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" |
1741 | 1924 | ||
1742 | #: src/datastore/gnunet-service-datastore.c:1773 | 1925 | #: src/datastore/gnunet-service-datastore.c:1609 |
1743 | #, fuzzy | 1926 | #, fuzzy |
1744 | msgid "Failed to initialize bloomfilter.\n" | 1927 | msgid "Failed to initialize bloomfilter.\n" |
1745 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 1928 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
1746 | 1929 | ||
1747 | #: src/datastore/plugin_datastore_heap.c:769 | 1930 | #: src/datastore/plugin_datastore_heap.c:893 |
1748 | #, fuzzy | 1931 | #, fuzzy |
1749 | msgid "Heap database running\n" | 1932 | msgid "Heap database running\n" |
1750 | msgstr "sqlite æ•°æ®ä»“库" | 1933 | msgstr "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 | ||
1938 | msgid "MySQL statement run failure" | ||
1939 | msgstr "" | ||
1940 | |||
1941 | #: src/datastore/plugin_datastore_mysql.c:410 | ||
1942 | #: src/datastore/plugin_datastore_sqlite.c:626 | ||
1754 | #, fuzzy | 1943 | #, fuzzy |
1755 | msgid "Data too large" | 1944 | msgid "Data too large" |
1756 | msgstr "è¿ä»£æ¬¡æ•°" | 1945 | msgstr "è¿ä»£æ¬¡æ•°" |
1757 | 1946 | ||
1758 | #: src/datastore/plugin_datastore_mysql.c:393 | 1947 | #: src/datastore/plugin_datastore_mysql.c:848 |
1759 | msgid "MySQL statement run failure" | ||
1760 | msgstr "" | ||
1761 | |||
1762 | #: src/datastore/plugin_datastore_mysql.c:936 | ||
1763 | #, fuzzy, c-format | 1948 | #, fuzzy, c-format |
1764 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" | 1949 | msgid "`%s' for `%s' failed at %s:%d with error: %s\n" |
1765 | msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" | 1950 | msgstr "“%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 |
1769 | msgid "Mysql database running\n" | 1954 | msgid "Mysql database running\n" |
1770 | msgstr "" | 1955 | msgstr "" |
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 | ||
1773 | msgid "Postgress exec failure" | 1959 | msgid "Postgress exec failure" |
1774 | msgstr "" | 1960 | msgstr "" |
1775 | 1961 | ||
1776 | #: src/datastore/plugin_datastore_postgres.c:866 | 1962 | #: src/datastore/plugin_datastore_postgres.c:852 |
1777 | #, fuzzy | 1963 | #, fuzzy |
1778 | msgid "Failed to drop table from database.\n" | 1964 | msgid "Failed to drop table from database.\n" |
1779 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | 1965 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\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 | ||
1785 | msgid "Postgres database running\n" | 1969 | msgid "Postgres database running\n" |
1786 | msgstr "" | 1970 | msgstr "" |
1787 | 1971 | ||
@@ -1793,7 +1977,8 @@ msgstr "" | |||
1793 | msgid "`%s' failed at %s:%u with error: %s" | 1977 | msgid "`%s' failed at %s:%u with error: %s" |
1794 | msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" | 1978 | msgstr "“%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" | |||
1802 | msgid "Unable to initialize SQLite: %s.\n" | 1987 | msgid "Unable to initialize SQLite: %s.\n" |
1803 | msgstr "æ— æ³•åˆå§‹åŒ– SQLite:%s。\n" | 1988 | msgstr "æ— æ³•åˆå§‹åŒ– SQLite:%s。\n" |
1804 | 1989 | ||
1805 | #: src/datastore/plugin_datastore_sqlite.c:1234 | 1990 | #: src/datastore/plugin_datastore_sqlite.c:577 |
1991 | msgid "sqlite bind failure" | ||
1992 | msgstr "" | ||
1993 | |||
1994 | #: src/datastore/plugin_datastore_sqlite.c:1259 | ||
1806 | msgid "sqlite version to old to determine size, assuming zero\n" | 1995 | msgid "sqlite version to old to determine size, assuming zero\n" |
1807 | msgstr "" | 1996 | msgstr "" |
1808 | 1997 | ||
1809 | #: src/datastore/plugin_datastore_sqlite.c:1268 | 1998 | #: src/datastore/plugin_datastore_sqlite.c:1293 |
1810 | #, c-format | 1999 | #, c-format |
1811 | msgid "" | 2000 | msgid "" |
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" |
1814 | msgstr "" | 2003 | msgstr "" |
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 |
1820 | msgid "Sqlite database running\n" | 2010 | msgid "Sqlite database running\n" |
1821 | msgstr "sqlite æ•°æ®ä»“库" | 2011 | msgstr "sqlite æ•°æ®ä»“库" |
1822 | 2012 | ||
1823 | #: src/datastore/plugin_datastore_template.c:259 | 2013 | #: src/datastore/plugin_datastore_template.c:253 |
1824 | msgid "Template database running\n" | 2014 | msgid "Template database running\n" |
1825 | msgstr "" | 2015 | msgstr "" |
1826 | 2016 | ||
@@ -1882,53 +2072,6 @@ msgstr "" | |||
1882 | msgid "Prints all packets that go through the DHT." | 2072 | msgid "Prints all packets that go through the DHT." |
1883 | msgstr "" | 2073 | msgstr "" |
1884 | 2074 | ||
1885 | #: src/dht/gnunet_dht_profiler.c:1161 | ||
1886 | #: src/testbed/gnunet-testbed-profiler.c:255 | ||
1887 | #, fuzzy, c-format | ||
1888 | msgid "Exiting as the number of peers is %u\n" | ||
1889 | msgstr "å¢žåŠ TCP/IP 的最大连接数" | ||
1890 | |||
1891 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
1892 | #, fuzzy | ||
1893 | msgid "number of peers to start" | ||
1894 | msgstr "è¿ä»£æ¬¡æ•°" | ||
1895 | |||
1896 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
1897 | msgid "" | ||
1898 | "maximum number of times we try to search for successor circle formation (0 " | ||
1899 | "for R5N)" | ||
1900 | msgstr "" | ||
1901 | |||
1902 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
1903 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
1904 | msgid "name of the file with the login information for the testbed" | ||
1905 | msgstr "" | ||
1906 | |||
1907 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
1908 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
1909 | msgstr "" | ||
1910 | |||
1911 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
1912 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
1913 | msgstr "" | ||
1914 | |||
1915 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
1916 | msgid "delay to start doing GETs (default: 5 min)" | ||
1917 | msgstr "" | ||
1918 | |||
1919 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
1920 | msgid "replication degree for DHT PUTs" | ||
1921 | msgstr "" | ||
1922 | |||
1923 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
1924 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
1925 | msgstr "" | ||
1926 | |||
1927 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
1928 | #, fuzzy | ||
1929 | msgid "Measure quality and performance of the DHT service." | ||
1930 | msgstr "æ— æ³•è®¿é—®è¯¥æœåŠ¡" | ||
1931 | |||
1932 | #: src/dht/gnunet-dht-put.c:120 | 2075 | #: src/dht/gnunet-dht-put.c:120 |
1933 | msgid "PUT request sent with key" | 2076 | msgid "PUT request sent with key" |
1934 | msgstr "" | 2077 | msgstr "" |
@@ -2178,6 +2321,52 @@ msgstr "" | |||
2178 | msgid "# DHT requests combined" | 2321 | msgid "# DHT requests combined" |
2179 | msgstr "" | 2322 | msgstr "" |
2180 | 2323 | ||
2324 | #: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255 | ||
2325 | #, fuzzy, c-format | ||
2326 | msgid "Exiting as the number of peers is %u\n" | ||
2327 | msgstr "å¢žåŠ TCP/IP 的最大连接数" | ||
2328 | |||
2329 | #: src/dht/gnunet_dht_profiler.c:1188 | ||
2330 | #, fuzzy | ||
2331 | msgid "number of peers to start" | ||
2332 | msgstr "è¿ä»£æ¬¡æ•°" | ||
2333 | |||
2334 | #: src/dht/gnunet_dht_profiler.c:1194 | ||
2335 | msgid "" | ||
2336 | "maximum number of times we try to search for successor circle formation (0 " | ||
2337 | "for R5N)" | ||
2338 | msgstr "" | ||
2339 | |||
2340 | #: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853 | ||
2341 | #: src/testbed/gnunet-testbed-profiler.c:305 | ||
2342 | msgid "name of the file with the login information for the testbed" | ||
2343 | msgstr "" | ||
2344 | |||
2345 | #: src/dht/gnunet_dht_profiler.c:1206 | ||
2346 | msgid "delay between rounds for collecting statistics (default: 30 sec)" | ||
2347 | msgstr "" | ||
2348 | |||
2349 | #: src/dht/gnunet_dht_profiler.c:1212 | ||
2350 | msgid "delay to start doing PUTs (default: 1 sec)" | ||
2351 | msgstr "" | ||
2352 | |||
2353 | #: src/dht/gnunet_dht_profiler.c:1218 | ||
2354 | msgid "delay to start doing GETs (default: 5 min)" | ||
2355 | msgstr "" | ||
2356 | |||
2357 | #: src/dht/gnunet_dht_profiler.c:1223 | ||
2358 | msgid "replication degree for DHT PUTs" | ||
2359 | msgstr "" | ||
2360 | |||
2361 | #: src/dht/gnunet_dht_profiler.c:1230 | ||
2362 | msgid "timeout for DHT PUT and GET requests (default: 1 min)" | ||
2363 | msgstr "" | ||
2364 | |||
2365 | #: src/dht/gnunet_dht_profiler.c:1248 | ||
2366 | #, fuzzy | ||
2367 | msgid "Measure quality and performance of the DHT service." | ||
2368 | msgstr "æ— æ³•è®¿é—®è¯¥æœåŠ¡" | ||
2369 | |||
2181 | #: src/dht/plugin_block_dht.c:187 | 2370 | #: src/dht/plugin_block_dht.c:187 |
2182 | #, c-format | 2371 | #, c-format |
2183 | msgid "Block not of type %u\n" | 2372 | msgid "Block not of type %u\n" |
@@ -2500,7 +2689,7 @@ msgstr "" | |||
2500 | msgid "No useful service enabled. Exiting.\n" | 2689 | msgid "No useful service enabled. Exiting.\n" |
2501 | msgstr "" | 2690 | msgstr "" |
2502 | 2691 | ||
2503 | #: src/exit/gnunet-daemon-exit.c:3969 | 2692 | #: src/exit/gnunet-daemon-exit.c:3970 |
2504 | msgid "Daemon to run to provide an IP exit node for the VPN" | 2693 | msgid "Daemon to run to provide an IP exit node for the VPN" |
2505 | msgstr "" | 2694 | msgstr "" |
2506 | 2695 | ||
@@ -3132,14 +3321,6 @@ msgid "" | |||
3132 | "chk/...)" | 3321 | "chk/...)" |
3133 | msgstr "" | 3322 | msgstr "" |
3134 | 3323 | ||
3135 | #: src/fs/gnunet-fs.c:119 | ||
3136 | msgid "print a list of all indexed files" | ||
3137 | msgstr "" | ||
3138 | |||
3139 | #: src/fs/gnunet-fs.c:130 | ||
3140 | msgid "Special file-sharing operations" | ||
3141 | msgstr "" | ||
3142 | |||
3143 | #: src/fs/gnunet-fs-profiler.c:211 | 3324 | #: src/fs/gnunet-fs-profiler.c:211 |
3144 | msgid "run the experiment with COUNT peers" | 3325 | msgid "run the experiment with COUNT peers" |
3145 | msgstr "" | 3326 | msgstr "" |
@@ -3156,6 +3337,14 @@ msgstr "" | |||
3156 | msgid "run a testbed to measure file-sharing performance" | 3337 | msgid "run a testbed to measure file-sharing performance" |
3157 | msgstr "" | 3338 | msgstr "" |
3158 | 3339 | ||
3340 | #: src/fs/gnunet-fs.c:119 | ||
3341 | msgid "print a list of all indexed files" | ||
3342 | msgstr "" | ||
3343 | |||
3344 | #: src/fs/gnunet-fs.c:130 | ||
3345 | msgid "Special file-sharing operations" | ||
3346 | msgstr "" | ||
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 |
3161 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" | 3350 | msgid "Publishing `%s' at %llu/%llu (%s remaining)\n" |
@@ -3810,22 +3999,11 @@ msgstr "" | |||
3810 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" | 3999 | msgid "GNUnet DNS-to-GNS proxy (a DNS server)" |
3811 | msgstr "" | 4000 | msgstr "" |
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 | 4003 | msgid "Not ready to process requests, lacking ego data\n" |
3815 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
3816 | msgstr "" | ||
3817 | |||
3818 | #: src/gns/gnunet-gns.c:252 | ||
3819 | #, c-format | ||
3820 | msgid "Please specify name to lookup!\n" | ||
3821 | msgstr "" | ||
3822 | |||
3823 | #: src/gns/gnunet-gns.c:276 | ||
3824 | #, c-format | ||
3825 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
3826 | msgstr "" | 4004 | msgstr "" |
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 |
3831 | msgid "" | 4009 | msgid "" |
@@ -3833,55 +4011,12 @@ msgid "" | |||
3833 | "gns-import.sh?\n" | 4011 | "gns-import.sh?\n" |
3834 | msgstr "" | 4012 | msgstr "" |
3835 | 4013 | ||
3836 | #: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727 | ||
3837 | #, fuzzy, c-format | ||
3838 | msgid "Failed to connect to GNS\n" | ||
3839 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
3840 | |||
3841 | #: src/gns/gnunet-gns.c:374 | ||
3842 | #, c-format | ||
3843 | msgid "Public key `%s' is not well-formed\n" | ||
3844 | msgstr "" | ||
3845 | |||
3846 | #: src/gns/gnunet-gns.c:428 | ||
3847 | msgid "Lookup a record for the given name" | ||
3848 | msgstr "" | ||
3849 | |||
3850 | #: src/gns/gnunet-gns.c:434 | ||
3851 | msgid "Specify the type of the record to lookup" | ||
3852 | msgstr "" | ||
3853 | |||
3854 | #: src/gns/gnunet-gns.c:440 | ||
3855 | msgid "Specify timeout for the lookup" | ||
3856 | msgstr "" | ||
3857 | |||
3858 | #: src/gns/gnunet-gns.c:445 | ||
3859 | msgid "No unneeded output" | ||
3860 | msgstr "" | ||
3861 | |||
3862 | #: src/gns/gnunet-gns.c:451 | ||
3863 | msgid "Specify the public key of the zone to lookup the record in" | ||
3864 | msgstr "" | ||
3865 | |||
3866 | #: src/gns/gnunet-gns.c:457 | ||
3867 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
3868 | msgstr "" | ||
3869 | |||
3870 | #: src/gns/gnunet-gns.c:476 | ||
3871 | #, fuzzy | ||
3872 | msgid "GNUnet GNS resolver tool" | ||
3873 | msgstr "GNUnet 错误日志" | ||
3874 | |||
3875 | #: src/gns/gnunet-gns-helper-service-w32.c:602 | ||
3876 | msgid "Not ready to process requests, lacking ego data\n" | ||
3877 | msgstr "" | ||
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 |
3881 | msgid "Failed to connect to identity service\n" | 4016 | msgid "Failed to connect to identity service\n" |
3882 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 4017 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
3883 | 4018 | ||
3884 | #: src/gns/gnunet-gns-import.c:489 | 4019 | #: src/gns/gnunet-gns-import.c:452 |
3885 | msgid "This program will import some GNS authorities into your GNS namestore." | 4020 | msgid "This program will import some GNS authorities into your GNS namestore." |
3886 | msgstr "" | 4021 | msgstr "" |
3887 | 4022 | ||
@@ -4006,13 +4141,62 @@ msgstr "" | |||
4006 | msgid "GNUnet GNS proxy" | 4141 | msgid "GNUnet GNS proxy" |
4007 | msgstr "" | 4142 | msgstr "" |
4008 | 4143 | ||
4144 | #: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346 | ||
4145 | #, c-format | ||
4146 | msgid "Invalid typename specified, assuming `ANY'\n" | ||
4147 | msgstr "" | ||
4148 | |||
4149 | #: src/gns/gnunet-gns.c:252 | ||
4150 | #, c-format | ||
4151 | msgid "Please specify name to lookup!\n" | ||
4152 | msgstr "" | ||
4153 | |||
4154 | #: src/gns/gnunet-gns.c:276 | ||
4155 | #, c-format | ||
4156 | msgid "Ego for `%s' not found, cannot perform lookup.\n" | ||
4157 | msgstr "" | ||
4158 | |||
4159 | #: src/gns/gnunet-gns.c:374 | ||
4160 | #, c-format | ||
4161 | msgid "Public key `%s' is not well-formed\n" | ||
4162 | msgstr "" | ||
4163 | |||
4164 | #: src/gns/gnunet-gns.c:428 | ||
4165 | msgid "Lookup a record for the given name" | ||
4166 | msgstr "" | ||
4167 | |||
4168 | #: src/gns/gnunet-gns.c:434 | ||
4169 | msgid "Specify the type of the record to lookup" | ||
4170 | msgstr "" | ||
4171 | |||
4172 | #: src/gns/gnunet-gns.c:440 | ||
4173 | msgid "Specify timeout for the lookup" | ||
4174 | msgstr "" | ||
4175 | |||
4176 | #: src/gns/gnunet-gns.c:445 | ||
4177 | msgid "No unneeded output" | ||
4178 | msgstr "" | ||
4179 | |||
4180 | #: src/gns/gnunet-gns.c:451 | ||
4181 | msgid "Specify the public key of the zone to lookup the record in" | ||
4182 | msgstr "" | ||
4183 | |||
4184 | #: src/gns/gnunet-gns.c:457 | ||
4185 | msgid "Specify the name of the ego of the zone to lookup the record in" | ||
4186 | msgstr "" | ||
4187 | |||
4188 | #: src/gns/gnunet-gns.c:476 | ||
4189 | #, fuzzy | ||
4190 | msgid "GNUnet GNS resolver tool" | ||
4191 | msgstr "GNUnet 错误日志" | ||
4192 | |||
4009 | #: src/gns/gnunet-service-gns.c:442 | 4193 | #: src/gns/gnunet-service-gns.c:442 |
4010 | #, fuzzy | 4194 | #, fuzzy |
4011 | msgid "Failed to connect to the namecache!\n" | 4195 | msgid "Failed to connect to the namecache!\n" |
4012 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 4196 | msgstr "åˆå§‹åŒ–“%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 |
4017 | msgid "Could not connect to DHT!\n" | 4201 | msgid "Could not connect to DHT!\n" |
4018 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" | 4202 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" |
@@ -4070,44 +4254,35 @@ msgstr "" | |||
4070 | msgid "Hostname `%s' is not well-formed, resolution fails\n" | 4254 | msgid "Hostname `%s' is not well-formed, resolution fails\n" |
4071 | msgstr "" | 4255 | msgstr "" |
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 |
4075 | msgid "Unable to parse PKEY record `%s'\n" | 4259 | msgid "Unable to parse PKEY record `%s'\n" |
4076 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 4260 | msgstr "解æžé…置文件“%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 |
4080 | msgid "Unable to parse GNS2DNS record `%s'\n" | 4264 | msgid "Unable to parse GNS2DNS record `%s'\n" |
4081 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 4265 | msgstr "解æžé…置文件“%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 |
4085 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" | 4269 | msgid "Failed to serialize GNS2DNS record with value `%s'\n" |
4086 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 4270 | msgstr "解æžé…置文件“%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 |
4090 | msgid "Unable to parse VPN record string `%s'\n" | 4274 | msgid "Unable to parse VPN record string `%s'\n" |
4091 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 4275 | msgstr "解æžé…置文件“%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 |
4095 | msgid "Unable to parse BOX record string `%s'\n" | 4279 | msgid "Unable to parse BOX record string `%s'\n" |
4096 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 4280 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" |
4097 | 4281 | ||
4098 | #: src/gns/plugin_gnsrecord_gns.c:360 | ||
4099 | #, fuzzy, c-format | ||
4100 | msgid "Unable to parse REVERSE record string `%s'\n" | ||
4101 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
4102 | |||
4103 | #: src/gns/plugin_rest_gns.c:384 | 4282 | #: src/gns/plugin_rest_gns.c:384 |
4104 | msgid "Ego for not found, cannot perform lookup.\n" | 4283 | msgid "Ego for not found, cannot perform lookup.\n" |
4105 | msgstr "" | 4284 | msgstr "" |
4106 | 4285 | ||
4107 | #: src/gns/plugin_rest_gns.c:668 | ||
4108 | msgid "GNS REST API initialized\n" | ||
4109 | msgstr "" | ||
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 |
4113 | msgid "Unable to parse IPv4 address `%s'\n" | 4288 | msgid "Unable to parse IPv4 address `%s'\n" |
@@ -4532,6 +4707,52 @@ msgstr "“%sâ€ä¸å¯ç”¨ã€‚\n" | |||
4532 | msgid "Could not start hostlist HTTP server on port %u\n" | 4707 | msgid "Could not start hostlist HTTP server on port %u\n" |
4533 | msgstr "" | 4708 | msgstr "" |
4534 | 4709 | ||
4710 | #: src/identity-provider/gnunet-idp.c:348 | ||
4711 | #, fuzzy | ||
4712 | msgid "Ego is required\n" | ||
4713 | msgstr "%s:选项“%sâ€æœ‰æ§ä¹‰\n" | ||
4714 | |||
4715 | #: src/identity-provider/gnunet-idp.c:370 | ||
4716 | msgid "Add attribute" | ||
4717 | msgstr "" | ||
4718 | |||
4719 | #: src/identity-provider/gnunet-idp.c:376 | ||
4720 | msgid "Attribute value" | ||
4721 | msgstr "" | ||
4722 | |||
4723 | #: src/identity-provider/gnunet-idp.c:381 | ||
4724 | msgid "Ego" | ||
4725 | msgstr "" | ||
4726 | |||
4727 | #: src/identity-provider/gnunet-idp.c:386 | ||
4728 | msgid "Audience (relying party)" | ||
4729 | msgstr "" | ||
4730 | |||
4731 | #: src/identity-provider/gnunet-idp.c:390 | ||
4732 | msgid "List attributes for Ego" | ||
4733 | msgstr "" | ||
4734 | |||
4735 | #: src/identity-provider/gnunet-idp.c:395 | ||
4736 | msgid "Issue a ticket" | ||
4737 | msgstr "" | ||
4738 | |||
4739 | #: src/identity-provider/gnunet-idp.c:400 | ||
4740 | msgid "Consume a ticket" | ||
4741 | msgstr "" | ||
4742 | |||
4743 | #: src/identity-provider/gnunet-idp.c:405 | ||
4744 | msgid "Revoke a ticket" | ||
4745 | msgstr "" | ||
4746 | |||
4747 | #: src/identity-provider/identity_provider_api.c:429 | ||
4748 | #, fuzzy | ||
4749 | msgid "failed to store record\n" | ||
4750 | msgstr "è¿è¡Œ %s失败:%s %d\n" | ||
4751 | |||
4752 | #: src/identity-provider/plugin_rest_identity_provider.c:1175 | ||
4753 | msgid "Identity Provider REST API initialized\n" | ||
4754 | msgstr "" | ||
4755 | |||
4535 | #: src/identity/gnunet-identity.c:179 | 4756 | #: src/identity/gnunet-identity.c:179 |
4536 | #, fuzzy, c-format | 4757 | #, fuzzy, c-format |
4537 | msgid "Failed to create ego: %s\n" | 4758 | msgid "Failed to create ego: %s\n" |
@@ -4619,32 +4840,10 @@ msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | |||
4619 | msgid "Failed to create directory `%s' for storing egos\n" | 4840 | msgid "Failed to create directory `%s' for storing egos\n" |
4620 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 4841 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" |
4621 | 4842 | ||
4622 | #: src/identity/plugin_rest_identity.c:967 | 4843 | #: src/identity/plugin_rest_identity.c:964 |
4623 | msgid "Identity REST API initialized\n" | 4844 | msgid "Identity REST API initialized\n" |
4624 | msgstr "" | 4845 | msgstr "" |
4625 | 4846 | ||
4626 | #: src/identity-provider/gnunet-identity-token.c:66 | ||
4627 | #, fuzzy | ||
4628 | msgid "Option `-t' is required\n" | ||
4629 | msgstr "%s:选项“%sâ€æœ‰æ§ä¹‰\n" | ||
4630 | |||
4631 | #: src/identity-provider/gnunet-identity-token.c:77 | ||
4632 | #, fuzzy, c-format | ||
4633 | msgid "Token `%s' is malformed\n" | ||
4634 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" | ||
4635 | |||
4636 | #: src/identity-provider/gnunet-identity-token.c:166 | ||
4637 | msgid "GNUid token" | ||
4638 | msgstr "" | ||
4639 | |||
4640 | #: src/identity-provider/gnunet-identity-token.c:171 | ||
4641 | msgid "Print token contents" | ||
4642 | msgstr "" | ||
4643 | |||
4644 | #: src/identity-provider/plugin_rest_identity_provider.c:1166 | ||
4645 | msgid "Identity Token REST API initialized\n" | ||
4646 | msgstr "" | ||
4647 | |||
4648 | #: src/json/json.c:119 | 4847 | #: src/json/json.c:119 |
4649 | #, fuzzy, c-format | 4848 | #, fuzzy, c-format |
4650 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" | 4849 | msgid "Failed to parse JSON in option `%s': %s (%s)\n" |
@@ -4745,25 +4944,79 @@ msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | |||
4745 | msgid "flat plugin running\n" | 4944 | msgid "flat plugin running\n" |
4746 | msgstr "sqlite æ•°æ®ä»“库" | 4945 | msgstr "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 | 4949 | msgid "Unsupported form value `%s'\n" |
4751 | msgid "Failed to create indices\n" | 4950 | msgstr "未知的命令“%sâ€ã€‚\n" |
4951 | |||
4952 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
4953 | #, fuzzy, c-format | ||
4954 | msgid "Failed to create record for domain `%s': %s\n" | ||
4955 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
4956 | |||
4957 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
4958 | msgid "Error when mapping zone to name\n" | ||
4959 | msgstr "" | ||
4960 | |||
4961 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
4962 | #, c-format | ||
4963 | msgid "Found existing name `%s' for the given key\n" | ||
4964 | msgstr "" | ||
4965 | |||
4966 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
4967 | #, c-format | ||
4968 | msgid "Found %u existing records for domain `%s'\n" | ||
4969 | msgstr "" | ||
4970 | |||
4971 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
4972 | #, fuzzy, c-format | ||
4973 | msgid "Failed to create page for `%s'\n" | ||
4752 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | 4974 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" |
4753 | 4975 | ||
4976 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
4977 | #, fuzzy, c-format | ||
4978 | msgid "Failed to setup post processor for `%s'\n" | ||
4979 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
4980 | |||
4981 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
4982 | msgid "Domain name must not contain `.'\n" | ||
4983 | msgstr "" | ||
4984 | |||
4985 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
4986 | msgid "Domain name must not contain `+'\n" | ||
4987 | msgstr "" | ||
4988 | |||
4989 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
4990 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
4991 | msgstr "" | ||
4992 | |||
4993 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
4994 | #, fuzzy | ||
4995 | msgid "Failed to start HTTP server\n" | ||
4996 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
4997 | |||
4998 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
4999 | #, fuzzy | ||
5000 | msgid "Failed to connect to identity\n" | ||
5001 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
5002 | |||
5003 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
5004 | msgid "GNU Name System First Come First Serve name registration service" | ||
5005 | msgstr "" | ||
5006 | |||
4754 | #: src/namestore/gnunet-namestore.c:301 | 5007 | #: src/namestore/gnunet-namestore.c:301 |
4755 | #, c-format | 5008 | #, c-format |
4756 | msgid "Adding record failed: %s\n" | 5009 | msgid "Adding record failed: %s\n" |
4757 | msgstr "" | 5010 | msgstr "" |
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 |
4762 | msgid "Deleting record failed, record does not exist%s%s\n" | 5015 | msgid "Deleting record failed, record does not exist%s%s\n" |
4763 | msgstr "" | 5016 | msgstr "" |
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 |
4768 | msgid "Deleting record failed%s%s\n" | 5021 | msgid "Deleting record failed%s%s\n" |
4769 | msgstr "" | 5022 | msgstr "" |
@@ -4781,7 +5034,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n" | |||
4781 | msgstr "" | 5034 | msgstr "" |
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 |
4786 | msgid "There are no records under label `%s' that could be deleted.\n" | 5039 | msgid "There are no records under label `%s' that could be deleted.\n" |
4787 | msgstr "" | 5040 | msgstr "" |
@@ -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" |
4793 | msgstr "" | 5046 | msgstr "" |
4794 | 5047 | ||
4795 | #: src/namestore/gnunet-namestore.c:776 | ||
4796 | #: src/namestore/plugin_rest_namestore.c:1004 | ||
4797 | #, c-format | ||
4798 | msgid "Ego `%s' not known to identity service\n" | ||
4799 | msgstr "" | ||
4800 | |||
4801 | #: src/namestore/gnunet-namestore.c:791 | 5048 | #: src/namestore/gnunet-namestore.c:791 |
4802 | #, c-format | 5049 | #, c-format |
4803 | msgid "No options given\n" | 5050 | msgid "No options given\n" |
4804 | msgstr "" | 5051 | msgstr "" |
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 | ||
4810 | msgid "Failed to connect to namestore\n" | ||
4811 | msgstr "åˆå§‹åŒ–“%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" | |||
4823 | msgstr "" | 5063 | msgstr "" |
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 |
4828 | msgid "Unsupported type `%s'\n" | 5068 | msgid "Unsupported type `%s'\n" |
4829 | msgstr "未知的命令“%sâ€ã€‚\n" | 5069 | msgstr "未知的命令“%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 |
4835 | msgid "Value `%s' invalid for record type `%s'\n" | 5075 | msgid "Value `%s' invalid for record type `%s'\n" |
4836 | msgstr "" | 5076 | msgstr "" |
@@ -4849,8 +5089,7 @@ msgstr "" | |||
4849 | msgid "Invalid public key for reverse lookup `%s'\n" | 5089 | msgid "Invalid public key for reverse lookup `%s'\n" |
4850 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" | 5090 | msgstr "“%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 |
4855 | msgid "Invalid URI `%s'\n" | 5094 | msgid "Invalid URI `%s'\n" |
4856 | msgstr "æ— æ•ˆæ¡ç›®ã€‚\n" | 5095 | msgstr "æ— æ•ˆæ¡ç›®ã€‚\n" |
@@ -4861,13 +5100,13 @@ msgid "Invalid nick `%s'\n" | |||
4861 | msgstr "æ— æ•ˆæ¡ç›®ã€‚\n" | 5100 | msgstr "æ— æ•ˆæ¡ç›®ã€‚\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 |
4866 | msgid "No default ego configured in identity service\n" | 5105 | msgid "No default ego configured in identity service\n" |
4867 | msgstr "" | 5106 | msgstr "" |
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 |
4872 | msgid "Cannot connect to identity service\n" | 5111 | msgid "Cannot connect to identity service\n" |
4873 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" | 5112 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" |
@@ -4930,67 +5169,7 @@ msgstr "" | |||
4930 | msgid "name of the ego controlling the zone" | 5169 | msgid "name of the ego controlling the zone" |
4931 | msgstr "" | 5170 | msgstr "" |
4932 | 5171 | ||
4933 | #: src/namestore/gnunet-namestore-fcfsd.c:508 | 5172 | #: src/namestore/gnunet-service-namestore.c:615 |
4934 | #, fuzzy, c-format | ||
4935 | msgid "Unsupported form value `%s'\n" | ||
4936 | msgstr "未知的命令“%sâ€ã€‚\n" | ||
4937 | |||
4938 | #: src/namestore/gnunet-namestore-fcfsd.c:535 | ||
4939 | #, fuzzy, c-format | ||
4940 | msgid "Failed to create record for domain `%s': %s\n" | ||
4941 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
4942 | |||
4943 | #: src/namestore/gnunet-namestore-fcfsd.c:555 | ||
4944 | msgid "Error when mapping zone to name\n" | ||
4945 | msgstr "" | ||
4946 | |||
4947 | #: src/namestore/gnunet-namestore-fcfsd.c:585 | ||
4948 | #, c-format | ||
4949 | msgid "Found existing name `%s' for the given key\n" | ||
4950 | msgstr "" | ||
4951 | |||
4952 | #: src/namestore/gnunet-namestore-fcfsd.c:662 | ||
4953 | #, c-format | ||
4954 | msgid "Found %u existing records for domain `%s'\n" | ||
4955 | msgstr "" | ||
4956 | |||
4957 | #: src/namestore/gnunet-namestore-fcfsd.c:718 | ||
4958 | #, fuzzy, c-format | ||
4959 | msgid "Failed to create page for `%s'\n" | ||
4960 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | ||
4961 | |||
4962 | #: src/namestore/gnunet-namestore-fcfsd.c:734 | ||
4963 | #, fuzzy, c-format | ||
4964 | msgid "Failed to setup post processor for `%s'\n" | ||
4965 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
4966 | |||
4967 | #: src/namestore/gnunet-namestore-fcfsd.c:770 | ||
4968 | msgid "Domain name must not contain `.'\n" | ||
4969 | msgstr "" | ||
4970 | |||
4971 | #: src/namestore/gnunet-namestore-fcfsd.c:778 | ||
4972 | msgid "Domain name must not contain `+'\n" | ||
4973 | msgstr "" | ||
4974 | |||
4975 | #: src/namestore/gnunet-namestore-fcfsd.c:974 | ||
4976 | msgid "No ego configured for `fcfsd` subsystem\n" | ||
4977 | msgstr "" | ||
4978 | |||
4979 | #: src/namestore/gnunet-namestore-fcfsd.c:1000 | ||
4980 | #, fuzzy | ||
4981 | msgid "Failed to start HTTP server\n" | ||
4982 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
4983 | |||
4984 | #: src/namestore/gnunet-namestore-fcfsd.c:1042 | ||
4985 | #, fuzzy | ||
4986 | msgid "Failed to connect to identity\n" | ||
4987 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
4988 | |||
4989 | #: src/namestore/gnunet-namestore-fcfsd.c:1074 | ||
4990 | msgid "GNU Name System First Come First Serve name registration service" | ||
4991 | msgstr "" | ||
4992 | |||
4993 | #: src/namestore/gnunet-service-namestore.c:612 | ||
4994 | #, fuzzy, c-format | 5173 | #, fuzzy, c-format |
4995 | msgid "Failed to replicate block in namecache: %s\n" | 5174 | msgid "Failed to replicate block in namecache: %s\n" |
4996 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | 5175 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" |
@@ -5004,7 +5183,7 @@ msgstr "" | |||
5004 | msgid "flat file database running\n" | 5183 | msgid "flat file database running\n" |
5005 | msgstr "sqlite æ•°æ®ä»“库" | 5184 | msgstr "sqlite æ•°æ®ä»“库" |
5006 | 5185 | ||
5007 | #: src/namestore/plugin_rest_namestore.c:1188 | 5186 | #: src/namestore/plugin_rest_namestore.c:1193 |
5008 | msgid "Namestore REST API initialized\n" | 5187 | msgid "Namestore REST API initialized\n" |
5009 | msgstr "" | 5188 | msgstr "" |
5010 | 5189 | ||
@@ -5287,10 +5466,6 @@ msgstr "" | |||
5287 | msgid "`upnpc' command not found\n" | 5466 | msgid "`upnpc' command not found\n" |
5288 | msgstr "" | 5467 | msgstr "" |
5289 | 5468 | ||
5290 | #: src/nse/gnunet-nse.c:122 | ||
5291 | msgid "Show network size estimates from NSE service." | ||
5292 | msgstr "" | ||
5293 | |||
5294 | #: src/nse/gnunet-nse-profiler.c:842 | 5469 | #: src/nse/gnunet-nse-profiler.c:842 |
5295 | msgid "limit to the number of connections to NSE services, 0 for none" | 5470 | msgid "limit to the number of connections to NSE services, 0 for none" |
5296 | msgstr "" | 5471 | msgstr "" |
@@ -5316,66 +5491,16 @@ msgstr "" | |||
5316 | msgid "Measure quality and performance of the NSE service." | 5491 | msgid "Measure quality and performance of the NSE service." |
5317 | msgstr "æ— æ³•è®¿é—®è¯¥æœåŠ¡" | 5492 | msgstr "æ— æ³•è®¿é—®è¯¥æœåŠ¡" |
5318 | 5493 | ||
5494 | #: src/nse/gnunet-nse.c:122 | ||
5495 | msgid "Show network size estimates from NSE service." | ||
5496 | msgstr "" | ||
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 |
5322 | msgid "Value is too large.\n" | 5501 | msgid "Value is too large.\n" |
5323 | msgstr "值ä¸åœ¨åˆæ³•èŒƒå›´å†…。" | 5502 | msgstr "值ä¸åœ¨åˆæ³•èŒƒå›´å†…。" |
5324 | 5503 | ||
5325 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5326 | #, c-format | ||
5327 | msgid "Removing expired address of transport `%s'\n" | ||
5328 | msgstr "" | ||
5329 | |||
5330 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5331 | #, fuzzy, c-format | ||
5332 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5333 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5334 | |||
5335 | #: src/peerinfo/gnunet-service-peerinfo.c:331 | ||
5336 | #: src/peerinfo/gnunet-service-peerinfo.c:362 | ||
5337 | #, fuzzy, c-format | ||
5338 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5339 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5340 | |||
5341 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5342 | msgid "# peers known" | ||
5343 | msgstr "" | ||
5344 | |||
5345 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5346 | #, c-format | ||
5347 | msgid "" | ||
5348 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5349 | msgstr "" | ||
5350 | |||
5351 | #: src/peerinfo/gnunet-service-peerinfo.c:655 | ||
5352 | #, fuzzy, c-format | ||
5353 | msgid "Scanning directory `%s'\n" | ||
5354 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5355 | |||
5356 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5357 | #, c-format | ||
5358 | msgid "Still no peers found in `%s'!\n" | ||
5359 | msgstr "" | ||
5360 | |||
5361 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5362 | #, fuzzy, c-format | ||
5363 | msgid "Cleaning up directory `%s'\n" | ||
5364 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5365 | |||
5366 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5367 | #, c-format | ||
5368 | msgid "Importing HELLOs from `%s'\n" | ||
5369 | msgstr "" | ||
5370 | |||
5371 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5372 | msgid "Skipping import of included HELLOs\n" | ||
5373 | msgstr "" | ||
5374 | |||
5375 | #: src/peerinfo/peerinfo_api.c:220 | ||
5376 | msgid "Failed to receive response from `PEERINFO' service." | ||
5377 | msgstr "" | ||
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 |
5381 | msgid "%sPeer `%s'\n" | 5506 | msgid "%sPeer `%s'\n" |
@@ -5467,6 +5592,60 @@ msgstr "" | |||
5467 | msgid "Failed to load transport plugin for `%s'\n" | 5592 | msgid "Failed to load transport plugin for `%s'\n" |
5468 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 5593 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" |
5469 | 5594 | ||
5595 | #: src/peerinfo/gnunet-service-peerinfo.c:178 | ||
5596 | #, c-format | ||
5597 | msgid "Removing expired address of transport `%s'\n" | ||
5598 | msgstr "" | ||
5599 | |||
5600 | #: src/peerinfo/gnunet-service-peerinfo.c:310 | ||
5601 | #, fuzzy, c-format | ||
5602 | msgid "Failed to parse HELLO in file `%s': %s\n" | ||
5603 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5604 | |||
5605 | #: src/peerinfo/gnunet-service-peerinfo.c:331 | ||
5606 | #: src/peerinfo/gnunet-service-peerinfo.c:362 | ||
5607 | #, fuzzy, c-format | ||
5608 | msgid "Failed to parse HELLO in file `%s'\n" | ||
5609 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5610 | |||
5611 | #: src/peerinfo/gnunet-service-peerinfo.c:446 | ||
5612 | msgid "# peers known" | ||
5613 | msgstr "" | ||
5614 | |||
5615 | #: src/peerinfo/gnunet-service-peerinfo.c:489 | ||
5616 | #, c-format | ||
5617 | msgid "" | ||
5618 | "File `%s' in directory `%s' does not match naming convention. Removed.\n" | ||
5619 | msgstr "" | ||
5620 | |||
5621 | #: src/peerinfo/gnunet-service-peerinfo.c:655 | ||
5622 | #, fuzzy, c-format | ||
5623 | msgid "Scanning directory `%s'\n" | ||
5624 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5625 | |||
5626 | #: src/peerinfo/gnunet-service-peerinfo.c:663 | ||
5627 | #, c-format | ||
5628 | msgid "Still no peers found in `%s'!\n" | ||
5629 | msgstr "" | ||
5630 | |||
5631 | #: src/peerinfo/gnunet-service-peerinfo.c:1076 | ||
5632 | #, fuzzy, c-format | ||
5633 | msgid "Cleaning up directory `%s'\n" | ||
5634 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | ||
5635 | |||
5636 | #: src/peerinfo/gnunet-service-peerinfo.c:1405 | ||
5637 | #, c-format | ||
5638 | msgid "Importing HELLOs from `%s'\n" | ||
5639 | msgstr "" | ||
5640 | |||
5641 | #: src/peerinfo/gnunet-service-peerinfo.c:1418 | ||
5642 | msgid "Skipping import of included HELLOs\n" | ||
5643 | msgstr "" | ||
5644 | |||
5645 | #: src/peerinfo/peerinfo_api.c:220 | ||
5646 | msgid "Failed to receive response from `PEERINFO' service." | ||
5647 | msgstr "" | ||
5648 | |||
5470 | #: src/peerstore/gnunet-peerstore.c:91 | 5649 | #: src/peerstore/gnunet-peerstore.c:91 |
5471 | msgid "peerstore" | 5650 | msgid "peerstore" |
5472 | msgstr "" | 5651 | msgstr "" |
@@ -5516,16 +5695,11 @@ msgstr "创建用户出错" | |||
5516 | msgid "Unable to create indices: %s.\n" | 5695 | msgid "Unable to create indices: %s.\n" |
5517 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | 5696 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" |
5518 | 5697 | ||
5519 | #: src/postgres/postgres.c:67 | 5698 | #: src/pq/pq_prepare.c:80 |
5520 | #, fuzzy, c-format | 5699 | #, fuzzy, c-format |
5521 | msgid "`%s:%s' failed at %s:%d with error: %s\n" | 5700 | msgid "PQprepare (`%s' as `%s') failed with error: %s\n" |
5522 | msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" | 5701 | msgstr "“%sâ€äºŽ %s:%d 处失败,错误为:%s\n" |
5523 | 5702 | ||
5524 | #: src/postgres/postgres.c:192 | ||
5525 | #, fuzzy, c-format | ||
5526 | msgid "Unable to connect to Postgres database '%s': %s\n" | ||
5527 | msgstr "æ— æ³•ä¿å˜é…置文件“%sâ€ï¼š" | ||
5528 | |||
5529 | #: src/psycstore/gnunet-service-psycstore.c:249 | 5703 | #: src/psycstore/gnunet-service-psycstore.c:249 |
5530 | #, fuzzy | 5704 | #, fuzzy |
5531 | msgid "Failed to store membership information!\n" | 5705 | msgid "Failed to store membership information!\n" |
@@ -5696,60 +5870,60 @@ msgstr "ç«‹å³ä¿å˜é…置?" | |||
5696 | msgid "Daemon to announce regular expressions for the peer using cadet." | 5870 | msgid "Daemon to announce regular expressions for the peer using cadet." |
5697 | msgstr "" | 5871 | msgstr "" |
5698 | 5872 | ||
5699 | #: src/regex/gnunet-regex-profiler.c:1314 | 5873 | #: src/regex/gnunet-regex-profiler.c:1386 |
5700 | msgid "No configuration file given. Exiting\n" | 5874 | msgid "No configuration file given. Exiting\n" |
5701 | msgstr "" | 5875 | msgstr "" |
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 |
5706 | msgid "No policy directory specified on command line. Exiting.\n" | 5880 | msgid "No policy directory specified on command line. Exiting.\n" |
5707 | msgstr "" | 5881 | msgstr "" |
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 |
5712 | msgid "Specified policies directory does not exist. Exiting.\n" | 5886 | msgid "Specified policies directory does not exist. Exiting.\n" |
5713 | msgstr "" | 5887 | msgstr "" |
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 |
5717 | msgid "No files found in `%s'\n" | 5891 | msgid "No files found in `%s'\n" |
5718 | msgstr "è¿è¡Œ %s失败:%s %d\n" | 5892 | msgstr "è¿è¡Œ %s失败:%s %d\n" |
5719 | 5893 | ||
5720 | #: src/regex/gnunet-regex-profiler.c:1377 | 5894 | #: src/regex/gnunet-regex-profiler.c:1449 |
5721 | msgid "No search strings file given. Exiting.\n" | 5895 | msgid "No search strings file given. Exiting.\n" |
5722 | msgstr "" | 5896 | msgstr "" |
5723 | 5897 | ||
5724 | #: src/regex/gnunet-regex-profiler.c:1397 | 5898 | #: src/regex/gnunet-regex-profiler.c:1469 |
5725 | #, fuzzy | 5899 | #, fuzzy |
5726 | msgid "Error loading search strings. Exiting.\n" | 5900 | msgid "Error loading search strings. Exiting.\n" |
5727 | msgstr "创建用户出错" | 5901 | msgstr "创建用户出错" |
5728 | 5902 | ||
5729 | #: src/regex/gnunet-regex-profiler.c:1485 | 5903 | #: src/regex/gnunet-regex-profiler.c:1557 |
5730 | #, fuzzy | 5904 | #, fuzzy |
5731 | msgid "name of the file for writing statistics" | 5905 | msgid "name of the file for writing statistics" |
5732 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 5906 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
5733 | 5907 | ||
5734 | #: src/regex/gnunet-regex-profiler.c:1491 | 5908 | #: src/regex/gnunet-regex-profiler.c:1563 |
5735 | msgid "wait TIMEOUT before ending the experiment" | 5909 | msgid "wait TIMEOUT before ending the experiment" |
5736 | msgstr "" | 5910 | msgstr "" |
5737 | 5911 | ||
5738 | #: src/regex/gnunet-regex-profiler.c:1497 | 5912 | #: src/regex/gnunet-regex-profiler.c:1569 |
5739 | msgid "directory with policy files" | 5913 | msgid "directory with policy files" |
5740 | msgstr "" | 5914 | msgstr "" |
5741 | 5915 | ||
5742 | #: src/regex/gnunet-regex-profiler.c:1504 | 5916 | #: src/regex/gnunet-regex-profiler.c:1576 |
5743 | #, fuzzy | 5917 | #, fuzzy |
5744 | msgid "name of file with input strings" | 5918 | msgid "name of file with input strings" |
5745 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 5919 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
5746 | 5920 | ||
5747 | #: src/regex/gnunet-regex-profiler.c:1510 | 5921 | #: src/regex/gnunet-regex-profiler.c:1582 |
5748 | #, fuzzy | 5922 | #, fuzzy |
5749 | msgid "name of file with hosts' names" | 5923 | msgid "name of file with hosts' names" |
5750 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 5924 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" |
5751 | 5925 | ||
5752 | #: src/regex/gnunet-regex-profiler.c:1523 | 5926 | #: src/regex/gnunet-regex-profiler.c:1595 |
5753 | msgid "Profiler for regex" | 5927 | msgid "Profiler for regex" |
5754 | msgstr "" | 5928 | msgstr "" |
5755 | 5929 | ||
@@ -5980,10 +6154,10 @@ msgstr "" | |||
5980 | msgid "Calculate the Vectorproduct with a GNUnet peer." | 6154 | msgid "Calculate the Vectorproduct with a GNUnet peer." |
5981 | msgstr "" | 6155 | msgstr "" |
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 |
5988 | msgid "Connect to CADET failed\n" | 6162 | msgid "Connect to CADET failed\n" |
5989 | msgstr "“%sâ€å·²è¿žæŽ¥åˆ°â€œ%sâ€ã€‚\n" | 6163 | msgstr "“%sâ€å·²è¿žæŽ¥åˆ°â€œ%sâ€ã€‚\n" |
@@ -6008,7 +6182,7 @@ msgstr "" | |||
6008 | msgid "also profile decryption" | 6182 | msgid "also profile decryption" |
6009 | msgstr "" | 6183 | msgstr "" |
6010 | 6184 | ||
6011 | #: src/set/gnunet-service-set.c:1948 | 6185 | #: src/set/gnunet-service-set.c:1989 |
6012 | #, fuzzy | 6186 | #, fuzzy |
6013 | msgid "Could not connect to CADET service\n" | 6187 | msgid "Could not connect to CADET service\n" |
6014 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" | 6188 | msgstr "æ— æ³•è¿žæŽ¥åˆ° %s:%u:%s\n" |
@@ -6068,114 +6242,114 @@ msgstr "" | |||
6068 | msgid "say good-bye and leave somebody else's place" | 6242 | msgid "say good-bye and leave somebody else's place" |
6069 | msgstr "" | 6243 | msgstr "" |
6070 | 6244 | ||
6071 | #: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232 | 6245 | #: src/social/gnunet-social.c:1227 |
6072 | msgid "create a place" | 6246 | msgid "create a place" |
6073 | msgstr "" | 6247 | msgstr "" |
6074 | 6248 | ||
6075 | #: src/social/gnunet-social.c:1237 | 6249 | #: src/social/gnunet-social.c:1232 |
6076 | msgid "destroy a place we were hosting" | 6250 | msgid "destroy a place we were hosting" |
6077 | msgstr "" | 6251 | msgstr "" |
6078 | 6252 | ||
6079 | #: src/social/gnunet-social.c:1242 | 6253 | #: src/social/gnunet-social.c:1237 |
6080 | msgid "enter somebody else's place" | 6254 | msgid "enter somebody else's place" |
6081 | msgstr "" | 6255 | msgstr "" |
6082 | 6256 | ||
6083 | #: src/social/gnunet-social.c:1248 | 6257 | #: src/social/gnunet-social.c:1243 |
6084 | msgid "find state matching name prefix" | 6258 | msgid "find state matching name prefix" |
6085 | msgstr "" | 6259 | msgstr "" |
6086 | 6260 | ||
6087 | #: src/social/gnunet-social.c:1253 | 6261 | #: src/social/gnunet-social.c:1248 |
6088 | msgid "replay history of messages up to the given --limit" | 6262 | msgid "replay history of messages up to the given --limit" |
6089 | msgstr "" | 6263 | msgstr "" |
6090 | 6264 | ||
6091 | #: src/social/gnunet-social.c:1258 | 6265 | #: src/social/gnunet-social.c:1253 |
6092 | msgid "reconnect to a previously created place" | 6266 | msgid "reconnect to a previously created place" |
6093 | msgstr "" | 6267 | msgstr "" |
6094 | 6268 | ||
6095 | #: src/social/gnunet-social.c:1263 | 6269 | #: src/social/gnunet-social.c:1258 |
6096 | msgid "publish something to a place we are hosting" | 6270 | msgid "publish something to a place we are hosting" |
6097 | msgstr "" | 6271 | msgstr "" |
6098 | 6272 | ||
6099 | #: src/social/gnunet-social.c:1268 | 6273 | #: src/social/gnunet-social.c:1263 |
6100 | msgid "reconnect to a previously entered place" | 6274 | msgid "reconnect to a previously entered place" |
6101 | msgstr "" | 6275 | msgstr "" |
6102 | 6276 | ||
6103 | #: src/social/gnunet-social.c:1273 | 6277 | #: src/social/gnunet-social.c:1268 |
6104 | msgid "search for state matching exact name" | 6278 | msgid "search for state matching exact name" |
6105 | msgstr "" | 6279 | msgstr "" |
6106 | 6280 | ||
6107 | #: src/social/gnunet-social.c:1278 | 6281 | #: src/social/gnunet-social.c:1273 |
6108 | msgid "submit something to somebody's place" | 6282 | msgid "submit something to somebody's place" |
6109 | msgstr "" | 6283 | msgstr "" |
6110 | 6284 | ||
6111 | #: src/social/gnunet-social.c:1283 | 6285 | #: src/social/gnunet-social.c:1278 |
6112 | msgid "list of egos and subscribed places" | 6286 | msgid "list of egos and subscribed places" |
6113 | msgstr "" | 6287 | msgstr "" |
6114 | 6288 | ||
6115 | #: src/social/gnunet-social.c:1288 | 6289 | #: src/social/gnunet-social.c:1283 |
6116 | msgid "extract and replay history between message IDs --start and --until" | 6290 | msgid "extract and replay history between message IDs --start and --until" |
6117 | msgstr "" | 6291 | msgstr "" |
6118 | 6292 | ||
6119 | #: src/social/gnunet-social.c:1297 | 6293 | #: src/social/gnunet-social.c:1292 |
6120 | msgid "application ID to use when connecting" | 6294 | msgid "application ID to use when connecting" |
6121 | msgstr "" | 6295 | msgstr "" |
6122 | 6296 | ||
6123 | #: src/social/gnunet-social.c:1303 | 6297 | #: src/social/gnunet-social.c:1298 |
6124 | msgid "message body or state value" | 6298 | msgid "message body or state value" |
6125 | msgstr "" | 6299 | msgstr "" |
6126 | 6300 | ||
6127 | #: src/social/gnunet-social.c:1309 | 6301 | #: src/social/gnunet-social.c:1304 |
6128 | #, fuzzy | 6302 | #, fuzzy |
6129 | msgid "name or public key of ego" | 6303 | msgid "name or public key of ego" |
6130 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" | 6304 | msgstr "“%sâ€çš„å‚æ•°æ— æ•ˆã€‚\n" |
6131 | 6305 | ||
6132 | #: src/social/gnunet-social.c:1314 | 6306 | #: src/social/gnunet-social.c:1309 |
6133 | #, fuzzy | 6307 | #, fuzzy |
6134 | msgid "wait for incoming messages" | 6308 | msgid "wait for incoming messages" |
6135 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | 6309 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" |
6136 | 6310 | ||
6137 | #: src/social/gnunet-social.c:1320 | 6311 | #: src/social/gnunet-social.c:1315 |
6138 | msgid "GNS name" | 6312 | msgid "GNS name" |
6139 | msgstr "" | 6313 | msgstr "" |
6140 | 6314 | ||
6141 | #: src/social/gnunet-social.c:1326 | 6315 | #: src/social/gnunet-social.c:1321 |
6142 | msgid "peer ID for --guest-enter" | 6316 | msgid "peer ID for --guest-enter" |
6143 | msgstr "" | 6317 | msgstr "" |
6144 | 6318 | ||
6145 | #: src/social/gnunet-social.c:1332 | 6319 | #: src/social/gnunet-social.c:1327 |
6146 | msgid "name (key) to query from state" | 6320 | msgid "name (key) to query from state" |
6147 | msgstr "" | 6321 | msgstr "" |
6148 | 6322 | ||
6149 | #: src/social/gnunet-social.c:1338 | 6323 | #: src/social/gnunet-social.c:1333 |
6150 | msgid "method name" | 6324 | msgid "method name" |
6151 | msgstr "" | 6325 | msgstr "" |
6152 | 6326 | ||
6153 | #: src/social/gnunet-social.c:1344 | 6327 | #: src/social/gnunet-social.c:1339 |
6154 | #, fuzzy | 6328 | #, fuzzy |
6155 | msgid "number of messages to replay from history" | 6329 | msgid "number of messages to replay from history" |
6156 | msgstr "æ¯æ¬¡è¿ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡" | 6330 | msgstr "æ¯æ¬¡è¿ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡" |
6157 | 6331 | ||
6158 | #: src/social/gnunet-social.c:1350 | 6332 | #: src/social/gnunet-social.c:1345 |
6159 | msgid "key address of place" | 6333 | msgid "key address of place" |
6160 | msgstr "" | 6334 | msgstr "" |
6161 | 6335 | ||
6162 | #: src/social/gnunet-social.c:1356 | 6336 | #: src/social/gnunet-social.c:1351 |
6163 | msgid "start message ID for history replay" | 6337 | msgid "start message ID for history replay" |
6164 | msgstr "" | 6338 | msgstr "" |
6165 | 6339 | ||
6166 | #: src/social/gnunet-social.c:1361 | 6340 | #: src/social/gnunet-social.c:1356 |
6167 | msgid "respond to entry requests by admitting all guests" | 6341 | msgid "respond to entry requests by admitting all guests" |
6168 | msgstr "" | 6342 | msgstr "" |
6169 | 6343 | ||
6170 | #: src/social/gnunet-social.c:1367 | 6344 | #: src/social/gnunet-social.c:1362 |
6171 | msgid "end message ID for history replay" | 6345 | msgid "end message ID for history replay" |
6172 | msgstr "" | 6346 | msgstr "" |
6173 | 6347 | ||
6174 | #: src/social/gnunet-social.c:1372 | 6348 | #: src/social/gnunet-social.c:1367 |
6175 | msgid "respond to entry requests by refusing all guests" | 6349 | msgid "respond to entry requests by refusing all guests" |
6176 | msgstr "" | 6350 | msgstr "" |
6177 | 6351 | ||
6178 | #: src/social/gnunet-social.c:1382 | 6352 | #: src/social/gnunet-social.c:1377 |
6179 | msgid "" | 6353 | msgid "" |
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 "" | |||
6368 | msgstr "" | 6542 | msgstr "" |
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 |
6373 | msgid "Incorrect hostkey file format: %s\n" | 6547 | msgid "Incorrect hostkey file format: %s\n" |
6374 | msgstr "" | 6548 | msgstr "" |
@@ -6438,15 +6612,6 @@ msgstr "" | |||
6438 | msgid "%.s Unknown result code." | 6612 | msgid "%.s Unknown result code." |
6439 | msgstr "" | 6613 | msgstr "" |
6440 | 6614 | ||
6441 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6442 | msgid "Waiting for child to exit.\n" | ||
6443 | msgstr "" | ||
6444 | |||
6445 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6446 | #, fuzzy, c-format | ||
6447 | msgid "Spawning process `%s'\n" | ||
6448 | msgstr "å¸è½½ GNUnet æœåŠ¡" | ||
6449 | |||
6450 | #: src/testbed/gnunet-testbed-profiler.c:290 | 6615 | #: src/testbed/gnunet-testbed-profiler.c:290 |
6451 | msgid "tolerate COUNT number of continious timeout failures" | 6616 | msgid "tolerate COUNT number of continious timeout failures" |
6452 | msgstr "" | 6617 | msgstr "" |
@@ -6458,6 +6623,15 @@ msgid "" | |||
6458 | "signal is received" | 6623 | "signal is received" |
6459 | msgstr "" | 6624 | msgstr "" |
6460 | 6625 | ||
6626 | #: src/testbed/gnunet_testbed_mpi_spawn.c:118 | ||
6627 | msgid "Waiting for child to exit.\n" | ||
6628 | msgstr "" | ||
6629 | |||
6630 | #: src/testbed/gnunet_testbed_mpi_spawn.c:241 | ||
6631 | #, fuzzy, c-format | ||
6632 | msgid "Spawning process `%s'\n" | ||
6633 | msgstr "å¸è½½ GNUnet æœåŠ¡" | ||
6634 | |||
6461 | #: src/testbed/testbed_api.c:410 | 6635 | #: src/testbed/testbed_api.c:410 |
6462 | #, fuzzy, c-format | 6636 | #, fuzzy, c-format |
6463 | msgid "Adding host %u failed with error: %s\n" | 6637 | msgid "Adding host %u failed with error: %s\n" |
@@ -6754,10 +6928,6 @@ msgstr "" | |||
6754 | msgid "GNUnet topology control" | 6928 | msgid "GNUnet topology control" |
6755 | msgstr "" | 6929 | msgstr "" |
6756 | 6930 | ||
6757 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
6758 | msgid "# Addresses given to ATS" | ||
6759 | msgstr "" | ||
6760 | |||
6761 | #: src/transport/gnunet-service-transport.c:448 | 6931 | #: src/transport/gnunet-service-transport.c:448 |
6762 | msgid "# messages dropped due to slow client" | 6932 | msgid "# messages dropped due to slow client" |
6763 | msgstr "" | 6933 | msgstr "" |
@@ -6803,6 +6973,10 @@ msgstr "" | |||
6803 | msgid "Transport service is lacking key configuration settings. Exiting.\n" | 6973 | msgid "Transport service is lacking key configuration settings. Exiting.\n" |
6804 | msgstr "ç«‹å³ä¿å˜é…置?" | 6974 | msgstr "ç«‹å³ä¿å˜é…置?" |
6805 | 6975 | ||
6976 | #: src/transport/gnunet-service-transport_ats.c:141 | ||
6977 | msgid "# Addresses given to ATS" | ||
6978 | msgstr "" | ||
6979 | |||
6806 | #: src/transport/gnunet-service-transport_hello.c:195 | 6980 | #: src/transport/gnunet-service-transport_hello.c:195 |
6807 | msgid "# refreshed my HELLO" | 6981 | msgid "# refreshed my HELLO" |
6808 | msgstr "" | 6982 | msgstr "" |
@@ -7107,6 +7281,44 @@ msgstr "" | |||
7107 | msgid "# validations succeeded" | 7281 | msgid "# validations succeeded" |
7108 | msgstr "" | 7282 | msgstr "" |
7109 | 7283 | ||
7284 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7285 | #, c-format | ||
7286 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7287 | msgstr "" | ||
7288 | |||
7289 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7290 | msgid "send data to peer" | ||
7291 | msgstr "" | ||
7292 | |||
7293 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7294 | msgid "receive data from peer" | ||
7295 | msgstr "" | ||
7296 | |||
7297 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7298 | msgid "iterations" | ||
7299 | msgstr "" | ||
7300 | |||
7301 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7302 | #, fuzzy | ||
7303 | msgid "number of messages to send" | ||
7304 | msgstr "æ¯æ¬¡è¿ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡" | ||
7305 | |||
7306 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7307 | #, fuzzy | ||
7308 | msgid "message size to use" | ||
7309 | msgstr "消æ¯å°ºå¯¸" | ||
7310 | |||
7311 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7312 | #: src/transport/gnunet-transport.c:1462 | ||
7313 | msgid "peer identity" | ||
7314 | msgstr "" | ||
7315 | |||
7316 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7317 | #: src/transport/gnunet-transport.c:1482 | ||
7318 | #, fuzzy | ||
7319 | msgid "Direct access to transport service." | ||
7320 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
7321 | |||
7110 | #: src/transport/gnunet-transport.c:413 | 7322 | #: src/transport/gnunet-transport.c:413 |
7111 | #, c-format | 7323 | #, c-format |
7112 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" | 7324 | msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n" |
@@ -7243,11 +7455,6 @@ msgstr "" | |||
7243 | msgid "do not resolve hostnames" | 7455 | msgid "do not resolve hostnames" |
7244 | msgstr "" | 7456 | msgstr "" |
7245 | 7457 | ||
7246 | #: src/transport/gnunet-transport.c:1462 | ||
7247 | #: src/transport/gnunet-transport-profiler.c:641 | ||
7248 | msgid "peer identity" | ||
7249 | msgstr "" | ||
7250 | |||
7251 | #: src/transport/gnunet-transport.c:1466 | 7458 | #: src/transport/gnunet-transport.c:1466 |
7252 | msgid "monitor plugin sessions" | 7459 | msgid "monitor plugin sessions" |
7253 | msgstr "" | 7460 | msgstr "" |
@@ -7256,42 +7463,9 @@ msgstr "" | |||
7256 | msgid "send data for benchmarking to the other peer (until CTRL-C)" | 7463 | msgid "send data for benchmarking to the other peer (until CTRL-C)" |
7257 | msgstr "" | 7464 | msgstr "" |
7258 | 7465 | ||
7259 | #: src/transport/gnunet-transport.c:1482 | ||
7260 | #: src/transport/gnunet-transport-profiler.c:652 | ||
7261 | #, fuzzy | ||
7262 | msgid "Direct access to transport service." | ||
7263 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | ||
7264 | |||
7265 | #: src/transport/gnunet-transport-profiler.c:219 | ||
7266 | #, c-format | ||
7267 | msgid "%llu B in %llu ms == %.2f KB/s!\n" | ||
7268 | msgstr "" | ||
7269 | |||
7270 | #: src/transport/gnunet-transport-profiler.c:617 | ||
7271 | msgid "send data to peer" | ||
7272 | msgstr "" | ||
7273 | |||
7274 | #: src/transport/gnunet-transport-profiler.c:621 | ||
7275 | msgid "receive data from peer" | ||
7276 | msgstr "" | ||
7277 | |||
7278 | #: src/transport/gnunet-transport-profiler.c:626 | ||
7279 | msgid "iterations" | ||
7280 | msgstr "" | ||
7281 | |||
7282 | #: src/transport/gnunet-transport-profiler.c:631 | ||
7283 | #, fuzzy | ||
7284 | msgid "number of messages to send" | ||
7285 | msgstr "æ¯æ¬¡è¿ä»£æ‰€ä½¿ç”¨çš„消æ¯æ•°é‡" | ||
7286 | |||
7287 | #: src/transport/gnunet-transport-profiler.c:636 | ||
7288 | #, fuzzy | ||
7289 | msgid "message size to use" | ||
7290 | msgstr "消æ¯å°ºå¯¸" | ||
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 |
7297 | msgid "TCP_STEALTH not supported on this platform.\n" | 7471 | msgid "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" | |||
7303 | msgstr "" | 7477 | msgstr "" |
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 |
7308 | msgid "Shutting down plugin `%s'\n" | 7482 | msgid "Shutting down plugin `%s'\n" |
7309 | msgstr "未知的命令“%sâ€ã€‚\n" | 7483 | msgstr "未知的命令“%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 |
7314 | msgid "Shutdown for plugin `%s' complete\n" | 7488 | msgid "Shutdown for plugin `%s' complete\n" |
7315 | msgstr "" | 7489 | msgstr "" |
@@ -7319,106 +7493,106 @@ msgstr "" | |||
7319 | msgid "Maximum number of requests is %u\n" | 7493 | msgid "Maximum number of requests is %u\n" |
7320 | msgstr "å¢žåŠ TCP/IP 的最大连接数" | 7494 | msgstr "å¢žåŠ 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 |
7324 | msgid "" | 7498 | msgid "" |
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" |
7327 | msgstr "" | 7501 | msgstr "" |
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 |
7331 | msgid "Accepting connection (%u of %u) from `%s'\n" | 7505 | msgid "Accepting connection (%u of %u) from `%s'\n" |
7332 | msgstr "" | 7506 | msgstr "" |
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 |
7336 | msgid "" | 7510 | msgid "" |
7337 | "Server reached maximum number connections (%u), rejecting new connection\n" | 7511 | "Server reached maximum number connections (%u), rejecting new connection\n" |
7338 | msgstr "" | 7512 | msgstr "" |
7339 | 7513 | ||
7340 | #: src/transport/plugin_transport_http_server.c:2125 | 7514 | #: src/transport/plugin_transport_http_server.c:2186 |
7341 | msgid "" | 7515 | msgid "" |
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" |
7344 | msgstr "" | 7518 | msgstr "" |
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 |
7348 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" | 7522 | msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n" |
7349 | msgstr "" | 7523 | msgstr "" |
7350 | 7524 | ||
7351 | #: src/transport/plugin_transport_http_server.c:2275 | 7525 | #: src/transport/plugin_transport_http_server.c:2338 |
7352 | msgid "Could not load or create server certificate! Loading plugin failed!\n" | 7526 | msgid "Could not load or create server certificate! Loading plugin failed!\n" |
7353 | msgstr "" | 7527 | msgstr "" |
7354 | 7528 | ||
7355 | #: src/transport/plugin_transport_http_server.c:2587 | 7529 | #: src/transport/plugin_transport_http_server.c:2650 |
7356 | #, fuzzy | 7530 | #, fuzzy |
7357 | msgid "Require valid port number for service in configuration!\n" | 7531 | msgid "Require valid port number for service in configuration!\n" |
7358 | msgstr "ä¿å˜é…置失败。" | 7532 | msgstr "ä¿å˜é…置失败。" |
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 |
7362 | msgid "Found %u addresses to report to NAT service\n" | 7536 | msgid "Found %u addresses to report to NAT service\n" |
7363 | msgstr "" | 7537 | msgstr "" |
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 |
7367 | msgid "Disabling IPv6 since it is not supported on this system!\n" | 7541 | msgid "Disabling IPv6 since it is not supported on this system!\n" |
7368 | msgstr "" | 7542 | msgstr "" |
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 |
7372 | msgid "IPv4 support is %s\n" | 7546 | msgid "IPv4 support is %s\n" |
7373 | msgstr "" | 7547 | msgstr "" |
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 |
7377 | msgid "IPv6 support is %s\n" | 7551 | msgid "IPv6 support is %s\n" |
7378 | msgstr "" | 7552 | msgstr "" |
7379 | 7553 | ||
7380 | #: src/transport/plugin_transport_http_server.c:2965 | 7554 | #: src/transport/plugin_transport_http_server.c:3028 |
7381 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" | 7555 | msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n" |
7382 | msgstr "" | 7556 | msgstr "" |
7383 | 7557 | ||
7384 | #: src/transport/plugin_transport_http_server.c:2976 | 7558 | #: src/transport/plugin_transport_http_server.c:3039 |
7385 | #, fuzzy | 7559 | #, fuzzy |
7386 | msgid "Port is required! Fix in configuration\n" | 7560 | msgid "Port is required! Fix in configuration\n" |
7387 | msgstr "" | 7561 | msgstr "" |
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 |
7393 | msgid "Using port %u\n" | 7567 | msgid "Using port %u\n" |
7394 | msgstr "" | 7568 | msgstr "" |
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 |
7398 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" | 7572 | msgid "Specific IPv4 address `%s' in configuration file is invalid!\n" |
7399 | msgstr "" | 7573 | msgstr "" |
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 |
7403 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" | 7577 | msgid "Specific IPv6 address `%s' in configuration file is invalid!\n" |
7404 | msgstr "" | 7578 | msgstr "" |
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 |
7408 | msgid "Using external hostname `%s'\n" | 7582 | msgid "Using external hostname `%s'\n" |
7409 | msgstr "å¸è½½ GNUnet æœåŠ¡" | 7583 | msgstr "å¸è½½ 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 |
7413 | msgid "Notifying transport only about hostname `%s'\n" | 7587 | msgid "Notifying transport only about hostname `%s'\n" |
7414 | msgstr "" | 7588 | msgstr "" |
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 |
7418 | msgid "Maximum number of connections is %u\n" | 7592 | msgid "Maximum number of connections is %u\n" |
7419 | msgstr "å¢žåŠ TCP/IP 的最大连接数" | 7593 | msgstr "å¢žåŠ 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 |
7423 | msgid "Unable to compile URL regex\n" | 7597 | msgid "Unable to compile URL regex\n" |
7424 | msgstr "æ— æ³•åˆå§‹åŒ– SQLite:%s。\n" | 7598 | msgstr "æ— æ³•åˆå§‹åŒ– SQLite:%s。\n" |
@@ -7565,20 +7739,6 @@ msgstr "" | |||
7565 | msgid "TCP transport advertises itself as being on port %llu\n" | 7739 | msgid "TCP transport advertises itself as being on port %llu\n" |
7566 | msgstr "" | 7740 | msgstr "" |
7567 | 7741 | ||
7568 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7569 | msgid "# Multicast HELLO beacons received via UDP" | ||
7570 | msgstr "" | ||
7571 | |||
7572 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7573 | msgid "" | ||
7574 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7575 | msgstr "" | ||
7576 | |||
7577 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7578 | #, c-format | ||
7579 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7580 | msgstr "" | ||
7581 | |||
7582 | #: src/transport/plugin_transport_udp.c:3366 | 7742 | #: src/transport/plugin_transport_udp.c:3366 |
7583 | #, c-format | 7743 | #, c-format |
7584 | msgid "" | 7744 | msgid "" |
@@ -7627,6 +7787,20 @@ msgstr "“%sâ€ä¸å¯ç”¨ã€‚\n" | |||
7627 | msgid "Failed to create UDP network sockets\n" | 7787 | msgid "Failed to create UDP network sockets\n" |
7628 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" | 7788 | msgstr "å‘é€æ¶ˆæ¯å¤±è´¥ã€‚\n" |
7629 | 7789 | ||
7790 | #: src/transport/plugin_transport_udp_broadcasting.c:168 | ||
7791 | msgid "# Multicast HELLO beacons received via UDP" | ||
7792 | msgstr "" | ||
7793 | |||
7794 | #: src/transport/plugin_transport_udp_broadcasting.c:548 | ||
7795 | msgid "" | ||
7796 | "Disabling HELLO broadcasting due to friend-to-friend only configuration!\n" | ||
7797 | msgstr "" | ||
7798 | |||
7799 | #: src/transport/plugin_transport_udp_broadcasting.c:565 | ||
7800 | #, c-format | ||
7801 | msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n" | ||
7802 | msgstr "" | ||
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 |
7632 | msgid "Cannot create path to `%s'\n" | 7806 | msgid "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" |
7732 | msgstr "" | 7906 | msgstr "" |
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 |
7736 | msgid "Unknown address family %d\n" | 7910 | msgid "Unknown address family %d\n" |
7737 | msgstr "" | 7911 | msgstr "" |
@@ -7776,51 +7950,51 @@ msgstr "è¿è¡Œ %s失败:%s %d\n" | |||
7776 | msgid "Service `%s' runs at %s\n" | 7950 | msgid "Service `%s' runs at %s\n" |
7777 | msgstr "" | 7951 | msgstr "" |
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 |
7780 | msgid "Service process failed to initialize\n" | 7954 | msgid "Service process failed to initialize\n" |
7781 | msgstr "" | 7955 | msgstr "" |
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 |
7784 | msgid "Service process could not initialize server function\n" | 7958 | msgid "Service process could not initialize server function\n" |
7785 | msgstr "" | 7959 | msgstr "" |
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 |
7788 | msgid "Service process failed to report status\n" | 7962 | msgid "Service process failed to report status\n" |
7789 | msgstr "" | 7963 | msgstr "" |
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 |
7794 | msgid "Cannot obtain information about user `%s': %s\n" | 7968 | msgid "Cannot obtain information about user `%s': %s\n" |
7795 | msgstr "æ— æ³•èŽ·å–有关用户“%sâ€çš„ä¿¡æ¯ï¼š%s\n" | 7969 | msgstr "æ— æ³•èŽ·å–有关用户“%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 |
7798 | msgid "No such user" | 7972 | msgid "No such user" |
7799 | msgstr "æ— æ¤ç”¨æˆ·" | 7973 | msgstr "æ— æ¤ç”¨æˆ·" |
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 |
7803 | msgid "Cannot change user/group to `%s': %s\n" | 7977 | msgid "Cannot change user/group to `%s': %s\n" |
7804 | msgstr "æ— æ³•æ›´æ”¹ç”¨æˆ·/组为“%sâ€ï¼š%s\n" | 7978 | msgstr "æ— æ³•æ›´æ”¹ç”¨æˆ·/组为“%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 |
7807 | msgid "do daemonize (detach from terminal)" | 7981 | msgid "do daemonize (detach from terminal)" |
7808 | msgstr "" | 7982 | msgstr "" |
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 |
7813 | msgid "Malformed configuration file `%s', exit ...\n" | 7987 | msgid "Malformed configuration file `%s', exit ...\n" |
7814 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 7988 | msgstr "解æžé…置文件“%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 |
7819 | msgid "Malformed configuration, exit ...\n" | 7993 | msgid "Malformed configuration, exit ...\n" |
7820 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 7994 | msgstr "解æžé…置文件“%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 |
7825 | msgid "Could not access configuration file `%s'\n" | 7999 | msgid "Could not access configuration file `%s'\n" |
7826 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" | 8000 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" |
@@ -7864,86 +8038,86 @@ msgstr "" | |||
7864 | msgid "Need a non-empty hostname for service `%s'.\n" | 8038 | msgid "Need a non-empty hostname for service `%s'.\n" |
7865 | msgstr "" | 8039 | msgstr "" |
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 |
7868 | msgid "DEBUG" | 8042 | msgid "DEBUG" |
7869 | msgstr "调试" | 8043 | msgstr "调试" |
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 |
7872 | msgid "INFO" | 8046 | msgid "INFO" |
7873 | msgstr "ä¿¡æ¯" | 8047 | msgstr "ä¿¡æ¯" |
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 |
7876 | msgid "MESSAGE" | 8050 | msgid "MESSAGE" |
7877 | msgstr "" | 8051 | msgstr "" |
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 |
7880 | msgid "WARNING" | 8054 | msgid "WARNING" |
7881 | msgstr "è¦å‘Š" | 8055 | msgstr "è¦å‘Š" |
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 |
7884 | msgid "ERROR" | 8058 | msgid "ERROR" |
7885 | msgstr "错误" | 8059 | msgstr "错误" |
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 |
7888 | msgid "NONE" | 8062 | msgid "NONE" |
7889 | msgstr "" | 8063 | msgstr "" |
7890 | 8064 | ||
7891 | #: src/util/common_logging.c:879 | 8065 | #: src/util/common_logging.c:882 |
7892 | #, fuzzy, c-format | 8066 | #, fuzzy, c-format |
7893 | msgid "Message `%.*s' repeated %u times in the last %s\n" | 8067 | msgid "Message `%.*s' repeated %u times in the last %s\n" |
7894 | msgstr "消æ¯â€œ%.*sâ€é‡å¤äº† %u 次,在最近 %llu 秒内\n" | 8068 | msgstr "消æ¯â€œ%.*sâ€é‡å¤äº† %u 次,在最近 %llu 秒内\n" |
7895 | 8069 | ||
7896 | #: src/util/common_logging.c:1132 | 8070 | #: src/util/common_logging.c:1135 |
7897 | msgid "INVALID" | 8071 | msgid "INVALID" |
7898 | msgstr "" | 8072 | msgstr "" |
7899 | 8073 | ||
7900 | #: src/util/common_logging.c:1302 | 8074 | #: src/util/common_logging.c:1326 |
7901 | msgid "unknown address" | 8075 | msgid "unknown address" |
7902 | msgstr "" | 8076 | msgstr "" |
7903 | 8077 | ||
7904 | #: src/util/common_logging.c:1344 | 8078 | #: src/util/common_logging.c:1368 |
7905 | msgid "invalid address" | 8079 | msgid "invalid address" |
7906 | msgstr "" | 8080 | msgstr "" |
7907 | 8081 | ||
7908 | #: src/util/common_logging.c:1362 | 8082 | #: src/util/common_logging.c:1386 |
7909 | #, fuzzy, c-format | 8083 | #, fuzzy, c-format |
7910 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" | 8084 | msgid "Configuration fails to specify option `%s' in section `%s'!\n" |
7911 | msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n" | 8085 | msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%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 |
7915 | msgid "" | 8089 | msgid "" |
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" |
7917 | msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n" | 8091 | msgstr "é…ç½®ä¸æ»¡è¶³é…置规范文件“%sâ€çš„约æŸï¼\n" |
7918 | 8092 | ||
7919 | #: src/util/configuration.c:286 | 8093 | #: src/util/configuration.c:296 |
7920 | #, fuzzy, c-format | 8094 | #, fuzzy, c-format |
7921 | msgid "Syntax error while deserializing in line %u\n" | 8095 | msgid "Syntax error while deserializing in line %u\n" |
7922 | msgstr "é…置文件“%sâ€ç¬¬ %d 行有è¯æ³•é”™è¯¯ã€‚\n" | 8096 | msgstr "é…置文件“%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 |
7926 | msgid "Error while reading file `%s'\n" | 8100 | msgid "Error while reading file `%s'\n" |
7927 | msgstr "è§£æž dscl 输出时出错。\n" | 8101 | msgstr "è§£æž dscl 输出时出错。\n" |
7928 | 8102 | ||
7929 | #: src/util/configuration.c:1017 | 8103 | #: src/util/configuration.c:1034 |
7930 | #, c-format | 8104 | #, c-format |
7931 | msgid "" | 8105 | msgid "" |
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" |
7934 | msgstr "" | 8108 | msgstr "" |
7935 | 8109 | ||
7936 | #: src/util/configuration.c:1136 | 8110 | #: src/util/configuration.c:1153 |
7937 | #, c-format | 8111 | #, c-format |
7938 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" | 8112 | msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n" |
7939 | msgstr "" | 8113 | msgstr "" |
7940 | 8114 | ||
7941 | #: src/util/configuration.c:1169 | 8115 | #: src/util/configuration.c:1186 |
7942 | #, fuzzy, c-format | 8116 | #, fuzzy, c-format |
7943 | msgid "Missing closing `%s' in option `%s'\n" | 8117 | msgid "Missing closing `%s' in option `%s'\n" |
7944 | msgstr "é…置文件“%sâ€å·²å†™å…¥ã€‚\n" | 8118 | msgstr "é…置文件“%sâ€å·²å†™å…¥ã€‚\n" |
7945 | 8119 | ||
7946 | #: src/util/configuration.c:1237 | 8120 | #: src/util/configuration.c:1254 |
7947 | #, c-format | 8121 | #, c-format |
7948 | msgid "" | 8122 | msgid "" |
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" | |||
7977 | msgid "EdDSA signature verification failed at %s:%d: %s\n" | 8151 | msgid "EdDSA signature verification failed at %s:%d: %s\n" |
7978 | msgstr "对驱动器“%2$sâ€çš„“%1$sâ€æ“作失败:%3$u\n" | 8152 | msgstr "对驱动器“%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 |
7983 | msgid "Could not acquire lock on file `%s': %s...\n" | 8157 | msgid "Could not acquire lock on file `%s': %s...\n" |
7984 | msgstr "æ— æ³•è§£æžâ€œ%sâ€(%s):%s\n" | 8158 | msgstr "æ— æ³•è§£æžâ€œ%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 |
7988 | msgid "Creating a new private key. This may take a while.\n" | 8162 | msgid "Creating a new private key. This may take a while.\n" |
7989 | msgstr "æ£åœ¨å¯åŠ¨æ•°æ®ä»“库转æ¢(å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´)。\n" | 8163 | msgstr "æ£åœ¨å¯åŠ¨æ•°æ®ä»“库转æ¢(å¯èƒ½éœ€è¦ä¸€æ®µæ—¶é—´)。\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 |
7992 | msgid "This may be ok if someone is currently generating a private key.\n" | 8166 | msgid "This may be ok if someone is currently generating a private key.\n" |
7993 | msgstr "" | 8167 | msgstr "" |
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 |
7997 | msgid "" | 8171 | msgid "" |
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" |
7999 | msgstr "" | 8173 | msgstr "" |
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 |
8002 | msgid "This may be ok if someone is currently generating a key.\n" | 8176 | msgid "This may be ok if someone is currently generating a key.\n" |
8003 | msgstr "" | 8177 | msgstr "" |
8004 | 8178 | ||
8005 | #: src/util/crypto_ecc_setup.c:413 | 8179 | #: src/util/crypto_ecc_setup.c:415 |
8006 | #, fuzzy | 8180 | #, fuzzy |
8007 | msgid "Could not load peer's private key\n" | 8181 | msgid "Could not load peer's private key\n" |
8008 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" | 8182 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" |
@@ -8193,82 +8367,86 @@ msgstr "" | |||
8193 | msgid "Manipulate GNUnet configuration files" | 8367 | msgid "Manipulate GNUnet configuration files" |
8194 | msgstr "更改é…置文件ä¸çš„一个值" | 8368 | msgstr "更改é…置文件ä¸çš„一个值" |
8195 | 8369 | ||
8196 | #: src/util/gnunet-ecc.c:84 | 8370 | #: src/util/gnunet-ecc.c:89 |
8197 | #, fuzzy, c-format | 8371 | #, fuzzy, c-format |
8198 | msgid "Failed to open `%s': %s\n" | 8372 | msgid "Failed to open `%s': %s\n" |
8199 | msgstr "打开日志文件“%sâ€å¤±è´¥ï¼š%s\n" | 8373 | msgstr "打开日志文件“%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 |
8203 | msgid "Generating %u keys like %s, please wait" | 8377 | msgid "Generating %u keys like %s, please wait" |
8204 | msgstr "" | 8378 | msgstr "" |
8205 | 8379 | ||
8206 | #: src/util/gnunet-ecc.c:133 | 8380 | #: src/util/gnunet-ecc.c:138 |
8207 | #, c-format | 8381 | #, c-format |
8208 | msgid "Generating %u keys, please wait" | 8382 | msgid "Generating %u keys, please wait" |
8209 | msgstr "" | 8383 | msgstr "" |
8210 | 8384 | ||
8211 | #: src/util/gnunet-ecc.c:174 | 8385 | #: src/util/gnunet-ecc.c:179 |
8212 | #, fuzzy, c-format | 8386 | #, fuzzy, c-format |
8213 | msgid "" | 8387 | msgid "" |
8214 | "\n" | 8388 | "\n" |
8215 | "Failed to write to `%s': %s\n" | 8389 | "Failed to write to `%s': %s\n" |
8216 | msgstr "è¿è¡Œ %s失败:%s %d\n" | 8390 | msgstr "è¿è¡Œ %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 |
8220 | msgid "" | 8394 | msgid "" |
8221 | "\n" | 8395 | "\n" |
8222 | "Finished!\n" | 8396 | "Finished!\n" |
8223 | msgstr "" | 8397 | msgstr "" |
8224 | 8398 | ||
8225 | #: src/util/gnunet-ecc.c:187 | 8399 | #: src/util/gnunet-ecc.c:192 |
8226 | #, c-format | 8400 | #, c-format |
8227 | msgid "" | 8401 | msgid "" |
8228 | "\n" | 8402 | "\n" |
8229 | "Error, %u keys not generated\n" | 8403 | "Error, %u keys not generated\n" |
8230 | msgstr "" | 8404 | msgstr "" |
8231 | 8405 | ||
8232 | #: src/util/gnunet-ecc.c:280 | 8406 | #: src/util/gnunet-ecc.c:283 |
8233 | #, c-format | 8407 | #, c-format |
8234 | msgid "Hostkeys file `%s' not found\n" | 8408 | msgid "Hostkeys file `%s' not found\n" |
8235 | msgstr "" | 8409 | msgstr "" |
8236 | 8410 | ||
8237 | #: src/util/gnunet-ecc.c:291 | 8411 | #: src/util/gnunet-ecc.c:294 |
8238 | #, fuzzy, c-format | 8412 | #, fuzzy, c-format |
8239 | msgid "Hostkeys file `%s' is empty\n" | 8413 | msgid "Hostkeys file `%s' is empty\n" |
8240 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" | 8414 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%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 |
8244 | msgid "Could not read hostkey file: %s\n" | 8418 | msgid "Could not read hostkey file: %s\n" |
8245 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" | 8419 | msgstr "找ä¸åˆ°æŽ¥å£â€œ%sâ€çš„一个 IP 地å€ã€‚\n" |
8246 | 8420 | ||
8247 | #: src/util/gnunet-ecc.c:364 | 8421 | #: src/util/gnunet-ecc.c:367 |
8248 | msgid "No hostkey file specified on command line\n" | 8422 | msgid "No hostkey file specified on command line\n" |
8249 | msgstr "" | 8423 | msgstr "" |
8250 | 8424 | ||
8251 | #: src/util/gnunet-ecc.c:416 | 8425 | #: src/util/gnunet-ecc.c:425 |
8252 | msgid "list keys included in a file (for testing)" | 8426 | msgid "list keys included in a file (for testing)" |
8253 | msgstr "" | 8427 | msgstr "" |
8254 | 8428 | ||
8255 | #: src/util/gnunet-ecc.c:421 | 8429 | #: src/util/gnunet-ecc.c:430 |
8256 | msgid "number of keys to list included in a file (for testing)" | 8430 | msgid "number of keys to list included in a file (for testing)" |
8257 | msgstr "" | 8431 | msgstr "" |
8258 | 8432 | ||
8259 | #: src/util/gnunet-ecc.c:426 | 8433 | #: src/util/gnunet-ecc.c:435 |
8260 | msgid "create COUNT public-private key pairs (for testing)" | 8434 | msgid "create COUNT public-private key pairs (for testing)" |
8261 | msgstr "" | 8435 | msgstr "" |
8262 | 8436 | ||
8263 | #: src/util/gnunet-ecc.c:430 | 8437 | #: src/util/gnunet-ecc.c:439 |
8264 | msgid "print the public key in ASCII format" | 8438 | msgid "print the public key in ASCII format" |
8265 | msgstr "" | 8439 | msgstr "" |
8266 | 8440 | ||
8267 | #: src/util/gnunet-ecc.c:434 | 8441 | #: src/util/gnunet-ecc.c:443 |
8442 | msgid "print the public key in HEX format" | ||
8443 | msgstr "" | ||
8444 | |||
8445 | #: src/util/gnunet-ecc.c:447 | ||
8268 | msgid "print examples of ECC operations (used for compatibility testing)" | 8446 | msgid "print examples of ECC operations (used for compatibility testing)" |
8269 | msgstr "" | 8447 | msgstr "" |
8270 | 8448 | ||
8271 | #: src/util/gnunet-ecc.c:449 | 8449 | #: src/util/gnunet-ecc.c:463 |
8272 | #, fuzzy | 8450 | #, fuzzy |
8273 | msgid "Manipulate GNUnet private ECC key files" | 8451 | msgid "Manipulate GNUnet private ECC key files" |
8274 | msgstr "更改é…置文件ä¸çš„一个值" | 8452 | msgstr "更改é…置文件ä¸çš„一个值" |
@@ -8362,7 +8540,7 @@ msgstr "创建用户出错" | |||
8362 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" | 8540 | msgid "Unable to shorten unix path `%s' while keeping name unique\n" |
8363 | msgstr "" | 8541 | msgstr "" |
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 |
8367 | msgid "" | 8545 | msgid "" |
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 "" | |||
8415 | msgid "Could not determine plugin installation path.\n" | 8593 | msgid "Could not determine plugin installation path.\n" |
8416 | msgstr "æ— æ³•ç¡®å®šç”¨æˆ·ç•Œé¢å®šä¹‰æ–‡ä»¶ã€‚" | 8594 | msgstr "æ— æ³•ç¡®å®šç”¨æˆ·ç•Œé¢å®šä¹‰æ–‡ä»¶ã€‚" |
8417 | 8595 | ||
8418 | #: src/util/resolver_api.c:204 | 8596 | #: src/util/resolver_api.c:203 |
8419 | #, c-format | 8597 | #, c-format |
8420 | msgid "" | 8598 | msgid "" |
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" |
8429 | msgstr "" | 8607 | msgstr "" |
8430 | 8608 | ||
8431 | #: src/util/resolver_api.c:815 | 8609 | #: src/util/resolver_api.c:826 |
8432 | #, c-format | 8610 | #, c-format |
8433 | msgid "Timeout trying to resolve hostname `%s'.\n" | 8611 | msgid "Timeout trying to resolve hostname `%s'.\n" |
8434 | msgstr "" | 8612 | msgstr "" |
8435 | 8613 | ||
8436 | #: src/util/resolver_api.c:827 | 8614 | #: src/util/resolver_api.c:839 |
8437 | #, fuzzy, c-format | 8615 | #, fuzzy, c-format |
8438 | msgid "Timeout trying to resolve IP address `%s'.\n" | 8616 | msgid "Timeout trying to resolve IP address `%s'.\n" |
8439 | msgstr "GNUnet 现在使用 IP åœ°å€ %s。\n" | 8617 | msgstr "GNUnet 现在使用 IP åœ°å€ %s。\n" |
8440 | 8618 | ||
8441 | #: src/util/resolver_api.c:1004 | 8619 | #: src/util/resolver_api.c:1023 |
8442 | msgid "Resolver not configured correctly.\n" | 8620 | msgid "Resolver not configured correctly.\n" |
8443 | msgstr "" | 8621 | msgstr "" |
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 |
8448 | msgid "Could not resolve our FQDN: %s\n" | 8626 | msgid "Could not resolve our FQDN: %s\n" |
8449 | msgstr "æ— æ³•è§£æžâ€œ%sâ€(%s):%s\n" | 8627 | msgstr "æ— æ³•è§£æžâ€œ%sâ€(%s):%s\n" |
8450 | 8628 | ||
8451 | #: src/util/service.c:1306 | 8629 | #: src/util/service.c:1305 |
8452 | msgid "" | 8630 | msgid "" |
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" |
8454 | msgstr "" | 8632 | msgstr "" |
8455 | 8633 | ||
8456 | #: src/util/service.c:2082 | 8634 | #: src/util/service.c:2081 |
8457 | #, c-format | 8635 | #, c-format |
8458 | msgid "" | 8636 | msgid "" |
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 " 天" | |||
8530 | msgid "end of time" | 8708 | msgid "end of time" |
8531 | msgstr "" | 8709 | msgstr "" |
8532 | 8710 | ||
8533 | #: src/util/strings.c:1269 | 8711 | #: src/util/strings.c:1270 |
8534 | msgid "IPv6 address did not start with `['\n" | 8712 | msgid "IPv6 address did not start with `['\n" |
8535 | msgstr "" | 8713 | msgstr "" |
8536 | 8714 | ||
8537 | #: src/util/strings.c:1277 | 8715 | #: src/util/strings.c:1278 |
8538 | msgid "IPv6 address did contain ':' to separate port number\n" | 8716 | msgid "IPv6 address did contain ':' to separate port number\n" |
8539 | msgstr "" | 8717 | msgstr "" |
8540 | 8718 | ||
8541 | #: src/util/strings.c:1283 | 8719 | #: src/util/strings.c:1284 |
8542 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" | 8720 | msgid "IPv6 address did contain ']' before ':' to separate port number\n" |
8543 | msgstr "" | 8721 | msgstr "" |
8544 | 8722 | ||
8545 | #: src/util/strings.c:1290 | 8723 | #: src/util/strings.c:1291 |
8546 | msgid "IPv6 address did contain a valid port number after the last ':'\n" | 8724 | msgid "IPv6 address did contain a valid port number after the last ':'\n" |
8547 | msgstr "" | 8725 | msgstr "" |
8548 | 8726 | ||
8549 | #: src/util/strings.c:1299 | 8727 | #: src/util/strings.c:1300 |
8550 | #, fuzzy, c-format | 8728 | #, fuzzy, c-format |
8551 | msgid "Invalid IPv6 address `%s': %s\n" | 8729 | msgid "Invalid IPv6 address `%s': %s\n" |
8552 | msgstr "æ— æ•ˆçš„è¿›ç¨‹ä¼˜å…ˆçº§â€œ%sâ€\n" | 8730 | msgstr "æ— æ•ˆçš„è¿›ç¨‹ä¼˜å…ˆçº§â€œ%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 |
8555 | msgid "Port not in range\n" | 8733 | msgid "Port not in range\n" |
8556 | msgstr "" | 8734 | msgstr "" |
8557 | 8735 | ||
8558 | #: src/util/strings.c:1596 | 8736 | #: src/util/strings.c:1597 |
8559 | #, fuzzy, c-format | 8737 | #, fuzzy, c-format |
8560 | msgid "Malformed port policy `%s'\n" | 8738 | msgid "Malformed port policy `%s'\n" |
8561 | msgstr "解æžé…置文件“%sâ€å¤±è´¥\n" | 8739 | msgstr "解æžé…置文件“%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 |
8566 | msgid "Invalid format for IP: `%s'\n" | 8744 | msgid "Invalid format for IP: `%s'\n" |
8567 | msgstr "IP æ ¼å¼æ— 效:“%sâ€\n" | 8745 | msgstr "IP æ ¼å¼æ— 效:“%sâ€\n" |
8568 | 8746 | ||
8569 | #: src/util/strings.c:1736 | 8747 | #: src/util/strings.c:1737 |
8570 | #, c-format | 8748 | #, c-format |
8571 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." | 8749 | msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)." |
8572 | msgstr "ç½‘ç»œè¡¨ç¤ºæ³•æ— æ•ˆ(“/%d†在 IPv4 CIDR ä¸æ˜¯éžæ³•çš„)。" | 8750 | msgstr "ç½‘ç»œè¡¨ç¤ºæ³•æ— æ•ˆ(“/%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 |
8576 | msgid "Invalid format: `%s'\n" | 8754 | msgid "Invalid format: `%s'\n" |
8577 | msgstr "IP æ ¼å¼æ— 效:“%sâ€\n" | 8755 | msgstr "IP æ ¼å¼æ— 效:“%sâ€\n" |
8578 | 8756 | ||
8579 | #: src/util/strings.c:1840 | 8757 | #: src/util/strings.c:1841 |
8580 | #, c-format | 8758 | #, c-format |
8581 | msgid "Invalid network notation (does not end with ';': `%s')\n" | 8759 | msgid "Invalid network notation (does not end with ';': `%s')\n" |
8582 | msgstr "æ— æ•ˆçš„ç½‘ç»œè¡¨ç¤ºæ³•(没有以“;â€ç»“尾:“%sâ€)\n" | 8760 | msgstr "æ— æ•ˆçš„ç½‘ç»œè¡¨ç¤ºæ³•(没有以“;â€ç»“尾:“%sâ€)\n" |
8583 | 8761 | ||
8584 | #: src/util/strings.c:1890 | 8762 | #: src/util/strings.c:1891 |
8585 | #, c-format | 8763 | #, c-format |
8586 | msgid "Wrong format `%s' for netmask\n" | 8764 | msgid "Wrong format `%s' for netmask\n" |
8587 | msgstr "网络掩ç çš„æ ¼å¼â€œ%sâ€é”™è¯¯\n" | 8765 | msgstr "网络掩ç çš„æ ¼å¼â€œ%sâ€é”™è¯¯\n" |
8588 | 8766 | ||
8589 | #: src/util/strings.c:1921 | 8767 | #: src/util/strings.c:1922 |
8590 | #, c-format | 8768 | #, c-format |
8591 | msgid "Wrong format `%s' for network\n" | 8769 | msgid "Wrong format `%s' for network\n" |
8592 | msgstr "ç½‘ç»œçš„æ ¼å¼â€œ%sâ€é”™è¯¯\n" | 8770 | msgstr "ç½‘ç»œçš„æ ¼å¼â€œ%sâ€é”™è¯¯\n" |
@@ -8761,28 +8939,44 @@ msgstr "" | |||
8761 | msgid "Setup tunnels via VPN." | 8939 | msgid "Setup tunnels via VPN." |
8762 | msgstr "" | 8940 | msgstr "" |
8763 | 8941 | ||
8764 | #: src/zonemaster/gnunet-service-zonemaster.c:705 | 8942 | #: src/zonemaster/gnunet-service-zonemaster.c:706 |
8765 | #, fuzzy | 8943 | #, fuzzy |
8766 | msgid "Failed to connect to the namestore!\n" | 8944 | msgid "Failed to connect to the namestore!\n" |
8767 | msgstr "åˆå§‹åŒ–“%sâ€æœåŠ¡å¤±è´¥ã€‚\n" | 8945 | msgstr "åˆå§‹åŒ–“%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 |
8772 | msgid "Assertion failed at %s:%d.\n" | 8950 | msgid "Assertion failed at %s:%d.\n" |
8773 | msgstr "" | 8951 | msgstr "" |
8774 | 8952 | ||
8775 | #: src/include/gnunet_common.h:711 | 8953 | #: src/include/gnunet_common.h:726 |
8776 | #, c-format | 8954 | #, c-format |
8777 | msgid "External protocol violation detected at %s:%d.\n" | 8955 | msgid "External protocol violation detected at %s:%d.\n" |
8778 | msgstr "" | 8956 | msgstr "" |
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 |
8782 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" | 8960 | msgid "`%s' failed on file `%s' at %s:%d with error: %s\n" |
8783 | msgstr "" | 8961 | msgstr "" |
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 | ||
18 | if HAVE_JSON | 18 | if HAVE_JSON |
19 | if HAVE_MHD | 19 | if HAVE_MHD |
20 | ATTRIBUTE_DIR = identity-attribute | ||
20 | PROVIDER_DIR = identity-provider | 21 | PROVIDER_DIR = identity-provider |
21 | endif | 22 | endif |
22 | endif | 23 | endif |
@@ -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 | ||
135 | endif | 138 | endif |
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 | ||
2 | AM_CPPFLAGS = -I$(top_srcdir)/src/include | ||
3 | |||
4 | EXTRA_DIST = \ | ||
5 | test_credential_defaults.conf \ | ||
6 | test_credential_lookup.conf | ||
7 | |||
8 | |||
9 | if USE_COVERAGE | ||
10 | AM_CFLAGS = --coverage -O0 | ||
11 | endif | ||
12 | |||
13 | pkgcfgdir = $(pkgdatadir)/config.d/ | ||
14 | |||
15 | libexecdir= $(pkglibdir)/libexec/ | ||
16 | |||
17 | plugindir = $(libdir)/gnunet | ||
18 | |||
19 | pkgcfg_DATA = \ | ||
20 | credential.conf | ||
21 | |||
22 | |||
23 | # /usr/lib - compiles a layer which can be used to be communicagte with the service | ||
24 | lib_LTLIBRARIES = \ | ||
25 | libgnunetcredential.la | ||
26 | |||
27 | # /usr/lib/gnunet/libexec - Business logic . Separate process | ||
28 | libexec_PROGRAMS = \ | ||
29 | gnunet-service-credential | ||
30 | |||
31 | bin_PROGRAMS = \ | ||
32 | gnunet-credential | ||
33 | |||
34 | plugin_LTLIBRARIES = \ | ||
35 | libgnunet_plugin_gnsrecord_credential.la | ||
36 | |||
37 | |||
38 | if HAVE_MHD | ||
39 | if HAVE_JSON | ||
40 | plugin_LTLIBRARIES += libgnunet_plugin_rest_credential.la | ||
41 | endif | ||
42 | endif | ||
43 | |||
44 | |||
45 | gnunet_credential_SOURCES = \ | ||
46 | gnunet-credential.c | ||
47 | gnunet_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 | |||
55 | libgnunet_plugin_gnsrecord_credential_la_SOURCES = \ | ||
56 | plugin_gnsrecord_credential.c | ||
57 | libgnunet_plugin_gnsrecord_credential_la_LIBADD = \ | ||
58 | libgnunetcredential.la \ | ||
59 | $(top_builddir)/src/util/libgnunetutil.la \ | ||
60 | $(LTLIBINTL) | ||
61 | libgnunet_plugin_gnsrecord_credential_la_LDFLAGS = \ | ||
62 | $(GN_PLUGIN_LDFLAGS) | ||
63 | |||
64 | |||
65 | |||
66 | gnunet_service_credential_SOURCES = \ | ||
67 | gnunet-service-credential.c | ||
68 | gnunet_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 | |||
77 | libgnunetcredential_la_SOURCES = \ | ||
78 | credential_api.c \ | ||
79 | credential_serialization.c \ | ||
80 | credential_misc.c | ||
81 | libgnunetcredential_la_LIBADD = \ | ||
82 | $(top_builddir)/src/util/libgnunetutil.la $(XLIB) | ||
83 | libgnunetcredential_la_LDFLAGS = \ | ||
84 | $(GN_LIB_LDFLAGS) | ||
85 | |||
86 | |||
87 | libgnunet_plugin_rest_credential_la_SOURCES = \ | ||
88 | plugin_rest_credential.c | ||
89 | libgnunet_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 | ||
97 | libgnunet_plugin_rest_credential_la_LDFLAGS = \ | ||
98 | $(GN_PLUGIN_LDFLAGS) | ||
99 | |||
100 | |||
101 | check_SCRIPTS = \ | ||
102 | test_credential_issue.sh \ | ||
103 | test_credential_verify_simple.sh \ | ||
104 | test_credential_verify.sh \ | ||
105 | test_credential_verify_and.sh | ||
106 | |||
107 | if ENABLE_TEST_RUN | ||
108 | if HAVE_SQLITE | ||
109 | AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH; | ||
110 | TESTS = $(check_SCRIPTS) | ||
111 | endif | ||
112 | endif | ||
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] | ||
2 | BINARY = gnunet-service-credential | ||
3 | UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-credential.sock | ||
4 | USER_SERVICE = YES | ||
5 | OPTIONS = -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 | |||
30 | GNUNET_NETWORK_STRUCT_BEGIN | ||
31 | |||
32 | /** | ||
33 | * Message from client to Credential service to collect credentials. | ||
34 | */ | ||
35 | struct 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 | */ | ||
70 | struct 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 | */ | ||
110 | struct 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 | |||
141 | struct 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 | |||
155 | struct 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 | |||
179 | struct 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 | |||
218 | GNUNET_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 | */ | ||
43 | struct 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 | */ | ||
87 | struct 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 | */ | ||
133 | static void | ||
134 | reconnect (struct GNUNET_CREDENTIAL_Handle *handle); | ||
135 | |||
136 | |||
137 | /** | ||
138 | * Reconnect to CREDENTIAL | ||
139 | * | ||
140 | * @param cls the handle | ||
141 | */ | ||
142 | static void | ||
143 | reconnect_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 | */ | ||
157 | static void | ||
158 | force_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 | */ | ||
179 | static void | ||
180 | mq_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 | */ | ||
194 | static int | ||
195 | check_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 | */ | ||
209 | static void | ||
210 | handle_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 | */ | ||
267 | static void | ||
268 | reconnect (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 | */ | ||
305 | struct GNUNET_CREDENTIAL_Handle * | ||
306 | GNUNET_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 | */ | ||
327 | void | ||
328 | GNUNET_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 | */ | ||
350 | void | ||
351 | GNUNET_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 | */ | ||
378 | struct GNUNET_CREDENTIAL_Request* | ||
379 | GNUNET_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 | */ | ||
448 | struct GNUNET_CREDENTIAL_Request* | ||
449 | GNUNET_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 | |||
36 | char* | ||
37 | GNUNET_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 | |||
63 | struct GNUNET_CREDENTIAL_Credential* | ||
64 | GNUNET_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 | */ | ||
122 | struct GNUNET_CREDENTIAL_Credential * | ||
123 | GNUNET_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 | |||
29 | char* | ||
30 | GNUNET_CREDENTIAL_credential_to_string (const struct GNUNET_CREDENTIAL_Credential *cred); | ||
31 | |||
32 | struct GNUNET_CREDENTIAL_Credential* | ||
33 | GNUNET_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 | */ | ||
44 | size_t | ||
45 | GNUNET_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 | */ | ||
71 | ssize_t | ||
72 | GNUNET_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 | */ | ||
115 | int | ||
116 | GNUNET_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 | */ | ||
151 | size_t | ||
152 | GNUNET_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 | */ | ||
176 | ssize_t | ||
177 | GNUNET_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 | */ | ||
224 | int | ||
225 | GNUNET_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 | */ | ||
266 | size_t | ||
267 | GNUNET_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 | */ | ||
299 | ssize_t | ||
300 | GNUNET_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 | */ | ||
357 | int | ||
358 | GNUNET_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 | } | ||
394 | int | ||
395 | GNUNET_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 | |||
427 | struct GNUNET_CREDENTIAL_Credential* | ||
428 | GNUNET_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 | */ | ||
44 | size_t | ||
45 | GNUNET_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 | */ | ||
57 | ssize_t | ||
58 | GNUNET_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 | */ | ||
73 | int | ||
74 | GNUNET_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 | |||
137 | ssize_t | ||
138 | GNUNET_CREDENTIAL_credentials_serialize (unsigned int c_count, | ||
139 | const struct GNUNET_CREDENTIAL_Credential *cd, | ||
140 | size_t dest_size, | ||
141 | char *dest); | ||
142 | |||
143 | |||
144 | int | ||
145 | GNUNET_CREDENTIAL_credentials_deserialize (size_t len, | ||
146 | const char *src, | ||
147 | unsigned int c_count, | ||
148 | struct GNUNET_CREDENTIAL_Credential *cd); | ||
149 | |||
150 | |||
151 | int | ||
152 | GNUNET_CREDENTIAL_credential_serialize (struct GNUNET_CREDENTIAL_Credential *cred, | ||
153 | char **data); | ||
154 | |||
155 | struct GNUNET_CREDENTIAL_Credential* | ||
156 | GNUNET_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 | */ | ||
35 | static const struct GNUNET_CONFIGURATION_Handle *cfg; | ||
36 | |||
37 | /** | ||
38 | * EgoLookup | ||
39 | */ | ||
40 | static struct GNUNET_IDENTITY_EgoLookup *el; | ||
41 | |||
42 | /** | ||
43 | * Handle to Credential service. | ||
44 | */ | ||
45 | static struct GNUNET_CREDENTIAL_Handle *credential; | ||
46 | |||
47 | /** | ||
48 | * Desired timeout for the lookup (default is no timeout). | ||
49 | */ | ||
50 | static struct GNUNET_TIME_Relative timeout; | ||
51 | |||
52 | /** | ||
53 | * Handle to verify request | ||
54 | */ | ||
55 | static struct GNUNET_CREDENTIAL_Request *verify_request; | ||
56 | |||
57 | /** | ||
58 | * Handle to collect request | ||
59 | */ | ||
60 | static struct GNUNET_CREDENTIAL_Request *collect_request; | ||
61 | |||
62 | /** | ||
63 | * Task scheduled to handle timeout. | ||
64 | */ | ||
65 | static struct GNUNET_SCHEDULER_Task *tt; | ||
66 | |||
67 | /** | ||
68 | * Subject pubkey string | ||
69 | */ | ||
70 | static char *subject_key; | ||
71 | |||
72 | /** | ||
73 | * Subject credential string | ||
74 | */ | ||
75 | static char *subject_credential; | ||
76 | |||
77 | /** | ||
78 | * Credential TTL | ||
79 | */ | ||
80 | static char *expiration; | ||
81 | |||
82 | /** | ||
83 | * Subject key | ||
84 | */ | ||
85 | struct GNUNET_CRYPTO_EcdsaPublicKey subject_pkey; | ||
86 | |||
87 | /** | ||
88 | * Issuer key | ||
89 | */ | ||
90 | struct GNUNET_CRYPTO_EcdsaPublicKey issuer_pkey; | ||
91 | |||
92 | |||
93 | /** | ||
94 | * Issuer pubkey string | ||
95 | */ | ||
96 | static char *issuer_key; | ||
97 | |||
98 | /** | ||
99 | * ego | ||
100 | */ | ||
101 | static char *ego_name; | ||
102 | |||
103 | /** | ||
104 | * Issuer attribute | ||
105 | */ | ||
106 | static char *issuer_attr; | ||
107 | |||
108 | /** | ||
109 | * Verify mode | ||
110 | */ | ||
111 | static int verify; | ||
112 | |||
113 | /** | ||
114 | * Issue mode | ||
115 | */ | ||
116 | static int create_cred; | ||
117 | |||
118 | /** | ||
119 | * Collect mode | ||
120 | */ | ||
121 | static int collect; | ||
122 | |||
123 | /** | ||
124 | * Task run on shutdown. Cleans up everything. | ||
125 | * | ||
126 | * @param cls unused | ||
127 | */ | ||
128 | static void | ||
129 | do_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 | */ | ||
154 | static void | ||
155 | do_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 | */ | ||
168 | static void | ||
169 | handle_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 | */ | ||
202 | static void | ||
203 | handle_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 | */ | ||
262 | static void | ||
263 | identity_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 | */ | ||
357 | static void | ||
358 | run (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 | */ | ||
537 | int | ||
538 | main (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 | |||
43 | struct VerifyRequestHandle; | ||
44 | |||
45 | struct DelegationSetQueueEntry; | ||
46 | |||
47 | |||
48 | struct 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 | */ | ||
84 | struct 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 | */ | ||
111 | struct 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 | */ | ||
148 | struct 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 | */ | ||
226 | struct 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 | */ | ||
330 | static struct VerifyRequestHandle *vrh_head; | ||
331 | |||
332 | /** | ||
333 | * Tail of the DLL. | ||
334 | */ | ||
335 | static struct VerifyRequestHandle *vrh_tail; | ||
336 | |||
337 | /** | ||
338 | * Handle to the statistics service | ||
339 | */ | ||
340 | static struct GNUNET_STATISTICS_Handle *statistics; | ||
341 | |||
342 | /** | ||
343 | * Handle to GNS service. | ||
344 | */ | ||
345 | static struct GNUNET_GNS_Handle *gns; | ||
346 | |||
347 | |||
348 | /** | ||
349 | * Handle to namestore service | ||
350 | */ | ||
351 | static struct GNUNET_NAMESTORE_Handle *namestore; | ||
352 | |||
353 | static void | ||
354 | cleanup_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 | |||
406 | static void | ||
407 | cleanup_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 | */ | ||
440 | static void | ||
441 | shutdown_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 | */ | ||
483 | static void | ||
484 | send_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 | |||
586 | static void | ||
587 | backward_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 | */ | ||
799 | static void | ||
800 | delegation_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 | */ | ||
868 | static int | ||
869 | check_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 | */ | ||
903 | static void | ||
904 | handle_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 | */ | ||
985 | static void | ||
986 | handle_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 | |||
995 | static void | ||
996 | collect_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 | */ | ||
1007 | static void | ||
1008 | handle_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 | */ | ||
1048 | static void | ||
1049 | handle_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 | */ | ||
1065 | static void | ||
1066 | handle_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 | */ | ||
1123 | static int | ||
1124 | check_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 | */ | ||
1158 | static void | ||
1159 | client_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 | */ | ||
1176 | static void * | ||
1177 | client_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 | */ | ||
1194 | static void | ||
1195 | run (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 | */ | ||
1221 | GNUNET_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 | */ | ||
45 | static char * | ||
46 | credential_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 | */ | ||
149 | static int | ||
150 | credential_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 | */ | ||
265 | static 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 | */ | ||
283 | static uint32_t | ||
284 | credential_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 | */ | ||
304 | static const char * | ||
305 | credential_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 | */ | ||
324 | void * | ||
325 | libgnunet_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 | */ | ||
344 | void * | ||
345 | libgnunet_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 | */ | ||
65 | struct Plugin | ||
66 | { | ||
67 | const struct GNUNET_CONFIGURATION_Handle *cfg; | ||
68 | }; | ||
69 | |||
70 | const struct GNUNET_CONFIGURATION_Handle *cfg; | ||
71 | |||
72 | struct 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 | */ | ||
167 | static void | ||
168 | cleanup_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 | */ | ||
203 | static void | ||
204 | do_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 | */ | ||
219 | static json_t* | ||
220 | attribute_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 | */ | ||
263 | static struct GNUNET_CREDENTIAL_Credential* | ||
264 | json_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 | */ | ||
333 | static json_t* | ||
334 | credential_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 | */ | ||
383 | static void | ||
384 | handle_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 | |||
447 | static void | ||
448 | subject_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 | */ | ||
480 | static void | ||
481 | handle_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 | |||
557 | static void | ||
558 | collect_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 | |||
659 | static void | ||
660 | verify_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 | |||
858 | void | ||
859 | send_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 | |||
922 | void | ||
923 | get_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 | |||
1046 | static void | ||
1047 | issue_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 | */ | ||
1070 | static void | ||
1071 | options_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 | */ | ||
1101 | static void | ||
1102 | rest_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 | */ | ||
1139 | void * | ||
1140 | libgnunet_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 | */ | ||
1166 | void * | ||
1167 | libgnunet_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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | TEST_ATTR2="test2" | ||
27 | gnunet-arm -s -c test_credential_lookup.conf | ||
28 | gnunet-identity -C testissuer -c test_credential_lookup.conf | ||
29 | gnunet-identity -C testsubject -c test_credential_lookup.conf | ||
30 | SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}') | ||
31 | ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}') | ||
32 | #TODO1 Get credential and store it with subject (3) | ||
33 | CRED=`$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 | ||
35 | CRED=`$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 | ||
37 | CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$ISSUER_KEY --attribute=$TEST_ATTR --ego=testsubject -c test_credential_lookup.conf | paste -d, -s` | ||
38 | echo $CREDS | ||
39 | RES=$? | ||
40 | gnunet-arm -e -c test_credential_lookup.conf | ||
41 | |||
42 | if test $? != 0 | ||
43 | then | ||
44 | echo "Error collecting..." | ||
45 | exit 1 | ||
46 | fi | ||
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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
25 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
26 | gnunet-arm -s -c test_credential_lookup.conf | ||
27 | gnunet-identity -C service -c test_credential_lookup.conf | ||
28 | gnunet-identity -C alice -c test_credential_lookup.conf | ||
29 | gnunet-identity -C gnu -c test_credential_lookup.conf | ||
30 | gnunet-identity -C gnunet -c test_credential_lookup.conf | ||
31 | |||
32 | GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}') | ||
33 | ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}') | ||
34 | GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}') | ||
35 | SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}') | ||
36 | |||
37 | USER_ATTR="user" | ||
38 | GNU_PROJECT_ATTR="project" | ||
39 | MEMBER_ATTR="member" | ||
40 | DEVELOPER_ATTR="developer" | ||
41 | DEV_ATTR="developer" | ||
42 | TEST_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 | ||
45 | gnunet-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 | ||
48 | gnunet-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" | ||
51 | gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf | ||
52 | gnunet-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" | ||
55 | CRED=`$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" | ||
58 | gnunet-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" | ||
61 | CRED=`$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" | ||
64 | gnunet-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 | |||
69 | gnunet-arm -i rest -c test_credential_lookup.conf | ||
70 | |||
71 | sleep 5 | ||
72 | |||
73 | curl -v "localhost:7776/credential/collect?attribute=$SERVICE_KEY.$USER_ATTR&subject=alice" | ||
74 | |||
75 | #TODO cleanup properly | ||
76 | gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf | ||
77 | gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf | ||
78 | gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf | ||
79 | gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf | ||
80 | echo "Stopping arm..." | ||
81 | gnunet-arm -e -c test_credential_lookup.conf | ||
82 | echo "Done" | ||
83 | if [ "$RES_CRED" != "Failed." ] | ||
84 | then | ||
85 | echo -e "${RES_CRED}" | ||
86 | exit 0 | ||
87 | else | ||
88 | echo "FAIL: Failed to verify credential $RES_CRED." | ||
89 | exit 1 | ||
90 | fi | ||
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] | ||
4 | GNUNET_TEST_HOME = /tmp/test-gnunet-credential-testing/ | ||
5 | |||
6 | [namestore-sqlite] | ||
7 | FILENAME = $GNUNET_TEST_HOME/namestore/sqlite_test.db | ||
8 | |||
9 | [namecache-sqlite] | ||
10 | FILENAME=$GNUNET_TEST_HOME/namecache/namecache.db | ||
11 | |||
12 | [identity] | ||
13 | # Directory where we store information about our egos | ||
14 | EGODIR = $GNUNET_TEST_HOME/identity/egos/ | ||
15 | |||
16 | [dhtcache] | ||
17 | DATABASE = heap | ||
18 | |||
19 | [transport] | ||
20 | PLUGINS = tcp | ||
21 | |||
22 | [transport-tcp] | ||
23 | BINDTO = 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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_credential_lookup.conf | ||
27 | gnunet-identity -C testissuer -c test_credential_lookup.conf | ||
28 | gnunet-identity -C testsubject -c test_credential_lookup.conf | ||
29 | SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}') | ||
30 | ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}') | ||
31 | #TODO1 Get credential and store it with subject (3) | ||
32 | CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf` | ||
33 | STATUS=$? | ||
34 | |||
35 | if test $? != 0 | ||
36 | then | ||
37 | echo "Error issuing..." | ||
38 | exit 1 | ||
39 | fi | ||
40 | #Try import | ||
41 | $DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf | ||
42 | RES=$? | ||
43 | gnunet-arm -e -c test_credential_lookup.conf | ||
44 | exit $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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_credential_lookup.conf | ||
27 | gnunet-arm -i gns | ||
28 | gnunet-arm -i credential | ||
29 | gnunet-arm -i identity | ||
30 | gnunet-arm -i rest -c test_credential_lookup.conf | ||
31 | |||
32 | gnunet-arm -I -c test_credential_lookup.conf | ||
33 | gnunet-identity -C testissuer -c test_credential_lookup.conf | ||
34 | gnunet-identity -C testsubject -c test_credential_lookup.conf | ||
35 | gnunet-identity -s credential-issuer -e testissuer | ||
36 | SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}') | ||
37 | ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}') | ||
38 | #TODO1 Get credential and store it with subject (3) | ||
39 | sleep 5 | ||
40 | curl "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` | ||
42 | STATUS=$? | ||
43 | |||
44 | if test $? != 0 | ||
45 | then | ||
46 | echo "Error issuing..." | ||
47 | exit 1 | ||
48 | fi | ||
49 | #Try import | ||
50 | #$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf | ||
51 | RES=$? | ||
52 | gnunet-arm -e -c test_credential_lookup.conf | ||
53 | exit $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] | ||
4 | GNUNET_TEST_HOME = /tmp/test-gnunet-credential-peer-1/ | ||
5 | |||
6 | [dht] | ||
7 | AUTOSTART = YES | ||
8 | |||
9 | [transport] | ||
10 | PLUGINS = | ||
11 | |||
12 | [credential] | ||
13 | AUTOSTART = YES | ||
14 | PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/credlog | ||
15 | |||
16 | [rest] | ||
17 | PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/restlog | ||
18 | |||
19 | [gns] | ||
20 | #PREFIX = valgrind --leak-check=full --track-origins=yes | ||
21 | AUTOSTART = YES | ||
22 | AUTO_IMPORT_PKEY = YES | ||
23 | MAX_PARALLEL_BACKGROUND_QUERIES = 10 | ||
24 | DEFAULT_LOOKUP_TIMEOUT = 15 s | ||
25 | RECORD_PUT_INTERVAL = 1 h | ||
26 | ZONE_PUBLISH_TIME_WINDOW = 1 h | ||
27 | DNS_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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
25 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
26 | gnunet-arm -s -c test_credential_lookup.conf | ||
27 | gnunet-identity -C service -c test_credential_lookup.conf | ||
28 | gnunet-identity -C alice -c test_credential_lookup.conf | ||
29 | gnunet-identity -C gnu -c test_credential_lookup.conf | ||
30 | gnunet-identity -C gnunet -c test_credential_lookup.conf | ||
31 | |||
32 | GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}') | ||
33 | ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}') | ||
34 | GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}') | ||
35 | SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}') | ||
36 | |||
37 | USER_ATTR="user" | ||
38 | GNU_PROJECT_ATTR="project" | ||
39 | MEMBER_ATTR="member" | ||
40 | DEVELOPER_ATTR="developer" | ||
41 | DEV_ATTR="developer" | ||
42 | TEST_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 | ||
45 | gnunet-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 | ||
48 | gnunet-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" | ||
51 | gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf | ||
52 | gnunet-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" | ||
55 | CRED=`$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" | ||
58 | gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf | ||
59 | |||
60 | CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --ego=alice -c test_credential_lookup.conf | paste -d, -s` | ||
61 | |||
62 | echo 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 | ||
64 | 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 | ||
68 | gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf | ||
69 | gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf | ||
70 | gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf | ||
71 | gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf | ||
72 | gnunet-arm -e -c test_credential_lookup.conf | ||
73 | |||
74 | if [ "$RES_CRED" != "Failed." ] | ||
75 | then | ||
76 | echo -e "${RES_CRED}" | ||
77 | exit 0 | ||
78 | else | ||
79 | echo "FAIL: Failed to verify credential $RES_CRED." | ||
80 | exit 1 | ||
81 | fi | ||
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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
25 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
26 | gnunet-arm -s -c test_credential_lookup.conf | ||
27 | gnunet-identity -C service -c test_credential_lookup.conf | ||
28 | gnunet-identity -C alice -c test_credential_lookup.conf | ||
29 | gnunet-identity -C gnu -c test_credential_lookup.conf | ||
30 | gnunet-identity -C gnunet -c test_credential_lookup.conf | ||
31 | |||
32 | GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}') | ||
33 | ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}') | ||
34 | GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}') | ||
35 | SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}') | ||
36 | |||
37 | USER_ATTR="user" | ||
38 | GNU_PROJECT_ATTR="project" | ||
39 | MEMBER_ATTR="member" | ||
40 | DEVELOPER_ATTR="developer" | ||
41 | DEV_ATTR="developer" | ||
42 | TEST_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 | ||
45 | gnunet-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 | ||
48 | gnunet-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" | ||
51 | gnunet-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" | ||
54 | CRED1=`$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" | ||
56 | CRED2=`$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" | ||
58 | gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED1" -e 5m -c test_credential_lookup.conf | ||
59 | gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED2" -e 5m -c test_credential_lookup.conf | ||
60 | |||
61 | CREDS=`$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 | ||
64 | RES_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 | ||
68 | gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf | ||
69 | gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf | ||
70 | gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf | ||
71 | gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf | ||
72 | gnunet-arm -e -c test_credential_lookup.conf | ||
73 | |||
74 | if [ "$RES_CRED" != "Failed." ] | ||
75 | then | ||
76 | echo -e "${RES_CRED}" | ||
77 | exit 0 | ||
78 | else | ||
79 | echo "FAIL: Failed to verify credential $RES_CRED." | ||
80 | exit 1 | ||
81 | fi | ||
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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
25 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
26 | gnunet-arm -s -c test_credential_lookup.conf | ||
27 | gnunet-identity -C service -c test_credential_lookup.conf | ||
28 | gnunet-identity -C alice -c test_credential_lookup.conf | ||
29 | gnunet-identity -C gnu -c test_credential_lookup.conf | ||
30 | gnunet-identity -C gnunet -c test_credential_lookup.conf | ||
31 | |||
32 | GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}') | ||
33 | ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}') | ||
34 | GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}') | ||
35 | SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}') | ||
36 | |||
37 | USER_ATTR="user" | ||
38 | GNU_PROJECT_ATTR="project" | ||
39 | MEMBER_ATTR="member" | ||
40 | DEVELOPER_ATTR="developer" | ||
41 | DEV_ATTR="developer" | ||
42 | TEST_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 | ||
45 | gnunet-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 | ||
48 | gnunet-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" | ||
51 | gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf | ||
52 | gnunet-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" | ||
55 | CRED=`$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" | ||
58 | gnunet-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 | |||
63 | gnunet-arm -i rest -c test_credential_lookup.conf | ||
64 | |||
65 | sleep 5 | ||
66 | |||
67 | CREDS=`curl "localhost:7776/credential/collect?attribute=$SERVICE_KEY.$USER_ATTR&subject=alice"` | ||
68 | |||
69 | echo $CREDS | ||
70 | |||
71 | curl -v "localhost:7776/credential/verify?attribute=$SERVICE_KEY.$USER_ATTR&subject_key=$ALICE_KEY" --data "$CREDS" | ||
72 | |||
73 | #TODO cleanup properly | ||
74 | gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf | ||
75 | gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf | ||
76 | gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf | ||
77 | gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf | ||
78 | gnunet-arm -e -c test_credential_lookup.conf | ||
79 | |||
80 | if [ "$RES_CRED" != "Failed." ] | ||
81 | then | ||
82 | echo -e "${RES_CRED}" | ||
83 | exit 0 | ||
84 | else | ||
85 | echo "FAIL: Failed to verify credential $RES_CRED." | ||
86 | exit 1 | ||
87 | fi | ||
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 | ||
2 | trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f` | ||
17 | |||
18 | # (3) Isser.user -> Subject | ||
19 | |||
20 | |||
21 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
22 | gnunet-arm -s -c test_credential_lookup.conf | ||
23 | gnunet-identity -C testissuer -c test_credential_lookup.conf | ||
24 | gnunet-identity -C testsubject -c test_credential_lookup.conf | ||
25 | |||
26 | TEST_ATTR="user" | ||
27 | SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}') | ||
28 | ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}') | ||
29 | CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf` | ||
30 | |||
31 | TEST_CREDENTIAL="t1" | ||
32 | gnunet-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` | ||
36 | RES_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 | ||
39 | gnunet-namestore -z testsubject -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf | ||
40 | gnunet-identity -D testsubject -c test_credential_lookup.conf | ||
41 | gnunet-arm -e -c test_credential_lookup.conf | ||
42 | echo $RES_CRED | ||
43 | #TODO3 proper test | ||
44 | if [ "$RES_CRED" == "Successful." ] | ||
45 | then | ||
46 | exit 0 | ||
47 | else | ||
48 | echo "FAIL: Failed to verify credential." | ||
49 | exit 1 | ||
50 | fi | ||
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 | ||
2 | AM_CPPFLAGS = -I$(top_srcdir)/src/include | ||
3 | |||
4 | plugindir = $(libdir)/gnunet | ||
5 | |||
6 | pkgcfgdir= $(pkgdatadir)/config.d/ | ||
7 | |||
8 | libexecdir= $(pkglibdir)/libexec/ | ||
9 | |||
10 | if MINGW | ||
11 | WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols | ||
12 | endif | ||
13 | |||
14 | if USE_COVERAGE | ||
15 | AM_CFLAGS = --coverage -O0 | ||
16 | XLIBS = -lgcov | ||
17 | endif | ||
18 | |||
19 | lib_LTLIBRARIES = \ | ||
20 | libgnunetidentityattribute.la | ||
21 | |||
22 | libgnunetidentityattribute_la_SOURCES = \ | ||
23 | identity_attribute.c | ||
24 | libgnunetidentityattribute_la_LIBADD = \ | ||
25 | $(top_builddir)/src/util/libgnunetutil.la \ | ||
26 | $(GN_LIBINTL) | ||
27 | libgnunetidentityattribute_la_LDFLAGS = \ | ||
28 | $(GN_LIB_LDFLAGS) $(WINFLAGS) \ | ||
29 | -version-info 0:0:0 | ||
30 | |||
31 | |||
32 | plugin_LTLIBRARIES = \ | ||
33 | libgnunet_plugin_identity_attribute_gnuid.la | ||
34 | |||
35 | |||
36 | libgnunet_plugin_identity_attribute_gnuid_la_SOURCES = \ | ||
37 | plugin_identity_attribute_gnuid.c | ||
38 | libgnunet_plugin_identity_attribute_gnuid_la_LIBADD = \ | ||
39 | $(top_builddir)/src/util/libgnunetutil.la \ | ||
40 | $(LTLIBINTL) | ||
41 | libgnunet_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 | */ | ||
39 | struct GNUNET_IDENTITY_ATTRIBUTE_Claim * | ||
40 | GNUNET_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 | |||
67 | size_t | ||
68 | GNUNET_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 | |||
77 | size_t | ||
78 | GNUNET_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 | |||
98 | struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList * | ||
99 | GNUNET_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 | |||
129 | struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList* | ||
130 | GNUNET_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 | |||
155 | void | ||
156 | GNUNET_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 | |||
172 | size_t | ||
173 | GNUNET_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 | |||
180 | size_t | ||
181 | GNUNET_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 | |||
207 | struct GNUNET_IDENTITY_ATTRIBUTE_Claim * | ||
208 | GNUNET_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 | |||
31 | struct 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 | */ | ||
43 | static char * | ||
44 | gnuid_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 | */ | ||
71 | static int | ||
72 | gnuid_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 | */ | ||
97 | static 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 | */ | ||
113 | static uint32_t | ||
114 | gnuid_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 | */ | ||
135 | static const char * | ||
136 | gnuid_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 | */ | ||
155 | void * | ||
156 | libgnunet_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 | */ | ||
175 | void * | ||
176 | libgnunet_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 |
13 | endif | 13 | endif |
14 | 14 | ||
15 | if HAVE_SQLITE | ||
16 | SQLITE_PLUGIN = libgnunet_plugin_identity_provider_sqlite.la | ||
17 | endif | ||
18 | |||
19 | EXTRA_DIST = \ | ||
20 | test_idp_defaults.conf \ | ||
21 | test_idp.conf \ | ||
22 | $(check_SCRIPTS) | ||
23 | |||
15 | pkgcfgdir= $(pkgdatadir)/config.d/ | 24 | pkgcfgdir= $(pkgdatadir)/config.d/ |
16 | 25 | ||
17 | libexecdir= $(pkglibdir)/libexec/ | 26 | libexecdir= $(pkglibdir)/libexec/ |
@@ -22,26 +31,50 @@ pkgcfg_DATA = \ | |||
22 | lib_LTLIBRARIES = \ | 31 | lib_LTLIBRARIES = \ |
23 | libgnunetidentityprovider.la | 32 | libgnunetidentityprovider.la |
24 | plugin_LTLIBRARIES = \ | 33 | plugin_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 | ||
27 | bin_PROGRAMS = \ | 38 | bin_PROGRAMS = \ |
28 | gnunet-identity-token | 39 | gnunet-idp |
29 | 40 | ||
30 | libexec_PROGRAMS = \ | 41 | libexec_PROGRAMS = \ |
31 | gnunet-service-identity-provider | 42 | gnunet-service-identity-provider |
32 | 43 | ||
44 | libgnunet_plugin_gnsrecord_identity_provider_la_SOURCES = \ | ||
45 | plugin_gnsrecord_identity_provider.c | ||
46 | libgnunet_plugin_gnsrecord_identity_provider_la_LIBADD = \ | ||
47 | $(top_builddir)/src/util/libgnunetutil.la \ | ||
48 | $(LTLIBINTL) | ||
49 | libgnunet_plugin_gnsrecord_identity_provider_la_LDFLAGS = \ | ||
50 | $(GN_PLUGIN_LDFLAGS) | ||
51 | |||
52 | libgnunet_plugin_identity_provider_sqlite_la_SOURCES = \ | ||
53 | plugin_identity_provider_sqlite.c | ||
54 | libgnunet_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) | ||
60 | libgnunet_plugin_identity_provider_sqlite_la_LDFLAGS = \ | ||
61 | $(GN_PLUGIN_LDFLAGS) | ||
62 | |||
63 | |||
64 | |||
33 | gnunet_service_identity_provider_SOURCES = \ | 65 | gnunet_service_identity_provider_SOURCES = \ |
34 | gnunet-service-identity-provider.c \ | 66 | gnunet-service-identity-provider.c |
35 | identity_token.c | ||
36 | gnunet_service_identity_provider_LDADD = \ | 67 | gnunet_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 | ||
46 | libgnunetidentityprovider_la_SOURCES = \ | 79 | libgnunetidentityprovider_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 |
66 | libgnunet_plugin_rest_identity_provider_la_LDFLAGS = \ | 100 | libgnunet_plugin_rest_identity_provider_la_LDFLAGS = \ |
67 | $(GN_PLUGIN_LDFLAGS) | 101 | $(GN_PLUGIN_LDFLAGS) |
68 | 102 | ||
69 | 103 | gnunet_idp_SOURCES = \ | |
70 | gnunet_identity_token_SOURCES = \ | 104 | gnunet-idp.c |
71 | gnunet-identity-token.c | 105 | gnunet_idp_LDADD = \ |
72 | gnunet_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 | |||
113 | check_SCRIPTS = \ | ||
114 | test_idp_attribute.sh \ | ||
115 | test_idp_issue.sh \ | ||
116 | test_idp_consume.sh \ | ||
117 | test_idp_revoke.sh | ||
118 | |||
119 | if 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) | ||
122 | endif | ||
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 | */ | ||
35 | static char* token; | ||
36 | |||
37 | /** | ||
38 | * Weather to print the token | ||
39 | */ | ||
40 | static int print_token; | ||
41 | |||
42 | static void | ||
43 | run (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 | |||
158 | int | ||
159 | main(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 | */ | ||
37 | static int ret; | ||
38 | |||
39 | /** | ||
40 | * List attribute flag | ||
41 | */ | ||
42 | static int list; | ||
43 | |||
44 | /** | ||
45 | * Relying party | ||
46 | */ | ||
47 | static char* rp; | ||
48 | |||
49 | /** | ||
50 | * The attribute | ||
51 | */ | ||
52 | static char* attr_name; | ||
53 | |||
54 | /** | ||
55 | * Attribute value | ||
56 | */ | ||
57 | static char* attr_value; | ||
58 | |||
59 | /** | ||
60 | * Attributes to issue | ||
61 | */ | ||
62 | static char* issue_attrs; | ||
63 | |||
64 | /** | ||
65 | * Ticket to consume | ||
66 | */ | ||
67 | static char* consume_ticket; | ||
68 | |||
69 | /** | ||
70 | * Ticket to revoke | ||
71 | */ | ||
72 | static char* revoke_ticket; | ||
73 | |||
74 | /** | ||
75 | * Ego name | ||
76 | */ | ||
77 | static char* ego_name; | ||
78 | |||
79 | /** | ||
80 | * Identity handle | ||
81 | */ | ||
82 | static struct GNUNET_IDENTITY_Handle *identity_handle; | ||
83 | |||
84 | /** | ||
85 | * IdP handle | ||
86 | */ | ||
87 | static struct GNUNET_IDENTITY_PROVIDER_Handle *idp_handle; | ||
88 | |||
89 | /** | ||
90 | * IdP operation | ||
91 | */ | ||
92 | static struct GNUNET_IDENTITY_PROVIDER_Operation *idp_op; | ||
93 | |||
94 | /** | ||
95 | * Attribute iterator | ||
96 | */ | ||
97 | static struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *attr_iterator; | ||
98 | |||
99 | /** | ||
100 | * Master ABE key | ||
101 | */ | ||
102 | static struct GNUNET_CRYPTO_AbeMasterKey *abe_key; | ||
103 | |||
104 | /** | ||
105 | * ego private key | ||
106 | */ | ||
107 | static const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey; | ||
108 | |||
109 | /** | ||
110 | * rp public key | ||
111 | */ | ||
112 | static struct GNUNET_CRYPTO_EcdsaPublicKey rp_key; | ||
113 | |||
114 | /** | ||
115 | * Ticket to consume | ||
116 | */ | ||
117 | static struct GNUNET_IDENTITY_PROVIDER_Ticket ticket; | ||
118 | |||
119 | /** | ||
120 | * Attribute list | ||
121 | */ | ||
122 | static struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attr_list; | ||
123 | |||
124 | static void | ||
125 | do_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 | |||
139 | static void | ||
140 | ticket_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 | |||
154 | static void | ||
155 | store_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 | |||
166 | static void | ||
167 | process_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 | |||
186 | static void | ||
187 | iter_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 | |||
195 | static void | ||
196 | process_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 | |||
207 | static void | ||
208 | iter_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 | |||
260 | static void | ||
261 | iter_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 | |||
296 | static void | ||
297 | ego_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 | |||
338 | static void | ||
339 | run (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 | |||
362 | int | ||
363 | main(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 | */ | ||
63 | static int state; | ||
64 | |||
65 | /** | ||
66 | * Head of ego entry DLL | ||
67 | */ | 63 | */ |
68 | static struct EgoEntry *ego_head; | 64 | static struct GNUNET_IDENTITY_Handle *identity_handle; |
69 | 65 | ||
70 | /** | 66 | /** |
71 | * Tail of ego entry DLL | 67 | * Database handle |
72 | */ | 68 | */ |
73 | static struct EgoEntry *ego_tail; | 69 | static struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *TKT_database; |
74 | 70 | ||
75 | /** | 71 | /** |
76 | * Identity handle | 72 | * Name of DB plugin |
77 | */ | 73 | */ |
78 | static struct GNUNET_IDENTITY_Handle *identity_handle; | 74 | static 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; | |||
93 | static struct GNUNET_GNS_Handle *gns_handle; | 89 | static struct GNUNET_GNS_Handle *gns_handle; |
94 | 90 | ||
95 | /** | 91 | /** |
92 | * Credential handle | ||
93 | */ | ||
94 | static struct GNUNET_CREDENTIAL_Handle *credential_handle; | ||
95 | |||
96 | /** | ||
97 | * Stats handle | ||
98 | */ | ||
99 | static struct GNUNET_STATISTICS_Handle *stats_handle; | ||
100 | |||
101 | /** | ||
96 | * Namestore qe | 102 | * Namestore qe |
97 | */ | 103 | */ |
98 | static struct GNUNET_NAMESTORE_QueueEntry *ns_qe; | 104 | static struct GNUNET_NAMESTORE_QueueEntry *ns_qe; |
@@ -112,11 +118,6 @@ static struct GNUNET_SCHEDULER_Task *timeout_task; | |||
112 | */ | 118 | */ |
113 | static struct GNUNET_SCHEDULER_Task *update_task; | 119 | static struct GNUNET_SCHEDULER_Task *update_task; |
114 | 120 | ||
115 | /** | ||
116 | * Timeout for next update pass | ||
117 | */ | ||
118 | static 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; | |||
134 | static char* scopes; | 135 | static char* scopes; |
135 | 136 | ||
136 | /** | 137 | /** |
137 | * Expiration for processed token | 138 | * Handle to the statistics service. |
138 | */ | 139 | */ |
139 | static uint64_t rd_exp; | 140 | static struct GNUNET_STATISTICS_Handle *stats; |
140 | 141 | ||
141 | /** | 142 | /** |
142 | * ECDHE Privkey for processed token metadata | 143 | * Our configuration. |
143 | */ | 144 | */ |
144 | static struct GNUNET_CRYPTO_EcdhePrivateKey ecdhe_privkey; | 145 | static const struct GNUNET_CONFIGURATION_Handle *cfg; |
145 | 146 | ||
146 | /** | 147 | /** |
147 | * Handle to the statistics service. | 148 | * An idp client |
148 | */ | 149 | */ |
149 | static struct GNUNET_STATISTICS_Handle *stats; | 150 | struct IdpClient; |
150 | 151 | ||
151 | /** | 152 | /** |
152 | * Our configuration. | 153 | * A ticket iteration operation. |
153 | */ | 154 | */ |
154 | static const struct GNUNET_CONFIGURATION_Handle *cfg; | 155 | struct 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 | */ | ||
206 | typedef void | ||
207 | (*AbeBootstrapResult) (void *cls, | ||
208 | struct GNUNET_CRYPTO_AbeMasterKey *abe_key); | ||
155 | 209 | ||
156 | 210 | ||
157 | struct ExchangeHandle | 211 | struct 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 | */ | ||
242 | struct 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 | */ | ||
286 | struct 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 | |||
337 | struct 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 */ | ||
378 | struct ParallelLookup; | ||
379 | |||
380 | struct 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 | ||
196 | struct IssueHandle | 444 | /** |
445 | * Handle for a parallel GNS lookup job | ||
446 | */ | ||
447 | struct 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 | */ | ||
473 | struct 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 | */ | ||
541 | struct 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 | */ | ||
607 | static void | ||
608 | cleanup() | ||
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 | */ |
652 | static void | ||
653 | do_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 | */ |
309 | static void | 663 | static void |
310 | store_token_cont (void *cls, | 664 | bootstrap_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 | */ | ||
686 | static void | ||
687 | bootstrap_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 | */ |
332 | static void | 712 | static void |
333 | handle_token_update (void *cls) | 713 | bootstrap_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) | 725 | static void |
389 | { | 726 | bootstrap_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 | */ | ||
756 | static void | ||
757 | bootstrap_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 | |||
785 | static int | ||
786 | create_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 | |||
502 | static void | 808 | static void |
503 | update_identities(void *cls); | 809 | cleanup_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 | /** | 819 | static void |
507 | * | 820 | send_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; |
515 | static int | 828 | |
516 | clear_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 | |||
540 | static void | 849 | static void |
541 | token_collect_error_cb (void *cls) | 850 | store_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 | |||
874 | int | ||
875 | serialize_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 | |||
558 | static void | 952 | static void |
559 | token_collect_finished_cb (void *cls) | 953 | issue_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 | */ |
585 | static void | 1030 | static int |
586 | token_collect (void *cls, | 1031 | check_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 | */ | ||
1054 | static void | ||
1055 | handle_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 | */ | ||
1086 | static void | ||
1087 | cleanup_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 | */ | ||
645 | static void | 1106 | static void |
646 | attribute_collect_error_cb (void *cls) | 1107 | send_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 | */ | ||
1132 | static void | ||
1133 | ticket_reissue_proc (void *cls, | ||
1134 | const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket, | ||
1135 | const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs); | ||
1136 | |||
658 | static void | 1137 | static void |
659 | attribute_collect_finished_cb (void *cls) | 1138 | revocation_reissue_tickets (struct TicketRevocationHandle *rh); |
1139 | |||
1140 | |||
1141 | static 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"); | 1148 | static void |
665 | ego_entry->attributes_dirty = GNUNET_NO; | 1149 | reissue_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 | */ |
682 | static void | 1176 | static void |
683 | attribute_collect (void *cls, | 1177 | ticket_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 | */ | ||
759 | static void | ||
760 | update_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 */ | ||
1302 | static void | ||
1303 | attr_reenc_cont (void *cls, | ||
1304 | int32_t success, | ||
1305 | const char *emsg); | ||
1306 | |||
1307 | static void | ||
1308 | revocation_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 | */ |
814 | static void | 1335 | static void |
815 | init_cont () | 1336 | reenc_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 | */ |
832 | static void | 1400 | static void |
833 | list_ego (void *cls, | 1401 | attr_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 | */ | ||
858 | static void | 1437 | static void |
859 | cleanup() | 1438 | process_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); | 1464 | static void |
903 | ego_entry = ego_entry->next; | 1465 | get_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 | */ |
914 | static void | 1485 | static int |
915 | do_shutdown (void *cls) | 1486 | check_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 | ||
923 | static struct GNUNET_MQ_Envelope* | 1491 | size = ntohs (im->header.size); |
924 | create_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 | * | |
943 | static struct GNUNET_MQ_Envelope* | 1501 | * Handler for ticket revocation message |
944 | create_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 | */ | ||
1507 | static void | ||
1508 | handle_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 | ||
965 | static void | ||
966 | cleanup_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 | ||
981 | static void | 1533 | static void |
982 | store_token_issue_cont (void *cls, | 1534 | cleanup_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 | */ |
1038 | static void | 1553 | static int |
1039 | sign_and_return_token (void *cls) | 1554 | check_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 | ||
1119 | static void | 1568 | static void |
1120 | attr_collect_error (void *cls) | 1569 | process_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 | 1660 | void | |
1130 | static void | 1661 | abort_parallel_lookups2 (void *cls) |
1131 | attr_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 | */ | ||
1144 | static void | 1689 | static void |
1145 | attr_collect (void *cls, | 1690 | process_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 | */ | ||
1792 | static void | ||
1793 | handle_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 | ||
1207 | static void | 1830 | static void |
1208 | cleanup_exchange_handle (struct ExchangeHandle *handle) | 1831 | cleanup_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 | ||
1217 | static void | 1840 | static void |
1218 | process_lookup_result (void *cls, uint32_t rd_count, | 1841 | attr_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 | |
1870 | static void | ||
1871 | attr_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 | |||
1932 | static void | ||
1933 | store_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 | */ |
1270 | static int | 1950 | static int |
1271 | check_exchange_message (void *cls, | 1951 | check_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 | */ |
1293 | static void | 1974 | static void |
1294 | handle_exchange_message (void *cls, | 1975 | handle_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 | ||
2000 | static void | ||
2001 | cleanup_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 | ||
1337 | static void | 2011 | static void |
1338 | find_existing_token_error (void *cls) | 2012 | attr_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 | ||
2022 | static void | ||
2023 | attr_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 | ||
1347 | static void | 2037 | static void |
1348 | find_existing_token_finished (void *cls) | 2038 | attr_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 | |||
2100 | void | ||
2101 | iterate_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 | ||
2116 | void | ||
2117 | iterate_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 | 2133 | static void |
1379 | * @param lbl the name of the record | 2134 | handle_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 | */ |
1384 | static void | 2161 | static void |
1385 | find_existing_token (void *cls, | 2162 | handle_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 | } | 2196 | static void |
1414 | if (token_metadata_record->record_type != GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA) | 2197 | handle_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 | */ | ||
2226 | enum 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 | */ | ||
2249 | struct 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 | |||
2267 | static void | ||
2268 | cleanup_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 | */ | ||
2280 | static void | ||
2281 | ticket_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 | */ |
2307 | static void | ||
2308 | run_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 | */ |
1497 | static int | 2359 | static void |
1498 | check_issue_message(void *cls, | 2360 | handle_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 | */ | ||
2389 | static void | ||
2390 | handle_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 | */ |
1528 | static void | 2424 | static void |
1529 | handle_issue_message (void *cls, | 2425 | handle_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 | |||
10 | UNIX_MATCH_UID = NO | 10 | UNIX_MATCH_UID = NO |
11 | UNIX_MATCH_GID = YES | 11 | UNIX_MATCH_GID = YES |
12 | TOKEN_EXPIRATION_INTERVAL = 30 m | 12 | TOKEN_EXPIRATION_INTERVAL = 30 m |
13 | DATABASE = sqlite | ||
14 | |||
15 | [identity-provider-sqlite] | ||
16 | FILENAME = $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 @@ | |||
34 | GNUNET_NETWORK_STRUCT_BEGIN | 34 | GNUNET_NETWORK_STRUCT_BEGIN |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * The token | 37 | * Use to store an identity attribute |
38 | */ | 38 | */ |
39 | struct GNUNET_IDENTITY_PROVIDER_Token | 39 | struct 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 | */ |
50 | struct GNUNET_IDENTITY_PROVIDER_Ticket | 68 | struct 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 | */ | ||
90 | struct 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 | */ | ||
126 | struct 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 | */ | ||
149 | struct 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 | */ | ||
167 | struct 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 | */ |
61 | struct IssueResultMessage | 184 | struct 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 | */ |
81 | struct ExchangeResultMessage | 211 | struct 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 | */ | ||
229 | struct 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 | */ |
108 | struct IssueMessage | 248 | struct 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 | */ | ||
281 | struct 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 | */ | ||
309 | struct 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 | */ |
150 | struct ExchangeMessage | 331 | struct 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 | */ | ||
348 | struct 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 | */ | ||
371 | struct 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 | |||
172 | GNUNET_NETWORK_STRUCT_END | 405 | GNUNET_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 | */ | ||
105 | struct 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 | */ | ||
170 | struct 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 | */ | ||
367 | static void | ||
368 | free_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 | */ | ||
405 | static void | ||
406 | handle_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 | */ |
221 | static int | 451 | static int |
222 | check_exchange_result (void *cls, | 452 | check_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 | */ | ||
476 | static void | ||
477 | handle_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 | */ |
246 | static int | 539 | static int |
247 | check_result (void *cls, | 540 | check_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 | */ |
268 | static void | 564 | static void |
269 | handle_exchange_result (void *cls, | 565 | handle_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 | */ | ||
652 | static int | ||
653 | check_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 | */ |
304 | static void | 676 | static void |
305 | handle_result (void *cls, | 677 | handle_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 | */ | ||
738 | static void | ||
739 | handle_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 | |||
364 | reconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h) | 781 | reconnect (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 | */ | ||
428 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
429 | GNUNET_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 | */ | ||
481 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
482 | GNUNET_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 | */ | ||
904 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
905 | GNUNET_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 | */ | ||
967 | struct GNUNET_IDENTITY_PROVIDER_AttributeIterator * | ||
968 | GNUNET_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 | */ |
1015 | void | ||
1016 | GNUNET_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 | */ |
578 | void | 1037 | void |
579 | GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token) | 1038 | GNUNET_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 | */ | ||
1069 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
1070 | GNUNET_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 | */ | ||
1118 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
1119 | GNUNET_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 | */ |
593 | char * | 1171 | struct GNUNET_IDENTITY_PROVIDER_TicketIterator * |
594 | GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token) | 1172 | GNUNET_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 | */ |
605 | char * | 1234 | struct GNUNET_IDENTITY_PROVIDER_TicketIterator * |
606 | GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) | 1235 | GNUNET_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 | */ |
618 | int | 1283 | void |
619 | GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input, | 1284 | GNUNET_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 | */ |
633 | void | 1305 | void |
634 | GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) | 1306 | GNUNET_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 | */ | ||
1334 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
1335 | GNUNET_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 | |||
45 | static int | ||
46 | create_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 | */ | ||
73 | static int | ||
74 | decrypt_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 | */ | ||
122 | static int | ||
123 | decrypt_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 | */ | ||
153 | static int | ||
154 | encrypt_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 | */ | ||
202 | struct IdentityToken* | ||
203 | token_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 | |||
225 | void | ||
226 | token_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 | |||
259 | void | ||
260 | token_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 | |||
290 | void | ||
291 | token_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 | |||
321 | static void | ||
322 | parse_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 | |||
366 | int | ||
367 | token_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 | |||
410 | int | ||
411 | token_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 | |||
461 | static char* | ||
462 | create_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 | |||
491 | static char* | ||
492 | create_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 | |||
506 | int | ||
507 | token_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 | |||
573 | int | ||
574 | token_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 | |||
607 | struct TokenTicketPayload* | ||
608 | ticket_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 | |||
621 | void | ||
622 | ticket_payload_destroy (struct TokenTicketPayload* payload) | ||
623 | { | ||
624 | if (NULL != payload->label) | ||
625 | GNUNET_free (payload->label); | ||
626 | GNUNET_free (payload); | ||
627 | } | ||
628 | |||
629 | void | ||
630 | ticket_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 | */ | ||
653 | struct TokenTicket* | ||
654 | ticket_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 | |||
673 | void | ||
674 | ticket_destroy (struct TokenTicket *ticket) | ||
675 | { | ||
676 | ticket_payload_destroy (ticket->payload); | ||
677 | GNUNET_free (ticket); | ||
678 | } | ||
679 | |||
680 | int | ||
681 | ticket_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 | |||
747 | int | ||
748 | ticket_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 | |||
840 | int | ||
841 | ticket_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 | |||
32 | struct 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 | |||
55 | struct 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 | |||
84 | struct 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 | |||
108 | struct 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 | |||
127 | struct 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 | */ | ||
160 | struct IdentityToken* | ||
161 | token_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 | */ | ||
169 | void | ||
170 | token_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 | */ | ||
179 | void | ||
180 | token_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 | */ | ||
191 | void | ||
192 | token_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 | */ | ||
269 | int | ||
270 | token_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 | */ | ||
303 | struct TokenTicket* | ||
304 | ticket_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 | */ | ||
329 | void | ||
330 | ticket_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 | */ | ||
341 | int | ||
342 | ticket_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 | |||
42 | static char* | ||
43 | create_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 | */ | ||
64 | char* | ||
65 | jwt_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 { | 177 | static 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 | */ |
222 | void * | 238 | void * |
223 | libgnunet_plugin_gnsrecord_identity_init (void *cls) | 239 | libgnunet_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 | */ |
242 | void * | 258 | void * |
243 | libgnunet_plugin_gnsrecord_identity_done (void *cls) | 259 | libgnunet_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 | */ | ||
60 | struct 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 | */ | ||
110 | static int | ||
111 | sq_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 | */ | ||
137 | static void | ||
138 | create_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 | */ | ||
174 | static int | ||
175 | database_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 | */ | ||
316 | static void | ||
317 | database_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 | */ | ||
373 | static int | ||
374 | identity_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 | */ | ||
461 | static int | ||
462 | identity_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 | */ | ||
522 | static int | ||
523 | get_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 | */ | ||
590 | static int | ||
591 | identity_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 | */ | ||
632 | static int | ||
633 | identity_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 | */ | ||
688 | void * | ||
689 | libgnunet_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 | */ | ||
722 | void * | ||
723 | libgnunet_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 | ||
291 | static void | ||
292 | cleanup_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 | */ | ||
371 | static void | 334 | static void |
372 | do_cleanup_handle_delayed (void *cls) | 335 | collect_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 | */ | ||
385 | static void | 342 | static void |
386 | token_creat_cont (void *cls, | 343 | finished_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); | 366 | static void |
414 | GNUNET_JSONAPI_resource_add_attr (json_resource, | 367 | return_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 | |||
382 | static void | ||
383 | collect_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 | */ |
442 | static void | 397 | static void |
443 | issue_token_cont (struct GNUNET_REST_RequestHandle *con, | 398 | ticket_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 | */ | ||
450 | static void | ||
451 | list_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 | ||
499 | static void | ||
500 | add_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 | */ | ||
636 | static void | ||
637 | return_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 | ||
652 | static void | ||
653 | token_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 | */ |
667 | static void | 620 | static void |
668 | token_collect (void *cls, | 621 | attr_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 | |||
675 | static void | ||
676 | token_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 | */ | ||
720 | static void | ||
721 | token_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 | */ |
772 | static void | 658 | static void |
773 | list_token_cont (struct GNUNET_REST_RequestHandle *con_handle, | 659 | list_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 | */ | ||
842 | static void | 708 | static void |
843 | exchange_cont (void *cls, | 709 | revoke_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 | */ | ||
909 | static void | 834 | static void |
910 | exchange_token_ticket_cb (void *cls, | 835 | consume_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 | |||
862 | static void | ||
863 | consume_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 | */ | ||
967 | static void | ||
968 | exchange_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 | */ |
1106 | static void | 1117 | static void |
1107 | rest_identity_process_request(struct GNUNET_REST_RequestHandle *conndata_handle, | 1118 | rest_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] | ||
4 | GNUNET_TEST_HOME = /tmp/test-gnunet-idp-peer-1/ | ||
5 | |||
6 | [dht] | ||
7 | AUTOSTART = YES | ||
8 | |||
9 | [rest] | ||
10 | AUTOSTART = YES | ||
11 | #PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/restlog | ||
12 | |||
13 | [transport] | ||
14 | PLUGINS = | ||
15 | |||
16 | [identity-provider] | ||
17 | AUTOSTART = 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 | ||
22 | AUTOSTART = YES | ||
23 | AUTO_IMPORT_PKEY = YES | ||
24 | MAX_PARALLEL_BACKGROUND_QUERIES = 10 | ||
25 | DEFAULT_LOOKUP_TIMEOUT = 15 s | ||
26 | RECORD_PUT_INTERVAL = 1 h | ||
27 | ZONE_PUBLISH_TIME_WINDOW = 1 h | ||
28 | DNS_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 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_idp.conf | ||
27 | gnunet-identity -C testego -c test_idp.conf | ||
28 | valgrind gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf | ||
29 | gnunet-idp -e testego -a name -V John -c test_idp.conf | ||
30 | gnunet-idp -e testego -D -c test_idp.conf | ||
31 | gnunet-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 | ||
2 | trap "gnunet-arm -e -c test_idp.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_idp.conf | ||
27 | #gnunet-arm -i rest -c test_idp.conf | ||
28 | gnunet-identity -C testego -c test_idp.conf | ||
29 | gnunet-identity -C rpego -c test_idp.conf | ||
30 | TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}') | ||
31 | gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf | ||
32 | gnunet-idp -e testego -a name -V John -c test_idp.conf > /dev/null 2>&1 | ||
33 | if test $? != 0 | ||
34 | then | ||
35 | echo "Failed." | ||
36 | exit 1 | ||
37 | fi | ||
38 | |||
39 | #curl localhost:7776/idp/attributes/testego | ||
40 | gnunet-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 | ||
2 | trap "gnunet-arm -e -c test_idp.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_idp.conf | ||
27 | #gnunet-arm -i rest -c test_idp.conf | ||
28 | gnunet-identity -C testego -c test_idp.conf | ||
29 | gnunet-identity -C rpego -c test_idp.conf | ||
30 | SUBJECT_KEY=$(gnunet-identity -d -c test_idp.conf | grep rpego | awk '{print $3}') | ||
31 | TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}') | ||
32 | gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf | ||
33 | gnunet-idp -e testego -a name -V John -c test_idp.conf | ||
34 | TICKET=$(gnunet-idp -e testego -i "email,name" -r $SUBJECT_KEY -c test_idp.conf | awk '{print $1}') | ||
35 | gnunet-idp -e rpego -C $TICKET -c test_idp.conf > /dev/null 2>&1 | ||
36 | |||
37 | if test $? != 0 | ||
38 | then | ||
39 | "Failed." | ||
40 | exit 1 | ||
41 | fi | ||
42 | #curl http://localhost:7776/idp/tickets/testego | ||
43 | gnunet-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] | ||
4 | GNUNET_TEST_HOME = /tmp/test-gnunet-idp-testing/ | ||
5 | |||
6 | [namestore-sqlite] | ||
7 | FILENAME = $GNUNET_TEST_HOME/namestore/sqlite_test.db | ||
8 | |||
9 | [namecache-sqlite] | ||
10 | FILENAME=$GNUNET_TEST_HOME/namecache/namecache.db | ||
11 | |||
12 | [identity] | ||
13 | # Directory where we store information about our egos | ||
14 | EGODIR = $GNUNET_TEST_HOME/identity/egos/ | ||
15 | |||
16 | [dhtcache] | ||
17 | DATABASE = heap | ||
18 | |||
19 | [transport] | ||
20 | PLUGINS = tcp | ||
21 | |||
22 | [transport-tcp] | ||
23 | BINDTO = 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 | ||
2 | trap "gnunet-arm -e -c test_idp.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_idp.conf | ||
27 | #gnunet-arm -i rest -c test_idp.conf | ||
28 | gnunet-identity -C testego -c test_idp.conf | ||
29 | gnunet-identity -C rpego -c test_idp.conf | ||
30 | SUBJECT_KEY=$(gnunet-identity -d -c test_idp.conf | grep rpego | awk '{print $3}') | ||
31 | TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}') | ||
32 | gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf > /dev/null 2>&1 | ||
33 | gnunet-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 | ||
35 | gnunet-idp -e testego -i "email,name" -r $SUBJECT_KEY -c test_idp.conf > /dev/null 2>&1 | ||
36 | if test $? != 0 | ||
37 | then | ||
38 | echo "Failed." | ||
39 | exit 1 | ||
40 | fi | ||
41 | #curl http://localhost:7776/idp/attributes/testego | ||
42 | gnunet-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 | ||
2 | trap "gnunet-arm -e -c test_idp.conf" SIGINT | ||
3 | |||
4 | LOCATION=$(which gnunet-config) | ||
5 | if [ -z $LOCATION ] | ||
6 | then | ||
7 | LOCATION="gnunet-config" | ||
8 | fi | ||
9 | $LOCATION --version 1> /dev/null | ||
10 | if test $? != 0 | ||
11 | then | ||
12 | echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX" | ||
13 | exit 77 | ||
14 | fi | ||
15 | |||
16 | rm -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 | |||
23 | which timeout &> /dev/null && DO_TIMEOUT="timeout 30" | ||
24 | |||
25 | TEST_ATTR="test" | ||
26 | gnunet-arm -s -c test_idp.conf | ||
27 | gnunet-identity -C alice -c test_idp.conf | ||
28 | gnunet-identity -C bob -c test_idp.conf | ||
29 | gnunet-identity -C eve -c test_idp.conf | ||
30 | ALICE_KEY=$(gnunet-identity -d -c test_idp.conf | grep alice | awk '{print $3}') | ||
31 | BOB_KEY=$(gnunet-identity -d -c test_idp.conf | grep bob | awk '{print $3}') | ||
32 | EVE_KEY=$(gnunet-identity -d -c test_idp.conf | grep eve | awk '{print $3}') | ||
33 | |||
34 | gnunet-idp -e alice -a email -V john@doe.gnu -c test_idp.conf | ||
35 | gnunet-idp -e alice -a name -V John -c test_idp.conf | ||
36 | TICKET_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 | ||
38 | TICKET_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 | ||
43 | gnunet-idp -e alice -R $TICKET_EVE -c test_idp.conf | ||
44 | |||
45 | gnunet-idp -e eve -C $TICKET_EVE -c test_idp.conf > /dev/null 2>&1 | ||
46 | if test $? == 0 | ||
47 | then | ||
48 | echo "Eve can still resolve attributes..." | ||
49 | gnunet-arm -e -c test_idp.conf | ||
50 | exit 1 | ||
51 | fi | ||
52 | gnunet-idp -e bob -C $TICKET_BOB -c test_idp.conf > /dev/null 2>&1 | ||
53 | if test $? != 0 | ||
54 | then | ||
55 | echo "Bob cannot resolve attributes..." | ||
56 | gnunet-arm -e -c test_idp.conf | ||
57 | exit 1 | ||
58 | fi | ||
59 | |||
60 | gnunet-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 = \ | |||
42 | if HAVE_MHD | 42 | if HAVE_MHD |
43 | if HAVE_JSON | 43 | if HAVE_JSON |
44 | plugin_LTLIBRARIES = \ | 44 | plugin_LTLIBRARIES = \ |
45 | libgnunet_plugin_rest_identity.la \ | 45 | libgnunet_plugin_rest_identity.la |
46 | libgnunet_plugin_gnsrecord_identity.la | ||
47 | endif | 46 | endif |
48 | endif | 47 | endif |
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 | ||
58 | libgnunet_plugin_gnsrecord_identity_la_SOURCES = \ | ||
59 | plugin_gnsrecord_identity.c | ||
60 | libgnunet_plugin_gnsrecord_identity_la_LIBADD = \ | ||
61 | $(top_builddir)/src/util/libgnunetutil.la \ | ||
62 | $(LTLIBINTL) | ||
63 | libgnunet_plugin_gnsrecord_identity_la_LDFLAGS = \ | ||
64 | $(GN_PLUGIN_LDFLAGS) | ||
65 | |||
66 | 57 | ||
67 | libgnunet_plugin_rest_identity_la_SOURCES = \ | 58 | libgnunet_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 |
39 | extern "C" | 41 | extern "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 | */ |
55 | struct GNUNET_CREDENTIAL_LookupRequest; | 57 | struct 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 | */ | ||
62 | enum 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 | |||
75 | GNUNET_NETWORK_STRUCT_BEGIN | ||
76 | /** | ||
77 | * The attribute delegation record | ||
78 | */ | ||
79 | struct 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 | */ | ||
99 | struct 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 | |||
113 | GNUNET_NETWORK_STRUCT_END | ||
114 | |||
115 | /** | ||
116 | * The attribute delegation record | ||
117 | */ | ||
118 | struct 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 | */ | ||
137 | struct 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 | */ | ||
174 | struct 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 | */ |
64 | struct GNUNET_Credential_Handle * | 216 | struct GNUNET_CREDENTIAL_Handle * |
65 | GNUNET_CREDENTIAL_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); | 217 | GNUNET_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 | */ |
85 | typedef void | 238 | typedef 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 | */ | ||
251 | typedef 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 | */ | ||
261 | typedef 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 | */ |
102 | struct GNUNET_CREDENTIAL_LookupRequest * | 282 | struct GNUNET_CREDENTIAL_Request* |
103 | GNUNET_CREDENTIAL_lookup (struct GNUNET_CREDENTIAL_Handle *handle, | 283 | GNUNET_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 | ||
292 | struct GNUNET_CREDENTIAL_Request* | ||
293 | GNUNET_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 | */ | ||
310 | struct GNUNET_CREDENTIAL_Request * | ||
311 | GNUNET_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 | */ |
120 | struct GNUNET_CREDENTIAL_IssueRequest * | 327 | struct GNUNET_CREDENTIAL_Request * |
121 | GNUNET_CREDENTIAL_issue (struct GNUNET_CREDENTIAL_Handle *handle, | 328 | GNUNET_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 | */ | ||
346 | struct GNUNET_CREDENTIAL_Credential* | ||
347 | GNUNET_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 | */ |
138 | struct GNUNET_CREDENTIAL_IssueRequest * | 363 | /** |
139 | GNUNET_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 | */ |
153 | void | 379 | void |
154 | GNUNET_CREDENTIAL_lookup_cancel (struct GNUNET_CREDENTIAL_LookupRequest *lr); | 380 | GNUNET_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 | */ | ||
401 | struct 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 | */ | ||
2151 | struct GNUNET_CRYPTO_AbeMasterKey * | ||
2152 | GNUNET_CRYPTO_cpabe_create_master_key (void); | ||
2153 | void | ||
2154 | GNUNET_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 | */ | ||
2162 | struct GNUNET_CRYPTO_AbeKey * | ||
2163 | GNUNET_CRYPTO_cpabe_create_key (struct GNUNET_CRYPTO_AbeMasterKey *msk, | ||
2164 | char **attrs); | ||
2165 | void | ||
2166 | GNUNET_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 | */ | ||
2181 | ssize_t | ||
2182 | GNUNET_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 | */ | ||
2199 | ssize_t | ||
2200 | GNUNET_CRYPTO_cpabe_decrypt (const void *block, | ||
2201 | size_t size, | ||
2202 | const struct GNUNET_CRYPTO_AbeKey *key, | ||
2203 | void **result); | ||
2204 | |||
2205 | ssize_t | ||
2206 | GNUNET_CRYPTO_cpabe_serialize_key (const struct GNUNET_CRYPTO_AbeKey *key, | ||
2207 | void **result); | ||
2208 | |||
2209 | struct GNUNET_CRYPTO_AbeKey* | ||
2210 | GNUNET_CRYPTO_cpabe_deserialize_key (const void *data, | ||
2211 | size_t len); | ||
2212 | |||
2213 | ssize_t | ||
2214 | GNUNET_CRYPTO_cpabe_serialize_master_key (const struct GNUNET_CRYPTO_AbeMasterKey *key, | ||
2215 | void **result); | ||
2216 | |||
2217 | struct GNUNET_CRYPTO_AbeMasterKey* | ||
2218 | GNUNET_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 | ||
34 | extern "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 | */ | ||
59 | struct 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 | |||
91 | struct 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 | |||
104 | struct 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 | */ | ||
131 | struct GNUNET_IDENTITY_ATTRIBUTE_Claim * | ||
132 | GNUNET_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 | */ | ||
145 | size_t | ||
146 | GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs); | ||
147 | |||
148 | void | ||
149 | GNUNET_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 | */ | ||
160 | size_t | ||
161 | GNUNET_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 | */ | ||
172 | struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList * | ||
173 | GNUNET_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 | */ | ||
184 | size_t | ||
185 | GNUNET_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 | */ | ||
197 | size_t | ||
198 | GNUNET_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 | */ | ||
209 | struct GNUNET_IDENTITY_ATTRIBUTE_Claim * | ||
210 | GNUNET_IDENTITY_ATTRIBUTE_deserialize (const char* data, | ||
211 | size_t data_size); | ||
212 | |||
213 | struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList* | ||
214 | GNUNET_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 | ||
38 | extern "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 | */ | ||
56 | typedef 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 | */ | ||
74 | typedef 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 | */ | ||
89 | typedef 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 | */ | ||
101 | typedef 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 | */ | ||
109 | struct 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 | ||
38 | extern "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 | */ | ||
52 | typedef 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 | */ | ||
60 | struct 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; | |||
57 | struct GNUNET_IDENTITY_PROVIDER_Token; | 57 | struct GNUNET_IDENTITY_PROVIDER_Token; |
58 | 58 | ||
59 | /** | 59 | /** |
60 | * Handle for a ticket | 60 | * The ticket |
61 | */ | 61 | */ |
62 | struct GNUNET_IDENTITY_PROVIDER_Ticket; | 62 | struct 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 | */ |
67 | struct GNUNET_IDENTITY_PROVIDER_Operation; | 83 | struct 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 | */ |
76 | typedef void | 92 | struct GNUNET_IDENTITY_PROVIDER_Handle * |
77 | (*GNUNET_IDENTITY_PROVIDER_ExchangeCallback)(void *cls, | 93 | GNUNET_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 | */ |
94 | typedef void | 105 | typedef 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 | */ |
107 | struct GNUNET_IDENTITY_PROVIDER_Handle * | 122 | struct GNUNET_IDENTITY_PROVIDER_Operation * |
108 | GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); | 123 | GNUNET_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 | */ |
124 | struct GNUNET_IDENTITY_PROVIDER_Operation * | 136 | typedef void |
125 | GNUNET_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 | */ |
146 | struct GNUNET_IDENTITY_PROVIDER_Operation * | 168 | struct GNUNET_IDENTITY_PROVIDER_AttributeIterator * |
147 | GNUNET_IDENTITY_PROVIDER_exchange_ticket (struct GNUNET_IDENTITY_PROVIDER_Handle *id, | 169 | GNUNET_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 | */ |
159 | void | 185 | void |
160 | GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h); | 186 | GNUNET_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 | */ |
171 | void | 196 | void |
172 | GNUNET_IDENTITY_PROVIDER_cancel (struct GNUNET_IDENTITY_PROVIDER_Operation *op); | 197 | GNUNET_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 | */ |
208 | typedef 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 | */ |
184 | void | 225 | struct GNUNET_IDENTITY_PROVIDER_Operation * |
185 | GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token); | 226 | GNUNET_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 | */ |
193 | char * | 244 | struct GNUNET_IDENTITY_PROVIDER_Operation * |
194 | GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token); | 245 | GNUNET_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 | */ | ||
264 | struct GNUNET_IDENTITY_PROVIDER_Operation * | ||
265 | GNUNET_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 | */ | ||
288 | struct GNUNET_IDENTITY_PROVIDER_TicketIterator * | ||
289 | GNUNET_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 | */ |
202 | char * | 315 | struct GNUNET_IDENTITY_PROVIDER_TicketIterator * |
203 | GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket); | 316 | GNUNET_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 | */ |
212 | int | 331 | void |
213 | GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input, | 332 | GNUNET_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 | */ |
221 | void | 341 | void |
222 | GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket); | 342 | GNUNET_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 | */ | ||
349 | void | ||
350 | GNUNET_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 | */ | ||
361 | void | ||
362 | GNUNET_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 | */ |
251 | char* | 251 | const char* |
252 | GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource); | 252 | GNUNET_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 | */ |
248 | char* | 248 | const char* |
249 | GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource) | 249 | GNUNET_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] |
2 | UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-rest.sock | ||
2 | BINARY=gnunet-rest-server | 3 | BINARY=gnunet-rest-server |
3 | REST_PORT=7776 | 4 | REST_PORT=7776 |
4 | REST_ALLOW_HEADERS=Authorization,Accept,Content-Type | 5 | REST_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 | ||
122 | if HAVE_PBC | ||
123 | if HAVE_ABE | ||
124 | libgnunetutil_la_SOURCES += \ | ||
125 | crypto_abe.c | ||
126 | libgnunetutil_la_LIBADD += \ | ||
127 | $(ABE_LIBADD) \ | ||
128 | -lgabe \ | ||
129 | -lpbc \ | ||
130 | -lglib-2.0 | ||
131 | endif | ||
132 | endif | ||
133 | |||
122 | libgnunetutil_la_LDFLAGS = \ | 134 | libgnunetutil_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 | |||
127 | libgnunetutil_taler_wallet_la_SOURCES = \ | 138 | libgnunetutil_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 = \ | |||
553 | test_speedup_LDADD = \ | 564 | test_speedup_LDADD = \ |
554 | libgnunetutil.la | 565 | libgnunetutil.la |
555 | 566 | ||
567 | if HAVE_PBC | ||
568 | if HAVE_ABE | ||
569 | test_crypto_abe_SOURCES = \ | ||
570 | test_crypto_abe.c | ||
571 | test_crypto_abe_LDADD = \ | ||
572 | libgnunetutil.la | ||
573 | check_PROGRAMS += \ | ||
574 | test_crypto_abe | ||
575 | endif | ||
576 | endif | ||
577 | |||
556 | perf_crypto_hash_SOURCES = \ | 578 | perf_crypto_hash_SOURCES = \ |
557 | perf_crypto_hash.c | 579 | perf_crypto_hash.c |
558 | perf_crypto_hash_LDADD = \ | 580 | perf_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 | |||
35 | struct GNUNET_CRYPTO_AbeMasterKey | ||
36 | { | ||
37 | gabe_pub_t* pub; | ||
38 | gabe_msk_t* msk; | ||
39 | }; | ||
40 | |||
41 | struct GNUNET_CRYPTO_AbeKey | ||
42 | { | ||
43 | gabe_pub_t* pub; | ||
44 | gabe_prv_t* prv; | ||
45 | }; | ||
46 | |||
47 | static int | ||
48 | init_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 | |||
79 | static int | ||
80 | aes_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 | |||
115 | static int | ||
116 | aes_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 | |||
148 | struct GNUNET_CRYPTO_AbeMasterKey* | ||
149 | GNUNET_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 | |||
159 | void | ||
160 | GNUNET_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 | |||
169 | struct GNUNET_CRYPTO_AbeKey* | ||
170 | GNUNET_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 | |||
186 | void | ||
187 | GNUNET_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 | |||
197 | ssize_t | ||
198 | write_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 | |||
225 | ssize_t | ||
226 | read_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 | |||
255 | ssize_t | ||
256 | GNUNET_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 | |||
287 | ssize_t | ||
288 | GNUNET_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 | |||
325 | ssize_t | ||
326 | GNUNET_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 | |||
347 | struct GNUNET_CRYPTO_AbeKey* | ||
348 | GNUNET_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 | |||
371 | ssize_t | ||
372 | GNUNET_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 | |||
393 | struct GNUNET_CRYPTO_AbeMasterKey* | ||
394 | GNUNET_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 | |||
31 | static int | ||
32 | testAbecipher () | ||
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 | |||
70 | int | ||
71 | main (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 */ | ||